which included commits to RCS files with non-trunk default branches.
-*- indented-text -*-
-to 21.2.18 "Toshima"
--- valid-image-instantiator-format-p tightened up by Andy Piper.
--- glyph widget support under X/Motif from Andy Piper
--- Make docdir configurable, update package searching rules from Michael
- Sperber
--- Fix for Japanese word/character movements from MORIOKA Tomohiko
--- lrecord struct header size fix from Olivier Galibert
-
-to 21.2.17 "Chiyoda"
--- miscellaneous bug fixes from Steve Baur
--- font menu fix from Robert Pluim
--- ldap API update from Oscar Figueiredo
--- Fix thai-xtis charset width from MORIOKA Tomohiko
--- CCL engine fix from MORIOKA Tomohiko
--- mswindows build fixes from Norbert Koch
--- miscellaneous fixes from Andy Piper
--- automated tests for mswindows from Adrian Aichner
--- tree-view and tab-control widget glyph support from Andy Piper
-
-to 21.2.16 "Sumida"
--- miscellaneous fixes from Hrvoje Niksic and Olivier Galibert
--- make selection more mswindows conformant.
--- Make customize use specifiers from Jan Vroonhof
--- Cyrillic CCL crash fix from MORIOKA Tomohiko
--- DEC OSF Build fix and miscellaneous Lisp fix from Steve Baur
--- raw-text coding system synch from MORIOKA Tomohiko
-
-to 21.2.15 "Sakuragawa"
--- new self tests from Oscar Figueiredo and Hrvoje Niksic
--- Miscellaneous bug fixes from Yoshiki Hayashi, Jerry James, Hirokazu FUKUI,
- Hrvoje Niksic, MORIOKA Tomohiko
--- LDAP internationalization from Oscar Figueiredo
--- DEC OSF build fixes from Steve Baur
--- Documentation fixes from Mike McEwan, Vin Shelton and Gunnar Evermann
--- Build fixes from Jan Vroonhof
--- Miscellaneous fixes from Hrvoje Niksic
--- Documentation updates from Hrvoje Niksic and Albert Chin-A-Young
--- mule-charset.el synch with Mule from Steve Baur
--- miscellaneous build and cosmetic fixes from Steve Baur
--- font-menu for mswindows from Andy Piper
--- select rationalisation for window systems from Andy Piper
--- reinstate sheap adjustment + mingw32 fixes from Andy Piper
-
-to 21.2.14 "Dionysos"
+to 21.2.14 ""
-- mingw32 port from Andy Piper
--- fix for Solaris build lossage from Hrvoje Niksic
--- THAI/Cyrillic-KOI8, Vietnamese, Ethiopic support from MORIOKA Tomohiko
--- miscellaneous bug fixes from Gunnar Evermann
--- Internal purespace cleanup from Olivier Galibert
--- documentation updates from Hrvoje Niksic
--- dump time tuning from Hrvoje Niksic
--- miscellaneous bug fixes from Giacomo Boffi
--- font hacking from Jan Vroonhof
--- Czech language support from David Sauer
--- `delete-key-deletes-forward' now defaults to t
--- `locate-file' update from Hrvoje Niksic
--- MS Windows build fixes from Adrian Aichner
--- LDAP updates from Oscar Figueiredo
--- miscellaneous bug fixes from Colin Rafferty and Kai Haberzettl
--- disable display of images in buffers by file format
--- miscellaneous Mule fixes from Olivier Galibert
--- documentation updates from Albert Chin-A-Young
--- documentation updates from Gunnar Evermann and Stephen Turnbull
--- MS Windows build fix from Norbert Koch
--- miscellaneous MS Windows fixes from Andy Piper
--- redisplay bug fixes from Jan Vroonhof
--- miscellaneous bug fixes from Robert Pluim, MORIOKA Tomohiko
--- many, many bug fixes and enhancements from Hrvoje Niksic and Olivier
- Galibert
--- miscellaneous bug fixes from Martin Buchholz
--- Miscellaneous MS Windows fixes from Philip Aston
--- lots of new tests from Hrvoje Niksic
to 21.2.13 "Demeter"
-- Build fixes from Martin Buchholz
-1999-06-25 Michael Sperber [Mr. Preprocessor] <sperber@informatik.uni-tuebingen.de>
-
- * configure.in (with_prefix): Added --with-prefix, defaults to
- yes, to control whether the value of --prefix is compiled into the
- binary.
-
-1999-07-03 Andy Piper <andy@xemacs.org>
-
- * configure.usage (--with-widgets): add.
-
-1999-07-02 Andy Piper <andy@xemacs.org>
-
- * configure.in: Make sure we get motif in lwlib if we have widgets
- and motif.
-
-1999-06-25 SL Baur <steve@miho.m17n.org>
-
- * configure.in (version): Fix --with-infodock test.
-
-1999-06-15 Michael Sperber [Mr. Preprocessor] <sperber@informatik.uni-tuebingen.de>
-
- * configure.in: --prefix and --exec-prefix are now only compiled
- into the binary if user-defined.
-
-1999-03-23 Michael Sperber [Mr. Preprocessor] <sperber@informatik.uni-tuebingen.de>
-
- * configure.in: Made docdir configurable.
-
- * Makefile.in (docdir): Added variable for custom DOC directory.
-
-1999-06-22 XEmacs Build Bot <builds@cvs.xemacs.org>
-
- * XEmacs 21.2.17 is released
-
-1999-06-13 Oscar Figueiredo <oscar@xemacs.org>
-
- * configure.in (with_ldap): Check libldap independently of liblber
- Do not test alternate library names such as libldap10
- Test the presence of a variety of LDAP API functions which were
- formerly assumed to be present according to dubious heuristics
-
-1999-06-11 XEmacs Build Bot <builds@cvs.xemacs.org>
-
- * XEmacs 21.2.16 is released
-
-1999-06-04 SL Baur <steve@steve1.m17n.org>
-
- * configure.in (CPP): Correct test for locating $site_prefix
- include directories.
-
-1999-06-04 XEmacs Build Bot <builds@cvs.xemacs.org>
-
- * XEmacs 21.2.15 is released
-
-1999-06-01 Gunnar Evermann <ge204@eng.cam.ac.uk>
-
- * README.packages: fix typos: user pacakge hierarchy is ~/.xemacs
- From: Eric Veldhuyzen <eric@terra.nu>
-
-1999-05-25 Jan Vroonhof <jan@xemacs.org>
-
- * configure.in: For non-beta's use x.y.z format for version strings.
-
-1999-06-03 SL Baur <steve@xemacs.org>
-
- * version.sh: add emacs_is_beta initialization
-
- * configure.in: Implement patch levels in version number
- From Jan Vroonhof <vroonhof@math.ethz.ch>
-
- * configure.in:
- * configure.usage:
- * config.h.in: Rename session option to wmcommand.
- From Oliver Graf <ograf@rhein-zeitung.de>
-
-1999-05-16 Mike McEwan <mike@lotusland.demon.co.uk>
-
- * info/dir: Add `emodules.info' entry to the top info dir.
-
-1999-05-31 SL Baur <steve@steve1.m17n.org>
-
- * configure.in (CPP): Don't check for include subdirectories in
- site-prefix directories. This check loses in valid configurations
- like /usr/jp in TurboLinux. Conditionally add include directory to
- site switches.
-
-1999-05-14 Hrvoje Niksic <hniksic@srce.hr>
-
- * configure.in (quoted_arguments): Support
- --error-checking=byte-code.
-
1999-05-14 XEmacs Build Bot <builds@cvs.xemacs.org>
* XEmacs 21.2.14 is released
--- /dev/null
+## DIST: This is the distribution Makefile for XEmacs. configure can
+## DIST: make most of the changes to this file you might want, so try
+## DIST: that first.
+
+## This file is part of XEmacs.
+
+## XEmacs is free software; you can redistribute it and/or modify it
+## under the terms of the GNU General Public License as published by the
+## Free Software Foundation; either version 2, or (at your option) any
+## later version.
+
+## XEmacs is distributed in the hope that it will be useful, but WITHOUT
+## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+## for more details.
+
+## You should have received a copy of the GNU General Public License
+## along with XEmacs; see the file COPYING. If not, write to
+## the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+## Boston, MA 02111-1307, USA.
+
+## make all to compile and build XEmacs.
+## make install to build and install it.
+## make install-only to install after a previous complete build
+## make TAGS to update tags tables.
+
+## make clean or make mostlyclean
+## Delete all files from the current directory that are normally
+## created by building the program. Don't delete the files that
+## record the configuration. Also preserve files that could be made
+## by building, but normally aren't because the distribution comes
+## with them.
+
+## Delete `.dvi' files here if they are not part of the distribution.
+
+## make distclean
+## Delete all files from the current directory that are created by
+## configuring or building the program. If you have unpacked the
+## source and built the program without creating any other files,
+## `make distclean' should leave only the files that were in the
+## distribution.
+
+## make realclean
+## Delete everything from the current directory that can be
+## reconstructed with this Makefile. This typically includes
+## everything deleted by distclean, plus more: C source files
+## produced by Bison, tags tables, info files, and so on.
+
+## make extraclean
+## Still more severe - delete backup and autosave files, too.
+
+@SET_MAKE@
+RECURSIVE_MAKE=@RECURSIVE_MAKE@
+SHELL = /bin/sh
+LANG = C
+RM = rm -f
+pwd = /bin/pwd
+
+## ==================== Things `configure' Might Edit ====================
+
+CC=@CC@
+CPP=@CPP@
+LN_S=@LN_S@
+CFLAGS=@CFLAGS@
+CPPFLAGS=@CPPFLAGS@
+LDFLAGS=@LDFLAGS@
+
+## These help us choose version- and architecture-specific directories
+## to install files in.
+
+## This should be the number of the XEmacs version we're building,
+## like `19.12' or `19.13'.
+version=@version@
+
+## This should be the name of the configuration we're building XEmacs
+## for, like `mips-dec-ultrix' or `sparc-sun-sunos'.
+configuration=@configuration@
+
+## This will be the name of the generated binary and is set automatically
+## by configure.
+PROGNAME=@PROGNAME@
+
+## ==================== Where To Install Things ====================
+
+## The default location for installation. Everything is placed in
+## subdirectories of this directory. The default values for many of
+## the variables below are expressed in terms of this one, so you may
+## not need to change them. This defaults to /usr/local.
+prefix=@prefix@
+
+## Like `prefix', but used for architecture-specific files.
+exec_prefix=@exec_prefix@
+
+## Where to install XEmacs and other binaries that people will want to
+## run directly (like etags).
+bindir=@bindir@
+
+## Where to install architecture-independent data files.
+## ${lispdir} and ${etcdir} are subdirectories of this.
+datadir=@datadir@
+
+## Where to find XEmacs packages.
+pkgdir=@pkgdir@
+
+## Where to install and expect the files that XEmacs modifies as it runs.
+## These files are all architecture-independent. Right now, the
+## only such data is the locking directory;
+## ${lockdir} is a subdirectory of this.
+statedir=@statedir@
+
+## Where to install and expect executable files to be run by XEmacs
+## rather than directly by users, and other architecture-dependent data
+## ${archlibdir} is a subdirectory of this.
+libdir=@libdir@
+
+## Where to install XEmacs's man pages, and what extension they should have.
+mandir=@mandir@
+manext=.1
+
+## Where to install and expect the info files describing XEmacs. In the
+## past, this defaulted to a subdirectory of ${prefix}/lib/xemacs, but
+## since there are now many packages documented with the texinfo
+## system, it is inappropriate to imply that it is part of XEmacs.
+infodir=@infodir@
+
+## Document me.
+## See callproc.c for code which references this.
+infopath=@infopath@
+
+## Where to find the source code. The source code for XEmacs's C kernel is
+## expected to be in ${srcdir}/src, and the source code for XEmacs's
+## utility programs is expected to be in ${srcdir}/lib-src. This is
+## set by the configure script's `--srcdir' option.
+srcdir=@srcdir@
+
+## Where the build is done.
+blddir=@blddir@
+
+## ==================== XEmacs-specific directories ====================
+
+## These variables hold the values XEmacs will actually use. They are
+## based on the values of the standard Make variables above.
+
+## Where to install the lisp files distributed with
+## XEmacs. This includes the XEmacs version, so that the
+## lisp files for different versions of XEmacs will install
+## themselves in separate directories.
+lispdir=@lispdir@
+
+## Directory XEmacs should search for lisp files specific
+## to this site (i.e. customizations), before consulting
+## ${lispdir}.
+sitelispdir=@sitelispdir@
+
+## Where XEmacs will search for its lisp files while
+## building. This is only used during the process of
+## compiling XEmacs, to help XEmacs find its lisp files
+## before they've been installed in their final location.
+## It's usually identical to lispdir, except that the
+## entry for the directory containing the installed lisp
+## files has been replaced with ../lisp. This should be a
+## colon-separated list of directories.
+buildlispdir=${srcdir}/lisp
+
+## Where to install the other architecture-independent
+## data files distributed with XEmacs (like the tutorial,
+## the cookie recipes and the Zippy database). This path
+## usually contains the XEmacs version number, so the data
+## files for multiple versions of XEmacs may be installed
+## at once.
+etcdir=@etcdir@
+
+## Where to create and expect the locking directory, where
+## the XEmacs locking code keeps track of which files are
+## currently being edited.
+lockdir=@lockdir@
+
+## Where to put executables to be run by XEmacs rather than
+## the user. This path usually includes the XEmacs version
+## and configuration name, so that multiple configurations
+## for multiple versions of XEmacs may be installed at
+## once.
+archlibdir=@archlibdir@
+
+## ==================== Utility Programs for the Build ====================
+
+## Allow the user to specify the install program.
+INSTALL = @install_pp@ @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+
+## ============================= Targets ==============================
+
+## Subdirectories to make recursively. `lisp' is not included
+## because the compiled lisp files are part of the distribution
+## and you cannot remake them without installing XEmacs first.
+MAKE_SUBDIR = @MAKE_SUBDIR@
+
+## Subdirectories that can be made recursively.
+SUBDIR = ${MAKE_SUBDIR} man
+
+## The makefiles of the directories in ${MAKE_SUBDIR}.
+SUBDIR_MAKEFILES = @SUBDIR_MAKEFILES@
+
+## Subdirectories to `make install-arch-dep' recursively
+INSTALL_ARCH_DEP_SUBDIR = @INSTALL_ARCH_DEP_SUBDIR@
+
+## Subdirectories to install, and where they'll go.
+## lib-src's makefile knows how to install it, so we don't do that here.
+## When installing the info files, we need to do special things to
+## avoid nuking an existing dir file, so we don't do that here;
+## instead, we have written out explicit code in the `install' targets.
+COPYDIR = ${srcdir}/etc ${srcdir}/lisp
+COPYDESTS = ${etcdir} ${lispdir}
+GENERATED_HEADERS = src/paths.h src/Emacs.ad.h src/puresize-adjust.h src/config.h lwlib/config.h src/sheap-adjust.h
+GENERATED_LISP = lisp/finder-inf.el
+
+all: ${PROGNAME} all-elc info
+
+${PROGNAME}: ${GENERATED_HEADERS} ${MAKE_SUBDIR} ${GENERATED_LISP}
+
+## For performance and consistency, no built-in rules
+.SUFFIXES:
+
+.NO_PARALLEL: ${GENERATED_HEADERS} ${MAKE_SUBDIR} dump-elcs
+.PHONY: ${SUBDIR} all beta all-elc all-elcs dump-elc dump-elcs autoloads finder
+
+## Convenience target for XEmacs beta testers
+beta: clean all-elc finder
+
+## Convenience target for XEmacs maintainers
+## This would run `make-xemacsdist' if I were really confident that everything
+## was turnkey.
+dist: all-elc info
+
+## Convenience target for XEmacs maintainers
+## Updates some rarely generated files:
+## - configure from configure.in
+## - config.values.in from configure
+## - src/depend from src/*.[ch]
+.PHONY: config configure depend
+config: configure depend
+configure: ${srcdir}/configure
+${srcdir}/configure: ${srcdir}/configure.in
+ cd ${srcdir} && autoconf
+ cd ${srcdir} && /bin/sh lib-src/config.values.sh
+
+depend ${srcdir}/src/depend:
+ cd ${srcdir}/src && \
+ perl ./make-src-depend > depend.tmp && \
+ $(RM) depend && mv depend.tmp depend
+
+## Build XEmacs and recompile out-of-date and missing .elc files along
+## the way.
+all-elc all-elcs: lib-src lwlib dump-elcs src
+ MAKE='$(MAKE)' EMACS='./src/$(PROGNAME)' sh ${srcdir}/lib-src/update-elc.sh
+
+## Sub-target for all-elc.
+dump-elc dump-elcs: ${GENERATED_HEADERS} FRC.dump-elcs
+ cd ./src && $(RECURSIVE_MAKE) dump-elcs
+
+autoloads: src
+ MAKE='$(MAKE)' EMACS='./src/$(PROGNAME)' sh ${srcdir}/lib-src/update-autoloads.sh
+
+custom-loads:
+ MAKE='$(MAKE)' EMACS='./src/$(PROGNAME)' sh ${srcdir}/lib-src/update-custom.sh
+
+finder: src
+ @echo "Building finder database ..."
+ @(cd ./lisp; \
+ ${blddir}/src/${PROGNAME} -batch -vanilla \
+ -eval '(setq finder-compile-keywords-quiet t)' \
+ -l finder -f finder-compile-keywords )
+ @echo "Building finder database ...(done)"
+
+lisp/finder-inf.el:
+ @echo "Building finder database ..."
+ @(cd ./lisp; \
+ ${blddir}/src/${PROGNAME} -batch -vanilla \
+ -eval '(setq finder-compile-keywords-quiet t)' \
+ -l finder -f finder-compile-keywords )
+ @echo "Building finder database ...(done)"
+
+## We have to force the building of Emacs.ad.h as well in order to get it
+## updated correctly when VPATH is being used. Since we use move-if-change,
+## it will only actually change if the user modified ${etcdir}/Emacs.ad.
+src/Emacs.ad.h: ${srcdir}/etc/Emacs.ad
+ @echo "Producing \`src/Emacs.ad.h' from \`etc/Emacs.ad'."
+ @$(RM) src/Emacs.ad.h
+ @(echo "/* Do not edit this file!" ; \
+ echo " Automatically generated from ${srcdir}/etc/Emacs.ad" ; \
+ echo " */" ; \
+ /bin/sh ${srcdir}/lib-src/ad2c ${srcdir}/etc/Emacs.ad ) > \
+ src/Emacs.ad.h
+
+src/puresize-adjust.h: ${srcdir}/src/puresize.h
+ @echo "Resetting \`src/puresize-adjust.h'."; \
+ (echo "/* Do not edit this file!" ; \
+ echo " Automatically generated by XEmacs */" ; \
+ echo "#define PURESIZE_ADJUSTMENT 0") > $@
+
+src/sheap-adjust.h:
+ @echo "Resetting \`src/sheap-adjust.h'."; \
+ (echo "/* Do not edit this file!" ; \
+ echo " Automatically generated by XEmacs */" ; \
+ echo "#define SHEAP_ADJUSTMENT 0") > $@
+
+src: @SRC_SUBDIR_DEPS@ FRC.src
+pkg-src/tree-x: pkg-src/FRC.tree-x
+lib-src: FRC.lib-src
+lwlib: FRC.lwlib
+dynodump: FRC.dynodump
+FRC.src FRC.lib-src FRC.lwlib FRC.dynodump pkg-src/FRC.tree-x:
+FRC.lisp.finder-inf.el:
+
+${SUBDIR}: ${SUBDIR_MAKEFILES} ${GENERATED_HEADERS} FRC
+ cd ./$@ && $(RECURSIVE_MAKE) all
+
+Makefile: ${srcdir}/Makefile.in config.status
+ ./config.status
+
+src/Makefile: ${srcdir}/src/Makefile.in.in ${srcdir}/src/depend config.status
+ ./config.status
+
+lib-src/Makefile: ${srcdir}/lib-src/Makefile.in.in config.status
+ ./config.status
+
+lwlib/Makefile: ${srcdir}/lwlib/Makefile.in.in config.status
+ ./config.status
+
+pkg-src/tree-x/Makefile: ${srcdir}/pkg-src/tree-x/Makefile.in.in config.status
+ ./config.status
+
+src/config.h: ${srcdir}/src/config.h.in
+ ./config.status && touch $@
+
+src/paths.h: ${srcdir}/src/paths.h.in
+ ./config.status && touch $@
+
+lwlib/config.h: ${srcdir}/lwlib/config.h.in
+ ./config.status && touch $@
+
+## ==================== Installation ====================
+
+## If we let lib-src do its own installation, that means we
+## don't have to duplicate the list of utilities to install in
+## this Makefile as well.
+
+## On AIX, use tar xBf.
+## On Xenix, use tar xpf.
+
+.PHONY: install-only install install-arch-dep install-arch-indep gzip.el mkdir
+.PHONY: check-features
+
+## We delete each directory in ${COPYDESTS} before we copy into it;
+## that way, we can reinstall over directories that have been put in
+## place with their files read-only (perhaps because they are checked
+## into RCS). In order to make this safe, we make sure that the
+## source exists and is distinct from the destination.
+
+## FSF doesn't depend on `all', but rather on ${MAKE_SUBDIR}, so that
+## they "won't ever modify src/paths.h". But that means you can't do
+## 'make install' right off the bat because src/paths.h won't exist.
+## And, in XEmacs case, src/Emacs.ad.h won't exist either. I also
+## don't see the point in avoiding modifying paths.h. It creates an
+## inconsistency in the build process. So we go ahead and depend on
+## all. --cet
+
+check-features: all
+ ${blddir}/src/${PROGNAME} -batch -l check-features.el
+
+install-only: ${MAKE_SUBDIR} check-features install-arch-dep install-arch-indep
+
+install: all check-features install-arch-dep install-arch-indep
+
+install-arch-dep: mkdir
+ for subdir in ${INSTALL_ARCH_DEP_SUBDIR}; do \
+ (cd ./$${subdir} && $(RECURSIVE_MAKE) install prefix=${prefix} \
+ exec_prefix=${exec_prefix} bindir=${bindir} libdir=${libdir} \
+ archlibdir=${archlibdir}) ; done
+ if test "`(cd ${archlibdir} && $(pwd))`" != \
+ "`(cd ./lib-src && $(pwd))`"; then \
+ if test -f ../Installation; then \
+ ${INSTALL_DATA} ../Installation ${archlibdir}/Installation; \
+ fi; \
+ for f in DOC config.values; do \
+ ${INSTALL_DATA} lib-src/$${f} ${archlibdir}/$${f}; \
+ done ; \
+ for subdir in `find ${archlibdir} -type d ! -name RCS ! -name SCCS ! -name CVS -print` ; \
+ do (cd $${subdir} && $(RM) -r RCS CVS SCCS \#* *~) ; done ; \
+ else true; fi
+ ${INSTALL_PROGRAM} src/${PROGNAME} ${bindir}/${PROGNAME}-${version}
+ -chmod 0755 ${bindir}/${PROGNAME}-${version}
+ cd ${bindir} && $(RM) ./${PROGNAME} && ${LN_S} ${PROGNAME}-${version} ./${PROGNAME}
+ if test "${prefix}" != "${exec_prefix}"; then \
+ for dir in \
+ lib/${PROGNAME} \
+ lib/${PROGNAME}-${version}/etc \
+ lib/${PROGNAME}-${version}/info \
+ lib/${PROGNAME}-${version}/lisp; do \
+ if test ! -d ${exec_prefix}/$${dir}; then \
+ $(LN_S) ${prefix}/$${dir} ${exec_prefix}/$${dir}; fi; \
+ done; \
+ fi
+
+install-arch-indep: mkdir info
+ -@set ${COPYDESTS} ; \
+ for dir in ${COPYDIR} ; do \
+ if test "`(cd $$1 && $(pwd))`" != \
+ "`(cd $${dir} && $(pwd))`"; then \
+ : do nothing - echo "rm -rf $$1" ; \
+ fi ; \
+ shift ; \
+ done
+ -set ${COPYDESTS} ; \
+ for dir in ${COPYDESTS} ; do \
+ if test ! -d $${dir} ; then mkdir $${dir} ; fi ; \
+ done ; \
+ for dir in ${COPYDIR} ; do \
+ dest=$$1 ; shift ; \
+ test -d $${dir} \
+ -a "`(cd $${dir} && $(pwd))`" != \
+ "`(cd $${dest} && $(pwd))`" \
+ && (echo "Copying $${dir}..." ; \
+ (cd $${dir} && tar -cf - . ) | \
+ (cd $${dest} && umask 022 && tar -xf - );\
+ chmod 0755 $${dest}; \
+ for subdir in `find $${dest} -type d ! -name RCS ! -name SCCS ! -name CVS -print` ; do \
+ (cd $${subdir} && $(RM) -r RCS CVS SCCS \#* *~) ; \
+ done) ; \
+ done
+ if test "`(cd ${srcdir}/info && $(pwd))`" != \
+ "`(cd ${infodir} && $(pwd))`" && cd ${srcdir}/info; then \
+ if test ! -f ${infodir}/dir -a -f dir ; then \
+ ${INSTALL_DATA} ${srcdir}/info/dir ${infodir}/dir ; \
+ fi ; \
+ for file in *.info* ; do \
+ ${INSTALL_DATA} $${file} ${infodir}/$${file} ; \
+ chmod 0644 ${infodir}/$${file}; \
+ done ; \
+ fi
+ ## Note it's `xemacs' not ${PROGNAME}
+ cd ${srcdir}/etc && \
+ for page in xemacs etags ctags gnuserv gnuclient gnuattach gnudoit; do \
+ ${INSTALL_DATA} ${srcdir}/etc/$${page}.1 ${mandir}/$${page}${manext} ; \
+ chmod 0644 ${mandir}/$${page}${manext} ; \
+ done
+ @echo "If you would like to save approximately 2M of disk space, do"
+ @echo "make gzip-el"
+ @echo "or you may run "
+ @echo ${srcdir}/lib-src/gzip-el.sh lispdir " from the command line."
+ @echo "Where lispdir is where the lisp files were installed, i.e.,"
+ @echo "${lispdir}"
+
+gzip-el:
+ ${srcdir}/lib-src/gzip-el.sh ${lispdir}
+
+MAKEPATH=./lib-src/make-path
+## Build all the directories to install XEmacs in.
+## Since we may be creating several layers of directories,
+## (e.g. /usr/local/lib/${PROGNAME}-20.5/sparc-sun-solaris2.6), we use
+## make-path instead of mkdir. Not all mkdirs have the `-p' flag.
+mkdir: FRC.mkdir
+ ${MAKEPATH} ${COPYDESTS} ${lockdir} ${infodir} ${archlibdir} \
+ ${mandir} ${bindir} ${datadir} ${libdir} ${pkgdir}
+ -chmod 0777 ${lockdir}
+
+## Delete all the installed files that the `install' target would
+## create (but not the noninstalled files such as `make all' would
+## create).
+
+#### Don't delete the lisp and etc directories if they're in the source tree.
+#### This target has not been updated in sometime and until it is it
+#### would be extremely dangerous for anyone to use it.
+#uninstall:
+# (cd ./lib-src; \
+# $(RECURSIVE_MAKE) uninstall \
+# prefix=${prefix} exec_prefix=${exec_prefix} \
+# bindir=${bindir} libdir=${libdir} archlibdir=${archlibdir})
+# for dir in ${lispdir} ${etcdir} ; do \
+# case `(cd $${dir} ; $(pwd))` in \
+# `(cd ${srcdir} ; $(pwd))`* ) ;; \
+# * ) $(RM) $${dir} ;; \
+# esac ; \
+# case $${dir} in \
+# ${datadir}/${PROGNAME}/${version}/* ) \
+# $(RM) -r ${datadir}/${PROGNAME}/${version} \
+# ;; \
+# esac ; \
+# done
+# cd ${infodir} && $(RM) cl* ${PROGNAME}* forms* info* vip*
+# cd ${mandir} && $(RM) xemacs.1 etags.1 ctags.1 gnuserv.1
+# cd ${bindir} && $(RM) ${PROGNAME}-${version} ${PROGNAME}
+
+
+## Some makes seem to remember that they've built something called FRC,
+## so you can only use a given FRC once per makefile.
+FRC FRC.src.paths.h FRC.mkdir FRC.dump-elcs FRC.info:
+FRC.mostlyclean FRC.clean FRC.distclean FRC.realclean FRC.tags:
+
+## ==================== Cleaning up and miscellanea ====================
+
+.PHONY: mostlyclean clean distclean realclean extraclean
+
+## `mostlyclean'
+## Like `clean', but may refrain from deleting a few files that people
+## normally don't want to recompile. For example, the `mostlyclean'
+## target for GCC does not delete `libgcc.a', because recompiling it
+## is rarely necessary and takes a lot of time.
+mostlyclean: FRC.mostlyclean
+ for d in $(SUBDIR); do (cd ./$$d && $(RECURSIVE_MAKE) $@); done
+
+## `clean'
+## Delete all files from the current directory that are normally
+## created by building the program. Don't delete the files that
+## record the configuration. Also preserve files that could be made
+## by building, but normally aren't because the distribution comes
+## with them.
+
+## Delete `.dvi' files here if they are not part of the distribution.
+clean: FRC.clean
+ for d in $(SUBDIR); do (cd ./$$d && $(RECURSIVE_MAKE) $@); done
+ $(RM) core
+
+## `distclean'
+## Delete all files from the current directory that are created by
+## configuring or building the program. If you have unpacked the
+## source and built the program without creating any other files,
+## `make distclean' should leave only the files that were in the
+## distribution.
+top_distclean=\
+ $(RM) config.status config.log config-tmp-* build-install Installation ; \
+ for d in src lib-src lwlib dynodump ; do \
+ $(RM) $$d/Makefile $$d/Makefile.in ; \
+ done ; \
+ $(RM) core .sbinit Makefile lock/*; \
+ $(RM) lisp/finder-inf.el* Installation.el Installation.elc; \
+ $(RM) packages mule-packages site-lisp
+
+distclean: FRC.distclean
+ for d in $(SUBDIR); do (cd ./$$d && $(RECURSIVE_MAKE) $@); done
+ -${top_distclean}
+
+## `realclean'
+## Delete everything from the current directory that can be
+## reconstructed with this Makefile. This typically includes
+## everything deleted by distclean, plus more: C source files
+## produced by Bison, tags tables, info files, and so on.
+
+## One exception, however: `make realclean' should not delete
+## `configure' even if `configure' can be remade using a rule in the
+## Makefile. More generally, `make realclean' should not delete
+## anything that needs to exist in order to run `configure' and then
+## begin to build the program.
+realclean: FRC.realclean
+ for d in $(SUBDIR); do (cd ./$$d && $(RECURSIVE_MAKE) $@); done
+ -${top_distclean}
+ $(RM) TAGS
+
+## This doesn't actually appear in the coding standards, but Karl
+## says GCC supports it, and that's where the configuration part of
+## the coding standards seem to come from. It's like distclean, but
+## it deletes backup and autosave files too.
+extraclean:
+ for d in $(SUBDIR); do (cd ./$$d && $(RECURSIVE_MAKE) $@); done
+ $(RM) *~ \#*
+ -${top_distclean}
+
+## Unlocking and relocking. The idea of these productions is to reduce
+## hassles when installing an incremental tar of XEmacs. Do `make unlock'
+## before unlocking the file to take the write locks off all sources so
+## that tar xvof will overwrite them without fuss. Then do `make relock'
+## afterward so that VC mode will know which files should be checked in
+## if you want to mung them.
+
+## Note: it's no disaster if these productions miss a file or two; tar
+## and VC will swiftly let you know if this happens, and it is easily
+## corrected.
+SOURCES = ChangeLog GETTING.GNU.SOFTWARE INSTALL Makefile.in PROBLEMS \
+ README build-install.in configure make-dist move-if-change
+
+.PHONY: unlock relock TAGS tags check dist info dvi mcs
+
+unlock:
+ chmod u+w $(SOURCES) cpp/*
+ -cd ./elisp && chmod u+w Makefile README *.texi
+ for d in src etc lib-src lisp; do (cd ./$$d && $(RECURSIVE_MAKE) $@); done
+ cd ./lisp/term && chmod u+w README *.el
+ cd ./man && chmod u+w *texi* ChangeLog split-man
+ cd ./lwlib && chmod u+w *.[ch] Makefile.in.in
+
+relock:
+ chmod u-w $(SOURCES) cpp/*
+ -cd ./elisp && chmod u-w Makefile README *.texi
+ for d in src etc lib-src lisp; do (cd ./$$d && $(RECURSIVE_MAKE) $@); done
+ cd ./lisp/term && chmod u+w README *.el
+ cd ./man && chmod u+w *texi* ChangeLog split-man
+ cd ./lwlib && chmod u+w *.[ch] Makefile.in.in
+
+PRUNE_VC = -name SCCS -prune -o -name RCS -prune -o -name CVS -prune -o
+TAGS tags: FRC.tags
+ @echo "If you don't have a copy of etags around, then do 'make lib-src' first."
+ $(RM) ${srcdir}/TAGS
+ @PATH=`$(pwd)`/lib-src:$$PATH HOME=/-=-; export PATH HOME; \
+ echo "Using etags from `which etags`."
+ PATH=`$(pwd)`/lib-src:$$PATH ; export PATH; cd ${srcdir} && \
+ find src lwlib lib-src ${PRUNE_VC} -name '*.[ch]' -print | \
+ xargs etags -a -r '/[ ]*DEF\(VAR\|INE\)_[A-Z_]+[ ]*([ ]*"\([^"]+\)"/\2/'; \
+ find lisp ${PRUNE_VC} -name '*.el' -print | \
+ xargs etags -a -l none -r "/^(def\\(var\\|un\\|alias\\|const\\|macro\\)[ ]+'?\\([^ ]+\\)/\\2/"
+
+## We have automated tests!
+testdir = ${srcdir}/tests
+tests = ${testdir}/basic-lisp.el ${testdir}/database.el
+
+check:
+ src/${PROGNAME} -batch -l ${testdir}/test-emacs.el -f batch-test-emacs ${tests}
+
+info: FRC.info
+ cd ${srcdir}/man && $(RECURSIVE_MAKE) $@
+
+dvi:
+ cd ${srcdir}/man && $(RECURSIVE_MAKE) $@
+
+## Fix up version information in executables (Solaris-only)
+mcs:
+ date=`LANG=C LC_ALL=C date -u '+%e %b %Y'`; \
+ ident="@(#)RELEASE VERSION XEmacs ${version} $${date}"; \
+ for f in `file lib-src/* src/${PROGNAME} | grep ELF | sed -e 's/:.*//'`; do \
+ mcs -da "$${ident} `echo $${f} | sed 's/.*\///'`" $${f}; \
+ done
## currently being edited.
lockdir=@lockdir@
-# Where to put the DOC file.
-docdir=@docdir@
-
## Where to put executables to be run by XEmacs rather than
## the user. This path usually includes the XEmacs version
## and configuration name, so that multiple configurations
if test -f ../Installation; then \
${INSTALL_DATA} ../Installation ${archlibdir}/Installation; \
fi; \
- ${INSTALL_DATA} lib-src/config.values ${archlibdir}/config.values; \
- ${INSTALL_DATA} lib-src/DOC ${docdir}/DOC; \
+ for f in DOC config.values; do \
+ ${INSTALL_DATA} lib-src/$${f} ${archlibdir}/$${f}; \
+ done ; \
for subdir in `find ${archlibdir} -type d ! -name RCS ! -name SCCS ! -name CVS -print` ; \
do (cd $${subdir} && $(RM) -r RCS CVS SCCS \#* *~) ; done ; \
else true; fi
## (e.g. /usr/local/lib/${PROGNAME}-20.5/sparc-sun-solaris2.6), we use
## make-path instead of mkdir. Not all mkdirs have the `-p' flag.
mkdir: FRC.mkdir
- ${MAKEPATH} ${COPYDESTS} ${lockdir} ${docdir} ${infodir} ${archlibdir} \
+ ${MAKEPATH} ${COPYDESTS} ${lockdir} ${infodir} ${archlibdir} \
${mandir} ${bindir} ${datadir} ${libdir} ${pkgdir} \
${sitelispdir} ${moduledir} ${sitemoduledir}
-chmod 0777 ${lockdir}
#### Configuration script for XEmacs. Largely divergent from FSF.
#### Guess values for system-dependent variables and create Makefiles.
-#### Generated automatically using autoconf version 2.13
+#### Generated automatically using autoconf version 2.12
#### Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
#### Copyright (C) 1993-1995 Board of Trustees, University of Illinois.
#### Copyright (C) 1996, 1997 Sun Microsystems, Inc.
ac_link='${CC-cc} -o conftest $CFLAGS '"$xe_cppflags $xe_ldflags"' conftest.$ac_ext '"$xe_libs"' 1>&5'
cross_compiling=no
-ac_exeext=
-ac_objext=o
if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
# Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
etcdir='${datadir}/${PROGNAME}-${version}/etc'
lockdir='${statedir}/${PROGNAME}/lock'
archlibdir='${datadir}/${PROGNAME}-${version}/${configuration}'
-docdir='${archlibdir}'
-with_prefix='yes'
with_site_lisp='no'
with_site_modules='yes'
with_menubars=''
with_scrollbars=''
-with_widgets=''
with_dialogs=''
with_file_coding=''
cpp='' cppflags='' libs='' ldflags=''
case "$opt" in
with_site_lisp | \
- with_prefix | \
- with_site_modules | \
+ with_site_modules | \
with_x | \
with_x11 | \
with_msw | \
with_jpeg | \
with_png | \
with_tiff | \
- with_wmcommand | \
+ with_session | \
with_xmu | \
with_purify | \
with_quantify | \
malloc ) error_check_malloc=yes ;;
nomalloc ) error_check_malloc=no ;;
- byte_code ) error_check_byte_code=yes ;;
- nobyte_code ) error_check_byte_code=no ;;
-
* ) bogus_error_check=yes ;;
esac
if test "$bogus_error_check" -o \
\( -n "$new_default" -a -n "$echeck_notfirst" \) ; then
if test "$error_check_default" = yes ; then
- types="\`all' (default), \`none', \`noextents', \`notypecheck', \`nobufpos', \`nogc', \`nomalloc', and \`nobyte-code'."
+ types="\`all' (default), \`none', \`noextents', \`notypecheck', \`nobufpos', \`nogc', and \`nomalloc'."
else
- types="\`all', \`none' (default), \`extents', \`typecheck', \`bufpos', \`gc', \`malloc', and \`byte-code'."
+ types="\`all', \`none' (default), \`extents', \`typecheck', \`bufpos', \`gc', and \`malloc'."
fi
(echo "$progname: Usage error:"
echo " " "Valid types for the \`--$optname' option are:
error_check_bufpos=$new_default
error_check_gc=$new_default
error_check_malloc=$new_default
- error_check_byte_code=$new_default
new_default= # reset this
fi
echeck_notfirst=true
eval "$opt=\"$val\""
case "$opt" in
- exec_prefix ) { test "$extra_verbose" = "yes" && cat << \EOF
- Defining EXEC_PREFIX_USER_DEFINED
-EOF
-cat >> confdefs.h <<\EOF
-#define EXEC_PREFIX_USER_DEFINED 1
-EOF
-}
- ;;
lispdir ) { test "$extra_verbose" = "yes" && cat << \EOF
Defining LISPDIR_USER_DEFINED
EOF
EOF
}
;;
- docdir ) { test "$extra_verbose" = "yes" && cat << \EOF
- Defining DOCDIR_USER_DEFINED
-EOF
-cat >> confdefs.h <<\EOF
-#define DOCDIR_USER_DEFINED 1
-EOF
-}
- ;;
exec_prefix | libdir | archlibdir ) { test "$extra_verbose" = "yes" && cat << \EOF
Defining ARCHLIBDIR_USER_DEFINED
EOF
"with_menubars" | \
"with_scrollbars" | \
- "with_dialogs" | \
- "with_widgets" )
+ "with_dialogs" )
case "$val" in
l | lu | luc | luci | lucid ) val=lucid ;;
m | mo | mot | moti | motif ) val=motif ;;
fi
echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
-echo "configure:794: checking whether ln -s works" >&5
+echo "configure:767: checking whether ln -s works" >&5
rm -f conftestdata
if ln -s X conftestdata 2>/dev/null
fi
. "$srcdir/version.sh" || exit 1;
-if test -n "$emacs_is_beta"; then beta=yes; else beta=no; fi
+if test -n "$emacs_beta_version"; then beta=yes; else beta=no; fi
: "${extra_verbose=$beta}"
version="${emacs_major_version}.${emacs_minor_version}"
{ test "$extra_verbose" = "yes" && cat << EOF
EOF
}
-if test -n "$emacs_beta_version" ; then
- if test "$beta" = "yes"; then
- version="${version}-b${emacs_beta_version}"
- { test "$extra_verbose" = "yes" && cat << EOF
+if test -n "$emacs_beta_version"; then
+ version="${version}-b${emacs_beta_version}"
+ { test "$extra_verbose" = "yes" && cat << EOF
Defining EMACS_BETA_VERSION = $emacs_beta_version
EOF
cat >> confdefs.h <<EOF
EOF
}
- else
- version="${version}.${emacs_beta_version}"
- { test "$extra_verbose" = "yes" && cat << EOF
- Defining EMACS_PATCH_LEVEL = $emacs_beta_version
-EOF
-cat >> confdefs.h <<EOF
-#define EMACS_PATCH_LEVEL $emacs_beta_version
-EOF
-}
-
- fi
fi
{ test "$extra_verbose" = "yes" && cat << EOF
Defining XEMACS_CODENAME = "$xemacs_codename"
if test "$with_infodock" = "yes"; then
- if test ! -f ../../ID-INSTALL; then
+ if test ! -f ../ID-INSTALL; then
echo "Cannot build InfoDock without InfoDock sources"
with_infodock=no
fi
PROGNAME=xemacs
fi
-if test -n "$emacs_is_beta"; then beta=yes; else beta=no; fi
+if test -n "$emacs_beta_version"; then beta=yes; else beta=no; fi
test "${error_check_extents=$beta}" = yes && { test "$extra_verbose" = "yes" && cat << \EOF
Defining ERROR_CHECK_EXTENTS
EOF
EOF
}
-test "${error_check_byte_code=$beta}" = yes && { test "$extra_verbose" = "yes" && cat << \EOF
- Defining ERROR_CHECK_BYTE_CODE
-EOF
-cat >> confdefs.h <<\EOF
-#define ERROR_CHECK_BYTE_CODE 1
-EOF
-}
-
if test "${debug:=$beta}" = "yes"; then
use_assertions=yes memory_usage_stats=yes
extra_objs="$extra_objs debug.o" && if test "$extra_verbose" = "yes"; then
echo $ac_n "checking "host system type"""... $ac_c" 1>&6
-echo "configure:1039: checking "host system type"" >&5
+echo "configure:992: checking "host system type"" >&5
internal_configuration=`echo $configuration | sed 's/-\(workshop\)//'`
canonical=`${CONFIG_SHELL-/bin/sh} $srcdir/config.sub "$internal_configuration"`
configuration=`echo "$configuration" | sed 's/^\([^-][^-]*-[^-][^-]*-[^-][^-]*\)-.*$/\1/'`
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1531: checking for $ac_word" >&5
+echo "configure:1484: checking for $ac_word" >&5
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
test -z "$ac_dir" && ac_dir=.
if test -f $ac_dir/$ac_word; then
ac_cv_prog_CC="gcc"
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1558: checking for $ac_word" >&5
+echo "configure:1510: checking for $ac_word" >&5
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
ac_prog_rejected=no
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
+ for ac_dir in $PATH; do
test -z "$ac_dir" && ac_dir=.
if test -f $ac_dir/$ac_word; then
if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
echo "$ac_t""no" 1>&6
fi
- if test -z "$CC"; then
- case "`uname -s`" in
- *win32* | *WIN32*)
- # Extract the first word of "cl", so it can be a program name with args.
-set dummy cl; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1606: checking for $ac_word" >&5
-
-if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_prog_CC="cl"
- break
- fi
- done
- IFS="$ac_save_ifs"
-fi
-CC="$ac_cv_prog_CC"
-if test -n "$CC"; then
- echo "$ac_t""$CC" 1>&6
-else
- echo "$ac_t""no" 1>&6
-fi
- ;;
- esac
- fi
test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:1635: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:1555: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
ac_ext=c
xe_cppflags='$CPPFLAGS $c_switch_site $c_switch_machine $c_switch_system $c_switch_x_site $X_CFLAGS'
ac_link='${CC-cc} -o conftest $CFLAGS '"$xe_cppflags $xe_ldflags"' conftest.$ac_ext '"$xe_libs"' 1>&5'
cross_compiling=no
-cat > conftest.$ac_ext << EOF
-
-#line 1648 "configure"
+cat > conftest.$ac_ext <<EOF
+#line 1567 "configure"
#include "confdefs.h"
-
main(){return(0);}
EOF
-if { (eval echo configure:1653: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1571: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
ac_cv_prog_cc_works=yes
# If we can't run a trivial program, we are probably using a cross compiler.
if (./conftest; exit) 2>/dev/null; then
ac_cv_prog_cc_works=no
fi
rm -fr conftest*
-ac_ext=c
-xe_cppflags='$CPPFLAGS $c_switch_site $c_switch_machine $c_switch_system $c_switch_x_site $X_CFLAGS'
-xe_ldflags='$LDFLAGS $ld_switch_site $ld_switch_machine $ld_switch_system $ld_switch_x_site $ld_switch_run'
-xe_libs='$ld_call_shared $xe_check_libs $X_EXTRA_LIBS $libs_x $X_PRE_LIBS $LIBS $libs_machine $libs_system $libs_standard'
-ac_cpp='$CPP '"$xe_cppflags"
-ac_compile='${CC-cc} -c $CFLAGS '"$xe_cppflags"' conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest $CFLAGS '"$xe_cppflags $xe_ldflags"' conftest.$ac_ext '"$xe_libs"' 1>&5'
-cross_compiling=no
echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
if test $ac_cv_prog_cc_works = no; then
{ echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:1681: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:1591: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
cross_compiling=$ac_cv_prog_cc_cross
echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:1686: checking whether we are using GNU C" >&5
+echo "configure:1596: checking whether we are using GNU C" >&5
cat > conftest.c <<EOF
#ifdef __GNUC__
yes;
#endif
EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1693: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1603: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
ac_cv_prog_gcc=yes
else
ac_cv_prog_gcc=no
if test $ac_cv_prog_gcc = yes; then
GCC=yes
-else
- GCC=
-fi
-
-ac_test_CFLAGS="${CFLAGS+set}"
-ac_save_CFLAGS="$CFLAGS"
-CFLAGS=
-echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:1711: checking whether ${CC-cc} accepts -g" >&5
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=
+ echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:1617: checking whether ${CC-cc} accepts -g" >&5
echo 'void f(){}' > conftest.c
if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
-if test "$ac_test_CFLAGS" = set; then
- CFLAGS="$ac_save_CFLAGS"
-elif test $ac_cv_prog_cc_g = yes; then
- if test "$GCC" = yes; then
+ if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+ elif test $ac_cv_prog_cc_g = yes; then
CFLAGS="-g -O2"
else
- CFLAGS="-g"
- fi
-else
- if test "$GCC" = yes; then
CFLAGS="-O2"
- else
- CFLAGS=
fi
+else
+ GCC=
+ test "${CFLAGS+set}" = set || CFLAGS="-g"
fi
if test "$with_gcc" = "no" -a "$GCC" = "yes"; then
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1744: checking for $ac_word" >&5
+echo "configure:1646: checking for $ac_word" >&5
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
test -z "$ac_dir" && ac_dir=.
if test -f $ac_dir/$ac_word; then
ac_cv_prog_CC="gcc"
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1771: checking for $ac_word" >&5
+echo "configure:1672: checking for $ac_word" >&5
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
ac_prog_rejected=no
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
+ for ac_dir in $PATH; do
test -z "$ac_dir" && ac_dir=.
if test -f $ac_dir/$ac_word; then
if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
echo "$ac_t""no" 1>&6
fi
- if test -z "$CC"; then
- case "`uname -s`" in
- *win32* | *WIN32*)
- # Extract the first word of "cl", so it can be a program name with args.
-set dummy cl; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1819: checking for $ac_word" >&5
-
-if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_prog_CC="cl"
- break
- fi
- done
- IFS="$ac_save_ifs"
-fi
-CC="$ac_cv_prog_CC"
-if test -n "$CC"; then
- echo "$ac_t""$CC" 1>&6
-else
- echo "$ac_t""no" 1>&6
-fi
- ;;
- esac
- fi
test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:1848: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:1717: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
ac_ext=c
xe_cppflags='$CPPFLAGS $c_switch_site $c_switch_machine $c_switch_system $c_switch_x_site $X_CFLAGS'
ac_link='${CC-cc} -o conftest $CFLAGS '"$xe_cppflags $xe_ldflags"' conftest.$ac_ext '"$xe_libs"' 1>&5'
cross_compiling=no
-cat > conftest.$ac_ext << EOF
-
-#line 1861 "configure"
+cat > conftest.$ac_ext <<EOF
+#line 1729 "configure"
#include "confdefs.h"
-
main(){return(0);}
EOF
-if { (eval echo configure:1866: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1733: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
ac_cv_prog_cc_works=yes
# If we can't run a trivial program, we are probably using a cross compiler.
if (./conftest; exit) 2>/dev/null; then
ac_cv_prog_cc_works=no
fi
rm -fr conftest*
-ac_ext=c
-xe_cppflags='$CPPFLAGS $c_switch_site $c_switch_machine $c_switch_system $c_switch_x_site $X_CFLAGS'
-xe_ldflags='$LDFLAGS $ld_switch_site $ld_switch_machine $ld_switch_system $ld_switch_x_site $ld_switch_run'
-xe_libs='$ld_call_shared $xe_check_libs $X_EXTRA_LIBS $libs_x $X_PRE_LIBS $LIBS $libs_machine $libs_system $libs_standard'
-ac_cpp='$CPP '"$xe_cppflags"
-ac_compile='${CC-cc} -c $CFLAGS '"$xe_cppflags"' conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest $CFLAGS '"$xe_cppflags $xe_ldflags"' conftest.$ac_ext '"$xe_libs"' 1>&5'
-cross_compiling=no
echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
if test $ac_cv_prog_cc_works = no; then
{ echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:1894: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:1753: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
cross_compiling=$ac_cv_prog_cc_cross
echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:1899: checking whether we are using GNU C" >&5
+echo "configure:1758: checking whether we are using GNU C" >&5
cat > conftest.c <<EOF
#ifdef __GNUC__
yes;
#endif
EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1906: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1765: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
ac_cv_prog_gcc=yes
else
ac_cv_prog_gcc=no
if test $ac_cv_prog_gcc = yes; then
GCC=yes
-else
- GCC=
-fi
-
-ac_test_CFLAGS="${CFLAGS+set}"
-ac_save_CFLAGS="$CFLAGS"
-CFLAGS=
-echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:1924: checking whether ${CC-cc} accepts -g" >&5
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=
+ echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:1779: checking whether ${CC-cc} accepts -g" >&5
echo 'void f(){}' > conftest.c
if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
-if test "$ac_test_CFLAGS" = set; then
- CFLAGS="$ac_save_CFLAGS"
-elif test $ac_cv_prog_cc_g = yes; then
- if test "$GCC" = yes; then
+ if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+ elif test $ac_cv_prog_cc_g = yes; then
CFLAGS="-g -O2"
else
- CFLAGS="-g"
- fi
-else
- if test "$GCC" = yes; then
CFLAGS="-O2"
- else
- CFLAGS=
fi
+else
+ GCC=
+ test "${CFLAGS+set}" = set || CFLAGS="-g"
fi
elif test "$with_gcc" = "yes" -a "$GCC" != "yes" ; then
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1957: checking for $ac_word" >&5
+echo "configure:1808: checking for $ac_word" >&5
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
test -z "$ac_dir" && ac_dir=.
if test -f $ac_dir/$ac_word; then
ac_cv_prog_CC="gcc"
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1984: checking for $ac_word" >&5
+echo "configure:1834: checking for $ac_word" >&5
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
ac_prog_rejected=no
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
+ for ac_dir in $PATH; do
test -z "$ac_dir" && ac_dir=.
if test -f $ac_dir/$ac_word; then
if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
echo "$ac_t""no" 1>&6
fi
- if test -z "$CC"; then
- case "`uname -s`" in
- *win32* | *WIN32*)
- # Extract the first word of "cl", so it can be a program name with args.
-set dummy cl; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2032: checking for $ac_word" >&5
-
-if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_prog_CC="cl"
- break
- fi
- done
- IFS="$ac_save_ifs"
-fi
-CC="$ac_cv_prog_CC"
-if test -n "$CC"; then
- echo "$ac_t""$CC" 1>&6
-else
- echo "$ac_t""no" 1>&6
-fi
- ;;
- esac
- fi
test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:2061: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:1879: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
ac_ext=c
xe_cppflags='$CPPFLAGS $c_switch_site $c_switch_machine $c_switch_system $c_switch_x_site $X_CFLAGS'
ac_link='${CC-cc} -o conftest $CFLAGS '"$xe_cppflags $xe_ldflags"' conftest.$ac_ext '"$xe_libs"' 1>&5'
cross_compiling=no
-cat > conftest.$ac_ext << EOF
-
-#line 2074 "configure"
+cat > conftest.$ac_ext <<EOF
+#line 1891 "configure"
#include "confdefs.h"
-
main(){return(0);}
EOF
-if { (eval echo configure:2079: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1895: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
ac_cv_prog_cc_works=yes
# If we can't run a trivial program, we are probably using a cross compiler.
if (./conftest; exit) 2>/dev/null; then
ac_cv_prog_cc_works=no
fi
rm -fr conftest*
-ac_ext=c
-xe_cppflags='$CPPFLAGS $c_switch_site $c_switch_machine $c_switch_system $c_switch_x_site $X_CFLAGS'
-xe_ldflags='$LDFLAGS $ld_switch_site $ld_switch_machine $ld_switch_system $ld_switch_x_site $ld_switch_run'
-xe_libs='$ld_call_shared $xe_check_libs $X_EXTRA_LIBS $libs_x $X_PRE_LIBS $LIBS $libs_machine $libs_system $libs_standard'
-ac_cpp='$CPP '"$xe_cppflags"
-ac_compile='${CC-cc} -c $CFLAGS '"$xe_cppflags"' conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest $CFLAGS '"$xe_cppflags $xe_ldflags"' conftest.$ac_ext '"$xe_libs"' 1>&5'
-cross_compiling=no
echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
if test $ac_cv_prog_cc_works = no; then
{ echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:2107: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:1915: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
cross_compiling=$ac_cv_prog_cc_cross
echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:2112: checking whether we are using GNU C" >&5
+echo "configure:1920: checking whether we are using GNU C" >&5
cat > conftest.c <<EOF
#ifdef __GNUC__
yes;
#endif
EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:2119: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1927: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
ac_cv_prog_gcc=yes
else
ac_cv_prog_gcc=no
if test $ac_cv_prog_gcc = yes; then
GCC=yes
-else
- GCC=
-fi
-
-ac_test_CFLAGS="${CFLAGS+set}"
-ac_save_CFLAGS="$CFLAGS"
-CFLAGS=
-echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:2137: checking whether ${CC-cc} accepts -g" >&5
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=
+ echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:1941: checking whether ${CC-cc} accepts -g" >&5
echo 'void f(){}' > conftest.c
if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
-if test "$ac_test_CFLAGS" = set; then
- CFLAGS="$ac_save_CFLAGS"
-elif test $ac_cv_prog_cc_g = yes; then
- if test "$GCC" = yes; then
+ if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+ elif test $ac_cv_prog_cc_g = yes; then
CFLAGS="-g -O2"
else
- CFLAGS="-g"
- fi
-else
- if test "$GCC" = yes; then
CFLAGS="-O2"
- else
- CFLAGS=
fi
+else
+ GCC=
+ test "${CFLAGS+set}" = set || CFLAGS="-g"
fi
fi
test -n "$NON_GNU_CPP" -a "$GCC" != "yes" -a -z "$CPP" && CPP="$NON_GNU_CPP"
echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:2174: checking how to run the C preprocessor" >&5
+echo "configure:1974: checking how to run the C preprocessor" >&5
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
CPP=
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp.
cat > conftest.$ac_ext <<EOF
-#line 2187 "configure"
+#line 1987 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2193: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:1993: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
:
else
rm -rf conftest*
CPP="${CC-cc} -E -traditional-cpp"
cat > conftest.$ac_ext <<EOF
-#line 2204 "configure"
-#include "confdefs.h"
-#include <assert.h>
-Syntax Error
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2210: \"$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
- :
-else
- echo "$ac_err" >&5
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- CPP="${CC-cc} -nologo -E"
- cat > conftest.$ac_ext <<EOF
-#line 2221 "configure"
+#line 2004 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2227: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:2010: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
:
else
rm -f conftest*
fi
rm -f conftest*
-fi
-rm -f conftest*
ac_cv_prog_CPP="$CPP"
CPP="$ac_cv_prog_CPP"
else
echo $ac_n "checking for AIX""... $ac_c" 1>&6
-echo "configure:2252: checking for AIX" >&5
+echo "configure:2033: checking for AIX" >&5
cat > conftest.$ac_ext <<EOF
-#line 2254 "configure"
+#line 2035 "configure"
#include "confdefs.h"
#ifdef _AIX
yes
echo $ac_n "checking for GNU libc""... $ac_c" 1>&6
-echo "configure:2281: checking for GNU libc" >&5
+echo "configure:2062: checking for GNU libc" >&5
cat > conftest.$ac_ext <<EOF
-#line 2283 "configure"
+#line 2064 "configure"
#include "confdefs.h"
#include <features.h>
int main() {
; return 0; }
EOF
-if { (eval echo configure:2295: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2076: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
have_glibc=yes
else
cat > conftest.$ac_ext <<EOF
-#line 2317 "configure"
+#line 2098 "configure"
#include "confdefs.h"
int main () {
#if defined __SUNPRO_C
#endif
}
EOF
-if { (eval echo configure:2329: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:2110: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
then
:
else
fi
echo $ac_n "checking for dynodump""... $ac_c" 1>&6
-echo "configure:2603: checking for dynodump" >&5
+echo "configure:2384: checking for dynodump" >&5
if test "$unexec" != "unexsol2.o"; then
echo "$ac_t""no" 1>&6
else
done
echo $ac_n "checking for terminateAndUnload in -lC""... $ac_c" 1>&6
-echo "configure:2641: checking for terminateAndUnload in -lC" >&5
+echo "configure:2422: checking for terminateAndUnload in -lC" >&5
ac_lib_var=`echo C'_'terminateAndUnload | sed 'y%./+-%__p_%'`
xe_check_libs=" -lC "
cat > conftest.$ac_ext <<EOF
-#line 2646 "configure"
+#line 2427 "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
terminateAndUnload()
; return 0; }
EOF
-if { (eval echo configure:2657: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2438: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
case "$site_prefixes" in *:* ) site_prefixes="`echo '' $site_prefixes | sed -e 's/^ //' -e 's/:/ /g'`";; esac
if test -n "$site_prefixes"; then
for dir in $site_prefixes; do
- lib_dir="${dir}/lib"
inc_dir="${dir}/include"
+ lib_dir="${dir}/lib"
if test ! -d "$dir"; then
{ echo "Error:" "Invalid site prefix \`$dir': no such directory" >&2; exit 1; }
+ elif test ! -d "$inc_dir"; then
+ { echo "Error:" "Invalid site prefix \`$dir': no such directory \`$inc_dir'" >&2; exit 1; }
elif test ! -d "$lib_dir"; then
{ echo "Error:" "Invalid site prefix \`$dir': no such directory \`$lib_dir'" >&2; exit 1; }
else
- if test -d "$inc_dir"; then
- c_switch_site="$c_switch_site "-I$inc_dir"" && if test "$extra_verbose" = "yes"; then echo " Appending \""-I$inc_dir"\" to \$c_switch_site"; fi
- fi
+ c_switch_site="$c_switch_site "-I$inc_dir"" && if test "$extra_verbose" = "yes"; then echo " Appending \""-I$inc_dir"\" to \$c_switch_site"; fi
ld_switch_site="$ld_switch_site "-L$lib_dir"" && if test "$extra_verbose" = "yes"; then echo " Appending \""-L$lib_dir"\" to \$ld_switch_site"; fi
fi
done
if test "$add_runtime_path" = "yes"; then
echo $ac_n "checking "for runtime libraries flag"""... $ac_c" 1>&6
-echo "configure:2761: checking "for runtime libraries flag"" >&5
+echo "configure:2542: checking "for runtime libraries flag"" >&5
case "$opsys" in
sol2 ) dash_r="-R" ;;
decosf* | linux* | irix*) dash_r="-rpath " ;;
done
fi
cat > conftest.$ac_ext <<EOF
-#line 2783 "configure"
+#line 2564 "configure"
#include "confdefs.h"
int main() {
; return 0; }
EOF
-if { (eval echo configure:2790: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2571: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
dash_r="$try_dash_r"
else
fi
after_morecore_hook_exists=yes
echo $ac_n "checking for malloc_get_state""... $ac_c" 1>&6
-echo "configure:2892: checking for malloc_get_state" >&5
+echo "configure:2673: checking for malloc_get_state" >&5
cat > conftest.$ac_ext <<EOF
-#line 2895 "configure"
+#line 2676 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char malloc_get_state(); below. */
; return 0; }
EOF
-if { (eval echo configure:2918: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2699: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_func_malloc_get_state=yes"
else
fi
echo $ac_n "checking for malloc_set_state""... $ac_c" 1>&6
-echo "configure:2938: checking for malloc_set_state" >&5
+echo "configure:2719: checking for malloc_set_state" >&5
cat > conftest.$ac_ext <<EOF
-#line 2941 "configure"
+#line 2722 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char malloc_set_state(); below. */
; return 0; }
EOF
-if { (eval echo configure:2964: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2745: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_func_malloc_set_state=yes"
else
fi
echo $ac_n "checking whether __after_morecore_hook exists""... $ac_c" 1>&6
-echo "configure:2984: checking whether __after_morecore_hook exists" >&5
+echo "configure:2765: checking whether __after_morecore_hook exists" >&5
cat > conftest.$ac_ext <<EOF
-#line 2986 "configure"
+#line 2767 "configure"
#include "confdefs.h"
extern void (* __after_morecore_hook)();
int main() {
__after_morecore_hook = 0
; return 0; }
EOF
-if { (eval echo configure:2993: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2774: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
echo "$ac_t""yes" 1>&6
else
# Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3052: checking for $ac_word" >&5
+echo "configure:2833: checking for $ac_word" >&5
if test -n "$RANLIB"; then
ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
test -z "$ac_dir" && ac_dir=.
if test -f $ac_dir/$ac_word; then
ac_cv_prog_RANLIB="ranlib"
# SunOS /usr/etc/install
# IRIX /sbin/install
# AIX /bin/install
-# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
# AFS /usr/afsws/bin/install, which mishandles nonexistent args
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
# ./install, which can be erroneously created by make from ./install.sh.
echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:3107: checking for a BSD compatible install" >&5
+echo "configure:2886: checking for a BSD compatible install" >&5
if test -z "$INSTALL"; then
- IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":"
+ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS="${IFS}:"
for ac_dir in $PATH; do
# Account for people who put trailing slashes in PATH elements.
case "$ac_dir/" in
/|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
*)
# OSF1 and SCO ODT 3.0 have their own names for install.
- # Don't use installbsd from OSF since it installs stuff as root
- # by default.
- for ac_prog in ginstall scoinst install; do
+ for ac_prog in ginstall installbsd scoinst install; do
if test -f $ac_dir/$ac_prog; then
if test $ac_prog = install &&
grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
# AIX install. It has an incompatible calling convention.
+ # OSF/1 installbsd also uses dspmsg, but is usable.
:
else
ac_cv_path_install="$ac_dir/$ac_prog -c"
# It thinks the first close brace ends the variable substitution.
test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
-
test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
for ac_prog in 'bison -y' byacc
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3161: checking for $ac_word" >&5
+echo "configure:2937: checking for $ac_word" >&5
if test -n "$YACC"; then
ac_cv_prog_YACC="$YACC" # Let the user override the test.
else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
test -z "$ac_dir" && ac_dir=.
if test -f $ac_dir/$ac_word; then
ac_cv_prog_YACC="$ac_prog"
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:3193: checking for $ac_hdr" >&5
+echo "configure:2968: checking for $ac_hdr" >&5
cat > conftest.$ac_ext <<EOF
-#line 3196 "configure"
+#line 2971 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3201: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:2976: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:3234: checking for $ac_hdr" >&5
+echo "configure:3009: checking for $ac_hdr" >&5
cat > conftest.$ac_ext <<EOF
-#line 3237 "configure"
+#line 3012 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3242: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:3017: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:3275: checking for $ac_hdr" >&5
+echo "configure:3050: checking for $ac_hdr" >&5
cat > conftest.$ac_ext <<EOF
-#line 3278 "configure"
+#line 3053 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3283: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:3058: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
done
echo $ac_n "checking for sys/wait.h that is POSIX.1 compatible""... $ac_c" 1>&6
-echo "configure:3313: checking for sys/wait.h that is POSIX.1 compatible" >&5
+echo "configure:3088: checking for sys/wait.h that is POSIX.1 compatible" >&5
cat > conftest.$ac_ext <<EOF
-#line 3316 "configure"
+#line 3091 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/wait.h>
s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
; return 0; }
EOF
-if { (eval echo configure:3332: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3107: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_header_sys_wait_h=yes
else
fi
echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:3356: checking for ANSI C header files" >&5
+echo "configure:3131: checking for ANSI C header files" >&5
cat > conftest.$ac_ext <<EOF
-#line 3359 "configure"
+#line 3134 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <stdarg.h>
#include <float.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3367: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:3142: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
ac_cv_header_stdc=yes
if test $ac_cv_header_stdc = yes; then
# SunOS 4.x string.h does not declare mem*, contrary to ANSI.
cat > conftest.$ac_ext <<EOF
-#line 3384 "configure"
+#line 3159 "configure"
#include "confdefs.h"
#include <string.h>
EOF
if test $ac_cv_header_stdc = yes; then
# ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
cat > conftest.$ac_ext <<EOF
-#line 3402 "configure"
+#line 3177 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
if test $ac_cv_header_stdc = yes; then
# /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
cat > conftest.$ac_ext <<EOF
-#line 3420 "configure"
+#line 3195 "configure"
#include "confdefs.h"
#include <ctype.h>
#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
exit (0); }
EOF
-if { (eval echo configure:3431: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:3206: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
then
:
else
fi
echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6
-echo "configure:3457: checking whether time.h and sys/time.h may both be included" >&5
+echo "configure:3232: checking whether time.h and sys/time.h may both be included" >&5
cat > conftest.$ac_ext <<EOF
-#line 3460 "configure"
+#line 3235 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/time.h>
struct tm *tp;
; return 0; }
EOF
-if { (eval echo configure:3469: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3244: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_header_time=yes
else
fi
echo $ac_n "checking for sys_siglist declaration in signal.h or unistd.h""... $ac_c" 1>&6
-echo "configure:3493: checking for sys_siglist declaration in signal.h or unistd.h" >&5
+echo "configure:3268: checking for sys_siglist declaration in signal.h or unistd.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 3496 "configure"
+#line 3271 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <signal.h>
char *msg = *(sys_siglist + 1);
; return 0; }
EOF
-if { (eval echo configure:3508: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3283: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_decl_sys_siglist=yes
else
echo $ac_n "checking for struct utimbuf""... $ac_c" 1>&6
-echo "configure:3533: checking for struct utimbuf" >&5
+echo "configure:3308: checking for struct utimbuf" >&5
cat > conftest.$ac_ext <<EOF
-#line 3535 "configure"
+#line 3310 "configure"
#include "confdefs.h"
#ifdef TIME_WITH_SYS_TIME
#include <sys/time.h>
static struct utimbuf x; x.actime = x.modtime;
; return 0; }
EOF
-if { (eval echo configure:3554: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3329: \"$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 return type of signal handlers""... $ac_c" 1>&6
-echo "configure:3574: checking return type of signal handlers" >&5
+echo "configure:3349: checking return type of signal handlers" >&5
cat > conftest.$ac_ext <<EOF
-#line 3577 "configure"
+#line 3352 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <signal.h>
int i;
; return 0; }
EOF
-if { (eval echo configure:3594: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3369: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_type_signal=void
else
echo $ac_n "checking for size_t""... $ac_c" 1>&6
-echo "configure:3616: checking for size_t" >&5
+echo "configure:3391: checking for size_t" >&5
cat > conftest.$ac_ext <<EOF
-#line 3619 "configure"
+#line 3394 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
#endif
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+ egrep "size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
rm -rf conftest*
ac_cv_type_size_t=yes
else
fi
echo $ac_n "checking for pid_t""... $ac_c" 1>&6
-echo "configure:3650: checking for pid_t" >&5
+echo "configure:3425: checking for pid_t" >&5
cat > conftest.$ac_ext <<EOF
-#line 3653 "configure"
+#line 3428 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
#endif
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- egrep "(^|[^a-zA-Z_0-9])pid_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+ egrep "pid_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
rm -rf conftest*
ac_cv_type_pid_t=yes
else
fi
echo $ac_n "checking for uid_t in sys/types.h""... $ac_c" 1>&6
-echo "configure:3684: checking for uid_t in sys/types.h" >&5
+echo "configure:3459: checking for uid_t in sys/types.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 3687 "configure"
+#line 3462 "configure"
#include "confdefs.h"
#include <sys/types.h>
EOF
fi
echo $ac_n "checking for mode_t""... $ac_c" 1>&6
-echo "configure:3723: checking for mode_t" >&5
+echo "configure:3498: checking for mode_t" >&5
cat > conftest.$ac_ext <<EOF
-#line 3726 "configure"
+#line 3501 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
#endif
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- egrep "(^|[^a-zA-Z_0-9])mode_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+ egrep "mode_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
rm -rf conftest*
ac_cv_type_mode_t=yes
else
fi
echo $ac_n "checking for off_t""... $ac_c" 1>&6
-echo "configure:3757: checking for off_t" >&5
+echo "configure:3532: checking for off_t" >&5
cat > conftest.$ac_ext <<EOF
-#line 3760 "configure"
+#line 3535 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
#endif
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- egrep "(^|[^a-zA-Z_0-9])off_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+ egrep "off_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
rm -rf conftest*
ac_cv_type_off_t=yes
else
echo $ac_n "checking for struct timeval""... $ac_c" 1>&6
-echo "configure:3792: checking for struct timeval" >&5
+echo "configure:3567: checking for struct timeval" >&5
cat > conftest.$ac_ext <<EOF
-#line 3794 "configure"
+#line 3569 "configure"
#include "confdefs.h"
#ifdef TIME_WITH_SYS_TIME
#include <sys/time.h>
static struct timeval x; x.tv_sec = x.tv_usec;
; return 0; }
EOF
-if { (eval echo configure:3810: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3585: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
echo "$ac_t""yes" 1>&6
HAVE_TIMEVAL=yes
rm -f conftest*
echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6
-echo "configure:3832: checking whether struct tm is in sys/time.h or time.h" >&5
+echo "configure:3607: checking whether struct tm is in sys/time.h or time.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 3835 "configure"
+#line 3610 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <time.h>
struct tm *tp; tp->tm_sec;
; return 0; }
EOF
-if { (eval echo configure:3843: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3618: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_struct_tm=time.h
else
fi
echo $ac_n "checking for tm_zone in struct tm""... $ac_c" 1>&6
-echo "configure:3867: checking for tm_zone in struct tm" >&5
+echo "configure:3642: checking for tm_zone in struct tm" >&5
cat > conftest.$ac_ext <<EOF
-#line 3870 "configure"
+#line 3645 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <$ac_cv_struct_tm>
struct tm tm; tm.tm_zone;
; return 0; }
EOF
-if { (eval echo configure:3878: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3653: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_struct_tm_zone=yes
else
else
echo $ac_n "checking for tzname""... $ac_c" 1>&6
-echo "configure:3901: checking for tzname" >&5
+echo "configure:3676: checking for tzname" >&5
cat > conftest.$ac_ext <<EOF
-#line 3904 "configure"
+#line 3679 "configure"
#include "confdefs.h"
#include <time.h>
#ifndef tzname /* For SGI. */
atoi(*tzname);
; return 0; }
EOF
-if { (eval echo configure:3914: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3689: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
ac_cv_var_tzname=yes
else
echo $ac_n "checking for working const""... $ac_c" 1>&6
-echo "configure:3940: checking for working const" >&5
+echo "configure:3715: checking for working const" >&5
cat > conftest.$ac_ext <<EOF
-#line 3943 "configure"
+#line 3718 "configure"
#include "confdefs.h"
int main() {
; return 0; }
EOF
-if { (eval echo configure:3992: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3767: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_c_const=yes
else
echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:4017: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo "configure:3792: checking whether ${MAKE-make} sets \${MAKE}" >&5
set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
cat > conftestmake <<\EOF
echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6
-echo "configure:4042: checking whether byte ordering is bigendian" >&5
+echo "configure:3817: checking whether byte ordering is bigendian" >&5
ac_cv_c_bigendian=unknown
# See if sys/param.h defines the BYTE_ORDER macro.
cat > conftest.$ac_ext <<EOF
-#line 4047 "configure"
+#line 3822 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/param.h>
#endif
; return 0; }
EOF
-if { (eval echo configure:4058: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3833: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
# It does; now see whether it defined to BIG_ENDIAN or not.
cat > conftest.$ac_ext <<EOF
-#line 4062 "configure"
+#line 3837 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/param.h>
#endif
; return 0; }
EOF
-if { (eval echo configure:4073: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3848: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_c_bigendian=yes
else
rm -f conftest*
if test $ac_cv_c_bigendian = unknown; then
cat > conftest.$ac_ext <<EOF
-#line 4090 "configure"
+#line 3865 "configure"
#include "confdefs.h"
main () {
/* Are we little or big endian? From Harbison&Steele. */
exit (u.c[sizeof (long) - 1] == 1);
}
EOF
-if { (eval echo configure:4103: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:3878: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
then
ac_cv_c_bigendian=no
else
echo $ac_n "checking size of short""... $ac_c" 1>&6
-echo "configure:4130: checking size of short" >&5
+echo "configure:3905: checking size of short" >&5
cat > conftest.$ac_ext <<EOF
-#line 4133 "configure"
+#line 3908 "configure"
#include "confdefs.h"
#include <stdio.h>
main()
exit(0);
}
EOF
-if { (eval echo configure:4144: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:3919: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
then
ac_cv_sizeof_short=`cat conftestval`
else
exit 1
fi
echo $ac_n "checking size of int""... $ac_c" 1>&6
-echo "configure:4172: checking size of int" >&5
+echo "configure:3947: checking size of int" >&5
cat > conftest.$ac_ext <<EOF
-#line 4175 "configure"
+#line 3950 "configure"
#include "confdefs.h"
#include <stdio.h>
main()
exit(0);
}
EOF
-if { (eval echo configure:4186: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:3961: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
then
ac_cv_sizeof_int=`cat conftestval`
else
echo $ac_n "checking size of long""... $ac_c" 1>&6
-echo "configure:4208: checking size of long" >&5
+echo "configure:3983: checking size of long" >&5
cat > conftest.$ac_ext <<EOF
-#line 4211 "configure"
+#line 3986 "configure"
#include "confdefs.h"
#include <stdio.h>
main()
exit(0);
}
EOF
-if { (eval echo configure:4222: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:3997: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
then
ac_cv_sizeof_long=`cat conftestval`
else
echo $ac_n "checking size of long long""... $ac_c" 1>&6
-echo "configure:4244: checking size of long long" >&5
+echo "configure:4019: checking size of long long" >&5
cat > conftest.$ac_ext <<EOF
-#line 4247 "configure"
+#line 4022 "configure"
#include "confdefs.h"
#include <stdio.h>
main()
exit(0);
}
EOF
-if { (eval echo configure:4258: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:4033: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
then
ac_cv_sizeof_long_long=`cat conftestval`
else
echo $ac_n "checking size of void *""... $ac_c" 1>&6
-echo "configure:4280: checking size of void *" >&5
+echo "configure:4055: checking size of void *" >&5
cat > conftest.$ac_ext <<EOF
-#line 4283 "configure"
+#line 4058 "configure"
#include "confdefs.h"
#include <stdio.h>
main()
exit(0);
}
EOF
-if { (eval echo configure:4294: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:4069: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
then
ac_cv_sizeof_void_p=`cat conftestval`
else
echo $ac_n "checking for long file names""... $ac_c" 1>&6
-echo "configure:4317: checking for long file names" >&5
+echo "configure:4092: checking for long file names" >&5
ac_cv_sys_long_file_names=yes
# Test for long file names in all the places we know might matter:
echo $ac_n "checking for sin""... $ac_c" 1>&6
-echo "configure:4363: checking for sin" >&5
+echo "configure:4138: checking for sin" >&5
cat > conftest.$ac_ext <<EOF
-#line 4366 "configure"
+#line 4141 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char sin(); below. */
; return 0; }
EOF
-if { (eval echo configure:4389: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4164: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_func_sin=yes"
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for sin in -lm""... $ac_c" 1>&6
-echo "configure:4407: checking for sin in -lm" >&5
+echo "configure:4182: checking for sin in -lm" >&5
ac_lib_var=`echo m'_'sin | sed 'y%./+-%__p_%'`
xe_check_libs=" -lm "
cat > conftest.$ac_ext <<EOF
-#line 4412 "configure"
+#line 4187 "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
sin()
; return 0; }
EOF
-if { (eval echo configure:4423: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4198: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
cat > conftest.$ac_ext <<EOF
-#line 4467 "configure"
+#line 4242 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
return atanh(1.0) + asinh(1.0) + acosh(1.0);
; return 0; }
EOF
-if { (eval echo configure:4474: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4249: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
{ test "$extra_verbose" = "yes" && cat << \EOF
Defining HAVE_INVERSE_HYPERBOLIC
rm -f conftest*
echo "checking type of mail spool file locking" 1>&6
-echo "configure:4491: checking type of mail spool file locking" >&5
+echo "configure:4266: checking type of mail spool file locking" >&5
test -z "$mail_locking" -a "$mail_use_flock" = "yes" && mail_locking=flock
test -z "$mail_locking" -a "$mail_use_lockf" = "yes" && mail_locking=lockf
if test "$mail_locking" = "lockf"; then { test "$extra_verbose" = "yes" && cat << \EOF
case "$opsys" in decosf*)
echo $ac_n "checking for cma_open in -lpthreads""... $ac_c" 1>&6
-echo "configure:4516: checking for cma_open in -lpthreads" >&5
+echo "configure:4291: checking for cma_open in -lpthreads" >&5
ac_lib_var=`echo pthreads'_'cma_open | sed 'y%./+-%__p_%'`
xe_check_libs=" -lpthreads "
cat > conftest.$ac_ext <<EOF
-#line 4521 "configure"
+#line 4296 "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
cma_open()
; return 0; }
EOF
-if { (eval echo configure:4532: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4307: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
esac
echo $ac_n "checking whether the -xildoff compiler flag is required""... $ac_c" 1>&6
-echo "configure:4568: checking whether the -xildoff compiler flag is required" >&5
+echo "configure:4343: checking whether the -xildoff compiler flag is required" >&5
if ${CC-cc} '-###' -xildon no_such_file.c 2>&1 | grep '^[^ ]*/ild ' > /dev/null ; then
if ${CC-cc} '-###' -xildoff no_such_file.c 2>&1 | grep '^[^ ]*/ild ' > /dev/null ;
then echo "$ac_t""no" 1>&6;
if test "$opsys" = "sol2" && test "$OS_RELEASE" -ge 56; then
echo $ac_n "checking for \"-z ignore\" linker flag""... $ac_c" 1>&6
-echo "configure:4579: checking for \"-z ignore\" linker flag" >&5
+echo "configure:4354: checking for \"-z ignore\" linker flag" >&5
case "`ld -h 2>&1`" in
*-z\ ignore\|record* ) echo "$ac_t""yes" 1>&6
ld_switch_site="-z ignore $ld_switch_site" && if test "$extra_verbose" = "yes"; then echo " Prepending \"-z ignore\" to \$ld_switch_site"; fi ;;
echo "checking "for specified window system"" 1>&6
-echo "configure:4589: checking "for specified window system"" >&5
+echo "configure:4364: checking "for specified window system"" >&5
if test "$with_x11" != "no"; then
test "$x_includes $x_libraries" != "NONE NONE" && \
# Uses ac_ vars as temps to allow command line to override cache and checks.
# --without-x overrides everything else, but does not touch the cache.
echo $ac_n "checking for X""... $ac_c" 1>&6
-echo "configure:4622: checking for X" >&5
+echo "configure:4397: checking for X" >&5
# Check whether --with-x or --without-x was given.
if test "${with_x+set}" = set; then
# First, try using that file with no special directory specified.
cat > conftest.$ac_ext <<EOF
-#line 4682 "configure"
+#line 4457 "configure"
#include "confdefs.h"
#include <$x_direct_test_include>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4687: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:4462: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
# We can compile using X headers with no special include directory.
ac_save_LIBS="$LIBS"
LIBS="-l$x_direct_test_library $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 4756 "configure"
+#line 4531 "configure"
#include "confdefs.h"
int main() {
${x_direct_test_function}()
; return 0; }
EOF
-if { (eval echo configure:4763: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4538: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
LIBS="$ac_save_LIBS"
# We can link X programs with no special library path.
case "`(uname -sr) 2>/dev/null`" in
"SunOS 5"*)
echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6
-echo "configure:4872: checking whether -R must be followed by a space" >&5
+echo "configure:4647: checking whether -R must be followed by a space" >&5
ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries"
cat > conftest.$ac_ext <<EOF
-#line 4875 "configure"
+#line 4650 "configure"
#include "confdefs.h"
int main() {
; return 0; }
EOF
-if { (eval echo configure:4882: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4657: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
ac_R_nospace=yes
else
else
LIBS="$ac_xsave_LIBS -R $x_libraries"
cat > conftest.$ac_ext <<EOF
-#line 4898 "configure"
+#line 4673 "configure"
#include "confdefs.h"
int main() {
; return 0; }
EOF
-if { (eval echo configure:4905: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4680: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
ac_R_space=yes
else
else
echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6
-echo "configure:4941: checking for dnet_ntoa in -ldnet" >&5
+echo "configure:4716: checking for dnet_ntoa in -ldnet" >&5
ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'`
xe_check_libs=" -ldnet "
cat > conftest.$ac_ext <<EOF
-#line 4946 "configure"
+#line 4721 "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
dnet_ntoa()
; return 0; }
EOF
-if { (eval echo configure:4957: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4732: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
if test $ac_cv_lib_dnet_dnet_ntoa = no; then
echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6
-echo "configure:4981: checking for dnet_ntoa in -ldnet_stub" >&5
+echo "configure:4756: checking for dnet_ntoa in -ldnet_stub" >&5
ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'`
xe_check_libs=" -ldnet_stub "
cat > conftest.$ac_ext <<EOF
-#line 4986 "configure"
+#line 4761 "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
dnet_ntoa()
; return 0; }
EOF
-if { (eval echo configure:4997: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4772: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
# The nsl library prevents programs from opening the X display
# on Irix 5.2, according to dickey@clark.net.
echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
-echo "configure:5026: checking for gethostbyname" >&5
+echo "configure:4801: checking for gethostbyname" >&5
cat > conftest.$ac_ext <<EOF
-#line 5029 "configure"
+#line 4804 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char gethostbyname(); below. */
; return 0; }
EOF
-if { (eval echo configure:5052: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4827: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_func_gethostbyname=yes"
else
if test $ac_cv_func_gethostbyname = no; then
echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6
-echo "configure:5073: checking for gethostbyname in -lnsl" >&5
+echo "configure:4848: checking for gethostbyname in -lnsl" >&5
ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'`
xe_check_libs=" -lnsl "
cat > conftest.$ac_ext <<EOF
-#line 5078 "configure"
+#line 4853 "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
gethostbyname()
; return 0; }
EOF
-if { (eval echo configure:5089: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4864: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
# -lsocket must be given before -lnsl if both are needed.
# We assume that if connect needs -lnsl, so does gethostbyname.
echo $ac_n "checking for connect""... $ac_c" 1>&6
-echo "configure:5119: checking for connect" >&5
+echo "configure:4894: checking for connect" >&5
cat > conftest.$ac_ext <<EOF
-#line 5122 "configure"
+#line 4897 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char connect(); below. */
; return 0; }
EOF
-if { (eval echo configure:5145: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4920: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_func_connect=yes"
else
xe_msg_checking="for connect in -lsocket"
test -n "$X_EXTRA_LIBS" && xe_msg_checking="$xe_msg_checking using extra libs $X_EXTRA_LIBS"
echo $ac_n "checking "$xe_msg_checking"""... $ac_c" 1>&6
-echo "configure:5168: checking "$xe_msg_checking"" >&5
+echo "configure:4943: checking "$xe_msg_checking"" >&5
ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'`
xe_check_libs=" -lsocket $X_EXTRA_LIBS"
cat > conftest.$ac_ext <<EOF
-#line 5173 "configure"
+#line 4948 "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
connect()
; return 0; }
EOF
-if { (eval echo configure:5184: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4959: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
# gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX.
echo $ac_n "checking for remove""... $ac_c" 1>&6
-echo "configure:5208: checking for remove" >&5
+echo "configure:4983: checking for remove" >&5
cat > conftest.$ac_ext <<EOF
-#line 5211 "configure"
+#line 4986 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char remove(); below. */
; return 0; }
EOF
-if { (eval echo configure:5234: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5009: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_func_remove=yes"
else
if test $ac_cv_func_remove = no; then
echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6
-echo "configure:5255: checking for remove in -lposix" >&5
+echo "configure:5030: checking for remove in -lposix" >&5
ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'`
xe_check_libs=" -lposix "
cat > conftest.$ac_ext <<EOF
-#line 5260 "configure"
+#line 5035 "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
remove()
; return 0; }
EOF
-if { (eval echo configure:5271: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5046: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
# BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
echo $ac_n "checking for shmat""... $ac_c" 1>&6
-echo "configure:5295: checking for shmat" >&5
+echo "configure:5070: checking for shmat" >&5
cat > conftest.$ac_ext <<EOF
-#line 5298 "configure"
+#line 5073 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char shmat(); below. */
; return 0; }
EOF
-if { (eval echo configure:5321: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5096: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_func_shmat=yes"
else
if test $ac_cv_func_shmat = no; then
echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6
-echo "configure:5342: checking for shmat in -lipc" >&5
+echo "configure:5117: checking for shmat in -lipc" >&5
ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'`
xe_check_libs=" -lipc "
cat > conftest.$ac_ext <<EOF
-#line 5347 "configure"
+#line 5122 "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
shmat()
; return 0; }
EOF
-if { (eval echo configure:5358: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5133: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
# libraries we check for below, so use a different variable.
# --interran@uluru.Stanford.EDU, kb@cs.umb.edu.
-xe_msg_checking="for IceConnectionNumber in -lICE"
-test -n "$X_EXTRA_LIBS" && xe_msg_checking="$xe_msg_checking using extra libs $X_EXTRA_LIBS"
-echo $ac_n "checking "$xe_msg_checking"""... $ac_c" 1>&6
-echo "configure:5394: checking "$xe_msg_checking"" >&5
+echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6
+echo "configure:5167: checking for IceConnectionNumber in -lICE" >&5
ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'`
-xe_check_libs=" -lICE $X_EXTRA_LIBS"
+xe_check_libs=" -lICE "
cat > conftest.$ac_ext <<EOF
-#line 5399 "configure"
+#line 5172 "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
IceConnectionNumber()
; return 0; }
EOF
-if { (eval echo configure:5410: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5183: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo "checking for X defines extracted by xmkmf" 1>&6
-echo "configure:5579: checking for X defines extracted by xmkmf" >&5
+echo "configure:5352: checking for X defines extracted by xmkmf" >&5
rm -fr conftestdir
if mkdir conftestdir; then
cd conftestdir
ac_safe=`echo "X11/Intrinsic.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for X11/Intrinsic.h""... $ac_c" 1>&6
-echo "configure:5611: checking for X11/Intrinsic.h" >&5
+echo "configure:5384: checking for X11/Intrinsic.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 5614 "configure"
+#line 5387 "configure"
#include "confdefs.h"
#include <X11/Intrinsic.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5619: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:5392: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
echo $ac_n "checking for XOpenDisplay in -lX11""... $ac_c" 1>&6
-echo "configure:5643: checking for XOpenDisplay in -lX11" >&5
+echo "configure:5416: checking for XOpenDisplay in -lX11" >&5
ac_lib_var=`echo X11'_'XOpenDisplay | sed 'y%./+-%__p_%'`
xe_check_libs=" -lX11 "
cat > conftest.$ac_ext <<EOF
-#line 5648 "configure"
+#line 5421 "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
XOpenDisplay()
; return 0; }
EOF
-if { (eval echo configure:5659: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5432: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
xe_msg_checking="for XGetFontProperty in -lX11"
test -n "-b i486-linuxaout" && xe_msg_checking="$xe_msg_checking using extra libs -b i486-linuxaout"
echo $ac_n "checking "$xe_msg_checking"""... $ac_c" 1>&6
-echo "configure:5684: checking "$xe_msg_checking"" >&5
+echo "configure:5457: checking "$xe_msg_checking"" >&5
ac_lib_var=`echo X11'_'XGetFontProperty | sed 'y%./+-%__p_%'`
xe_check_libs=" -lX11 -b i486-linuxaout"
cat > conftest.$ac_ext <<EOF
-#line 5689 "configure"
+#line 5462 "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
XGetFontProperty()
; return 0; }
EOF
-if { (eval echo configure:5700: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5473: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo $ac_n "checking for XShapeSelectInput in -lXext""... $ac_c" 1>&6
-echo "configure:5727: checking for XShapeSelectInput in -lXext" >&5
+echo "configure:5500: checking for XShapeSelectInput in -lXext" >&5
ac_lib_var=`echo Xext'_'XShapeSelectInput | sed 'y%./+-%__p_%'`
xe_check_libs=" -lXext "
cat > conftest.$ac_ext <<EOF
-#line 5732 "configure"
+#line 5505 "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
XShapeSelectInput()
; return 0; }
EOF
-if { (eval echo configure:5743: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5516: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo $ac_n "checking for XtOpenDisplay in -lXt""... $ac_c" 1>&6
-echo "configure:5766: checking for XtOpenDisplay in -lXt" >&5
+echo "configure:5539: checking for XtOpenDisplay in -lXt" >&5
ac_lib_var=`echo Xt'_'XtOpenDisplay | sed 'y%./+-%__p_%'`
xe_check_libs=" -lXt "
cat > conftest.$ac_ext <<EOF
-#line 5771 "configure"
+#line 5544 "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
XtOpenDisplay()
; return 0; }
EOF
-if { (eval echo configure:5782: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5555: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo $ac_n "checking the version of X11 being used""... $ac_c" 1>&6
-echo "configure:5805: checking the version of X11 being used" >&5
+echo "configure:5578: checking the version of X11 being used" >&5
cat > conftest.$ac_ext <<EOF
-#line 5807 "configure"
+#line 5580 "configure"
#include "confdefs.h"
#include <X11/Intrinsic.h>
int main(int c, char *v[]) { return c>1 ? XlibSpecificationRelease : 0; }
EOF
-if { (eval echo configure:5812: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:5585: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
then
./conftest foobar; x11_release=$?
else
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:5837: checking for $ac_hdr" >&5
+echo "configure:5610: checking for $ac_hdr" >&5
cat > conftest.$ac_ext <<EOF
-#line 5840 "configure"
+#line 5613 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5845: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:5618: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
echo $ac_n "checking for XFree86""... $ac_c" 1>&6
-echo "configure:5876: checking for XFree86" >&5
+echo "configure:5649: checking for XFree86" >&5
if test -d "/usr/X386/include" -o \
-f "/etc/XF86Config" -o \
-f "/etc/X11/XF86Config" -o \
test -z "$with_xmu" && {
echo $ac_n "checking for XmuReadBitmapDataFromFile in -lXmu""... $ac_c" 1>&6
-echo "configure:5896: checking for XmuReadBitmapDataFromFile in -lXmu" >&5
+echo "configure:5669: checking for XmuReadBitmapDataFromFile in -lXmu" >&5
ac_lib_var=`echo Xmu'_'XmuReadBitmapDataFromFile | sed 'y%./+-%__p_%'`
xe_check_libs=" -lXmu "
cat > conftest.$ac_ext <<EOF
-#line 5901 "configure"
+#line 5674 "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
XmuReadBitmapDataFromFile()
; return 0; }
EOF
-if { (eval echo configure:5912: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5685: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo $ac_n "checking for main in -lXbsd""... $ac_c" 1>&6
-echo "configure:5951: checking for main in -lXbsd" >&5
+echo "configure:5724: checking for main in -lXbsd" >&5
ac_lib_var=`echo Xbsd'_'main | sed 'y%./+-%__p_%'`
xe_check_libs=" -lXbsd "
cat > conftest.$ac_ext <<EOF
-#line 5956 "configure"
+#line 5729 "configure"
#include "confdefs.h"
int main() {
main()
; return 0; }
EOF
-if { (eval echo configure:5963: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5736: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
fi
if test "$with_msw" != "no"; then
echo "checking for MS-Windows" 1>&6
-echo "configure:6000: checking for MS-Windows" >&5
+echo "configure:5773: checking for MS-Windows" >&5
echo $ac_n "checking for main in -lgdi32""... $ac_c" 1>&6
-echo "configure:6003: checking for main in -lgdi32" >&5
+echo "configure:5776: checking for main in -lgdi32" >&5
ac_lib_var=`echo gdi32'_'main | sed 'y%./+-%__p_%'`
xe_check_libs=" -lgdi32 "
cat > conftest.$ac_ext <<EOF
-#line 6008 "configure"
+#line 5781 "configure"
#include "confdefs.h"
int main() {
main()
; return 0; }
EOF
-if { (eval echo configure:6015: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5788: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
fi
fi
cat > conftest.$ac_ext <<EOF
-#line 6080 "configure"
+#line 5853 "configure"
#include "confdefs.h"
#include <fcntl.h>
int main() { return (open("/dev/windows", O_RDONLY, 0) > 0)? 0 : 1; }
EOF
-if { (eval echo configure:6085: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:5858: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
then
{ test "$extra_verbose" = "yes" && cat << \EOF
Defining HAVE_MSG_SELECT
fi
if test "$with_x11" != "yes"; then
- for feature in tooltalk cde offix wmcommand xim xmu
+ for feature in tooltalk cde offix session xim xmu
do
if eval "test -n \"\$with_${feature}\" -a \"\$with_${feature}\" != no" ; then
echo "configure: warning: --with-$feature ignored: Not valid without X support" 1>&2
test "$opsys" = "hpux9-shr" && opsysfile="s/hpux9shxr4.h"
esac
-echo "checking for WM_COMMAND option" 1>&6
-echo "configure:6161: checking for WM_COMMAND option" >&5;
-if test "$with_wmcommand" != "no"; then
+echo "checking for session-management option" 1>&6
+echo "configure:5934: checking for session-management option" >&5;
+if test "$with_session" != "no"; then
{ test "$extra_verbose" = "yes" && cat << \EOF
- Defining HAVE_WMCOMMAND
+ Defining HAVE_SESSION
EOF
cat >> confdefs.h <<\EOF
-#define HAVE_WMCOMMAND 1
+#define HAVE_SESSION 1
EOF
}
test -z "$with_xauth" && test "$window_system" = "none" && with_xauth=no
test -z "$with_xauth" && { ac_safe=`echo "X11/Xauth.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for X11/Xauth.h""... $ac_c" 1>&6
-echo "configure:6176: checking for X11/Xauth.h" >&5
+echo "configure:5949: checking for X11/Xauth.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 6179 "configure"
+#line 5952 "configure"
#include "confdefs.h"
#include <X11/Xauth.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6184: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:5957: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
}
test -z "$with_xauth" && {
echo $ac_n "checking for XauGetAuthByAddr in -lXau""... $ac_c" 1>&6
-echo "configure:6207: checking for XauGetAuthByAddr in -lXau" >&5
+echo "configure:5980: checking for XauGetAuthByAddr in -lXau" >&5
ac_lib_var=`echo Xau'_'XauGetAuthByAddr | sed 'y%./+-%__p_%'`
xe_check_libs=" -lXau "
cat > conftest.$ac_ext <<EOF
-#line 6212 "configure"
+#line 5985 "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
XauGetAuthByAddr()
; return 0; }
EOF
-if { (eval echo configure:6223: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5996: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
for dir in "" "Tt/" "desktop/" ; do
ac_safe=`echo "${dir}tt_c.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for ${dir}tt_c.h""... $ac_c" 1>&6
-echo "configure:6268: checking for ${dir}tt_c.h" >&5
+echo "configure:6041: checking for ${dir}tt_c.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 6271 "configure"
+#line 6044 "configure"
#include "confdefs.h"
#include <${dir}tt_c.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6276: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:6049: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
xe_msg_checking="for tt_message_create in -ltt"
test -n "$extra_libs" && xe_msg_checking="$xe_msg_checking using extra libs $extra_libs"
echo $ac_n "checking "$xe_msg_checking"""... $ac_c" 1>&6
-echo "configure:6312: checking "$xe_msg_checking"" >&5
+echo "configure:6085: checking "$xe_msg_checking"" >&5
ac_lib_var=`echo tt'_'tt_message_create | sed 'y%./+-%__p_%'`
xe_check_libs=" -ltt $extra_libs"
cat > conftest.$ac_ext <<EOF
-#line 6317 "configure"
+#line 6090 "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
tt_message_create()
; return 0; }
EOF
-if { (eval echo configure:6328: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6101: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
test -z "$with_cde" && { ac_safe=`echo "Dt/Dt.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for Dt/Dt.h""... $ac_c" 1>&6
-echo "configure:6385: checking for Dt/Dt.h" >&5
+echo "configure:6158: checking for Dt/Dt.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 6388 "configure"
+#line 6161 "configure"
#include "confdefs.h"
#include <Dt/Dt.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6393: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:6166: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
}
test -z "$with_cde" && {
echo $ac_n "checking for DtDndDragStart in -lDtSvc""... $ac_c" 1>&6
-echo "configure:6416: checking for DtDndDragStart in -lDtSvc" >&5
+echo "configure:6189: checking for DtDndDragStart in -lDtSvc" >&5
ac_lib_var=`echo DtSvc'_'DtDndDragStart | sed 'y%./+-%__p_%'`
xe_check_libs=" -lDtSvc "
cat > conftest.$ac_ext <<EOF
-#line 6421 "configure"
+#line 6194 "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
DtDndDragStart()
; return 0; }
EOF
-if { (eval echo configure:6432: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6205: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
fi
echo $ac_n "checking if drag and drop API is needed""... $ac_c" 1>&6
-echo "configure:6501: checking if drag and drop API is needed" >&5
+echo "configure:6274: checking if drag and drop API is needed" >&5
if test "$with_dragndrop" != "no" ; then
if test -n "$dragndrop_proto" ; then
with_dragndrop=yes
fi
echo "checking for LDAP" 1>&6
-echo "configure:6522: checking for LDAP" >&5
+echo "configure:6295: checking for LDAP" >&5
test -z "$with_ldap" && { ac_safe=`echo "ldap.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for ldap.h""... $ac_c" 1>&6
-echo "configure:6525: checking for ldap.h" >&5
+echo "configure:6298: checking for ldap.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 6528 "configure"
+#line 6301 "configure"
#include "confdefs.h"
#include <ldap.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6533: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:6306: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
}
test -z "$with_ldap" && { ac_safe=`echo "lber.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for lber.h""... $ac_c" 1>&6
-echo "configure:6556: checking for lber.h" >&5
+echo "configure:6329: checking for lber.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 6559 "configure"
+#line 6332 "configure"
#include "confdefs.h"
#include <lber.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6564: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:6337: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
fi
}
if test "$with_ldap" != "no"; then
-
-echo $ac_n "checking for ldap_search in -lldap""... $ac_c" 1>&6
-echo "configure:6588: checking for ldap_search in -lldap" >&5
-ac_lib_var=`echo ldap'_'ldap_search | sed 'y%./+-%__p_%'`
+ test -z "$with_umich_ldap" && {
+xe_msg_checking="for ldap_open in -lldap"
+test -n "-llber" && xe_msg_checking="$xe_msg_checking using extra libs -llber"
+echo $ac_n "checking "$xe_msg_checking"""... $ac_c" 1>&6
+echo "configure:6363: checking "$xe_msg_checking"" >&5
+ac_lib_var=`echo ldap'_'ldap_open | sed 'y%./+-%__p_%'`
-xe_check_libs=" -lldap "
+xe_check_libs=" -lldap -llber"
cat > conftest.$ac_ext <<EOF
-#line 6593 "configure"
+#line 6368 "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
builtin and then its argument prototype would still apply. */
-char ldap_search();
+char ldap_open();
int main() {
-ldap_search()
+ldap_open()
; return 0; }
EOF
-if { (eval echo configure:6604: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6379: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes" ; then
echo "$ac_t""yes" 1>&6
- with_ldap_nolber=yes
+ with_umich_ldap=yes
else
echo "$ac_t""no" 1>&6
-with_ldap_nolber=no
+with_umich_ldap=no
fi
+ }
+ test "$with_umich_ldap" = "no" && {
+echo $ac_n "checking for ldap_set_option in -lldap10""... $ac_c" 1>&6
+echo "configure:6402: checking for ldap_set_option in -lldap10" >&5
+ac_lib_var=`echo ldap10'_'ldap_set_option | sed 'y%./+-%__p_%'`
- test "$with_ldap_nolber" = "no" && {
-xe_msg_checking="for ldap_open in -lldap"
-test -n "-llber" && xe_msg_checking="$xe_msg_checking using extra libs -llber"
-echo $ac_n "checking "$xe_msg_checking"""... $ac_c" 1>&6
-echo "configure:6629: checking "$xe_msg_checking"" >&5
-ac_lib_var=`echo ldap'_'ldap_open | sed 'y%./+-%__p_%'`
-
-xe_check_libs=" -lldap -llber"
+xe_check_libs=" -lldap10 "
cat > conftest.$ac_ext <<EOF
-#line 6634 "configure"
+#line 6407 "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
builtin and then its argument prototype would still apply. */
-char ldap_open();
+char ldap_set_option();
int main() {
-ldap_open()
+ldap_set_option()
; return 0; }
EOF
-if { (eval echo configure:6645: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6418: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes" ; then
echo "$ac_t""yes" 1>&6
- with_ldap_lber=yes
+ with_ns_ldap=yes
else
echo "$ac_t""no" 1>&6
-with_ldap_lber=no
+with_ns_ldap=no
fi
}
- test -z "$with_ldap" -a \( "$with_ldap_lber" = "yes" -o "$with_ldap_nolber" = "yes" \) && with_ldap=yes
+ test -z "$with_ldap" -a \( "$with_umich_ldap" = "yes" -o "$with_ns_ldap" = "yes" \) && with_ldap=yes
fi
if test "$with_ldap" = "yes"; then
{ test "$extra_verbose" = "yes" && cat << \EOF
extra_objs="$extra_objs eldap.o" && if test "$extra_verbose" = "yes"; then
echo " xemacs will be linked with \"eldap.o\""
fi
- if test "$with_ldap_nolber" = "yes" ; then
- LIBS="-lldap $LIBS" && if test "$extra_verbose" = "yes"; then echo " Prepending \"-lldap\" to \$LIBS"; fi
- else
- LIBS="-llber $LIBS" && if test "$extra_verbose" = "yes"; then echo " Prepending \"-llber\" to \$LIBS"; fi
- LIBS="-lldap $LIBS" && if test "$extra_verbose" = "yes"; then echo " Prepending \"-lldap\" to \$LIBS"; fi
- fi
- for ac_func in ldap_set_option ldap_get_lderrno ldap_result2error ldap_parse_result
-do
-echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:6689: checking for $ac_func" >&5
-
-cat > conftest.$ac_ext <<EOF
-#line 6692 "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $ac_func(); below. */
-#include <assert.h>
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char $ac_func();
-
-int main() {
-
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-$ac_func();
-#endif
-
-; return 0; }
+ if test "$with_umich_ldap" = "yes" ; then
+ { test "$extra_verbose" = "yes" && cat << \EOF
+ Defining HAVE_UMICH_LDAP
EOF
-if { (eval echo configure:6715: \"$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 "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_func_$ac_func=no"
-fi
-rm -f conftest*
+cat >> confdefs.h <<\EOF
+#define HAVE_UMICH_LDAP 1
+EOF
+}
-if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
- { test "$extra_verbose" = "yes" && cat << EOF
- Defining $ac_tr_func
+ LIBS="-llber $LIBS" && if test "$extra_verbose" = "yes"; then echo " Prepending \"-llber\" to \$LIBS"; fi
+ LIBS="-lldap $LIBS" && if test "$extra_verbose" = "yes"; then echo " Prepending \"-lldap\" to \$LIBS"; fi
+ elif test "$with_ldap" = "yes" -a "$with_ns_ldap" = "yes" ; then
+ { test "$extra_verbose" = "yes" && cat << \EOF
+ Defining HAVE_NS_LDAP
EOF
-cat >> confdefs.h <<EOF
-#define $ac_tr_func 1
+cat >> confdefs.h <<\EOF
+#define HAVE_NS_LDAP 1
EOF
}
-
-else
- echo "$ac_t""no" 1>&6
-fi
-done
+ LIBS="-lldap10 $LIBS" && if test "$extra_verbose" = "yes"; then echo " Prepending \"-lldap10\" to \$LIBS"; fi
+ elif test "$with_ldap" = "yes" ; then
+ LIBS="-lldap $LIBS" && if test "$extra_verbose" = "yes"; then echo " Prepending \"-lldap\" to \$LIBS"; fi
+ fi
fi
if test "$window_system" != "none"; then
echo "checking for graphics libraries" 1>&6
-echo "configure:6747: checking for graphics libraries" >&5
+echo "configure:6482: checking for graphics libraries" >&5
xpm_problem=""
if test -z "$with_xpm"; then
echo $ac_n "checking for Xpm - no older than 3.4f""... $ac_c" 1>&6
-echo "configure:6752: checking for Xpm - no older than 3.4f" >&5
+echo "configure:6487: checking for Xpm - no older than 3.4f" >&5
xe_check_libs=-lXpm
cat > conftest.$ac_ext <<EOF
-#line 6755 "configure"
+#line 6490 "configure"
#include "confdefs.h"
#include <X11/xpm.h>
int main(int c, char **v) {
XpmIncludeVersion != XpmLibraryVersion() ? 1 :
XpmIncludeVersion < 30406 ? 2 : 0 ;}
EOF
-if { (eval echo configure:6763: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:6498: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
then
./conftest dummy_arg; xpm_status=$?;
if test "$xpm_status" = "0"; then
libs_x="-lXpm $libs_x" && if test "$extra_verbose" = "yes"; then echo " Prepending \"-lXpm\" to \$libs_x"; fi
echo $ac_n "checking for \"FOR_MSW\" xpm""... $ac_c" 1>&6
-echo "configure:6805: checking for \"FOR_MSW\" xpm" >&5
+echo "configure:6540: checking for \"FOR_MSW\" xpm" >&5
xe_check_libs=-lXpm
cat > conftest.$ac_ext <<EOF
-#line 6808 "configure"
+#line 6543 "configure"
#include "confdefs.h"
int main() {
XpmCreatePixmapFromData()
; return 0; }
EOF
-if { (eval echo configure:6815: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6550: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
xpm_for_msw=no
else
test -z "$with_xface" && { ac_safe=`echo "compface.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for compface.h""... $ac_c" 1>&6
-echo "configure:6841: checking for compface.h" >&5
+echo "configure:6576: checking for compface.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 6844 "configure"
+#line 6579 "configure"
#include "confdefs.h"
#include <compface.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6849: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:6584: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
}
test -z "$with_xface" && {
echo $ac_n "checking for UnGenFace in -lcompface""... $ac_c" 1>&6
-echo "configure:6872: checking for UnGenFace in -lcompface" >&5
+echo "configure:6607: checking for UnGenFace in -lcompface" >&5
ac_lib_var=`echo compface'_'UnGenFace | sed 'y%./+-%__p_%'`
xe_check_libs=" -lcompface "
cat > conftest.$ac_ext <<EOF
-#line 6877 "configure"
+#line 6612 "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
UnGenFace()
; return 0; }
EOF
-if { (eval echo configure:6888: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6623: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
if test "$with_png $with_tiff" != "no no"; then
echo $ac_n "checking for inflate in -lc""... $ac_c" 1>&6
-echo "configure:6940: checking for inflate in -lc" >&5
+echo "configure:6675: checking for inflate in -lc" >&5
ac_lib_var=`echo c'_'inflate | sed 'y%./+-%__p_%'`
xe_check_libs=" -lc "
cat > conftest.$ac_ext <<EOF
-#line 6945 "configure"
+#line 6680 "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
inflate()
; return 0; }
EOF
-if { (eval echo configure:6956: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6691: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for inflate in -lz""... $ac_c" 1>&6
-echo "configure:6975: checking for inflate in -lz" >&5
+echo "configure:6710: checking for inflate in -lz" >&5
ac_lib_var=`echo z'_'inflate | sed 'y%./+-%__p_%'`
xe_check_libs=" -lz "
cat > conftest.$ac_ext <<EOF
-#line 6980 "configure"
+#line 6715 "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
inflate()
; return 0; }
EOF
-if { (eval echo configure:6991: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6726: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for inflate in -lgz""... $ac_c" 1>&6
-echo "configure:7010: checking for inflate in -lgz" >&5
+echo "configure:6745: checking for inflate in -lgz" >&5
ac_lib_var=`echo gz'_'inflate | sed 'y%./+-%__p_%'`
xe_check_libs=" -lgz "
cat > conftest.$ac_ext <<EOF
-#line 7015 "configure"
+#line 6750 "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
inflate()
; return 0; }
EOF
-if { (eval echo configure:7026: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6761: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
test -z "$with_jpeg" && { ac_safe=`echo "jpeglib.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for jpeglib.h""... $ac_c" 1>&6
-echo "configure:7056: checking for jpeglib.h" >&5
+echo "configure:6791: checking for jpeglib.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 7059 "configure"
+#line 6794 "configure"
#include "confdefs.h"
#include <jpeglib.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7064: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:6799: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
}
test -z "$with_jpeg" && {
echo $ac_n "checking for jpeg_destroy_decompress in -ljpeg""... $ac_c" 1>&6
-echo "configure:7087: checking for jpeg_destroy_decompress in -ljpeg" >&5
+echo "configure:6822: checking for jpeg_destroy_decompress in -ljpeg" >&5
ac_lib_var=`echo jpeg'_'jpeg_destroy_decompress | sed 'y%./+-%__p_%'`
xe_check_libs=" -ljpeg "
cat > conftest.$ac_ext <<EOF
-#line 7092 "configure"
+#line 6827 "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
jpeg_destroy_decompress()
; return 0; }
EOF
-if { (eval echo configure:7103: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6838: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
png_problem=""
test -z "$with_png" && { echo $ac_n "checking for pow""... $ac_c" 1>&6
-echo "configure:7139: checking for pow" >&5
+echo "configure:6874: checking for pow" >&5
cat > conftest.$ac_ext <<EOF
-#line 7142 "configure"
+#line 6877 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char pow(); below. */
; return 0; }
EOF
-if { (eval echo configure:7165: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6900: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_func_pow=yes"
else
}
test -z "$with_png" && { ac_safe=`echo "png.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for png.h""... $ac_c" 1>&6
-echo "configure:7186: checking for png.h" >&5
+echo "configure:6921: checking for png.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 7189 "configure"
+#line 6924 "configure"
#include "confdefs.h"
#include <png.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7194: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:6929: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
}
test -z "$with_png" && {
echo $ac_n "checking for png_read_image in -lpng""... $ac_c" 1>&6
-echo "configure:7217: checking for png_read_image in -lpng" >&5
+echo "configure:6952: checking for png_read_image in -lpng" >&5
ac_lib_var=`echo png'_'png_read_image | sed 'y%./+-%__p_%'`
xe_check_libs=" -lpng "
cat > conftest.$ac_ext <<EOF
-#line 7222 "configure"
+#line 6957 "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
png_read_image()
; return 0; }
EOF
-if { (eval echo configure:7233: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6968: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
}
if test -z "$with_png"; then
echo $ac_n "checking for workable png version information""... $ac_c" 1>&6
-echo "configure:7256: checking for workable png version information" >&5
+echo "configure:6991: checking for workable png version information" >&5
xe_check_libs="-lpng -lz"
cat > conftest.$ac_ext <<EOF
-#line 7259 "configure"
+#line 6994 "configure"
#include "confdefs.h"
#include <png.h>
int main(int c, char **v) {
if (strcmp(png_libpng_ver, PNG_LIBPNG_VER_STRING) != 0) return 1;
return (PNG_LIBPNG_VER < 10002) ? 2 : 0 ;}
EOF
-if { (eval echo configure:7267: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:7002: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
then
./conftest dummy_arg; png_status=$?;
if test "$png_status" = "0"; then
test -z "$with_tiff" && { ac_safe=`echo "tiffio.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for tiffio.h""... $ac_c" 1>&6
-echo "configure:7310: checking for tiffio.h" >&5
+echo "configure:7045: checking for tiffio.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 7313 "configure"
+#line 7048 "configure"
#include "confdefs.h"
#include <tiffio.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7318: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:7053: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
}
test -z "$with_tiff" && {
echo $ac_n "checking for TIFFClientOpen in -ltiff""... $ac_c" 1>&6
-echo "configure:7341: checking for TIFFClientOpen in -ltiff" >&5
+echo "configure:7076: checking for TIFFClientOpen in -ltiff" >&5
ac_lib_var=`echo tiff'_'TIFFClientOpen | sed 'y%./+-%__p_%'`
xe_check_libs=" -ltiff "
cat > conftest.$ac_ext <<EOF
-#line 7346 "configure"
+#line 7081 "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
TIFFClientOpen()
; return 0; }
EOF
-if { (eval echo configure:7357: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7092: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
if test "$with_x11" = "yes"; then
echo "checking for X11 graphics libraries" 1>&6
-echo "configure:7396: checking for X11 graphics libraries" >&5
+echo "configure:7131: checking for X11 graphics libraries" >&5
echo $ac_n "checking for XawScrollbarSetThumb in -lXaw""... $ac_c" 1>&6
-echo "configure:7400: checking for XawScrollbarSetThumb in -lXaw" >&5
+echo "configure:7135: checking for XawScrollbarSetThumb in -lXaw" >&5
ac_lib_var=`echo Xaw'_'XawScrollbarSetThumb | sed 'y%./+-%__p_%'`
xe_check_libs=" -lXaw "
cat > conftest.$ac_ext <<EOF
-#line 7405 "configure"
+#line 7140 "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
XawScrollbarSetThumb()
; return 0; }
EOF
-if { (eval echo configure:7416: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7151: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
ac_safe=`echo "Xm/Xm.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for Xm/Xm.h""... $ac_c" 1>&6
-echo "configure:7440: checking for Xm/Xm.h" >&5
+echo "configure:7175: checking for Xm/Xm.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 7443 "configure"
+#line 7178 "configure"
#include "confdefs.h"
#include <Xm/Xm.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7448: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:7183: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
echo "$ac_t""yes" 1>&6
echo $ac_n "checking for XmStringFree in -lXm""... $ac_c" 1>&6
-echo "configure:7465: checking for XmStringFree in -lXm" >&5
+echo "configure:7200: checking for XmStringFree in -lXm" >&5
ac_lib_var=`echo Xm'_'XmStringFree | sed 'y%./+-%__p_%'`
xe_check_libs=" -lXm "
cat > conftest.$ac_ext <<EOF
-#line 7470 "configure"
+#line 7205 "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
XmStringFree()
; return 0; }
EOF
-if { (eval echo configure:7481: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7216: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
if test "$have_motif" = "yes"; then
echo $ac_n "checking for Lesstif""... $ac_c" 1>&6
-echo "configure:7510: checking for Lesstif" >&5
+echo "configure:7245: checking for Lesstif" >&5
cat > conftest.$ac_ext <<EOF
-#line 7512 "configure"
+#line 7247 "configure"
#include "confdefs.h"
#include <Xm/Xm.h>
#ifdef LESSTIF_VERSION
case "$with_scrollbars" in "" | "yes" )
with_scrollbars="lucid" ;;
esac
-case "$with_widgets" in "" | "yes" )
- if test "$have_motif" = "yes"; then with_widgets="motif"
- else with_widgets=no
- fi ;;
-esac
-all_widgets="$with_menubars $with_scrollbars $with_dialogs $with_toolbars $with_widgets"
+all_widgets="$with_menubars $with_scrollbars $with_dialogs $with_toolbars"
case "$all_widgets" in *athena* )
{ test "$extra_verbose" = "yes" && cat << \EOF
test "$with_toolbars" != "no" && extra_objs="$extra_objs toolbar-x.o" && if test "$extra_verbose" = "yes"; then
echo " xemacs will be linked with \"toolbar-x.o\""
fi
- test "$all_widgets" != "no no no no no" && extra_objs="$extra_objs gui-x.o" && if test "$extra_verbose" = "yes"; then
+ test "$all_widgets" != "no no no no" && extra_objs="$extra_objs gui-x.o" && if test "$extra_verbose" = "yes"; then
echo " xemacs will be linked with \"gui-x.o\""
fi
else
if test "$with_mule" = "yes" ; then
echo "checking for Mule-related features" 1>&6
-echo "configure:7780: checking for Mule-related features" >&5
+echo "configure:7510: checking for Mule-related features" >&5
{ test "$extra_verbose" = "yes" && cat << \EOF
Defining MULE
EOF
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:7805: checking for $ac_hdr" >&5
+echo "configure:7535: checking for $ac_hdr" >&5
cat > conftest.$ac_ext <<EOF
-#line 7808 "configure"
+#line 7538 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7813: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:7543: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
echo $ac_n "checking for strerror in -lintl""... $ac_c" 1>&6
-echo "configure:7844: checking for strerror in -lintl" >&5
+echo "configure:7574: checking for strerror in -lintl" >&5
ac_lib_var=`echo intl'_'strerror | sed 'y%./+-%__p_%'`
xe_check_libs=" -lintl "
cat > conftest.$ac_ext <<EOF
-#line 7849 "configure"
+#line 7579 "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
strerror()
; return 0; }
EOF
-if { (eval echo configure:7860: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7590: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo "checking for Mule input methods" 1>&6
-echo "configure:7893: checking for Mule input methods" >&5
+echo "configure:7623: checking for Mule input methods" >&5
case "$with_xim" in "" | "yes" )
echo "checking for XIM" 1>&6
-echo "configure:7896: checking for XIM" >&5
+echo "configure:7626: checking for XIM" >&5
echo $ac_n "checking for XOpenIM in -lX11""... $ac_c" 1>&6
-echo "configure:7899: checking for XOpenIM in -lX11" >&5
+echo "configure:7629: checking for XOpenIM in -lX11" >&5
ac_lib_var=`echo X11'_'XOpenIM | sed 'y%./+-%__p_%'`
xe_check_libs=" -lX11 "
cat > conftest.$ac_ext <<EOF
-#line 7904 "configure"
+#line 7634 "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
XOpenIM()
; return 0; }
EOF
-if { (eval echo configure:7915: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7645: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
if test "$have_motif $have_lesstif" = "yes no"; then
echo $ac_n "checking for XmImMbLookupString in -lXm""... $ac_c" 1>&6
-echo "configure:7939: checking for XmImMbLookupString in -lXm" >&5
+echo "configure:7669: checking for XmImMbLookupString in -lXm" >&5
ac_lib_var=`echo Xm'_'XmImMbLookupString | sed 'y%./+-%__p_%'`
xe_check_libs=" -lXm "
cat > conftest.$ac_ext <<EOF
-#line 7944 "configure"
+#line 7674 "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
XmImMbLookupString()
; return 0; }
EOF
-if { (eval echo configure:7955: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7685: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
if test "$with_xfs" = "yes" ; then
echo "checking for XFontSet" 1>&6
-echo "configure:8020: checking for XFontSet" >&5
+echo "configure:7750: checking for XFontSet" >&5
echo $ac_n "checking for XmbDrawString in -lX11""... $ac_c" 1>&6
-echo "configure:8023: checking for XmbDrawString in -lX11" >&5
+echo "configure:7753: checking for XmbDrawString in -lX11" >&5
ac_lib_var=`echo X11'_'XmbDrawString | sed 'y%./+-%__p_%'`
xe_check_libs=" -lX11 "
cat > conftest.$ac_ext <<EOF
-#line 8028 "configure"
+#line 7758 "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
XmbDrawString()
; return 0; }
EOF
-if { (eval echo configure:8039: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7769: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
test "$with_wnn6" = "yes" && with_wnn=yes # wnn6 implies wnn support
test -z "$with_wnn" && { ac_safe=`echo "wnn/jllib.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for wnn/jllib.h""... $ac_c" 1>&6
-echo "configure:8079: checking for wnn/jllib.h" >&5
+echo "configure:7809: checking for wnn/jllib.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 8082 "configure"
+#line 7812 "configure"
#include "confdefs.h"
#include <wnn/jllib.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8087: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:7817: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
for ac_func in crypt
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:8112: checking for $ac_func" >&5
+echo "configure:7842: checking for $ac_func" >&5
cat > conftest.$ac_ext <<EOF
-#line 8115 "configure"
+#line 7845 "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:8138: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7868: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
test "$ac_cv_func_crypt" != "yes" && {
echo $ac_n "checking for crypt in -lcrypt""... $ac_c" 1>&6
-echo "configure:8167: checking for crypt in -lcrypt" >&5
+echo "configure:7897: checking for crypt in -lcrypt" >&5
ac_lib_var=`echo crypt'_'crypt | sed 'y%./+-%__p_%'`
xe_check_libs=" -lcrypt "
cat > conftest.$ac_ext <<EOF
-#line 8172 "configure"
+#line 7902 "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
crypt()
; return 0; }
EOF
-if { (eval echo configure:8183: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7913: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
if test -z "$with_wnn" -o "$with_wnn" = "yes"; then
echo $ac_n "checking for jl_dic_list_e in -lwnn""... $ac_c" 1>&6
-echo "configure:8218: checking for jl_dic_list_e in -lwnn" >&5
+echo "configure:7948: checking for jl_dic_list_e in -lwnn" >&5
ac_lib_var=`echo wnn'_'jl_dic_list_e | sed 'y%./+-%__p_%'`
xe_check_libs=" -lwnn "
cat > conftest.$ac_ext <<EOF
-#line 8223 "configure"
+#line 7953 "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
jl_dic_list_e()
; return 0; }
EOF
-if { (eval echo configure:8234: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7964: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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 jl_dic_list_e in -lwnn4""... $ac_c" 1>&6
-echo "configure:8252: checking for jl_dic_list_e in -lwnn4" >&5
+echo "configure:7982: checking for jl_dic_list_e in -lwnn4" >&5
ac_lib_var=`echo wnn4'_'jl_dic_list_e | sed 'y%./+-%__p_%'`
xe_check_libs=" -lwnn4 "
cat > conftest.$ac_ext <<EOF
-#line 8257 "configure"
+#line 7987 "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
jl_dic_list_e()
; return 0; }
EOF
-if { (eval echo configure:8268: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7998: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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 jl_dic_list_e in -lwnn6""... $ac_c" 1>&6
-echo "configure:8286: checking for jl_dic_list_e in -lwnn6" >&5
+echo "configure:8016: checking for jl_dic_list_e in -lwnn6" >&5
ac_lib_var=`echo wnn6'_'jl_dic_list_e | sed 'y%./+-%__p_%'`
xe_check_libs=" -lwnn6 "
cat > conftest.$ac_ext <<EOF
-#line 8291 "configure"
+#line 8021 "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
jl_dic_list_e()
; return 0; }
EOF
-if { (eval echo configure:8302: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8032: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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 dic_list_e in -lwnn6_fromsrc""... $ac_c" 1>&6
-echo "configure:8320: checking for dic_list_e in -lwnn6_fromsrc" >&5
+echo "configure:8050: checking for dic_list_e in -lwnn6_fromsrc" >&5
ac_lib_var=`echo wnn6_fromsrc'_'dic_list_e | sed 'y%./+-%__p_%'`
xe_check_libs=" -lwnn6_fromsrc "
cat > conftest.$ac_ext <<EOF
-#line 8325 "configure"
+#line 8055 "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
dic_list_e()
; return 0; }
EOF
-if { (eval echo configure:8336: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8066: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
if test "$with_wnn6" != "no"; then
echo $ac_n "checking for jl_fi_dic_list in -l$libwnn""... $ac_c" 1>&6
-echo "configure:8384: checking for jl_fi_dic_list in -l$libwnn" >&5
+echo "configure:8114: checking for jl_fi_dic_list in -l$libwnn" >&5
ac_lib_var=`echo $libwnn'_'jl_fi_dic_list | sed 'y%./+-%__p_%'`
xe_check_libs=" -l$libwnn "
cat > conftest.$ac_ext <<EOF
-#line 8389 "configure"
+#line 8119 "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
jl_fi_dic_list()
; return 0; }
EOF
-if { (eval echo configure:8400: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8130: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
if test "$with_canna" != "no"; then
ac_safe=`echo "canna/jrkanji.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for canna/jrkanji.h""... $ac_c" 1>&6
-echo "configure:8435: checking for canna/jrkanji.h" >&5
+echo "configure:8165: checking for canna/jrkanji.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 8438 "configure"
+#line 8168 "configure"
#include "confdefs.h"
#include <canna/jrkanji.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8443: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:8173: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
c_switch_site="$c_switch_site -I/usr/local/canna/include"
ac_safe=`echo "canna/jrkanji.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for canna/jrkanji.h""... $ac_c" 1>&6
-echo "configure:8470: checking for canna/jrkanji.h" >&5
+echo "configure:8200: checking for canna/jrkanji.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 8473 "configure"
+#line 8203 "configure"
#include "confdefs.h"
#include <canna/jrkanji.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8478: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:8208: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
test -z "$with_canna" && { ac_safe=`echo "canna/RK.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for canna/RK.h""... $ac_c" 1>&6
-echo "configure:8506: checking for canna/RK.h" >&5
+echo "configure:8236: checking for canna/RK.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 8509 "configure"
+#line 8239 "configure"
#include "confdefs.h"
#include <canna/RK.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8514: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:8244: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
}
test -z "$with_canna" && {
echo $ac_n "checking for RkBgnBun in -lRKC""... $ac_c" 1>&6
-echo "configure:8537: checking for RkBgnBun in -lRKC" >&5
+echo "configure:8267: checking for RkBgnBun in -lRKC" >&5
ac_lib_var=`echo RKC'_'RkBgnBun | sed 'y%./+-%__p_%'`
xe_check_libs=" -lRKC "
cat > conftest.$ac_ext <<EOF
-#line 8542 "configure"
+#line 8272 "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
RkBgnBun()
; return 0; }
EOF
-if { (eval echo configure:8553: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8283: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
}
test -z "$with_canna" && {
echo $ac_n "checking for jrKanjiControl in -lcanna""... $ac_c" 1>&6
-echo "configure:8576: checking for jrKanjiControl in -lcanna" >&5
+echo "configure:8306: checking for jrKanjiControl in -lcanna" >&5
ac_lib_var=`echo canna'_'jrKanjiControl | sed 'y%./+-%__p_%'`
xe_check_libs=" -lcanna "
cat > conftest.$ac_ext <<EOF
-#line 8581 "configure"
+#line 8311 "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
jrKanjiControl()
; return 0; }
EOF
-if { (eval echo configure:8592: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8322: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
libs_x="-lXm $libs_x" && if test "$extra_verbose" = "yes"; then echo " Prepending \"-lXm\" to \$libs_x"; fi
echo $ac_n "checking for layout_object_getvalue in -li18n""... $ac_c" 1>&6
-echo "configure:8641: checking for layout_object_getvalue in -li18n" >&5
+echo "configure:8371: checking for layout_object_getvalue in -li18n" >&5
ac_lib_var=`echo i18n'_'layout_object_getvalue | sed 'y%./+-%__p_%'`
xe_check_libs=" -li18n "
cat > conftest.$ac_ext <<EOF
-#line 8646 "configure"
+#line 8376 "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
layout_object_getvalue()
; return 0; }
EOF
-if { (eval echo configure:8657: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8387: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
for ac_func in cbrt closedir dup2 eaccess fmod fpathconf frexp ftime gethostname 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 strcasecmp strerror tzset ulimit usleep utimes waitpid vsnprintf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:8743: checking for $ac_func" >&5
+echo "configure:8473: checking for $ac_func" >&5
cat > conftest.$ac_ext <<EOF
-#line 8746 "configure"
+#line 8476 "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:8769: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8499: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
* ) for ac_func in realpath
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:8810: checking for $ac_func" >&5
+echo "configure:8540: checking for $ac_func" >&5
cat > conftest.$ac_ext <<EOF
-#line 8813 "configure"
+#line 8543 "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:8836: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8566: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
for ac_func in getloadavg
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:8872: checking for $ac_func" >&5
+echo "configure:8602: checking for $ac_func" >&5
cat > conftest.$ac_ext <<EOF
-#line 8875 "configure"
+#line 8605 "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:8898: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8628: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
echo $ac_n "checking for kstat_open in -lkstat""... $ac_c" 1>&6
-echo "configure:8934: checking for kstat_open in -lkstat" >&5
+echo "configure:8664: 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 8939 "configure"
+#line 8669 "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:8950: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8680: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo $ac_n "checking for kvm_read in -lkvm""... $ac_c" 1>&6
-echo "configure:8984: checking for kvm_read in -lkvm" >&5
+echo "configure:8714: 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 8989 "configure"
+#line 8719 "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:9000: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8730: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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:9034: checking whether netdb declares h_errno" >&5
+echo "configure:8764: checking whether netdb declares h_errno" >&5
cat > conftest.$ac_ext <<EOF
-#line 9036 "configure"
+#line 8766 "configure"
#include "confdefs.h"
#include <netdb.h>
int main() {
return h_errno;
; return 0; }
EOF
-if { (eval echo configure:9043: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8773: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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:9063: checking for sigsetjmp" >&5
+echo "configure:8793: checking for sigsetjmp" >&5
cat > conftest.$ac_ext <<EOF
-#line 9065 "configure"
+#line 8795 "configure"
#include "confdefs.h"
#include <setjmp.h>
int main() {
sigjmp_buf bar; sigsetjmp (bar, 0);
; return 0; }
EOF
-if { (eval echo configure:9072: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:8802: \"$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:9092: checking whether localtime caches TZ" >&5
+echo "configure:8822: checking whether localtime caches TZ" >&5
if test "$ac_cv_func_tzset" = "yes"; then
cat > conftest.$ac_ext <<EOF
-#line 9096 "configure"
+#line 8826 "configure"
#include "confdefs.h"
#include <time.h>
#if STDC_HEADERS
exit (0);
}
EOF
-if { (eval echo configure:9131: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:8861: \"$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:9161: checking whether gettimeofday accepts one or two arguments" >&5
+echo "configure:8891: checking whether gettimeofday accepts one or two arguments" >&5
cat > conftest.$ac_ext <<EOF
-#line 9163 "configure"
+#line 8893 "configure"
#include "confdefs.h"
#ifdef TIME_WITH_SYS_TIME
; return 0; }
EOF
-if { (eval echo configure:9185: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8915: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
echo "$ac_t""two" 1>&6
else
echo $ac_n "checking for inline""... $ac_c" 1>&6
-echo "configure:9207: checking for inline" >&5
+echo "configure:8937: checking for inline" >&5
ac_cv_c_inline=no
for ac_kw in inline __inline__ __inline; do
cat > conftest.$ac_ext <<EOF
-#line 9212 "configure"
+#line 8942 "configure"
#include "confdefs.h"
int main() {
} $ac_kw foo() {
; return 0; }
EOF
-if { (eval echo configure:9219: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:8949: \"$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:9269: checking for working alloca.h" >&5
+echo "configure:8999: checking for working alloca.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 9272 "configure"
+#line 9002 "configure"
#include "confdefs.h"
#include <alloca.h>
int main() {
char *p = alloca(2 * sizeof(int));
; return 0; }
EOF
-if { (eval echo configure:9279: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9009: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
ac_cv_header_alloca_h=yes
else
fi
echo $ac_n "checking for alloca""... $ac_c" 1>&6
-echo "configure:9303: checking for alloca" >&5
+echo "configure:9033: checking for alloca" >&5
cat > conftest.$ac_ext <<EOF
-#line 9306 "configure"
+#line 9036 "configure"
#include "confdefs.h"
#ifdef __GNUC__
# define alloca __builtin_alloca
#else
-# ifdef _MSC_VER
-# include <malloc.h>
-# define alloca _alloca
+# if HAVE_ALLOCA_H
+# include <alloca.h>
# else
-# if HAVE_ALLOCA_H
-# include <alloca.h>
-# else
-# ifdef _AIX
+# ifdef _AIX
#pragma alloca
-# else
-# ifndef alloca /* predefined by HP cc +Olibcalls */
+# else
+# ifndef alloca /* predefined by HP cc +Olibcalls */
char *alloca ();
-# endif
# endif
# endif
# endif
char *p = (char *) alloca(1);
; return 0; }
EOF
-if { (eval echo configure:9334: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9059: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
ac_cv_func_alloca_works=yes
else
# that cause trouble. Some versions do not even contain alloca or
# contain a buggy version. If you still want to use their alloca,
# use ar to extract alloca.o from them instead of compiling alloca.c.
- ALLOCA=alloca.${ac_objext}
+ ALLOCA=alloca.o
{ test "$extra_verbose" = "yes" && cat << \EOF
Defining C_ALLOCA
EOF
echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
-echo "configure:9373: checking whether alloca needs Cray hooks" >&5
+echo "configure:9098: checking whether alloca needs Cray hooks" >&5
cat > conftest.$ac_ext <<EOF
-#line 9376 "configure"
+#line 9101 "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:9400: checking for $ac_func" >&5
+echo "configure:9125: checking for $ac_func" >&5
cat > conftest.$ac_ext <<EOF
-#line 9403 "configure"
+#line 9128 "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:9426: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9151: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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:9456: checking stack direction for C alloca" >&5
+echo "configure:9181: checking stack direction for C alloca" >&5
cat > conftest.$ac_ext <<EOF
-#line 9459 "configure"
+#line 9184 "configure"
#include "confdefs.h"
find_stack_direction ()
{
exit (find_stack_direction() < 0);
}
EOF
-if { (eval echo configure:9478: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:9203: \"$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:9507: checking for vfork.h" >&5
+echo "configure:9232: checking for vfork.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 9510 "configure"
+#line 9235 "configure"
#include "confdefs.h"
#include <vfork.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:9515: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:9240: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
fi
echo $ac_n "checking for working vfork""... $ac_c" 1>&6
-echo "configure:9543: checking for working vfork" >&5
+echo "configure:9268: checking for working vfork" >&5
cat > conftest.$ac_ext <<EOF
-#line 9546 "configure"
+#line 9271 "configure"
#include "confdefs.h"
/* Thanks to Paul Eggert for this test. */
#include <stdio.h>
}
}
EOF
-if { (eval echo configure:9641: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:9366: \"$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:9667: checking for working strcoll" >&5
+echo "configure:9392: checking for working strcoll" >&5
cat > conftest.$ac_ext <<EOF
-#line 9670 "configure"
+#line 9395 "configure"
#include "confdefs.h"
#include <string.h>
main ()
strcoll ("123", "456") >= 0);
}
EOF
-if { (eval echo configure:9680: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:9405: \"$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:9708: checking for $ac_func" >&5
+echo "configure:9433: checking for $ac_func" >&5
cat > conftest.$ac_ext <<EOF
-#line 9711 "configure"
+#line 9436 "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:9734: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9459: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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:9762: checking whether getpgrp takes no argument" >&5
+echo "configure:9487: checking whether getpgrp takes no argument" >&5
cat > conftest.$ac_ext <<EOF
-#line 9765 "configure"
+#line 9490 "configure"
#include "confdefs.h"
/*
}
EOF
-if { (eval echo configure:9820: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:9545: \"$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:9847: checking for working mmap" >&5
+echo "configure:9572: checking for working mmap" >&5
case "$opsys" in ultrix* ) have_mmap=no ;; *)
cat > conftest.$ac_ext <<EOF
-#line 9850 "configure"
+#line 9575 "configure"
#include "confdefs.h"
#include <stdio.h>
#include <unistd.h>
return 1;
}
EOF
-if { (eval echo configure:9883: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:9608: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
then
have_mmap=yes
else
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:9908: checking for $ac_hdr" >&5
+echo "configure:9633: checking for $ac_hdr" >&5
cat > conftest.$ac_ext <<EOF
-#line 9911 "configure"
+#line 9636 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:9916: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:9641: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
for ac_func in getpagesize
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:9948: checking for $ac_func" >&5
+echo "configure:9673: checking for $ac_func" >&5
cat > conftest.$ac_ext <<EOF
-#line 9951 "configure"
+#line 9676 "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:9974: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9699: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
done
echo $ac_n "checking for working mmap""... $ac_c" 1>&6
-echo "configure:10002: checking for working mmap" >&5
+echo "configure:9727: checking for working mmap" >&5
cat > conftest.$ac_ext <<EOF
-#line 10005 "configure"
+#line 9730 "configure"
#include "confdefs.h"
/* Thanks to Mike Haertel and Jim Avera for this test.
}
EOF
-if { (eval echo configure:10145: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:9870: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
then
ac_cv_func_mmap_fixed_mapped=yes
else
ac_safe=`echo "termios.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for termios.h""... $ac_c" 1>&6
-echo "configure:10183: checking for termios.h" >&5
+echo "configure:9908: checking for termios.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 10186 "configure"
+#line 9911 "configure"
#include "confdefs.h"
#include <termios.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:10191: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:9916: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
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:10234: checking for termio.h" >&5
+echo "configure:9959: checking for termio.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 10237 "configure"
+#line 9962 "configure"
#include "confdefs.h"
#include <termio.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:10242: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:9967: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
echo $ac_n "checking for socket""... $ac_c" 1>&6
-echo "configure:10274: checking for socket" >&5
+echo "configure:9999: checking for socket" >&5
cat > conftest.$ac_ext <<EOF
-#line 10277 "configure"
+#line 10002 "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:10300: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10025: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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:10315: checking for netinet/in.h" >&5
+echo "configure:10040: checking for netinet/in.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 10318 "configure"
+#line 10043 "configure"
#include "confdefs.h"
#include <netinet/in.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:10323: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:10048: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
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:10340: checking for arpa/inet.h" >&5
+echo "configure:10065: checking for arpa/inet.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 10343 "configure"
+#line 10068 "configure"
#include "confdefs.h"
#include <arpa/inet.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:10348: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:10073: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
}
echo $ac_n "checking "for sun_len member in struct sockaddr_un"""... $ac_c" 1>&6
-echo "configure:10373: checking "for sun_len member in struct sockaddr_un"" >&5
+echo "configure:10098: checking "for sun_len member in struct sockaddr_un"" >&5
cat > conftest.$ac_ext <<EOF
-#line 10375 "configure"
+#line 10100 "configure"
#include "confdefs.h"
#include <sys/types.h>
static struct sockaddr_un x; x.sun_len = 1;
; return 0; }
EOF
-if { (eval echo configure:10386: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10111: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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:10404: checking "for ip_mreq struct in netinet/in.h"" >&5
+echo "configure:10129: checking "for ip_mreq struct in netinet/in.h"" >&5
cat > conftest.$ac_ext <<EOF
-#line 10406 "configure"
+#line 10131 "configure"
#include "confdefs.h"
#include <sys/types.h>
static struct ip_mreq x;
; return 0; }
EOF
-if { (eval echo configure:10416: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10141: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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:10447: checking for msgget" >&5
+echo "configure:10172: checking for msgget" >&5
cat > conftest.$ac_ext <<EOF
-#line 10450 "configure"
+#line 10175 "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:10473: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10198: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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:10488: checking for sys/ipc.h" >&5
+echo "configure:10213: checking for sys/ipc.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 10491 "configure"
+#line 10216 "configure"
#include "confdefs.h"
#include <sys/ipc.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:10496: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:10221: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
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:10513: checking for sys/msg.h" >&5
+echo "configure:10238: checking for sys/msg.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 10516 "configure"
+#line 10241 "configure"
#include "confdefs.h"
#include <sys/msg.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:10521: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:10246: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
ac_safe=`echo "dirent.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for dirent.h""... $ac_c" 1>&6
-echo "configure:10559: checking for dirent.h" >&5
+echo "configure:10284: checking for dirent.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 10562 "configure"
+#line 10287 "configure"
#include "confdefs.h"
#include <dirent.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:10567: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:10292: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
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:10594: checking for sys/dir.h" >&5
+echo "configure:10319: checking for sys/dir.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 10597 "configure"
+#line 10322 "configure"
#include "confdefs.h"
#include <sys/dir.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:10602: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:10327: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
ac_safe=`echo "nlist.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for nlist.h""... $ac_c" 1>&6
-echo "configure:10635: checking for nlist.h" >&5
+echo "configure:10360: checking for nlist.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 10638 "configure"
+#line 10363 "configure"
#include "confdefs.h"
#include <nlist.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:10643: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:10368: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
echo "checking "for sound support"" 1>&6
-echo "configure:10673: checking "for sound support"" >&5
+echo "configure:10398: checking "for sound support"" >&5
case "$with_sound" in
native | both ) with_native_sound=yes;;
nas | no ) with_native_sound=no;;
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:10684: checking for multimedia/audio_device.h" >&5
+echo "configure:10409: checking for multimedia/audio_device.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 10687 "configure"
+#line 10412 "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:10692: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:10417: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
if test -z "$native_sound_lib"; then
echo $ac_n "checking for ALopenport in -laudio""... $ac_c" 1>&6
-echo "configure:10740: checking for ALopenport in -laudio" >&5
+echo "configure:10465: 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 10745 "configure"
+#line 10470 "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:10756: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10481: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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:10787: checking for AOpenAudio in -lAlib" >&5
+echo "configure:10512: 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 10792 "configure"
+#line 10517 "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:10803: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10528: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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:10841: checking for ${dir}/soundcard.h" >&5
+echo "configure:10566: checking for ${dir}/soundcard.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 10844 "configure"
+#line 10569 "configure"
#include "confdefs.h"
#include <${dir}/soundcard.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:10849: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:10574: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
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 10919 "configure"
+#line 10644 "configure"
#include "confdefs.h"
#include <audio/Xtutil.h>
EOF
if test "$with_tty" = "yes" ; then
echo "checking for TTY-related features" 1>&6
-echo "configure:10946: checking for TTY-related features" >&5
+echo "configure:10671: 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:10962: checking for tgetent in -lncurses" >&5
+echo "configure:10687: 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 10967 "configure"
+#line 10692 "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:10978: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10703: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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:11011: checking for ncurses/curses.h" >&5
+echo "configure:10736: checking for ncurses/curses.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 11014 "configure"
+#line 10739 "configure"
#include "confdefs.h"
#include <ncurses/curses.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11019: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:10744: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
ac_safe=`echo "ncurses/term.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for ncurses/term.h""... $ac_c" 1>&6
-echo "configure:11041: checking for ncurses/term.h" >&5
+echo "configure:10766: checking for ncurses/term.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 11044 "configure"
+#line 10769 "configure"
#include "confdefs.h"
#include <ncurses/term.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11049: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:10774: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
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:11079: checking for ncurses/curses.h" >&5
+echo "configure:10804: checking for ncurses/curses.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 11082 "configure"
+#line 10807 "configure"
#include "confdefs.h"
#include <ncurses/curses.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11087: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:10812: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
for lib in curses termlib termcap; do
echo $ac_n "checking for tgetent in -l$lib""... $ac_c" 1>&6
-echo "configure:11122: checking for tgetent in -l$lib" >&5
+echo "configure:10847: 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 11127 "configure"
+#line 10852 "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:11138: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10863: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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:11169: checking for tgetent in -lcurses" >&5
+echo "configure:10894: 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 11174 "configure"
+#line 10899 "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:11185: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10910: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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:11203: checking for tgetent in -ltermcap" >&5
+echo "configure:10928: 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 11208 "configure"
+#line 10933 "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:11219: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10944: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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:11267: checking for gpm.h" >&5
+echo "configure:10992: checking for gpm.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 11270 "configure"
+#line 10995 "configure"
#include "confdefs.h"
#include <gpm.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11275: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:11000: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
}
test -z "$with_gpm" && {
echo $ac_n "checking for Gpm_Open in -lgpm""... $ac_c" 1>&6
-echo "configure:11298: checking for Gpm_Open in -lgpm" >&5
+echo "configure:11023: 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 11303 "configure"
+#line 11028 "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:11314: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11039: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
test "$with_database_gnudbm $with_database_dbm $with_database_berkdb" \
!= "no no no" && echo "checking for database support" 1>&6
-echo "configure:11364: checking for database support" >&5
+echo "configure:11089: checking for database support" >&5
if test "$with_database_gnudbm $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:11369: checking for ndbm.h" >&5
+echo "configure:11094: checking for ndbm.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 11372 "configure"
+#line 11097 "configure"
#include "confdefs.h"
#include <ndbm.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11377: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:11102: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
if test "$with_database_gnudbm" != "no"; then
echo $ac_n "checking for dbm_open in -lgdbm""... $ac_c" 1>&6
-echo "configure:11407: checking for dbm_open in -lgdbm" >&5
+echo "configure:11132: 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 11412 "configure"
+#line 11137 "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:11423: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11148: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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:11451: checking for dbm_open" >&5
+echo "configure:11176: checking for dbm_open" >&5
cat > conftest.$ac_ext <<EOF
-#line 11454 "configure"
+#line 11179 "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:11477: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11202: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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:11496: checking for dbm_open in -ldbm" >&5
+echo "configure:11221: 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 11501 "configure"
+#line 11226 "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:11512: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11237: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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:11553: checking for Berkeley db.h" >&5
+echo "configure:11278: checking for Berkeley db.h" >&5
for path in "db/db.h" "db.h"; do
cat > conftest.$ac_ext <<EOF
-#line 11556 "configure"
+#line 11281 "configure"
#include "confdefs.h"
#ifdef HAVE_INTTYPES_H
#define __BIT_TYPES_DEFINED__
; return 0; }
EOF
-if { (eval echo configure:11574: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:11299: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
db_h_path="$path"; break
else
if test "$with_database_berkdb" != "no"; then
echo $ac_n "checking for Berkeley DB version""... $ac_c" 1>&6
-echo "configure:11590: checking for Berkeley DB version" >&5
+echo "configure:11315: checking for Berkeley DB version" >&5
cat > conftest.$ac_ext <<EOF
-#line 11592 "configure"
+#line 11317 "configure"
#include "confdefs.h"
#include <$db_h_path>
#if DB_VERSION_MAJOR > 1
rm -f conftest*
echo $ac_n "checking for $dbfunc""... $ac_c" 1>&6
-echo "configure:11611: checking for $dbfunc" >&5
+echo "configure:11336: checking for $dbfunc" >&5
cat > conftest.$ac_ext <<EOF
-#line 11614 "configure"
+#line 11339 "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:11637: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11362: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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:11656: checking for $dbfunc in -ldb" >&5
+echo "configure:11381: 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 11661 "configure"
+#line 11386 "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:11672: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11397: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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:11736: checking for SOCKSinit in -lsocks" >&5
+echo "configure:11461: 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 11741 "configure"
+#line 11466 "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:11752: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11477: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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:11809: checking for $ac_hdr" >&5
+echo "configure:11534: checking for $ac_hdr" >&5
cat > conftest.$ac_ext <<EOF
-#line 11812 "configure"
+#line 11537 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11817: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+{ (eval echo configure:11542: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
test -z "$with_shlib" && test ! -z "$have_dlfcn" && {
echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6
-echo "configure:11856: checking for dlopen in -ldl" >&5
+echo "configure:11581: checking for dlopen in -ldl" >&5
ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'`
xe_check_libs=" -ldl "
cat > conftest.$ac_ext <<EOF
-#line 11861 "configure"
+#line 11586 "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
dlopen()
; return 0; }
EOF
-if { (eval echo configure:11872: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11597: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
}
test -z "$with_shlib" && test ! -z "$have_dlfcn" && {
echo $ac_n "checking for _dlopen in -lc""... $ac_c" 1>&6
-echo "configure:11901: checking for _dlopen in -lc" >&5
+echo "configure:11626: checking for _dlopen in -lc" >&5
ac_lib_var=`echo c'_'_dlopen | sed 'y%./+-%__p_%'`
xe_check_libs=" -lc "
cat > conftest.$ac_ext <<EOF
-#line 11906 "configure"
+#line 11631 "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
_dlopen()
; return 0; }
EOF
-if { (eval echo configure:11917: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11642: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
}
test -z "$with_shlib" && test ! -z "$have_dlfcn" && {
echo $ac_n "checking for dlopen in -lc""... $ac_c" 1>&6
-echo "configure:11946: checking for dlopen in -lc" >&5
+echo "configure:11671: checking for dlopen in -lc" >&5
ac_lib_var=`echo c'_'dlopen | sed 'y%./+-%__p_%'`
xe_check_libs=" -lc "
cat > conftest.$ac_ext <<EOF
-#line 11951 "configure"
+#line 11676 "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
dlopen()
; return 0; }
EOF
-if { (eval echo configure:11962: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11687: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
}
test -z "$with_shlib" && {
echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6
-echo "configure:11991: checking for shl_load in -ldld" >&5
+echo "configure:11716: 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 11996 "configure"
+#line 11721 "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:12007: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11732: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
}
test -z "$with_shlib" && {
echo $ac_n "checking for dld_init in -ldld""... $ac_c" 1>&6
-echo "configure:12036: checking for dld_init in -ldld" >&5
+echo "configure:11761: 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 12041 "configure"
+#line 11766 "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:12052: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11777: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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:12091: checking how to build dynamic libraries for ${xehost}" >&5
+echo "configure:11816: 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:12119: checking checking whether we are using GNU C" >&5
+echo "configure:11844: checking checking whether we are using GNU C" >&5
cat > conftest.$ac_ext <<EOF
-#line 12121 "configure"
+#line 11846 "configure"
#include "confdefs.h"
#ifdef __GNUC__
fi
echo $ac_n "checking how to produce PIC code""... $ac_c" 1>&6
-echo "configure:12143: checking how to produce PIC code" >&5
+echo "configure:11868: 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:12236: checking if PIC flag ${dll_cflags} really works" >&5
+echo "configure:11961: checking if PIC flag ${dll_cflags} really works" >&5
save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $dll_cflags -DPIC"
cat > conftest.$ac_ext <<EOF
-#line 12240 "configure"
+#line 11965 "configure"
#include "confdefs.h"
int main() {
int x=0;
; return 0; }
EOF
-if { (eval echo configure:12247: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:11972: \"$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:12278: checking if C compiler can produce shared libraries" >&5
+echo "configure:12003: 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 12329 "configure"
+#line 12054 "configure"
#include "confdefs.h"
int main() {
int x=0;
; return 0; }
EOF
-if { (eval echo configure:12336: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12061: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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:12361: checking for ld used by GCC" >&5
+echo "configure:12086: 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:12386: checking for GNU ld" >&5
+echo "configure:12111: 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:12424: checking if the linker is GNU ld" >&5
+echo "configure:12149: 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:12451: checking whether the linker supports shared libraries" >&5
+echo "configure:12176: 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:12667: checking for $ac_func" >&5
+echo "configure:12392: checking for $ac_func" >&5
cat > conftest.$ac_ext <<EOF
-#line 12670 "configure"
+#line 12395 "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:12693: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12418: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
fi
cat > conftest.$ac_ext <<EOF
-#line 12727 "configure"
+#line 12452 "configure"
#include "confdefs.h"
int main(int c,char *v[]){return 0;}
EOF
-if { (eval echo configure:12731: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:12456: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
then
:
else
-
PREFIX=$prefix
while true; do
case "$PREFIX" in
-
EXEC_PREFIX=$exec_prefix
while true; do
case "$EXEC_PREFIX" in
-DOCDIR=$docdir
-while true; do
- case "$DOCDIR" in
- *\$* ) eval "DOCDIR=$DOCDIR" ;;
- *) break ;;
- esac
-done
-
-
-
-
ARCHLIBDIR=$archlibdir
while true; do
case "$ARCHLIBDIR" in
: ${XEMACS_CC:=$CC}
-if test "$with_prefix" = "yes"; then
- { test "$extra_verbose" = "yes" && cat << \EOF
- Defining PREFIX_USER_DEFINED
-EOF
-cat >> confdefs.h <<\EOF
-#define PREFIX_USER_DEFINED 1
-EOF
-}
-
-fi
if test "$with_site_lisp" = "no"; then
{ test "$extra_verbose" = "yes" && cat << \EOF
echo "$0 $quoted_arguments"
) > Installation
-if test ! -z ${emacs_beta_version} ; then
- if test -z "${emacs_is_beta}" ; then
- xemacs_betaname=".${emacs_beta_version}"
- else
- xemacs_betaname="-b${emacs_beta_version}"
- fi
-else
- xemacs_betaname=""
-fi
+xemacs_betaname=""
+test ! -z "${emacs_beta_version}" && xemacs_betaname="-b${emacs_beta_version}"
(
echo "
test "$with_database_dbm" = yes && echo " Compiling in support for DBM."
test "$with_database_gnudbm" = yes && echo " Compiling in support for GNU DBM."
-test "$with_ldap" = yes && echo " Compiling in support for LDAP."
+test "$with_umich_ldap" = yes && echo " Compiling in support for LDAP (UMich libs)."
+test "$with_ns_ldap" = yes && echo " Compiling in support for LDAP (Netscape SDK)."
+test "$with_ldap" = yes -a "$with_umich_ldap" = no -a "$with_ns_ldap" = no && echo " Compiling in support for LDAP (Generic)."
test "$with_ncurses" = yes && echo " Compiling in support for ncurses."
test "$with_gpm" = yes && echo " Compiling in support for GPM (General Purpose Mouse)."
test "$with_offix" = yes && echo " Compiling in support for OffiX."
test "$with_dragndrop" = yes && echo " Compiling in EXPERIMENTAL support for Drag'n'Drop ($dragndrop_proto )."
test "$with_workshop" = yes && echo " Compiling in support for Sun WorkShop."
-test "$with_wmcommand" != no && echo " Compiling in support for proper WM_COMMAND handling."
+test "$with_session" != no && echo " Compiling in support for proper session-management."
case "$with_menubars" in
lucid ) echo " Using Lucid menubars." ;;
motif ) echo " Using Motif menubars."
echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
-version | --version | --versio | --versi | --vers | --ver | --ve | --v)
- echo "$CONFIG_STATUS generated by autoconf version 2.13"
+ echo "$CONFIG_STATUS generated by autoconf version 2.12"
exit 0 ;;
-help | --help | --hel | --he | --h)
echo "\$ac_cs_usage"; exit 0 ;;
s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
$ac_vpsub
$extrasub
-s%@SHELL@%$SHELL%g
s%@CFLAGS@%$CFLAGS%g
s%@CPPFLAGS@%$CPPFLAGS%g
s%@CXXFLAGS@%$CXXFLAGS%g
-s%@FFLAGS@%$FFLAGS%g
s%@DEFS@%$DEFS%g
s%@LDFLAGS@%$LDFLAGS%g
s%@LIBS@%$LIBS%g
s%@lib_gcc@%$lib_gcc%g
s%@RANLIB@%$RANLIB%g
s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
-s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
s%@INSTALL_DATA@%$INSTALL_DATA%g
s%@YACC@%$YACC%g
s%@SET_MAKE@%$SET_MAKE%g
s%@srcdir@%$srcdir%g
s%@pkgdir@%$pkgdir%g
s%@statedir@%$statedir%g
-s%@PREFIX_USER_DEFINED@%$PREFIX_USER_DEFINED%g
s%@PREFIX@%$PREFIX%g
-s%@EXEC_PREFIX_USER_DEFINED@%$EXEC_PREFIX_USER_DEFINED%g
s%@EXEC_PREFIX@%$EXEC_PREFIX%g
s%@INFODIR_USER_DEFINED@%$INFODIR_USER_DEFINED%g
s%@INFODIR@%$INFODIR%g
s%@lockdir@%$lockdir%g
s%@LOCKDIR_USER_DEFINED@%$LOCKDIR_USER_DEFINED%g
s%@LOCKDIR@%$LOCKDIR%g
-s%@docdir@%$docdir%g
-s%@DOCDIR_USER_DEFINED@%$DOCDIR_USER_DEFINED%g
-s%@DOCDIR@%$DOCDIR%g
s%@archlibdir@%$archlibdir%g
s%@ARCHLIBDIR_USER_DEFINED@%$ARCHLIBDIR_USER_DEFINED%g
s%@ARCHLIBDIR@%$ARCHLIBDIR%g
+s%@docdir@%$docdir%g
s%@bitmapdir@%$bitmapdir%g
s%@extra_objs@%$extra_objs%g
s%@machfile@%$machfile%g
etcdir='${datadir}/${PROGNAME}-${version}/etc'
lockdir='${statedir}/${PROGNAME}/lock'
archlibdir='${datadir}/${PROGNAME}-${version}/${configuration}'
-docdir='${archlibdir}'
-with_prefix='yes'
with_site_lisp='no'
with_site_modules='yes'
with_menubars=''
with_scrollbars=''
-with_widgets=''
with_dialogs=''
with_file_coding=''
dnl const_is_losing is removed - we rely on AC_C_CONST instead.
dnl Process (many) boolean options
with_site_lisp | \
- with_prefix | \
- with_site_modules | \
+ with_site_modules | \
with_x | \
with_x11 | \
with_msw | \
with_jpeg | \
with_png | \
with_tiff | \
- with_wmcommand | \
+ with_session | \
with_xmu | \
with_purify | \
with_quantify | \
malloc ) error_check_malloc=yes ;;
nomalloc ) error_check_malloc=no ;;
- byte_code ) error_check_byte_code=yes ;;
- nobyte_code ) error_check_byte_code=no ;;
-
* ) bogus_error_check=yes ;;
esac
if test "$bogus_error_check" -o \
\( -n "$new_default" -a -n "$echeck_notfirst" \) ; then
if test "$error_check_default" = yes ; then
- types="\`all' (default), \`none', \`noextents', \`notypecheck', \`nobufpos', \`nogc', \`nomalloc', and \`nobyte-code'."
+ types="\`all' (default), \`none', \`noextents', \`notypecheck', \`nobufpos', \`nogc', and \`nomalloc'."
else
- types="\`all', \`none' (default), \`extents', \`typecheck', \`bufpos', \`gc', \`malloc', and \`byte-code'."
+ types="\`all', \`none' (default), \`extents', \`typecheck', \`bufpos', \`gc', and \`malloc'."
fi
USAGE_ERROR(["Valid types for the \`--$optname' option are:
$types."])
error_check_bufpos=$new_default
error_check_gc=$new_default
error_check_malloc=$new_default
- error_check_byte_code=$new_default
new_default= # reset this
fi
echeck_notfirst=true
dnl You need to synchronize this with the way the
dnl default values are built.
case "$opt" in
- dnl prefix is taken care of by --with-prefix
- exec_prefix ) AC_DEFINE(EXEC_PREFIX_USER_DEFINED) ;;
lispdir ) AC_DEFINE(LISPDIR_USER_DEFINED) ;;
sitelispdir ) AC_DEFINE(SITELISPDIR_USER_DEFINED) ;;
moduledir ) AC_DEFINE(MODULEDIR_USER_DEFINED) ;;
AC_DEFINE(MODULEDIR_USER_DEFINED)
AC_DEFINE(ETCDIR_USER_DEFINED) ;;
statedir | lockdir ) AC_DEFINE(LOCKDIR_USER_DEFINED) ;;
- docdir ) AC_DEFINE(DOCDIR_USER_DEFINED) ;;
exec_prefix | libdir | archlibdir ) AC_DEFINE(ARCHLIBDIR_USER_DEFINED) ;;
esac
;;
dnl Has the user specified the toolkit(s) to use for GUI elements?
"with_menubars" | \
"with_scrollbars" | \
- "with_dialogs" | \
- "with_widgets" )
+ "with_dialogs" )
case "$val" in
l | lu | luc | luci | lucid ) val=lucid ;;
m | mo | mot | moti | motif ) val=motif ;;
dnl ----------------------------------------
. "$srcdir/version.sh" || exit 1;
dnl Must do the following first to determine verbosity for AC_DEFINE
-if test -n "$emacs_is_beta"; then beta=yes; else beta=no; fi
+if test -n "$emacs_beta_version"; then beta=yes; else beta=no; fi
: "${extra_verbose=$beta}"
version="${emacs_major_version}.${emacs_minor_version}"
AC_DEFINE_UNQUOTED(EMACS_MAJOR_VERSION, $emacs_major_version)
AC_DEFINE_UNQUOTED(EMACS_MINOR_VERSION, $emacs_minor_version)
-if test -n "$emacs_beta_version" ; then
- if test "$beta" = "yes"; then
- version="${version}-b${emacs_beta_version}"
- AC_DEFINE_UNQUOTED(EMACS_BETA_VERSION, $emacs_beta_version)
- else
- version="${version}.${emacs_beta_version}"
- AC_DEFINE_UNQUOTED(EMACS_PATCH_LEVEL, $emacs_beta_version)
- fi
+if test -n "$emacs_beta_version"; then
+ version="${version}-b${emacs_beta_version}"
+ AC_DEFINE_UNQUOTED(EMACS_BETA_VERSION, $emacs_beta_version)
fi
AC_DEFINE_UNQUOTED(XEMACS_CODENAME, "$xemacs_codename")
AC_DEFINE_UNQUOTED(EMACS_VERSION, "$version")
if test "$with_infodock" = "yes"; then
- if test ! -f ../../ID-INSTALL; then
+ if test ! -f ../ID-INSTALL; then
echo "Cannot build InfoDock without InfoDock sources"
with_infodock=no
fi
dnl ----------------------------------
dnl Error checking default to "yes" in beta versions, to "no" in releases.
dnl Same goes for --debug and --extra-verbosity.
-if test -n "$emacs_is_beta"; then beta=yes; else beta=no; fi
+if test -n "$emacs_beta_version"; then beta=yes; else beta=no; fi
test "${error_check_extents=$beta}" = yes && AC_DEFINE(ERROR_CHECK_EXTENTS)
test "${error_check_typecheck=$beta}" = yes && AC_DEFINE(ERROR_CHECK_TYPECHECK)
test "${error_check_bufpos=$beta}" = yes && AC_DEFINE(ERROR_CHECK_BUFPOS)
test "${error_check_gc=$beta}" = yes && AC_DEFINE(ERROR_CHECK_GC)
test "${error_check_malloc=$beta}" = yes && AC_DEFINE(ERROR_CHECK_MALLOC)
-test "${error_check_byte_code=$beta}" = yes && AC_DEFINE(ERROR_CHECK_BYTE_CODE)
dnl debug=yes must be set when error checking is present. This should be
dnl fixed up.
dnl debug implies other options
COLON_TO_SPACE(site_prefixes)
if test -n "$site_prefixes"; then
for dir in $site_prefixes; do
- lib_dir="${dir}/lib"
inc_dir="${dir}/include"
+ lib_dir="${dir}/lib"
if test ! -d "$dir"; then
XE_DIE("Invalid site prefix \`$dir': no such directory")
+ elif test ! -d "$inc_dir"; then
+ XE_DIE("Invalid site prefix \`$dir': no such directory \`$inc_dir'")
elif test ! -d "$lib_dir"; then
XE_DIE("Invalid site prefix \`$dir': no such directory \`$lib_dir'")
else
- if test -d "$inc_dir"; then
- XE_APPEND("-I$inc_dir", c_switch_site)
- fi
+ XE_APPEND("-I$inc_dir", c_switch_site)
XE_APPEND("-L$lib_dir", ld_switch_site)
fi
done
dnl if test "$with_tty" = "no" ; then
dnl AC_MSG_ERROR([No window system support and no TTY support - Unable to proceed.])
dnl fi
- for feature in tooltalk cde offix wmcommand xim xmu
+ for feature in tooltalk cde offix session xim xmu
do
if eval "test -n \"\$with_${feature}\" -a \"\$with_${feature}\" != no" ; then
AC_MSG_WARN([--with-$feature ignored: Not valid without X support])
test "$opsys" = "hpux9-shr" && opsysfile="s/hpux9shxr4.h"
esac
-dnl Enable or disable proper handling of WM_COMMAND
-AC_CHECKING(for WM_COMMAND option);
-dnl if test "$with_wmcommand" = "yes"; then
-if test "$with_wmcommand" != "no"; then
- AC_DEFINE(HAVE_WMCOMMAND)
+dnl Enable or disable proper session-management
+AC_CHECKING(for session-management option);
+dnl if test "$with_session" = "yes"; then
+if test "$with_session" != "no"; then
+ AC_DEFINE(HAVE_SESSION)
fi
dnl Autodetect Xauth
test -z "$with_ldap" && { AC_CHECK_HEADER(ldap.h, ,with_ldap=no) }
test -z "$with_ldap" && { AC_CHECK_HEADER(lber.h, ,with_ldap=no) }
if test "$with_ldap" != "no"; then
- AC_CHECK_LIB(ldap, ldap_search, with_ldap_nolber=yes, with_ldap_nolber=no)
- test "$with_ldap_nolber" = "no" && { AC_CHECK_LIB(ldap, ldap_open, with_ldap_lber=yes, with_ldap_lber=no, -llber) }
- test -z "$with_ldap" -a \( "$with_ldap_lber" = "yes" -o "$with_ldap_nolber" = "yes" \) && with_ldap=yes
+ test -z "$with_umich_ldap" && { AC_CHECK_LIB(ldap, ldap_open, with_umich_ldap=yes, with_umich_ldap=no, -llber) }
+ test "$with_umich_ldap" = "no" && { AC_CHECK_LIB(ldap10, ldap_set_option, with_ns_ldap=yes, with_ns_ldap=no) }
+ test -z "$with_ldap" -a \( "$with_umich_ldap" = "yes" -o "$with_ns_ldap" = "yes" \) && with_ldap=yes
fi
if test "$with_ldap" = "yes"; then
AC_DEFINE(HAVE_LDAP)
XE_ADD_OBJS(eldap.o)
- if test "$with_ldap_nolber" = "yes" ; then
- XE_PREPEND(-lldap, LIBS)
- else
+ if test "$with_umich_ldap" = "yes" ; then
+ AC_DEFINE(HAVE_UMICH_LDAP)
XE_PREPEND(-llber, LIBS)
XE_PREPEND(-lldap, LIBS)
+ elif test "$with_ldap" = "yes" -a "$with_ns_ldap" = "yes" ; then
+ AC_DEFINE(HAVE_NS_LDAP)
+ XE_PREPEND(-lldap10, LIBS)
+ elif test "$with_ldap" = "yes" ; then
+ XE_PREPEND(-lldap, LIBS)
fi
- AC_CHECK_FUNCS(ldap_set_option ldap_get_lderrno ldap_result2error ldap_parse_result)
fi
dnl ----------------------
case "$with_scrollbars" in "" | "yes" )
with_scrollbars="lucid" ;;
esac
-case "$with_widgets" in "" | "yes" )
- if test "$have_motif" = "yes"; then with_widgets="motif"
- else with_widgets=no
- fi ;;
-esac
-all_widgets="$with_menubars $with_scrollbars $with_dialogs $with_toolbars $with_widgets"
+all_widgets="$with_menubars $with_scrollbars $with_dialogs $with_toolbars"
case "$all_widgets" in *athena* )
AC_DEFINE(LWLIB_USES_ATHENA)
test "$with_scrollbars" != "no" && XE_ADD_OBJS(scrollbar-x.o)
test "$with_dialogs" != "no" && XE_ADD_OBJS(dialog-x.o)
test "$with_toolbars" != "no" && XE_ADD_OBJS(toolbar-x.o)
- test "$all_widgets" != "no no no no no" && XE_ADD_OBJS(gui-x.o)
+ test "$all_widgets" != "no no no no" && XE_ADD_OBJS(gui-x.o)
else
if test \( "$with_sound" = "nas" \) -o \( "$with_sound" = "both" \); then
echo "Attempt to Build NAS sound without X"
AC_SUBST(mandir)
AC_SUBST(prefix)
-AC_SUBST(PREFIX_USER_DEFINED)
dnl Yo, Stephen Bourne! I want to marry you!
PREFIX=$prefix
while true; do
AC_SUBST(PREFIX)
AC_SUBST(exec_prefix)
-AC_SUBST(EXEC_PREFIX_USER_DEFINED)
EXEC_PREFIX=$exec_prefix
while true; do
case "$EXEC_PREFIX" in
done
AC_SUBST(LOCKDIR)
-AC_SUBST(docdir)
-AC_SUBST(DOCDIR_USER_DEFINED)
-DOCDIR=$docdir
-while true; do
- case "$DOCDIR" in
- *\$* ) eval "DOCDIR=$DOCDIR" ;;
- *) break ;;
- esac
-done
-AC_SUBST(DOCDIR)
-
AC_SUBST(archlibdir)
AC_SUBST(ARCHLIBDIR_USER_DEFINED)
ARCHLIBDIR=$archlibdir
: ${XEMACS_CC:=$CC}
AC_SUBST(XEMACS_CC)
-dnl The default is yes
-if test "$with_prefix" = "yes"; then
- AC_DEFINE(PREFIX_USER_DEFINED)
-fi
dnl The default is no
if test "$with_site_lisp" = "no"; then
echo "$0 $quoted_arguments"
) > Installation
-if test ! -z ${emacs_beta_version} ; then
- if test -z "${emacs_is_beta}" ; then
- xemacs_betaname=".${emacs_beta_version}"
- else
- xemacs_betaname="-b${emacs_beta_version}"
- fi
-else
- xemacs_betaname=""
-fi
+xemacs_betaname=""
+test ! -z "${emacs_beta_version}" && xemacs_betaname="-b${emacs_beta_version}"
dnl Start stdout redirection to '| tee -a Installation'
(
test "$with_database_dbm" = yes && echo " Compiling in support for DBM."
test "$with_database_gnudbm" = yes && echo " Compiling in support for GNU DBM."
-test "$with_ldap" = yes && echo " Compiling in support for LDAP."
+test "$with_umich_ldap" = yes && echo " Compiling in support for LDAP (UMich libs)."
+test "$with_ns_ldap" = yes && echo " Compiling in support for LDAP (Netscape SDK)."
+test "$with_ldap" = yes -a "$with_umich_ldap" = no -a "$with_ns_ldap" = no && echo " Compiling in support for LDAP (Generic)."
test "$with_ncurses" = yes && echo " Compiling in support for ncurses."
test "$with_gpm" = yes && echo " Compiling in support for GPM (General Purpose Mouse)."
test "$with_offix" = yes && echo " Compiling in support for OffiX."
test "$with_dragndrop" = yes && echo " Compiling in EXPERIMENTAL support for Drag'n'Drop ($dragndrop_proto )."
test "$with_workshop" = yes && echo " Compiling in support for Sun WorkShop."
-test "$with_wmcommand" != no && echo " Compiling in support for proper WM_COMMAND handling."
+test "$with_session" != no && echo " Compiling in support for proper session-management."
case "$with_menubars" in
lucid ) echo " Using Lucid menubars." ;;
motif ) echo " Using Motif menubars."
--- /dev/null
+Reference: Robert W. Brockway, Myth from the Ice Age to Mickey Mouse
+
+ A collective definition of myth composed of many theories might be
+ framed by the following paraphrase:
+
+ Myths are stories, usually, about gods and other supernatural
+ beings. They are often stories of origins, how the world and
+ everything in it came to be in illo tempore. They are usually
+ strongly structured and their meaning is only discerned by
+ linguistic analysis. Sometimes they are public dreams which, like
+ private dreams, emerge from the unconscious mind. Indeed, they
+ often reveal the archetypes of the collective unconscious. They
+ are symbolic and metaphorical. They orient people to the
+ metaphysical dimension, explain the origins and nature of the
+ cosmos, validate social issues, and, on the psychological plane,
+ address themselves to the innermost depths of the psyche. Some of
+ them are explanatory, being prescientific attempts to interpret
+ the natural world. As such, they are usually functional and are
+ the science of primitive peoples. Often, they are enacted in
+ rituals. Religious myths are sacred histories, and distinguished
+ from the profane. But, being semiotic expressions, they are a
+ "disease of language." They are both individual and social in
+ scope, but they are first and foremost stories.
+
+
--- /dev/null
+;; -*- Mode: Emacs-Lisp -*-
+
+;;; This is a sample .emacs file.
+;;;
+;;; The .emacs file, which should reside in your home directory, allows you to
+;;; customize the behavior of Emacs. In general, changes to your .emacs file
+;;; will not take effect until the next time you start up Emacs. You can load
+;;; it explicitly with `M-x load-file RET ~/.emacs RET'.
+;;;
+;;; There is a great deal of documentation on customization in the Emacs
+;;; manual. You can read this manual with the online Info browser: type
+;;; `C-h i' or select "Emacs Info" from the "Help" menu.
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Basic Customization ;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;; Enable the command `narrow-to-region' ("C-x n n"), a useful
+;; command, but possibly confusing to a new user, so it's disabled by
+;; default.
+(put 'narrow-to-region 'disabled nil)
+
+;;; Define a variable to indicate whether we're running XEmacs/Lucid Emacs.
+;;; (You do not have to defvar a global variable before using it --
+;;; you can just call `setq' directly like we do for `emacs-major-version'
+;;; below. It's clearer this way, though.)
+
+(defvar running-xemacs (string-match "XEmacs\\|Lucid" emacs-version))
+
+;; Make the sequence "C-x w" execute the `what-line' command,
+;; which prints the current line number in the echo area.
+(global-set-key "\C-xw" 'what-line)
+
+;; set up the function keys to do common tasks to reduce Emacs pinky
+;; and such.
+
+;; Make F1 invoke help
+(global-set-key [f1] 'help-command)
+;; Make F2 be `undo'
+(global-set-key [f2] 'undo)
+;; Make F3 be `find-file'
+;; Note: it does not currently work to say
+;; (global-set-key 'f3 "\C-x\C-f")
+;; The reason is that macros can't do interactive things properly.
+;; This is an extremely longstanding bug in Emacs. Eventually,
+;; it will be fixed. (Hopefully ..)
+(global-set-key [f3] 'find-file)
+
+;; Make F4 be "mark", F5 be "copy", F6 be "paste"
+;; Note that you can set a key sequence either to a command or to another
+;; key sequence.
+(global-set-key [f4] 'set-mark-command)
+(global-set-key [f5] "\M-w")
+(global-set-key [f6] "\C-y")
+
+;; Shift-F4 is "pop mark off of stack"
+(global-set-key [(shift f4)] (lambda () (interactive) (set-mark-command t)))
+
+;; Make F7 be `save-buffer'
+(global-set-key [f7] 'save-buffer)
+
+;; Make F8 be "start macro", F9 be "end macro", F10 be "execute macro"
+(global-set-key [f8] 'start-kbd-macro)
+(global-set-key [f9] 'end-kbd-macro)
+(global-set-key [f10] 'call-last-kbd-macro)
+
+;; Here's an alternative binding if you don't use keyboard macros:
+;; Make F8 be `save-buffer' followed by `delete-window'.
+;;(global-set-key 'f8 "\C-x\C-s\C-x0")
+
+;; If you prefer delete to actually delete forward then you want to
+;; uncomment the next line (or use `Customize' to customize this).
+;; (setq delete-key-deletes-forward t)
+
+
+(cond (running-xemacs
+ ;;
+ ;; Code for any version of XEmacs/Lucid Emacs goes here
+ ;;
+
+ ;; Change the values of some variables.
+ ;; (t means true; nil means false.)
+ ;;
+ ;; Use the "Describe Variable..." option on the "Help" menu
+ ;; to find out what these variables mean.
+ (setq find-file-use-truenames nil
+ find-file-compare-truenames t
+ minibuffer-confirm-incomplete t
+ complex-buffers-menu-p t
+ next-line-add-newlines nil
+ mail-yank-prefix "> "
+ kill-whole-line t
+ )
+
+ ;; When running ispell, consider all 1-3 character words as correct.
+ (setq ispell-extra-args '("-W" "3"))
+
+ (cond ((or (not (fboundp 'device-type))
+ (equal (device-type) 'x)
+ (equal (device-type) 'mswindows))
+ ;; Code which applies only when running emacs under X or
+ ;; MicroSoft Windows goes here. (We check whether the
+ ;; function `device-type' exists before using it. In
+ ;; versions before 19.12, there was no such function.
+ ;; If it doesn't exist, we simply assume we're running
+ ;; under X -- versions before 19.12 only supported X.)
+
+ ;; Remove the binding of C-x C-c, which normally exits emacs.
+ ;; It's easy to hit this by mistake, and that can be annoying.
+ ;; Under X, you can always quit with the "Exit Emacs" option on
+ ;; the File menu.
+ (global-set-key "\C-x\C-c" nil)
+
+ ;; Uncomment this to enable "sticky modifier keys" in 19.13
+ ;; and up. With sticky modifier keys enabled, you can
+ ;; press and release a modifier key before pressing the
+ ;; key to be modified, like how the ESC key works always.
+ ;; If you hold the modifier key down, however, you still
+ ;; get the standard behavior. I personally think this
+ ;; is the best thing since sliced bread (and a *major*
+ ;; win when it comes to reducing Emacs pinky), but it's
+ ;; disorienting at first so I'm not enabling it here by
+ ;; default.
+
+ ;;(setq modifier-keys-are-sticky t)
+
+ ;; This changes the variable which controls the text that goes
+ ;; in the top window title bar. (However, it is not changed
+ ;; unless it currently has the default value, to avoid
+ ;; interfering with a -wn command line argument I may have
+ ;; started emacs with.)
+ (if (equal frame-title-format "%S: %b")
+ (setq frame-title-format
+ (concat "%S: " invocation-directory invocation-name
+ " [" emacs-version "]"
+ (if nil ; (getenv "NCD")
+ ""
+ " %b"))))
+
+ ;; If we're running on display 0, load some nifty sounds that
+ ;; will replace the default beep. But if we're running on a
+ ;; display other than 0, which probably means my NCD X terminal,
+ ;; which can't play digitized sounds, do two things: reduce the
+ ;; beep volume a bit, and change the pitch of the sound that is
+ ;; made for "no completions."
+ ;;
+ ;; (Note that sampled sounds only work if XEmacs was compiled
+ ;; with sound support, and we're running on the console of a
+ ;; Sparc, HP, or SGI machine, or on a machine which has a
+ ;; NetAudio server; otherwise, you just get the standard beep.)
+ ;;
+ ;; (Note further that changing the pitch and duration of the
+ ;; standard beep only works with some X servers; many servers
+ ;; completely ignore those parameters.)
+ ;;
+ (cond ((or (and (getenv "DISPLAY")
+ (string-match ":0" (getenv "DISPLAY")))
+ (and (eq (console-type) 'mswindows)
+ (device-sound-enabled-p)))
+ (load-default-sounds))
+ (t
+ (setq bell-volume 40)
+ (setq sound-alist
+ (append sound-alist '((no-completion :pitch 500))))
+ ))
+
+ ;; Make `C-x C-m' and `C-x RET' be different (since I tend
+ ;; to type the latter by accident sometimes.)
+ (define-key global-map [(control x) return] nil)
+
+ ;; Change the pointer used when the mouse is over a modeline
+ (set-glyph-image modeline-pointer-glyph "leftbutton")
+
+ ;; Change the continuation glyph face so it stands out more
+ (and (fboundp 'make-face-bold)
+ (boundp 'continuation-glyph)
+ (make-face-bold (glyph-face continuation-glyph)))
+
+ ;; Change the pointer used during garbage collection.
+ ;;
+ ;; Note that this pointer image is rather large as pointers go,
+ ;; and so it won't work on some X servers (such as the MIT
+ ;; R5 Sun server) because servers may have lamentably small
+ ;; upper limits on pointer size.
+ ;;(if (featurep 'xpm)
+ ;; (set-glyph-image gc-pointer-glyph
+ ;; (expand-file-name "trash.xpm" data-directory)))
+
+ ;; Here's another way to do that: it first tries to load the
+ ;; pointer once and traps the error, just to see if it's
+ ;; possible to load that pointer on this system; if it is,
+ ;; then it sets gc-pointer-glyph, because we know that
+ ;; will work. Otherwise, it doesn't change that variable
+ ;; because we know it will just cause some error messages.
+ (if (featurep 'xpm)
+ (let ((file (expand-file-name "recycle.xpm" data-directory)))
+ (if (condition-case error
+ ;; check to make sure we can use the pointer.
+ (make-image-instance file nil
+ '(pointer))
+ (error nil)) ; returns nil if an error occurred.
+ (set-glyph-image gc-pointer-glyph file))))
+
+ (when (featurep 'menubar)
+ ;; Add `dired' to the File menu
+ (add-menu-button '("File") ["Edit Directory" dired t])
+
+ ;; Here's a way to add scrollbar-like buttons to the menubar
+ (add-menu-button nil ["Top" beginning-of-buffer t])
+ (add-menu-button nil ["<<<" scroll-down t])
+ (add-menu-button nil [" . " recenter t])
+ (add-menu-button nil [">>>" scroll-up t])
+ (add-menu-button nil ["Bot" end-of-buffer t]))
+
+ ;; Change the behavior of mouse button 2 (which is normally
+ ;; bound to `mouse-yank'), so that it inserts the selected text
+ ;; at point (where the text cursor is), instead of at the
+ ;; position clicked.
+ ;;
+ ;; Note that you can find out what a particular key sequence or
+ ;; mouse button does by using the "Describe Key..." option on
+ ;; the Help menu.
+ (setq mouse-yank-at-point t)
+
+ ;; When editing C code (and Lisp code and the like), I often
+ ;; like to insert tabs into comments and such. It gets to be
+ ;; a pain to always have to use `C-q TAB', so I set up a more
+ ;; convenient binding. Note that this does not work in
+ ;; TTY frames, where tab and shift-tab are indistinguishable.
+ (define-key global-map '(shift tab) 'self-insert-command)
+
+ ;; LISPM bindings of Control-Shift-C and Control-Shift-E.
+ ;; Note that "\C-C" means Control-C, not Control-Shift-C.
+ ;; To specify shifted control characters, you must use the
+ ;; more verbose syntax used here.
+ (define-key emacs-lisp-mode-map '(control C) 'compile-defun)
+ (define-key emacs-lisp-mode-map '(control E) 'eval-defun)
+
+ ;; If you like the FSF Emacs binding of button3 (single-click
+ ;; extends the selection, double-click kills the selection),
+ ;; uncomment the following:
+
+ ;; Under 19.13, the following is enough:
+ ;(define-key global-map 'button3 'mouse-track-adjust)
+
+ ;; But under 19.12, you need this:
+ ;(define-key global-map 'button3
+ ; (lambda (event)
+ ; (interactive "e")
+ ; (let ((default-mouse-track-adjust t))
+ ; (mouse-track event))))
+
+ ;; Under both 19.12 and 19.13, you also need this:
+ ;(add-hook 'mouse-track-click-hook
+ ; (lambda (event count)
+ ; (if (or (/= (event-button event) 3)
+ ; (/= count 2))
+ ; nil ;; do the normal operation
+ ; (kill-region (point) (mark))
+ ; t ;; don't do the normal operations.
+ ; )))
+
+ ))
+
+ ))
+
+;; Oh, and here's a cute hack you might want to put in the sample .emacs
+;; file: it changes the color of the window if it's not on the local
+;; machine, or if it's running as root:
+
+;; local emacs background: whitesmoke
+;; remote emacs background: palegreen1
+;; root emacs background: coral2
+(cond
+ ((and (string-match "XEmacs" emacs-version)
+ (eq window-system 'x)
+ (boundp 'emacs-major-version)
+ (= emacs-major-version 19)
+ (>= emacs-minor-version 12))
+ (let* ((root-p (eq 0 (user-uid)))
+ (dpy (or (getenv "DISPLAY") ""))
+ (remote-p (not
+ (or (string-match "^\\(\\|unix\\|localhost\\):" dpy)
+ (let ((s (system-name)))
+ (if (string-match "\\.\\(netscape\\|mcom\\)\\.com" s)
+ (setq s (substring s 0 (match-beginning 0))))
+ (string-match (concat "^" (regexp-quote s)) dpy)))))
+ (bg (cond (root-p "coral2")
+ (remote-p "palegreen1")
+ (t nil))))
+ (cond (bg
+ (let ((def (color-name (face-background 'default)))
+ (faces (face-list)))
+ (while faces
+ (let ((obg (face-background (car faces))))
+ (if (and obg (equal def (color-name obg)))
+ (set-face-background (car faces) bg)))
+ (setq faces (cdr faces)))))))))
+
+
+;;; Older versions of emacs did not have these variables
+;;; (emacs-major-version and emacs-minor-version.)
+;;; Let's define them if they're not around, since they make
+;;; it much easier to conditionalize on the emacs version.
+
+(if (and (not (boundp 'emacs-major-version))
+ (string-match "^[0-9]+" emacs-version))
+ (setq emacs-major-version
+ (string-to-int (substring emacs-version
+ (match-beginning 0) (match-end 0)))))
+(if (and (not (boundp 'emacs-minor-version))
+ (string-match "^[0-9]+\\.\\([0-9]+\\)" emacs-version))
+ (setq emacs-minor-version
+ (string-to-int (substring emacs-version
+ (match-beginning 1) (match-end 1)))))
+
+;;; Define a function to make it easier to check which version we're
+;;; running.
+
+(defun running-emacs-version-or-newer (major minor)
+ (or (> emacs-major-version major)
+ (and (= emacs-major-version major)
+ (>= emacs-minor-version minor))))
+
+(cond ((and running-xemacs
+ (running-emacs-version-or-newer 19 6))
+ ;;
+ ;; Code requiring XEmacs/Lucid Emacs version 19.6 or newer goes here
+ ;;
+ ))
+
+(cond ((>= emacs-major-version 19)
+ ;;
+ ;; Code for any vintage-19 emacs goes here
+ ;;
+ ))
+
+(cond ((and (not running-xemacs)
+ (>= emacs-major-version 19))
+ ;;
+ ;; Code specific to FSF Emacs 19 (not XEmacs/Lucid Emacs) goes here
+ ;;
+ ))
+
+(cond ((< emacs-major-version 19)
+ ;;
+ ;; Code specific to emacs 18 goes here
+ ;;
+ ))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Customization of Specific Packages ;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;; Load gnuserv, which will allow you to connect to XEmacs sessions
+;;; using `gnuclient'.
+
+;; If you never run more than one XEmacs at a time, you might want to
+;; always start gnuserv. Otherwise it is preferable to specify
+;; `-f gnuserv-start' on the command line to one of the XEmacsen.
+; (gnuserv-start)
+
+
+;;; ********************
+;;; Load efs, which uses the FTP protocol as a pseudo-filesystem.
+;;; When this is loaded, the pathname syntax /user@host:/remote/path
+;;; refers to files accessible through ftp.
+;;;
+(require 'dired)
+;; compatible ange-ftp/efs initialization derived from code
+;; from John Turner <turner@lanl.gov>
+;; As of 19.15, efs is bundled instead of ange-ftp.
+;; NB: doesn't handle 20.0 properly, efs didn't appear until 20.1.
+;;
+;; The environment variable EMAIL_ADDRESS is used as the password
+;; for access to anonymous ftp sites, if it is set. If not, one is
+;; constructed using the environment variables USER and DOMAINNAME
+;; (e.g. turner@lanl.gov), if set.
+
+(if (and running-xemacs
+ (or (> emacs-major-version 20)
+ (and (= emacs-major-version 20) (>= emacs-minor-version 1))
+ (and (= emacs-major-version 19) (>= emacs-minor-version 15))))
+ (progn
+ (message "Loading and configuring bundled packages... efs")
+ (require 'efs-auto)
+ (if (getenv "USER")
+ (setq efs-default-user (getenv "USER")))
+ (if (getenv "EMAIL_ADDRESS")
+ (setq efs-generate-anonymous-password (getenv "EMAIL_ADDRESS"))
+ (if (and (getenv "USER")
+ (getenv "DOMAINNAME"))
+ (setq efs-generate-anonymous-password
+ (concat (getenv "USER")"@"(getenv "DOMAINNAME")))))
+ (setq efs-auto-save 1))
+ (progn
+ (message "Loading and configuring bundled packages... ange-ftp")
+ (require 'ange-ftp)
+ (if (getenv "USER")
+ (setq ange-ftp-default-user (getenv "USER")))
+ (if (getenv "EMAIL_ADDRESS")
+ (setq ange-ftp-generate-anonymous-password (getenv "EMAIL_ADDRESS"))
+ (if (and (getenv "USER")
+ (getenv "DOMAINNAME"))
+ (setq ange-ftp-generate-anonymous-password
+ (concat (getenv "USER")"@"(getenv "DOMAINNAME")))))
+ (setq ange-ftp-auto-save 1)
+ )
+ )
+
+;;; ********************
+;;; Load the default-dir.el package which installs fancy handling
+;;; of the initial contents in the minibuffer when reading
+;;; file names.
+
+(if (and running-xemacs
+ (or (and (= emacs-major-version 20) (>= emacs-minor-version 1))
+ (and (= emacs-major-version 19) (>= emacs-minor-version 15))))
+ (require 'default-dir))
+
+;;; ********************
+;;; Load the auto-save.el package, which lets you put all of your autosave
+;;; files in one place, instead of scattering them around the file system.
+;;;
+(setq auto-save-directory (expand-file-name "~/autosave/")
+ auto-save-directory-fallback auto-save-directory
+ auto-save-hash-p nil
+ efs-auto-save t
+ efs-auto-save-remotely nil
+ ;; now that we have auto-save-timeout, let's crank this up
+ ;; for better interactive response.
+ auto-save-interval 2000
+ )
+;; We load this afterwards because it checks to make sure the
+;; auto-save-directory exists (creating it if not) when it's loaded.
+(require 'auto-save)
+
+;; This adds additional extensions which indicate files normally
+;; handled by cc-mode.
+(setq auto-mode-alist
+ (append '(("\\.C$" . c++-mode)
+ ("\\.cc$" . c++-mode)
+ ("\\.hh$" . c++-mode)
+ ("\\.c$" . c-mode)
+ ("\\.h$" . c-mode))
+ auto-mode-alist))
+
+
+;;; ********************
+;;; cc-mode (the mode you're in when editing C, C++, and Objective C files)
+
+;; Tell cc-mode not to check for old-style (K&R) function declarations.
+;; This speeds up indenting a lot.
+(setq c-recognize-knr-p nil)
+
+;; Change the indentation amount to 4 spaces instead of 2.
+;; You have to do it in this complicated way because of the
+;; strange way the cc-mode initializes the value of `c-basic-offset'.
+(add-hook 'c-mode-hook (lambda () (setq c-basic-offset 4)))
+
+
+;;; ********************
+;;; Load a partial-completion mechanism, which makes minibuffer completion
+;;; search multiple words instead of just prefixes; for example, the command
+;;; `M-x byte-compile-and-load-file RET' can be abbreviated as `M-x b-c-a RET'
+;;; because there are no other commands whose first three words begin with
+;;; the letters `b', `c', and `a' respectively.
+;;;
+(load-library "completer")
+
+
+;;; ********************
+;;; Load crypt, which is a package for automatically decoding and reencoding
+;;; files by various methods - for example, you can visit a .Z or .gz file,
+;;; edit it, and have it automatically re-compressed when you save it again.
+;;;
+(setq crypt-encryption-type 'pgp ; default encryption mechanism
+ crypt-confirm-password t ; make sure new passwords are correct
+ ;crypt-never-ever-decrypt t ; if you don't encrypt anything, set this to
+ ; tell it not to assume that "binary" files
+ ; are encrypted and require a password.
+ )
+(require 'crypt)
+
+
+;;; ********************
+;;; Edebug is a source-level debugger for emacs-lisp programs.
+;;;
+(define-key emacs-lisp-mode-map "\C-xx" 'edebug-defun)
+
+
+;;; ********************
+;;; Font-Lock is a syntax-highlighting package. When it is enabled and you
+;;; are editing a program, different parts of your program will appear in
+;;; different fonts or colors. For example, with the code below, comments
+;;; appear in red italics, function names in function definitions appear in
+;;; blue bold, etc. The code below will cause font-lock to automatically be
+;;; enabled when you edit C, C++, Emacs-Lisp, and many other kinds of
+;;; programs.
+;;;
+;;; The "Options" menu has some commands for controlling this as well.
+;;;
+(cond (running-xemacs
+
+ ;; If you want the default colors, you could do this:
+ ;; (setq font-lock-use-default-fonts nil)
+ ;; (setq font-lock-use-default-colors t)
+ ;; but I want to specify my own colors, so I turn off all
+ ;; default values.
+ (setq font-lock-use-default-fonts nil)
+ (setq font-lock-use-default-colors nil)
+
+ (require 'font-lock)
+
+ ;; Mess around with the faces a bit. Note that you have
+ ;; to change the font-lock-use-default-* variables *before*
+ ;; loading font-lock, and wait till *after* loading font-lock
+ ;; to customize the faces.
+
+ ;; string face is green
+ (set-face-foreground 'font-lock-string-face "forest green")
+
+ ;; comments are italic and red; doc strings are italic
+ ;;
+ ;; (I use copy-face instead of make-face-italic/make-face-bold
+ ;; because the startup code does intelligent things to the
+ ;; 'italic and 'bold faces to ensure that they are different
+ ;; from the default face. For example, if the default face
+ ;; is bold, then the 'bold face will be unbold.)
+ (copy-face 'italic 'font-lock-comment-face)
+ ;; Underlining comments looks terrible on tty's
+ (set-face-underline-p 'font-lock-comment-face nil 'global 'tty)
+ (set-face-highlight-p 'font-lock-comment-face t 'global 'tty)
+ (copy-face 'font-lock-comment-face 'font-lock-doc-string-face)
+ (set-face-foreground 'font-lock-comment-face "red")
+
+ ;; function names are bold and blue
+ (copy-face 'bold 'font-lock-function-name-face)
+ (set-face-foreground 'font-lock-function-name-face "blue")
+
+ ;; misc. faces
+ (and (find-face 'font-lock-preprocessor-face) ; 19.13 and above
+ (copy-face 'bold 'font-lock-preprocessor-face))
+ (copy-face 'italic 'font-lock-type-face)
+ (copy-face 'bold 'font-lock-keyword-face)
+ ))
+
+
+;;; ********************
+;;; fast-lock is a package which speeds up the highlighting of files
+;;; by saving information about a font-locked buffer to a file and
+;;; loading that information when the file is loaded again. This
+;;; requires a little extra disk space be used.
+;;;
+;;; Normally fast-lock puts the cache file (the filename appended with
+;;; .flc) in the same directory as the file it caches. You can
+;;; specify an alternate directory to use by setting the variable
+;;; fast-lock-cache-directories.
+
+;; Let's use lazy-lock instead.
+;;(add-hook 'font-lock-mode-hook 'turn-on-fast-lock)
+;;(setq fast-lock-cache-directories '("/foo/bar/baz"))
+
+
+;;; ********************
+;;; lazy-lock is a package which speeds up the highlighting of files
+;;; by doing it "on-the-fly" -- only the visible portion of the
+;;; buffer is fontified. The results may not always be quite as
+;;; accurate as using full font-lock or fast-lock, but it's *much*
+;;; faster. No more annoying pauses when you load files.
+
+(add-hook 'font-lock-mode-hook 'turn-on-lazy-lock)
+;; I personally don't like "stealth mode" (where lazy-lock starts
+;; fontifying in the background if you're idle for 30 seconds)
+;; because it takes too long to wake up again on my piddly Sparc 1+.
+(setq lazy-lock-stealth-time nil)
+
+
+;;; ********************
+;;; func-menu is a package that scans your source file for function
+;;; definitions and makes a menubar entry that lets you jump to any
+;;; particular function definition by selecting it from the menu. The
+;;; following code turns this on for all of the recognized languages.
+;;; Scanning the buffer takes some time, but not much.
+;;;
+;;; Send bug reports, enhancements etc to:
+;;; David Hughes <ukchugd@ukpmr.cs.philips.nl>
+;;;
+(cond (running-xemacs
+ (require 'func-menu)
+ (define-key global-map 'f8 'function-menu)
+ (add-hook 'find-file-hooks 'fume-add-menubar-entry)
+ (define-key global-map "\C-cl" 'fume-list-functions)
+ (define-key global-map "\C-cg" 'fume-prompt-function-goto)
+
+ ;; The Hyperbole information manager package uses (shift button2) and
+ ;; (shift button3) to provide context-sensitive mouse keys. If you
+ ;; use this next binding, it will conflict with Hyperbole's setup.
+ ;; Choose another mouse key if you use Hyperbole.
+ (define-key global-map '(shift button3) 'mouse-function-menu)
+
+ ;; For descriptions of the following user-customizable variables,
+ ;; type C-h v <variable>
+ (setq fume-max-items 25
+ fume-fn-window-position 3
+ fume-auto-position-popup t
+ fume-display-in-modeline-p t
+ fume-menubar-menu-location "File"
+ fume-buffer-name "*Function List*"
+ fume-no-prompt-on-valid-default nil)
+ ))
+
+
+;;; ********************
+;;; MH is a mail-reading system from the Rand Corporation that relies on a
+;;; number of external filter programs (which do not come with emacs.)
+;;; Emacs provides a nice front-end onto MH, called "mh-e".
+;;;
+;; Bindings that let you send or read mail using MH
+;(global-set-key "\C-xm" 'mh-smail)
+;(global-set-key "\C-x4m" 'mh-smail-other-window)
+;(global-set-key "\C-cr" 'mh-rmail)
+
+;; Customization of MH behavior.
+(setq mh-delete-yanked-msg-window t)
+(setq mh-yank-from-start-of-msg 'body)
+(setq mh-summary-height 11)
+
+;; Use lines like the following if your version of MH
+;; is in a special place.
+;(setq mh-progs "/usr/dist/pkgs/mh/bin.svr4/")
+;(setq mh-lib "/usr/dist/pkgs/mh/lib.svr4/")
+
+
+;;; ********************
+;;; resize-minibuffer-mode makes the minibuffer automatically
+;;; resize as necessary when it's too big to hold its contents.
+
+(autoload 'resize-minibuffer-mode "rsz-minibuf" nil t)
+(resize-minibuffer-mode)
+(setq resize-minibuffer-window-exactly nil)
+
+;;; ********************
+;;; W3 is a browser for the World Wide Web, and takes advantage of the very
+;;; latest redisplay features in XEmacs. You can access it simply by typing
+;;; 'M-x w3'; however, if you're unlucky enough to be on a machine that is
+;;; behind a firewall, you will have to do something like this first:
+
+;(setq w3-use-telnet t
+; ;;
+; ;; If the Telnet program you use to access the outside world is
+; ;; not called "telnet", specify its name like this.
+; w3-telnet-prog "itelnet"
+; ;;
+; ;; If your Telnet program adds lines of junk at the beginning
+; ;; of the session, specify the number of lines here.
+; w3-telnet-header-length 4
+; )
--- /dev/null
+%Start ErrorText ErrorMessage OtherText
+
+EC [0-9][0-9][0-9][0-9]-[0-9][0-9][0-9]
+D [0-9]
+D3 [0-9 ][0-9 ][0-9]
+D4 [0-9 ][0-9 ][0-9 ][0-9]
+D5 [0-9 ][0-9 ][0-9 ][0-9 ][0-9]
+DS [0-9 ]
+
+%{
+/* moore@wilma.cs.utk.edu
+
+ * Hack to work around the AIX C compiler's brain-damaged error messages
+ * so that emacs can parse them. It runs /bin/cc as a subprocess, and
+ * tries to rearrange the error messages so that (a) each message contains
+ * both the filename and line number where the error occurred, and (b)
+ * the error message(s) for a particular line get displayed *before* the
+ * line itself.
+ *
+ * to compile:
+ * lex aixcc.lex
+ * cc -o aixcc lex.yy.c
+ *
+ *
+ * Copyright December 1991 by Keith Moore
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *
+ * TODO: figure out how the compiler counts file numbers for included
+ * files, keep track of which file corresponds to which number, and
+ * always output the right file name.
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+char *current_file;
+int line;
+int debug = 0;
+char bigbuf[10240];
+char *bufptr = bigbuf;
+int last_line_was_error = 0;
+
+spaces (s)
+char *s;
+{
+ while (*s++)
+ *bufptr++ = ' ';
+}
+
+char *
+strsave (s)
+char *s;
+{
+ char *ptr = malloc (strlen (s) + 1);
+ strcpy (ptr, s);
+ return ptr;
+}
+
+yywrap ()
+{
+ *bufptr = '\0';
+ bufptr = bigbuf;
+ while (*bufptr)
+ putc (*bufptr++, yyout);
+ return 1;
+}
+
+%}
+%%
+^File\ Line\ Column\ Message\ text[^\n]* {
+ /*
+ * ignore this. don't treat it as error text
+ */
+}
+
+^{DS}{DS}{DS}\ {D5}\ \| {
+ /*
+ * (optional) nesting level, followed by line number, followed
+ * by the source code fragment that caused the error
+ */
+
+ /*
+ * save the line number for later
+ */
+ line = atoi (yytext+4);
+
+ if (debug) {
+ fprintf (yyout, "line <= %d\n", line);
+ fprintf (yyout, "%s\n", yytext);
+ }
+
+ /*
+ * if the last line was an error message, to flush out all of
+ * the old source text before starting to save the new source text.
+ */
+ if (last_line_was_error) {
+ *bufptr = '\0';
+ bufptr = bigbuf;
+ while (*bufptr)
+ putc (*bufptr++, yyout);
+ bufptr = bigbuf;
+ last_line_was_error = 0;
+ }
+ /*
+ * stuff enough spaces in the text buffer so that the
+ * saved text will line up properly when displayed.
+ */
+ spaces (yytext);
+
+ BEGIN ErrorText; /* continue below */
+}
+
+<ErrorText>[^\n]*$ {
+ char *ptr;
+
+ /*
+ * Save the text until we see the error message(s), then print it.
+ * This because emacs puts the error message at the top of the
+ * window, and it's nice to be able to see the text below it.
+ */
+
+ ptr = yytext;
+ while (*ptr)
+ *bufptr++ = *ptr++;
+ *bufptr++ = '\n';
+
+ BEGIN 0;
+}
+
+^Processing\ include\ file\ .*$ {
+ /*
+ * name of a new include file being processed. Increment file number
+ * and remember the file name corresponding to this file number.
+ */
+
+ current_file = strsave (yytext+24);
+
+ if (debug) {
+ fprintf (yyout, "current_file <= %s\n", current_file);
+ fprintf (yyout, "%s\n", yytext);
+ }
+}
+
+^([a-z]\ -)?\ *{EC}: {
+ /*
+ * error message (which we print immediately) preceded by an
+ * error code (which we ignore)
+ */
+
+ fprintf (yyout, "\"%s\", line %d: %c -", current_file, line, *yytext);
+ last_line_was_error = 1;
+ BEGIN ErrorMessage;
+}
+
+^{D3}\ {D5}\ {D4}\ {EC}: {
+ /*
+ * (optional) nesting level, followed by line number, followed
+ * by column number, followed by error message text.
+ */
+
+ /*
+ * save the line number for later
+ */
+ line = atoi (yytext+4);
+
+ if (debug) {
+ fprintf (yyout, "line <= %d\n", line);
+ fprintf (yyout, "%s\n", yytext);
+ }
+
+ /*
+ * if the last line was an error message, flush out all of
+ * the old source text before printing this error message.
+ */
+ if (last_line_was_error) {
+ *bufptr = '\0';
+ bufptr = bigbuf;
+ while (*bufptr)
+ putc (*bufptr++, yyout);
+ bufptr = bigbuf;
+ last_line_was_error = 0;
+ }
+ fprintf (yyout, "\"%s\", line %d:", current_file, line);
+ last_line_was_error = 1;
+ BEGIN ErrorMessage;
+}
+
+<ErrorMessage>[^\n]*$ {
+ fprintf (yyout, "%s\n", yytext);
+ BEGIN 0;
+}
+
+
+^[^ :]+".c:"\ *$ {
+ /* name of new source file being processed */
+
+ char *ptr;
+
+ if (current_file)
+ free (current_file);
+ ptr = strchr (yytext, ':');
+ *ptr = '\0';
+ current_file = strsave (yytext);
+}
+
+^[^\n] {
+ /*
+ * other text starting with a newline. We have to break it up this
+ * way to keep this rule from matching any of the above patterns
+ */
+
+ if (last_line_was_error) {
+ *bufptr = '\0';
+ bufptr = bigbuf;
+ while (*bufptr)
+ putc (*bufptr++, yyout);
+ bufptr = bigbuf;
+ last_line_was_error = 0;
+ }
+
+ *bufptr++ = *yytext;
+ BEGIN OtherText;
+}
+
+<OtherText>[^\n]*$ {
+ char *ptr;
+
+ ptr = yytext;
+ while (*ptr)
+ *bufptr++ = *ptr++;
+ *bufptr++ = '\n';
+
+ BEGIN 0;
+}
+
+\n ;
+
+%%
+
+main (argc, argv)
+char **argv;
+{
+ int pfd[2];
+ int child_pid;
+ int i;
+
+ current_file = strsave ("/dev/null");
+
+ line = 0;
+
+ for (i = 1; i < argc; ++i) {
+ char *ptr = strrchr (argv[i], '.');
+ if (ptr && ptr[1] == 'c' && ptr[2] == '\0') {
+ current_file = strsave (argv[i]);
+ break;
+ }
+ }
+
+ if (pipe (pfd) < 0) {
+ perror ("pipe");
+ exit (1);
+ }
+ if ((child_pid = fork()) > 0) {
+ int status;
+
+ close (pfd[1]);
+ yyin = fdopen (pfd[0], "r");
+ yyout = stderr;
+ yylex();
+
+ wait (&status);
+ exit ((status >> 8) & 0xff);
+ }
+ else if (child_pid == 0) {
+ dup2 (pfd[1], 2);
+ close (pfd[0]);
+ close (pfd[1]);
+ argv[0] = "cc";
+ execv ("/bin/cc", argv);
+ perror ("/bin/cc");
+ exit (1);
+ }
+ else {
+ perror ("fork");
+ exit (1);
+ }
+}
--- /dev/null
+#!/bin/sh
+# Drop in the SUBMITTER id into a site's installed send-pr script.
+# Copyright (C) 1993 Free Software Foundation, Inc.
+# Contributed by Brendan Kehoe (brendan@cygnus.com), based on a
+# version written by Heinz G. Seidl (hgs@ide.com).
+#
+# This file is part of GNU GNATS.
+#
+# GNU GNATS is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# GNU GNATS is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU GNATS; see the file COPYING. If not, write to
+# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+COMMAND=`echo $0 | sed -e 's,.*/,,g'`
+USAGE="Usage: $COMMAND [--install-dir=prefix] [--help] [--version] submitter-id"
+
+VERSION=3.101
+
+BINDIR=/usr/bin
+
+SUBMITTER=
+TEMP=/tmp/sp$$
+
+if [ $# -eq 0 ]; then
+ echo "$USAGE"
+ exit 1
+fi
+
+while [ $# -gt 0 ]; do
+ case "$1" in
+ -install-dir=*|--install-dir=*|--install-di=*|--install-d=*|--install-=*|--install=*|--instal=*|--insta=*|--inst=*|--ins=*|--in=*|--i=*)
+ I=`echo "$1" | sed 's/-*i[a-z\-]*=//'`
+ BINDIR=$I/bin ;;
+ --version) echo $COMMAND version $VERSION ; exit 1 ;;
+ -*) echo "$USAGE" ; exit 1 ;;
+ *) SUBMITTER=$1 ;;
+ esac
+ shift
+done
+
+path=`echo $0 | sed -e "s;${COMMAND};;"`
+
+[ -z "$path" ] && path=.
+
+examinebindir=yes
+
+if [ "$examinebindir" = yes ] && [ -f $BINDIR/send-pr ]; then
+ SPPATHLIST=$BINDIR/send-pr
+else
+ if [ -f $path/send-pr ]; then
+ SPPATHLIST=$path/send-pr
+ else
+ echo "$COMMAND: cannot find \`$BINDIR/send-pr' or \`$path/send-pr'" >&2
+ exit 1
+ fi
+fi
+
+trap 'rm -f $TEMP ; exit 0' 0
+trap 'echo "$COM: Aborting ..."; rm -f $TEMP ; exit 1' 1 2 3 13 15
+
+for SPPATH in $SPPATHLIST; do
+ sed -e "s/^SUBMITTER=.*/SUBMITTER=${SUBMITTER}/" $SPPATH > $TEMP
+
+ if grep $SUBMITTER $TEMP > /dev/null; then
+ cp $SPPATH $SPPATH.orig &&
+ rm -f $SPPATH &&
+ cp $TEMP $SPPATH &&
+ chmod a+rx $SPPATH &&
+ rm -f $TEMP $SPPATH.orig ||
+ { echo "$COMMAND: unable to replace send-pr" >&2 ; exit 1; }
+ else
+ echo "$COMMAND: something went wrong when sed-ing the submitter into send-pr" >&2
+ exit 1
+ fi
+done
+
+echo "$COMMAND: \`$SUBMITTER' is now the default submitter ID for send-pr"
+
+exit 0
--- /dev/null
+## Process the output of makedepend.
+## Copyright (c) 1994 Amdahl Corporation.
+## Written by Ben Wing, December 1994.
+
+## This file is used as part of 'make depend', to produce the
+## dependency list for src/Makefile.in.in.
+
+## Unfortunately, makedepend (at least the one that comes as part
+## of Open Windows under Solaris) is stupid and doesn't follow the
+## documented behavior. So we have to force the definitions of
+## certain options through -D flags (even though it's supposed to
+## pick this up), and post-process the output to get rid of stuff
+## we don't want.
+
+## The sed stage gets rid of include files in other directories,
+## except for lwlib.h (makedepend puts system include files in,
+## which is pretty stupid). We also get rid of some standard
+## include files that are in every or pretty much every file
+## and where changes in those files don't usually merit
+## recompilation of everything. Finally, we eliminate entirely
+## the dependencies for some files (such as unex*.c) that get
+## screwed up by makedepend. We just put those in by hand at
+## the top of the dependency list.
+
+## For Mule, we need to do some additional processing: conversion
+## to MULESRCDIR (at least so that the include files don't get
+## wiped out by the next stage) and removing the mule/ prefix
+## from the object file names.
+
+## The awk stage puts one dependency per line. Then we pass
+## the result through sort and uniq (makedepend is supposed
+## to not put in duplicate dependencies, but it does so
+## occasionally).
+
+## After running 'make depend', verify that the output (in
+## depend.out) is reasonable and then replace the stuff in
+## Makefile.in.in marked "generated by 'make depend'".
+
+sed -e '
+1d
+s/ \/[^ ]*\/lwlib\// $(LWLIBSRCDIR)\//g
+s/\.\.\/etc\//${srcdir}\/${etcdir}/g
+s/^mule\///g
+s/ mule\// $(MULESRCDIR)\/mule\//g
+s/ \/[^ ]*\.h//g
+s/ \/[^ ]*gray//g
+s/ [a-z][^ ]*\/[^ ]*\.h//g
+s/ lisp\.h//g
+s/ lisp-union\.h//g
+s/ lisp-disunion\.h//g
+s/ lrecord\.h//g
+s/ emacsfns\.h//g
+s/ symeval\.h//g
+s/ symsinit\.h//g
+s/ syssignal\.h//g
+s/ intl\.h//g
+s/ tt_c\.h//g
+s/ descrip\.h//g
+/^unex/d
+/^sgiplay/d
+/^Extern/d
+/^extw/d
+/^[^ ]*\.o:$/d
+' | awk '
+{ for (i = 2; i <= NF; i++)
+ printf ("%s %s\n", $1, $i)
+}
+' | sort | uniq
--- /dev/null
+#!/bin/sh
+
+perl -e '
+while (<>)
+{
+ chop;
+ $foo .= $_;
+ if (!/\\$/)
+ {
+ @foo = split (/[ \\:\n]+/, $foo);
+ $filename = $foo[0];
+ if (($filename =~ /^unex/) ||
+ ($filename =~ /^sgiplay/) ||
+ ($filename =~ /^Extern/) ||
+ ($filename =~ /^extw/))
+ {
+ $foo = "";
+ next;
+ }
+ @foo = grep (!/\.c$/, @foo);
+ @foo = grep ((s/\/.*lwlib\//\$(LWLIBSRCDIR)\//, 1), @foo);
+ @foo = grep (!/lisp\.h/, @foo);
+ @foo = grep (!/lisp\.h/, @foo);
+ @foo = grep (!/lisp-union\.h/, @foo);
+ @foo = grep (!/lisp-disunion\.h/, @foo);
+ @foo = grep (!/lrecord\.h/, @foo);
+ @foo = grep (!/emacsfns\.h/, @foo);
+ @foo = grep (!/symeval\.h/, @foo);
+ @foo = grep (!/symsinit\.h/, @foo);
+ @foo = grep (!/syssignal\.h/, @foo);
+ @foo = grep (!/intl\.h/, @foo);
+ @foo = grep (!/tt_c\.h/, @foo);
+ @foo = grep (!/descrip\.h/, @foo);
+ shift @foo;
+ if (!$#foo)
+ {
+ next;
+ }
+ foreach $i (0 .. $#foo)
+ {
+ $foo[$i] = $filename . ": " . $foo[$i];
+ }
+ print $filename . ": config.h\n";
+ print join ("\n", @foo);
+ print "\n";
+ $foo = "";
+ }
+}
+' | sort | uniq
\ No newline at end of file
--- /dev/null
+: # -*-Perl-*-
+eval 'exec perl -w -S $0 ${1+"$@"}' # Portability kludge
+ if 0;
+#
+# pstogif.pl v1.0, July 1994, by Nikos Drakos <nikos@cbl.leeds.ac.uk>
+# Computer Based Learning Unit, University of Leeds.
+#
+# Accompanies LaTeX2HTML Version 96.1
+#
+# Script to convert an arbitrary PostScript image to a cropped GIF image
+# suitable for incorporation into HTML documents as inlined images to be
+# viewed with WWW browsers.
+#
+# This is based on the pstoepsi script
+# by Doug Crabill dgc@cs.purdue.edu
+#
+# Please note the following:
+# - The source PostScript file must end
+# in a .ps extention. This is a GhostScript requirement, not mine...
+# - The -density argument has no effect unless the
+# color depth (set with the -depth argument) is equal to 1.
+# - Valid arguments for -depth are 1,8, or 24.
+#
+# This software is provided as is without any guarantee.
+#
+# Nikos Drakos (ND), nikos@cbl.leeds.ac.uk
+# Computer Based Learning Unit, University of Leeds.
+#
+# 15 Jan 96 HS Call ppmquant only if needed. Fixed bug relative to
+# V 95.3 .
+#
+# 15 Dec 95 HS (Herbert Swan <dprhws.edp.Arco.com> Added support for
+# the flip=option. This allows images to be oriented differently
+# in the paper versus the electronic media
+#
+# 1 Nov 95 jmn - modified for use with gs ppm driver - from jhrg's patches
+# note that ppmtops.ps and ppmtops3.ps are no longer needed
+#
+# 20 JUL 94 ND Converted to Perl and made several changes eg it now accepts
+# parameters from environment variables or from command line or will use
+# default ones.
+#
+# 1 APR 94 ND Changed the suffixes of multi-page files from xbm to gif (oops!)
+#
+#
+
+#####################################################################
+$| =1;
+&read_args;
+
+### You may need to specify some pathnames here if you want to
+### run the script without LaTeX2HTML
+
+# Ghostscript
+$GS= $ENV{'GS'} || 'gs';
+
+# Comes with LaTeX2HTML (For ghostscript versions greater than 3.0
+# you need the newer pstoppm.ps)
+#$PSTOPPM= $ENV{'PSTOPPM'} ||
+# 'pstoppm.ps';
+
+# Available in the PBMPLUS library
+$PNMCROP=$ENV{'PNMCROP'} || 'pnmcrop' ;
+
+# Also in PBMPLUS
+$PNMFLIP=$ENV{'PNMFLIP'} || 'pnmflip' ;
+
+# Also in PBMPPLUS
+$PPMTOGIF=$ENV{'PPMTOGIF'} || 'ppmtogif' ;
+
+# Also in PBMPPLUS
+$REDUCE_COLOR=$ENV{'PPMQUANT'} || 'ppmquant 256' ;
+
+$OUTFILE = $ENV{'OUTFILE'} || $out;
+
+# Valid choices for $COLOR_DEPTH are 1, 8 or 24.
+$DEPTH = $ENV{'DEPTH'} || $depth || 24;
+
+#Default density is 72
+$DENSITY = $ENV{'DENSITY'} || $density || 72;
+
+# Valid choices are any numbers greater than zero
+# Useful choices are numbers between 0.1 - 5
+# Large numbers may generate very large intermediate files
+# and will take longer to process
+$SCALE = $ENV{'SCALE'} || $scale; # No default value
+
+$PAPERSIZE = $ENV{'PAPERSIZE'} || $papersize; # No default value;
+
+$DEBUG = $ENV{'DEBUG'} || $DEBUG || 0;
+
+######################################################################
+
+&main;
+
+sub read_args {
+ local($_);
+ local($color);
+ while ($ARGV[0] =~ /^-/) {
+ $_ = shift @ARGV;
+ if (/^-h(elp)?$/) {
+ &usage; exit}
+ elsif (/^-out$/) {
+ $out = shift @ARGV;
+ }
+ elsif (/^-(.*)$/) {
+ eval "\$$1 = shift \@ARGV"; # Create and set a flag $<name>
+ }
+ }
+}
+
+sub main {
+ local($base, $outfile, $i, $j);
+ $base = &test_args;
+ $outfile = $OUTFILE || "$base.gif";
+ open(STDERR, ">/dev/null") unless $DEBUG;
+ &convert($base);
+ if (-f "$base.ppm") {
+ &crop_scale_etc("$base.ppm", $outfile);
+ }
+ else {
+ foreach $i (<$base.[1-9]*ppm>) {
+ $j = $i;
+ $j =~ s/\.(.*)ppm/$1.gif/;
+ &crop_scale_etc($i, $j)}
+ }
+ &cleanup($base);
+}
+
+sub crop_scale_etc {
+ local($in, $out) = @_;
+ local($tmp) = $in . ".tmp";
+ open(STDERR, ">/dev/null") unless $DEBUG;
+
+ if ($flip) {
+ rename($tmp, $in) unless system("$PNMFLIP -$flip $in > $tmp");
+ }
+ system("$PNMCROP $in > $tmp");
+
+ if (system("$PPMTOGIF $tmp > $out")) {
+ print "Running ppmquant for $out\n";
+ system("$REDUCE_COLOR < $tmp|$PPMTOGIF - > $out");
+ }
+ unlink $tmp;
+ print "Writing $out\n";
+}
+
+sub test_args {
+ local($file) = $ARGV[0];
+ if (! ($file =~ s/\.ps$//)) {
+ print "The name of the input file must end in '.ps'\n";
+ exit}
+ elsif (! ( -f "$file.ps")) {
+ print "Cannot find file $file.ps\n.";
+ exit}
+ elsif (! ($DEPTH =~ /^(1|8|24)$/)) {
+ print "The color depth must be 1 or 8 or 24. You specified $DEPTH\n";
+ exit
+ }
+ if (defined $SCALE) {
+ if ($SCALE > 0) {
+ $DENSITY = int($SCALE * $DENSITY)}
+ else {
+ print "Error: The scale must be greater than 0.\n" .
+ "You specified $SCALE\n";
+ exit}
+ }
+ $file;
+}
+
+sub convert {
+ local($base) = @_;
+ local($paperopt) = "-sPAPERSIZE=$PAPERSIZE" if $PAPERSIZE;
+ local($ppmtype) = join('', "ppm",$DEPTH,"run");
+ local($density) = "-r$DENSITY" if ($DENSITY != 72);
+ open (GS, "|$GS -q -dNOPAUSE -dNO_PAUSE -sDEVICE=ppmraw $density -sOutputFile=$base.ppm $paperopt $base.ps");
+ close GS;
+}
+
+sub cleanup {
+ local($base) = @_;
+ unlink <$base[0-9.]*ppm>;
+}
+
+sub usage {
+ print "Usage: pstogif [-h(elp)] [-out <output file>] [-depth <color depth 1, 8 or 24>] [-flip <Flip_code>] [-density <pixel density>] <file>.ps\n\n";
+}
+
+
--- /dev/null
+/* run -- Wrapper program for console mode programs under Windows(TM)
+ * Copyright (C) 1998 Charles S. Wilson
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * This program is based on the runemacs.c distributed with XEmacs 21.0
+ *
+ * Simple program to start gnu-win32 X11 programs (and native XEmacs)
+ * with its console window hidden.
+ *
+ * This program is provided purely for convenience, since most users will
+ * use XEmacs in windowing (GUI) mode, and will not want to have an extra
+ * console window lying around. Ditto for desktop shortcuts to gnu-win32
+ * X11 executables.
+ */
+
+
+#define WIN32
+
+#include <windows.h>
+#include <string.h>
+#include <malloc.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "run.h"
+
+#if defined(__CYGWIN__)
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #include <sys/cygwin.h>
+ #include <sys/unistd.h>
+WinMainCRTStartup() { mainCRTStartup(); }
+#else
+ #include <direct.h>
+#endif
+
+
+char buffer[1024];
+
+int WINAPI
+WinMain (HINSTANCE hSelf, HINSTANCE hPrev, LPSTR cmdline, int nShow)
+{
+ int wait_for_child = FALSE;
+ int compact_invocation = FALSE;
+ DWORD ret_code = 0;
+
+
+ char execname[FILENAME_MAX];
+ char execpath[MAX_PATH];
+ char* argv[MAX_ARGS+1]; /* leave extra slot for compact_invocation argv[0] */
+ int argc;
+ int i,j;
+ char exec[MAX_PATH + FILENAME_MAX + 100];
+ char cmdline2[MAX_ARGS * MAX_PATH];
+
+ compact_invocation = get_exec_name_and_path(execname,execpath);
+
+ if (compact_invocation)
+ {
+ argv[0] = execname;
+ argc = parse_cmdline_to_arg_array(&(argv[1]),cmdline);
+ argc++;
+ }
+ else
+ {
+ argc = parse_cmdline_to_arg_array(argv,cmdline);
+ if (argc >= 1)
+ strcpy(execname,argv[0]);
+ }
+ /* at this point, execpath is defined, as are argv[] and execname */
+#ifdef DEBUG
+ j = sprintf(buffer,"\nexecname : %s\nexecpath : %s\n",execname,execpath);
+ for (i = 0; i < argc; i++)
+ j += sprintf(buffer+j,"argv[%d]\t: %s\n",i,argv[i]);
+ Trace((buffer));
+#endif
+
+ if (execname == NULL)
+ error("you must supply a program name to run");
+
+#if defined(__CYGWIN__)
+ /* this insures that we search for symlinks before .exe's */
+ if (compact_invocation)
+ strip_exe(execname);
+#endif
+
+ process_execname(exec,execname,execpath);
+ Trace(("exec\t%s\nexecname\t%s\nexecpath\t%s\n",
+ exec,execname,execpath));
+
+ wait_for_child = build_cmdline(cmdline2,exec,argc,argv);
+ Trace((cmdline2));
+
+ xemacs_special(exec);
+ ret_code = start_child(cmdline2,wait_for_child);
+ if (compact_invocation)
+ for (i = 1; i < argc; i++) // argv[0] was not malloc'ed
+ free(argv[i]);
+ else
+ for (i = 0; i < argc; i++)
+ free(argv[i]);
+ return (int) ret_code;
+}
+int start_child(char* cmdline, int wait_for_child)
+{
+ STARTUPINFO start;
+ SECURITY_ATTRIBUTES sec_attrs;
+ PROCESS_INFORMATION child;
+ int retval;
+
+ memset (&start, 0, sizeof (start));
+ start.cb = sizeof (start);
+ start.dwFlags = STARTF_USESHOWWINDOW;
+ start.wShowWindow = SW_HIDE;
+
+ sec_attrs.nLength = sizeof (sec_attrs);
+ sec_attrs.lpSecurityDescriptor = NULL;
+ sec_attrs.bInheritHandle = FALSE;
+
+ if (CreateProcess (NULL, cmdline, &sec_attrs, NULL, TRUE, 0,
+ NULL, NULL, &start, &child))
+ {
+ if (wait_for_child)
+ {
+ WaitForSingleObject (child.hProcess, INFINITE);
+ GetExitCodeProcess (child.hProcess, &retval);
+ }
+ CloseHandle (child.hThread);
+ CloseHandle (child.hProcess);
+ }
+ else
+ error("could not start %s",cmdline);
+ return retval;
+}
+void xemacs_special(char* exec)
+{
+ /*
+ * if we're trying to run xemacs, AND this file was in %emacs_dir%\bin,
+ * then set emacs_dir environment variable
+ */
+ char* p;
+ char* p2;
+ char exec2[MAX_PATH + FILENAME_MAX + 100];
+ char tmp[MAX_PATH + FILENAME_MAX + 100];
+ strcpy(exec2,exec);
+ /* this depends on short-circuit evaluation */
+ if ( ((p = strrchr(exec2,'\\')) && stricmp(p,"\\xemacs") == 0) ||
+ ((p = strrchr(exec2,'/')) && stricmp(p,"/xemacs") == 0) ||
+ ((p = strrchr(exec2,'\\')) && stricmp(p,"\\xemacs.exe") == 0) ||
+ ((p = strrchr(exec2,'/')) && stricmp(p,"/xemacs.exe") == 0) )
+ {
+ if ( ((p2 = strrchr(p, '\\')) && stricmp(p2, "\\bin") == 0) ||
+ ((p2 = strrchr(p, '/')) && stricmp(p2, "/bin") == 0) )
+ {
+ *p2 = '\0';
+#if defined(__CYGWIN__)
+ CYGWIN_CONV_TO_POSIX_PATH((exec2,tmp));
+ strcpy(exec2,tmp);
+#else /* NATIVE xemacs DOS-style paths with forward slashes */
+ for (p = exec2; *p; p++)
+ if (*p == '\\') *p = '/';
+#endif
+ SetEnvironmentVariable ("emacs_dir", exec2);
+ }
+ }
+}
+int build_cmdline(char* new_cmdline, char* exec, int argc, char* argv[])
+{
+ int retval = FALSE;
+ int first_arg = 1;
+ int i;
+ int char_cnt = 0;
+ /*
+ * look for "-wait" as first true argument; we'll apply that ourselves
+ */
+ if ((argc >= 2) && (stricmp(argv[1],"-wait") == 0))
+ {
+ retval = TRUE;
+ first_arg++;
+ }
+
+ char_cnt = strlen(exec);
+ for (i = first_arg; i < argc; i++)
+ char_cnt += strlen(argv[i]);
+ if (char_cnt > MAX_ARGS*MAX_PATH) /* then we ran out of room */
+ error("command line too long -\n%s",new_cmdline);
+
+ strcpy(new_cmdline,exec);
+ for (i = first_arg; i < argc; i++)
+ {
+ strcat(new_cmdline," ");
+ strcat(new_cmdline,argv[i]);
+ }
+ return retval;
+}
+/* process exec_arg : if it
+ * NATIVE:
+ * 1) starts with '\\' or '/', it's a root-path and leave it alone
+ * 2) starts with 'x:\\' or 'x:/', it's a root-path and leave it alone
+ * 3) starts with '.\\' or './', two possible meanings:
+ * 1) exec is in the current directory
+ * 2) exec in same directory as this program
+ * 4) otherwise, search path (and _prepend_ "." to the path!!!)
+ * 5) convert all '/' to '\\'
+ * CYGWIN
+ * 1) starts with '\\' or '/', it's a root-path and leave it alone
+ * 2) starts with 'x:\\' or 'x:/', it's a root-path and leave it alone
+ * 3) starts with '.\\' or './', two possible meanings:
+ * 1) exec is in the current directory
+ * 2) exec in same directory as this program
+ * 4) otherwise, search path (and _prepend_ "." to the path!!!)
+ * 5) convert to cygwin-style path to resolve symlinks within the pathspec
+ * 6) check filename: if it's a symlink, resolve it by peeking inside
+ * 7) convert to win32-style path+filename since we're using Windows
+ * createProcess() to launch
+ */
+void process_execname(char *exec, const char* execname,const char* execpath )
+{
+ char* orig_pathlist;
+ char* pathlist;
+ char exec_tmp[MAX_PATH + FILENAME_MAX + 100];
+ char exec_tmp2[MAX_PATH + FILENAME_MAX + 100];
+ char buf[MAX_PATH + FILENAME_MAX + 100];
+ int i,j;
+
+ /*
+ * STARTS WITH / or \
+ * execpath NOT used
+ */
+ if ((execname[0] == '\\') || (execname[0] == '/'))
+ {
+#if defined(__CYGWIN__)
+ strcpy(exec_tmp,execname);
+#else
+ exec_tmp[0] = ((char) (_getdrive() + ((int) 'A') - 1));
+ exec_tmp[1] = ':';
+ exec_tmp[2] = '\0';
+ strcat(exec_tmp,execname);
+#endif
+ Trace(("/ -\nexec_tmp\t%s\nexecname\t%s\nexecpath\t%s\n",
+ exec_tmp,execname,execpath));
+ if (! fileExistsMulti(exec_tmp2,NULL,exec_tmp,exts,NUM_EXTENSIONS) )
+ {
+ j = 0;
+ for (i = 0; i < NUM_EXTENSIONS; i++)
+ j += sprintf(buf + j," [%d]: %s\n",i+1,exts[i]);
+ error("Couldn't locate %s\nI tried appending the following "
+ "extensions: \n%s",exec_tmp,buf);
+ }
+ Trace((exec_tmp2));
+ }
+ /*
+ * STARTS WITH x:\ or x:/
+ * execpath NOT used
+ */
+ else if ((strlen(execname) > 3) && // avoid boundary errors
+ (execname[1] == ':') &&
+ ((execname[2] == '\\') || (execname[2] == '/')))
+ {
+ strcpy(exec_tmp,execname);
+ Trace(("x: -\nexec_tmp\t%s\nexecname\t%s\nexecpath\t%s\n",
+ exec_tmp,execname,execpath));
+ if (! fileExistsMulti(exec_tmp2,NULL,exec_tmp,exts,NUM_EXTENSIONS) )
+ {
+ j = 0;
+ for (i = 0; i < NUM_EXTENSIONS; i++)
+ j += sprintf(buf + j," [%d]: %s\n",i+1,exts[i]);
+ error("Couldn't locate %s\nI tried appending the following "
+ "extensions: \n%s",exec_tmp,buf);
+ }
+ Trace((exec_tmp2));
+ }
+ /*
+ * STARTS WITH ./ or .\
+ */
+ else if ((execname[0] == '.') &&
+ ((execname[1] == '\\') || (execname[1] == '/')))
+ {
+ if (((char*) getcwd(exec_tmp,MAX_PATH))==NULL)
+ error("can't find current working directory");
+ if (! fileExistsMulti(exec_tmp2,exec_tmp,&(execname[2]),
+ exts,NUM_EXTENSIONS) )
+ if (! fileExistsMulti(exec_tmp2,execpath,&(execname[2]),
+ exts,NUM_EXTENSIONS) )
+ {
+ j = 0;
+ for (i = 0; i < NUM_EXTENSIONS; i++)
+ j += sprintf(buf + j," [%d]: %s\n",i+1,exts[i]);
+ error("Couldn't locate %s\n"
+ "I looked in the following directories:\n [1]: %s\n [2]: %s\n"
+ "I also tried appending the following "
+ "extensions: \n%s",execname,exec_tmp,execpath,buf);
+ }
+ Trace((exec_tmp2));
+ }
+ /*
+ * OTHERWISE, SEARCH PATH (prepend '.' and run.exe's directory)
+ * can't use fileExistsMulti because we want to search entire path
+ * for exts[0], then for exts[1], etc.
+ */
+ else
+ {
+ orig_pathlist = getenv("PATH");
+ if ((pathlist = malloc (strlen(orig_pathlist)
+ + strlen(".")
+ + strlen(execpath)+ 3)) == NULL)
+ error("internal error - out of memory");
+ strcpy(pathlist,".");
+ strcat(pathlist,SEP_CHARS);
+ strcat(pathlist,execpath);
+ strcat(pathlist,SEP_CHARS);
+ strcat(pathlist,orig_pathlist);
+
+ Trace((pathlist));
+ for (i = 0; i < NUM_EXTENSIONS; i++)
+ {
+ strcpy(exec_tmp,execname);
+ strcat(exec_tmp,exts[i]);
+ pfopen(exec_tmp2,exec_tmp,pathlist);
+ if (fileExists(NULL,NULL,exec_tmp2))
+ break;
+ exec_tmp2[0] = '\0';
+ }
+ Trace(("exec_tmp\t%s\npathlist\t%s\n",exec_tmp2,pathlist));
+
+ free(pathlist);
+ if (exec_tmp2[0] == '\0')
+ {
+ j = 0;
+ for (i = 0; i < NUM_EXTENSIONS; i++)
+ j += sprintf(buf + j," [%d]: %s\n",i+1,exts[i]);
+ error("Couldn't find %s anywhere.\n"
+ "I even looked in the PATH \n"
+ "I also tried appending the following "
+ "extensions: \n%s",execname,buf);
+ }
+ }
+/*
+ * At this point, we know that exec_tmp2 contains a filename
+ * and we know that exec_tmp2 exists.
+ */
+#if defined(__CYGWIN__)
+ {
+ struct stat stbuf;
+ char sym_link_name[MAX_PATH+1];
+ char real_name[MAX_PATH+1];
+ char dummy[MAX_PATH+1];
+
+ strcpy(exec_tmp,exec_tmp2);
+
+ CYGWIN_CONV_TO_POSIX_PATH((exec_tmp,sym_link_name));
+ Trace((sym_link_name));
+
+ if (lstat(sym_link_name, &stbuf) == 0)
+ {
+ if ((stbuf.st_mode & S_IFLNK) == S_IFLNK)
+ {
+ if (readlink(sym_link_name, real_name, sizeof(real_name)) == -1)
+ error("problem reading symbolic link for %s",exec_tmp);
+ else
+ {
+ // if realname starts with '/' it's a rootpath
+ if (real_name[0] == '/')
+ strcpy(exec_tmp2,real_name);
+ else // otherwise, it's relative to the symlink's location
+ {
+ CYGWIN_SPLIT_PATH((sym_link_name,exec_tmp2,dummy));
+ if (!endsWith(exec_tmp2,PATH_SEP_CHAR_STR))
+ strcat(exec_tmp2,PATH_SEP_CHAR_STR);
+ strcat(exec_tmp2,real_name);
+ }
+ }
+ }
+ else /* NOT a symlink */
+ strcpy(exec_tmp2, sym_link_name);
+ }
+ else
+ error("can't locate executable - %s",sym_link_name);
+ }
+ CYGWIN_CONV_TO_FULL_WIN32_PATH((exec_tmp2,exec));
+#else
+ strcpy (exec, exec_tmp2);
+#endif
+}
+int endsWith(const char* s1, const char* s2)
+{
+ int len1;
+ int len2;
+ int retval = FALSE;
+ len1 = strlen(s1);
+ len2 = strlen(s2);
+ if (len1 - len2 >= 0)
+ if (stricmp(&(s1[len1-len2]),s2) == 0)
+ retval = TRUE;
+ return retval;
+}void strip_exe(char* s)
+{
+ if ((strlen(s) > 4) && // long enough to have .exe extension
+ // second part not evaluated (short circuit) if exec_arg too short
+ (stricmp(&(s[strlen(s)-4]),".exe") == 0))
+ s[strlen(s)-4] = '\0';
+}
+void error(char* fmt, ...)
+{
+ char buf[4096];
+ int j;
+ va_list args;
+ va_start(args, fmt);
+ j = sprintf(buf, "Error: ");
+ j += vsprintf(buf + j,fmt,args);
+ j += sprintf(buf + j,"\n");
+ va_end(args);
+ MessageBox(NULL, buf, "Run.exe", MB_ICONSTOP);
+ exit(1);
+}
+void message(char* fmt, ...)
+{
+ char buf[10000];
+ int j;
+ va_list args;
+ va_start(args, fmt);
+ j = vsprintf(buf,fmt,args);
+ j += sprintf(buf + j,"\n");
+ va_end(args);
+ MessageBox(NULL, buf, "Run.exe Message", MB_ICONSTOP);
+}
+void Trace_(char* fmt, ...)
+{
+ char buf[10000];
+ int j;
+ va_list args;
+ va_start(args, fmt);
+ j = vsprintf(buf,fmt,args);
+ j += sprintf(buf + j,"\n");
+ va_end(args);
+ MessageBox(NULL, buf, "Run.exe DEBUG", MB_ICONSTOP);
+}
+/*
+ * Uses system info to determine the path used to invoke run
+ * Also attempts to deduce the target execname if "compact_invocation"
+ * method was used.
+ *
+ * returns TRUE if compact_invocation method was used
+ * (and target execname was deduced successfully)
+ * otherwise returns FALSE, and execname == run or run.exe
+ */
+int get_exec_name_and_path(char* execname, char* execpath)
+{
+ char modname[MAX_PATH];
+ char* tmp_execname;
+ char* p;
+ int retval = FALSE;
+
+ if (!GetModuleFileName (NULL, modname, MAX_PATH))
+ error("internal error - can't find my own name");
+ if ((p = strrchr (modname, '\\')) == NULL)
+ error("internal error - my own name has no path\n%s",modname);
+ tmp_execname = p + 1;
+ p[0] = '\0';
+ // if invoked by a name like "runxemacs" then strip off
+ // the "run" and let "xemacs" be execname.
+ // To check for this, make that:
+ // 1) first three chars are "run"
+ // 2) but the string doesn't end there, or start ".exe"
+ // Also, set "compact_invocation" TRUE
+ if ( ((tmp_execname[0] == 'r') || (tmp_execname[0] == 'R')) &&
+ ((tmp_execname[1] == 'u') || (tmp_execname[1] == 'U')) &&
+ ((tmp_execname[2] == 'n') || (tmp_execname[2] == 'N')) &&
+ ((tmp_execname[3] != '.') && (tmp_execname[3] != '\0')) )
+ {
+ tmp_execname += 3;
+ retval = TRUE;
+ }
+ else
+ tmp_execname = NULL;
+
+ if (tmp_execname == NULL)
+ strcpy(execname,"");
+ else
+ strcpy(execname,tmp_execname);
+#if defined(__CYGWIN__)
+ CYGWIN_CONV_TO_POSIX_PATH((modname,execpath));
+#else
+ strcpy(execpath,modname);
+#endif
+ return retval;
+}
+/*
+ * works like strtok, but:
+ * double quotes (") suspends tokenizing until closing " reached
+ * CYGWIN ONLY:
+ * additionally, backslash escapes next character, even if that
+ * next character is a delimiter. Or a double quote.
+ * WARNING: this means that backslash may NOT be a delimiter
+ */
+char* my_strtok(char* s, const char* delim, char** lasts)
+{
+ char *spanp;
+ int c, sc;
+ char *tok;
+
+ if ((s == NULL) && ((s = *lasts) == NULL))
+ return NULL;
+ /* Skip leading delimiters */
+cont:
+ c = *s++;
+ for (spanp = (char *)delim; (sc = *spanp++) != 0;) {
+ if (c == sc)
+ goto cont;
+ }
+ if (c == 0) { /* no non-delimiter characters */
+ *lasts = NULL;
+ return (NULL);
+ }
+ tok = s - 1;
+ /*
+ * Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
+ * Note that delim must have one NUL; we stop if we see that, too.
+ * If we see a double quote, continue until next double quote, then
+ * start scanning for delimiters again.
+ * CYGWIN ONLY: if we see a backslash, just copy next character -
+ * don't consider it as a delimiter even if it is in delim string.
+ */
+ for (;;) {
+ /* if this c is ", then scan until we find next " */
+ if (c == '\"')
+ while ((c = *s++) != '\"')
+ if (c == 0) /* oops, forgot to close the ", clean up & return */
+ {
+ s = NULL;
+ *lasts = s;
+ return (tok);
+ }
+#if defined(__CYGWIN__)
+ if (c == '\\')
+ {
+ c = *s++; /* skip the backslash */
+ if (c == 0) /* if escaped character is end-of-string, clean up & return */
+ {
+ s = NULL;
+ *lasts = s;
+ return (tok);
+ }
+ c = *s++; /* otherwise, skip the escaped character */
+ }
+#endif
+ spanp = (char *)delim;
+ do {
+ if ((sc = *spanp++) == c) {
+ if (c == 0)
+ s = NULL;
+ else
+ s[-1] = 0;
+ *lasts = s;
+ return (tok);
+ }
+ } while (sc != 0);
+ c = *s++;
+ }
+ /* NOTREACHED */
+}
+int parse_cmdline_to_arg_array(char* argv[MAX_ARGS], char* cmdline)
+{
+ char seps[] = " \t\n";
+ char* token;
+ int argc = 0;
+ char* lasts;
+
+ token = my_strtok(cmdline, seps, &lasts);
+ while ((token != NULL) && (argc < MAX_ARGS))
+ {
+ if ((argv[argc] = malloc(strlen(token)+1)) == NULL)
+ {
+ error("internal error - out of memory");
+ }
+ strcpy(argv[argc++],token);
+ token = my_strtok(NULL,seps,&lasts);
+ }
+ if (argc >= MAX_ARGS)
+ error("too many arguments on commandline\n%s",cmdline);
+ return argc;
+}
+/* Taken from pfopen.c by David Engel (5-Jul-97).
+ * Original comments appear below. Superseded by next comment block.
+ *
+ * Written and released to the public domain by David Engel.
+ *
+ * This function attempts to open a file which may be in any of
+ * several directories. It is particularly useful for opening
+ * configuration files. For example, PROG.EXE can easily open
+ * PROG.CFG (which is kept in the same directory) by executing:
+ *
+ * cfg_file = pfopen("PROG.CFG", "r", getenv("PATH"));
+ *
+ * NULL is returned if the file can't be opened.
+ */
+
+/*
+ * This function attempts to locate a file which may be in any of
+ * several directories. Unlike the original pfopen, it does not
+ * return a FILE pointer to the opened file, but rather returns
+ * the fully-qualified filename of the first match found. Returns
+ * empty string if not found.
+ */
+char *pfopen(char *retval, const char *name, const char *dirs)
+{
+ char *ptr;
+ char *tdirs;
+ char returnval[MAX_PATH + FILENAME_MAX + 100];
+ int foundit = FALSE;
+
+ returnval[0] = '\0';
+
+ if (dirs == NULL || dirs[0] == '\0')
+ return NULL;
+
+ if ((tdirs = malloc(strlen(dirs)+1)) == NULL)
+ return NULL;
+
+ strcpy(tdirs, dirs);
+
+ for (ptr = strtok(tdirs, SEP_CHARS); (foundit == FALSE) && ptr != NULL;
+ ptr = strtok(NULL, SEP_CHARS))
+ {
+ foundit = fileExists(returnval,ptr,name);
+ }
+
+ free(tdirs);
+ if (!foundit)
+ retval[0] = '\0';
+ else
+ strcpy(retval,returnval);
+ return retval;
+}
+int fileExistsMulti(char* fullname, const char* path,
+ const char* name_noext, const char* exts[],
+ const int extcnt)
+{
+ char tryName[MAX_PATH + FILENAME_MAX];
+ int i = 0;
+ int retval = FALSE;
+ fullname[0] = '\0';
+ for (i = 0; i < extcnt; i++)
+ {
+ strcpy(tryName,name_noext);
+ strcat(tryName,exts[i]);
+ if (fileExists(fullname, path, tryName) == TRUE)
+ {
+ retval = TRUE;
+ break;
+ }
+ fullname[0] = '\0';
+ }
+ return retval;
+}
+int fileExists(char* fullname, const char* path, const char* name)
+{
+ int retval = FALSE;
+ FILE* file;
+ size_t len;
+ char work[FILENAME_MAX];
+ char work2[MAX_PATH + FILENAME_MAX + 100];
+ if (path != NULL)
+ {
+ strcpy(work, path);
+ len = strlen(work);
+ if (len && work[len-1] != '/' && work[len-1] != '\\')
+ strcat(work, PATH_SEP_CHAR_STR);
+ }
+ else
+ work[0]='\0';
+
+ strcat(work, name);
+#if defined(__CYGWIN__)
+ CYGWIN_CONV_TO_POSIX_PATH((work, work2));
+#else
+ strcpy(work2,work);
+#endif
+
+#ifdef DEBUGALL
+ Trace(("looking for...\t%s\n",work2));
+#endif
+
+ file = fopen(work2, "rb");
+ if (file != NULL)
+ {
+ if (fullname != NULL)
+ strcpy(fullname,work2);
+ retval = TRUE;
+ fclose(file);
+ }
+ return retval;
+}
--- /dev/null
+// #define DEBUG
+// #define DEBUGALL
+
+// B19 - egcs automatically defines CYGWIN32 but not CYGWIN
+// B20 - egcs automatically defines both CYGWIN32 and CYGWIN
+// Bfuture - (???) defines CYGWIN but not CYGWIN32
+#if defined(__CYGWIN32__)
+#if !defined(__CYGWIN__)
+ #define B19
+ #define __CYGWIN__
+#else
+ #define B20
+#endif
+#else
+#if defined(__CYGWIN__)
+ #define B21
+#endif
+#endif
+// Now: use __CYGWIN__ to represent any version
+// distinguish using B19, B20, or B21
+
+#if defined(__CYGWIN__)
+#ifdef B19
+#define CYGWIN_ATTACH_HANDLE_TO_FD(a) cygwin32_attach_handle_to_fd a
+#define CYGWIN_CONV_TO_FULL_POSIX_PATH(a) cygwin32_conv_to_full_posix_path a
+#define CYGWIN_CONV_TO_FULL_WIN32_PATH(a) cygwin32_conv_to_full_win32_path a
+#define CYGWIN_CONV_TO_POSIX_PATH(a) cygwin32_conv_to_posix_path a
+#define CYGWIN_CONV_TO_WIN32_PATH(a) cygwin32_conv_to_win32_path a
+#define CYGWIN_DETACH_DLL(a) cygwin32_detach_dll a
+#define CYGWIN_GETSHARED(a) cygwin32_getshared a
+#define CYGWIN_INTERNAL(a) cygwin32_internal a
+#define CYGWIN_POSIX_PATH_LIST_P(a) cygwin32_posix_path_list_p a
+#define CYGWIN_POSIX_TO_WIN32_PATH_LIST(a) cygwin32_posix_to_win32_path_list a
+#define CYGWIN_POSIX_TO_WIN32_PATH_LIST_BUF_SIZE(a) cygwin32_posix_to_win32_path_list_buf_size a
+#define CYGWIN_SPLIT_PATH(a) cygwin32_split_path a
+#define CYGWIN_WIN32_TO_POSIX_PATH_LIST(a) cygwin32_win32_to_posix_path_list a
+#define CYGWIN_WIN32_TO_POSIX_PATH_LIST_BUF_SIZE(a) cygwin32_win32_to_posix_path_list_buf_size a
+#define CYGWIN_WINPID_TO_PID(a) cygwin32_winpid_to_pid a
+#else
+#define CYGWIN_ATTACH_HANDLE_TO_FD(a) cygwin_attach_handle_to_fd a
+#define CYGWIN_CONV_TO_FULL_POSIX_PATH(a) cygwin_conv_to_full_posix_path a
+#define CYGWIN_CONV_TO_FULL_WIN32_PATH(a) cygwin_conv_to_full_win32_path a
+#define CYGWIN_CONV_TO_POSIX_PATH(a) cygwin_conv_to_posix_path a
+#define CYGWIN_CONV_TO_WIN32_PATH(a) cygwin_conv_to_win32_path a
+#define CYGWIN_DETACH_DLL(a) cygwin_detach_dll a
+#define CYGWIN_GETSHARED(a) cygwin_getshared a
+#define CYGWIN_INTERNAL(a) cygwin_internal a
+#define CYGWIN_POSIX_PATH_LIST_P(a) cygwin_posix_path_list_p a
+#define CYGWIN_POSIX_TO_WIN32_PATH_LIST(a) cygwin_posix_to_win32_path_list a
+#define CYGWIN_POSIX_TO_WIN32_PATH_LIST_BUF_SIZE(a) cygwin_posix_to_win32_path_list_buf_size a
+#define CYGWIN_SPLIT_PATH(a) cygwin_split_path a
+#define CYGWIN_WIN32_TO_POSIX_PATH_LIST(a) cygwin_win32_to_posix_path_list a
+#define CYGWIN_WIN32_TO_POSIX_PATH_LIST_BUF_SIZE(a) cygwin_win32_to_posix_path_list_buf_size a
+#define CYGWIN_WINPID_TO_PID(a) cygwin_winpid_to_pid a
+#endif
+#endif
+
+#if defined(__CYGWIN__)
+ #define PATH_SEP_CHAR_STR "/"
+ #define SEP_CHARS ":"
+#else
+ #define PATH_SEP_CHAR_STR "\\"
+ #define SEP_CHARS ";"
+#endif
+
+#ifndef RC_INVOKED
+
+#define MAX_ARGS 20
+
+#ifdef DEBUG
+ #define Trace(x) Trace_ x
+#else
+ #define Trace(x)
+#endif
+
+#define NUM_EXTENSIONS 2
+const char* exts[NUM_EXTENSIONS] = { "", ".exe" };
+
+char* pfopen(char *retval, const char *name, const char *dirs);
+void error(char* fmt, ...);
+void message(char* fmt, ...);
+void Trace_(char* fmt, ...);
+int get_exec_name_and_path(char* execname, char* execpath);
+char* my_strtok(char* s, const char* delim, char** lasts);
+int parse_cmdline_to_arg_array(char* argv[MAX_ARGS], char* cmdline);
+void strip_exe(char* s);
+int start_child(char* cmdline, int wait_for_child);
+void xemacs_special(char* exec);
+int build_cmdline(char* new_cmdline, char* exec, int argc, char* argv[]);
+void process_execname(char *exec, const char* execname, const char* execpath);
+int fileExists(char* fullname, const char* path, const char* name);
+int endsWith(const char* s1, const char* s2);
+int fileExistsMulti(char* fullname, const char* path,
+ const char* name_noext, const char* exts[],
+ const int extcnt);
+
+#endif /* RC_INVOKED */
+
+
+
--- /dev/null
+XEmacs ICON PRELOAD "xemacs.ico"
+XEmacsFile ICON "file.ico"
+XEmacsLisp ICON "lisp.ico"
+
+#include <windows.h>
+#include "run.h"
+
+1 VERSIONINFO
+FILEVERSION 1, 1, 4, 0
+PRODUCTVERSION 1, 1, 4, 0
+FILEOS VOS_NT_WINDOWS32
+FILETYPE VFT_APP
+FILESUBTYPE 0
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "04090000"
+ BEGIN
+ VALUE "CompanyName", "Charles S. Wilson\000"
+ VALUE "FileDescription", "Runs console-mode programs sans console.\000"
+ VALUE "FileVersion", "1.1.4\000"
+ VALUE "InternalName", "run\000"
+ VALUE "LegalCopyright", "Copyright © 1998 Charles S. Wilson\000"
+ VALUE "OriginalFilename", "run.exe\000"
+ VALUE "ProductName","run\000"
+ VALUE "ProductVersion","1.1.4\000"
+ VALUE "GPL Copyleft", "Released under the GNU General Public License version 2 --------------------------------------- This program is free software; you can redistribute it and/or modify it under the termms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. --------------------------------------- This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. --------------------------------------- You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\000"
+ END
+ END
+END
--- /dev/null
+#!/bin/sh
+# Submit a problem report to a GNATS site.
+# Copyright (C) 1993 Free Software Foundation, Inc.
+# Contributed by Brendan Kehoe (brendan@cygnus.com), based on a
+# version written by Heinz G. Seidl (hgs@cygnus.com).
+#
+# This file is part of GNU GNATS.
+#
+# GNU GNATS is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# GNU GNATS is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU GNATS; see the file COPYING. If not, write to
+# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+# The version of this send-pr.
+VERSION=3.101
+
+# The submitter-id for your site.
+SUBMITTER=net
+
+# Where the GNATS directory lives, if at all.
+[ -z "$GNATS_ROOT" ] &&
+GNATS_ROOT=/usr/lib/gnats/gnats-db
+
+# The default mail address for PR submissions.
+GNATS_ADDR=bugs@xemacs.org
+
+# Where the gnats category tree lives.
+[ -z "$DATADIR" ] &&
+DATADIR=/usr/share
+
+# If we've been moved around, try using GCC_EXEC_PREFIX.
+[ ! -d $DATADIR/gnats -a -d "$GCC_EXEC_PREFIX" ] &&
+ DATADIR=${GCC_EXEC_PREFIX}../../../lib
+
+
+# The default release for this host.
+DEFAULT_RELEASE="gnats-3.101"
+
+# The default organization.
+DEFAULT_ORGANIZATION="XEmacs Users"
+
+# The default site to look for.
+GNATS_SITE=xemacs.org
+
+# Newer config information?
+[ -f ${GNATS_ROOT}/gnats-adm/config ] && . ${GNATS_ROOT}/gnats-adm/config
+
+# What mailer to use. This must come after the config file, since it is
+# host-dependent.
+MAIL_AGENT="/usr/lib/sendmail -oi -t"
+
+# How to read the passwd database.
+PASSWD="cat /etc/passwd"
+
+ECHON=bsd
+
+if [ $ECHON = bsd ] ; then
+ ECHON1="echo -n"
+ ECHON2=
+elif [ $ECHON = sysv ] ; then
+ ECHON1=echo
+ ECHON2='\c'
+else
+ ECHON1=echo
+ ECHON2=
+fi
+
+#\f
+
+if [ -z "$TMPDIR" ]; then
+ TMPDIR=/tmp
+else
+ if [ "`echo $TMPDIR | grep '/$'`" != "" ]; then
+ TMPDIR="`echo $TMPDIR | sed -e 's,/$,,'`"
+ fi
+fi
+
+TEMP=$TMPDIR/p$$
+BAD=$TMPDIR/pbad$$
+REF=$TMPDIR/pf$$
+
+# find a user name
+if [ "$LOGNAME" = "" ]; then
+ if [ "$USER" != "" ]; then
+ LOGNAME="$USER"
+ else
+ LOGNAME="UNKNOWN"
+ fi
+fi
+
+FROM="$LOGNAME"
+if [ -z "$REPLYTO" ]; then
+ REPLYTO="$LOGNAME"
+fi
+
+# Find out the name of the originator of this PR.
+if [ -n "$NAME" ]; then
+ ORIGINATOR="$NAME"
+elif [ -f $HOME/.fullname ]; then
+ ORIGINATOR="`sed -e '1q' $HOME/.fullname`"
+else
+ # Must use temp file due to incompatibilities in quoting behavior
+ # and to protect shell metacharacters in the expansion of $LOGNAME
+ $PASSWD | grep "^$LOGNAME:" | awk -F: '{print $5}' | sed -e 's/,.*//' > $TEMP
+ ORIGINATOR="`cat $TEMP`"
+ rm -f $TEMP
+fi
+
+if [ -n "$ORGANIZATION" ]; then
+ if [ -f "$ORGANIZATION" ]; then
+ ORGANIZATION="`cat $ORGANIZATION`"
+ fi
+else
+ if [ -n "$DEFAULT_ORGANIZATION" ]; then
+ ORGANIZATION="$DEFAULT_ORGANIZATION"
+ elif [ -f $HOME/.organization ]; then
+ ORGANIZATION="`cat $HOME/.organization`"
+ elif [ -f $HOME/.signature ]; then
+ ORGANIZATION="`cat $HOME/.signature`"
+ fi
+fi
+
+# If they don't have a preferred editor set, then use
+if [ -z "$VISUAL" ]; then
+ if [ -z "$EDITOR" ]; then
+ EDIT=vi
+ else
+ EDIT="$EDITOR"
+ fi
+else
+ EDIT="$VISUAL"
+fi
+
+# Find out some information.
+SYSTEM=`( [ -f /bin/uname ] && /bin/uname -a ) || \
+ ( [ -f /usr/bin/uname ] && /usr/bin/uname -a ) || echo ""`
+ARCH=`[ -f /bin/arch ] && /bin/arch`
+MACHINE=`[ -f /bin/machine ] && /bin/machine`
+
+COMMAND=`echo $0 | sed -e 's,.*/,,'`
+USAGE="Usage: $COMMAND [-PVL] [-t address] [-f filename] [-s severity]
+ [-c address] [--request-id] [--version]"
+REMOVE=
+BATCH=
+CC=
+SEVERITY_C=
+
+while [ $# -gt 0 ]; do
+ case "$1" in
+ -r) ;; # Ignore for backward compat.
+ -t | --to) if [ $# -eq 1 ]; then echo "$USAGE"; exit 1; fi
+ shift ; GNATS_ADDR="$1"
+ EXPLICIT_GNATS_ADDR=true
+ ;;
+ -f | --file) if [ $# -eq 1 ]; then echo "$USAGE"; exit 1; fi
+ shift ; IN_FILE="$1"
+ if [ "$IN_FILE" != "-" -a ! -r "$IN_FILE" ]; then
+ echo "$COMMAND: cannot read $IN_FILE"
+ exit 1
+ fi
+ ;;
+ -b | --batch) BATCH=true ;;
+ -c | --cc) if [ $# -eq 1 ]; then echo "$USAGE"; exit 1; fi
+ shift ; CC="$1"
+ ;;
+ -s | --severity) if [ $# -eq 1 ]; then echo "$USAGE"; exit 1; fi
+ shift ; SEVERITY_C="$1"
+ ;;
+ -p | -P | --print) PRINT=true ;;
+ -L | --list) FORMAT=norm ;;
+ -l | -CL | --lisp) FORMAT=lisp ;;
+ --request-id) REQUEST_ID=true ;;
+ -h | --help) echo "$USAGE"; exit 0 ;;
+ -V | --version) echo "$VERSION"; exit 0 ;;
+ -*) echo "$USAGE" ; exit 1 ;;
+ *) if [ -z "$USER_GNATS_SITE" ]; then
+ if [ ! -r "$DATADIR/gnats/$1" ]; then
+ echo "$COMMAND: the GNATS site $1 does not have a categories list."
+ exit 1
+ else
+ # The site name is the alias they'll have to have created.
+ USER_GNATS_SITE=$1
+ fi
+ else
+ echo "$USAGE" ; exit 1
+ fi
+ ;;
+ esac
+ shift
+done
+
+if [ -n "$USER_GNATS_SITE" ] && [ "$USER_GNATS_SITE" != "$GNATS_SITE" ]; then
+ GNATS_SITE=$USER_GNATS_SITE
+ GNATS_ADDR=$USER_GNATS_SITE-gnats
+fi
+
+if [ "$SUBMITTER" = "unknown" -a -z "$REQUEST_ID" -a -z "$IN_FILE" ]; then
+ cat << '__EOF__'
+It seems that send-pr is not installed with your unique submitter-id.
+You need to run
+
+ install-sid YOUR-SID
+
+where YOUR-SID is the identification code you received with `send-pr'.
+`send-pr' will automatically insert this value into the template field
+`>Submitter-Id'. If you've downloaded `send-pr' from the Net, use `net'
+for this value. If you do not know your id, run `send-pr --request-id' to
+get one from your support site.
+__EOF__
+ exit 1
+fi
+
+if [ -r "$DATADIR/gnats/$GNATS_SITE" ]; then
+ CATEGORIES=`grep -v '^#' $DATADIR/gnats/$GNATS_SITE | sort`
+else
+ echo "$COMMAND: could not read $DATADIR/gnats/$GNATS_SITE for categories list."
+ exit 1
+fi
+
+if [ -z "$CATEGORIES" ]; then
+ echo "$COMMAND: the categories list for $GNATS_SITE was empty!"
+ exit 1
+fi
+
+case "$FORMAT" in
+ lisp) echo "$CATEGORIES" | \
+ awk 'BEGIN {printf "( "} {printf "(\"%s\") ",$0} END {printf ")\n"}'
+ exit 0
+ ;;
+ norm) l=`echo "$CATEGORIES" | \
+ awk 'BEGIN {max = 0; } { if (length($0) > max) { max = length($0); } }
+ END {print max + 1;}'`
+ c=`expr 70 / $l`
+ if [ $c -eq 0 ]; then c=1; fi
+ echo "$CATEGORIES" | \
+ awk 'BEGIN {print "Known categories:"; i = 0 }
+ { printf ("%-'$l'.'$l's", $0); if ((++i % '$c') == 0) { print "" } }
+ END { print ""; }'
+ exit 0
+ ;;
+esac
+
+ORIGINATOR_C='<name of the PR author (one line)>'
+ORGANIZATION_C='<organization of PR author (multiple lines)>'
+CONFIDENTIAL_C='<[ yes | no ] (one line)>'
+SYNOPSIS_C='<synopsis of the problem (one line)>'
+if [ -z "$SEVERITY_C" ]; then
+ SEVERITY_C='<[ non-critical | serious | critical ] (one line)>'
+fi
+PRIORITY_C='<[ low | medium | high ] (one line)>'
+CATEGORY_C='<name of the product (one line)>'
+CLASS_C='<[ sw-bug | doc-bug | change-request | support ] (one line)>'
+RELEASE_C='<release number or tag (one line)>'
+ENVIRONMENT_C='<machine, os, target, libraries (multiple lines)>'
+DESCRIPTION_C='<precise description of the problem (multiple lines)>'
+HOW_TO_REPEAT_C='<code/input/activities to reproduce the problem (multiple lines)>'
+FIX_C='<how to correct or work around the problem, if known (multiple lines)>'
+
+# Catch some signals. ($xs kludge needed by Sun /bin/sh)
+xs=0
+trap 'rm -f $REF $TEMP; exit $xs' 0
+trap 'echo "$COMMAND: Aborting ..."; rm -f $REF $TEMP; xs=1; exit' 1 2 3 13 15
+
+# If they told us to use a specific file, then do so.
+if [ -n "$IN_FILE" ]; then
+ if [ "$IN_FILE" = "-" ]; then
+ # The PR is coming from the standard input.
+ if [ -n "$EXPLICIT_GNATS_ADDR" ]; then
+ sed -e "s;^[Tt][Oo]:.*;To: $GNATS_ADDR;" > $TEMP
+ else
+ cat > $TEMP
+ fi
+ else
+ # Use the file they named.
+ if [ -n "$EXPLICIT_GNATS_ADDR" ]; then
+ sed -e "s;^[Tt][Oo]:.*;To: $GNATS_ADDR;" $IN_FILE > $TEMP
+ else
+ cat $IN_FILE > $TEMP
+ fi
+ fi
+else
+
+ if [ -n "$PR_FORM" -a -z "$PRINT_INTERN" ]; then
+ # If their PR_FORM points to a bogus entry, then bail.
+ if [ ! -f "$PR_FORM" -o ! -r "$PR_FORM" -o ! -s "$PR_FORM" ]; then
+ echo "$COMMAND: can't seem to read your template file (\`$PR_FORM'), ignoring PR_FORM"
+ sleep 1
+ PRINT_INTERN=bad_prform
+ fi
+ fi
+
+ if [ -n "$PR_FORM" -a -z "$PRINT_INTERN" ]; then
+ cp $PR_FORM $TEMP ||
+ ( echo "$COMMAND: could not copy $PR_FORM" ; xs=1; exit )
+ else
+ for file in $TEMP $REF ; do
+ cat > $file << '__EOF__'
+SEND-PR: -*- send-pr -*-
+SEND-PR: Lines starting with `SEND-PR' will be removed automatically, as
+SEND-PR: will all comments (text enclosed in `<' and `>').
+SEND-PR:
+SEND-PR: Please consult the send-pr man page `send-pr(1)' or the Texinfo
+SEND-PR: manual if you are not sure how to fill out a problem report.
+SEND-PR:
+SEND-PR: Choose from the following categories:
+SEND-PR:
+__EOF__
+
+ # Format the categories so they fit onto lines.
+ l=`echo "$CATEGORIES" | \
+ awk 'BEGIN {max = 0; } { if (length($0) > max) { max = length($0); } }
+ END {print max + 1;}'`
+ c=`expr 61 / $l`
+ if [ $c -eq 0 ]; then c=1; fi
+ echo "$CATEGORIES" | \
+ awk 'BEGIN {printf "SEND-PR: "; i = 0 }
+ { printf ("%-'$l'.'$l's", $0);
+ if ((++i % '$c') == 0) { printf "\nSEND-PR: " } }
+ END { printf "\nSEND-PR:\n"; }' >> $file
+
+ cat >> $file << __EOF__
+To: $GNATS_ADDR
+Subject:
+From: $FROM
+Reply-To: $REPLYTO
+Cc: $CC
+X-send-pr-version: $VERSION
+
+
+>Submitter-Id: $SUBMITTER
+>Originator: $ORIGINATOR
+>Organization:
+${ORGANIZATION- $ORGANIZATION_C}
+>Confidential: $CONFIDENTIAL_C
+>Synopsis: $SYNOPSIS_C
+>Severity: $SEVERITY_C
+>Priority: $PRIORITY_C
+>Category: $CATEGORY_C
+>Class: $CLASS_C
+>Release: ${DEFAULT_RELEASE-$RELEASE_C}
+>Environment:
+ $ENVIRONMENT_C
+`[ -n "$SYSTEM" ] && echo System: $SYSTEM`
+`[ -n "$ARCH" ] && echo Architecture: $ARCH`
+`[ -n "$MACHINE" ] && echo Machine: $MACHINE`
+>Description:
+ $DESCRIPTION_C
+>How-To-Repeat:
+ $HOW_TO_REPEAT_C
+>Fix:
+ $FIX_C
+__EOF__
+ done
+ fi
+
+ if [ "$PRINT" = true -o "$PRINT_INTERN" = true ]; then
+ cat $TEMP
+ xs=0; exit
+ fi
+
+ chmod u+w $TEMP
+ if [ -z "$REQUEST_ID" ]; then
+ eval $EDIT $TEMP
+ else
+ ed -s $TEMP << '__EOF__'
+/^Subject/s/^Subject:.*/Subject: request for a customer id/
+/^>Category/s/^>Category:.*/>Category: send-pr/
+w
+q
+__EOF__
+ fi
+
+ if cmp -s $REF $TEMP ; then
+ echo "$COMMAND: problem report not filled out, therefore not sent"
+ xs=1; exit
+ fi
+fi
+
+#\f
+# Check the enumeration fields
+
+# This is a "sed-subroutine" with one keyword parameter
+# (with workaround for Sun sed bug)
+#
+SED_CMD='
+/$PATTERN/{
+s|||
+s|<.*>||
+s|^[ ]*||
+s|[ ]*$||
+p
+q
+}'
+
+
+while [ -z "$REQUEST_ID" ]; do
+ CNT=0
+
+ # 1) Confidential
+ #
+ PATTERN=">Confidential:"
+ CONFIDENTIAL=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
+ case "$CONFIDENTIAL" in
+ ""|yes|no) CNT=`expr $CNT + 1` ;;
+ *) echo "$COMMAND: \`$CONFIDENTIAL' is not a valid value for \`Confidential'." ;;
+ esac
+ #
+ # 2) Severity
+ #
+ PATTERN=">Severity:"
+ SEVERITY=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
+ case "$SEVERITY" in
+ ""|non-critical|serious|critical) CNT=`expr $CNT + 1` ;;
+ *) echo "$COMMAND: \`$SEVERITY' is not a valid value for \`Severity'."
+ esac
+ #
+ # 3) Priority
+ #
+ PATTERN=">Priority:"
+ PRIORITY=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
+ case "$PRIORITY" in
+ ""|low|medium|high) CNT=`expr $CNT + 1` ;;
+ *) echo "$COMMAND: \`$PRIORITY' is not a valid value for \`Priority'."
+ esac
+ #
+ # 4) Category
+ #
+ PATTERN=">Category:"
+ CATEGORY=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
+ FOUND=
+ for C in $CATEGORIES
+ do
+ if [ "$C" = "$CATEGORY" ]; then FOUND=true ; break ; fi
+ done
+ if [ -n "$FOUND" ]; then
+ CNT=`expr $CNT + 1`
+ else
+ if [ -z "$CATEGORY" ]; then
+ echo "$COMMAND: you must include a Category: field in your report."
+ else
+ echo "$COMMAND: \`$CATEGORY' is not a known category."
+ fi
+ fi
+ #
+ # 5) Class
+ #
+ PATTERN=">Class:"
+ CLASS=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
+ case "$CLASS" in
+ ""|sw-bug|doc-bug|change-request|support) CNT=`expr $CNT + 1` ;;
+ *) echo "$COMMAND: \`$CLASS' is not a valid value for \`Class'."
+ esac
+
+ [ $CNT -lt 5 -a -z "$BATCH" ] &&
+ echo "Errors were found with the problem report."
+
+ while true; do
+ if [ -z "$BATCH" ]; then
+ $ECHON1 "a)bort, e)dit or s)end? $ECHON2"
+ read input
+ else
+ if [ $CNT -eq 5 ]; then
+ input=s
+ else
+ input=a
+ fi
+ fi
+ case "$input" in
+ a*)
+ if [ -z "$BATCH" ]; then
+ echo "$COMMAND: the problem report remains in $BAD and is not sent."
+ mv $TEMP $BAD
+ else
+ echo "$COMMAND: the problem report is not sent."
+ fi
+ xs=1; exit
+ ;;
+ e*)
+ eval $EDIT $TEMP
+ continue 2
+ ;;
+ s*)
+ break 2
+ ;;
+ esac
+ done
+done
+#
+# Remove comments and send the problem report
+# (we have to use patterns, where the comment contains regex chars)
+#
+# /^>Originator:/s;$ORIGINATOR;;
+sed -e "
+/^SEND-PR:/d
+/^>Organization:/,/^>[A-Za-z-]*:/s;$ORGANIZATION_C;;
+/^>Confidential:/s;<.*>;;
+/^>Synopsis:/s;$SYNOPSIS_C;;
+/^>Severity:/s;<.*>;;
+/^>Priority:/s;<.*>;;
+/^>Category:/s;$CATEGORY_C;;
+/^>Class:/s;<.*>;;
+/^>Release:/,/^>[A-Za-z-]*:/s;$RELEASE_C;;
+/^>Environment:/,/^>[A-Za-z-]*:/s;$ENVIRONMENT_C;;
+/^>Description:/,/^>[A-Za-z-]*:/s;$DESCRIPTION_C;;
+/^>How-To-Repeat:/,/^>[A-Za-z-]*:/s;$HOW_TO_REPEAT_C;;
+/^>Fix:/,/^>[A-Za-z-]*:/s;$FIX_C;;
+" $TEMP > $REF
+
+if $MAIL_AGENT < $REF; then
+ echo "$COMMAND: problem report sent"
+ xs=0; exit
+else
+ echo "$COMMAND: mysterious mail failure."
+ if [ -z "$BATCH" ]; then
+ echo "$COMMAND: the problem report remains in $BAD and is not sent."
+ mv $REF $BAD
+ else
+ echo "$COMMAND: the problem report is not sent."
+ fi
+ xs=1; exit
+fi
--- /dev/null
+#!/bin/sh -
+#
+# $Id: tm-au,v 1.6 1997/02/15 22:20:26 steve Exp $
+#
+# Copyright 1994,1995,1996,1997 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Emacs; see the file COPYING. If not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+PATH=${PATH:-/usr/bin:/bin}:`dirname $0 2>/dev/null`; export PATH
+
+if [ "$TM_TMP_DIR" = "" ]; then
+ TM_TMP_DIR=/tmp
+ export TM_TMP_DIR
+fi
+
+if [ "$5" = "" ]; then
+ filename="$TM_TMP_DIR/mime$$.au"
+else
+ filename="$TM_TMP_DIR/$5"
+fi
+
+
+case "$4" in
+"play")
+ echo "$2; $3 ->"
+ tmdecode $3 $1 $filename
+ if [ "$AUDIOSERVER" = "" ]; then
+ case "`uname`" in
+ IRIX ) sfplay $filename ;;
+ OSF1 ) decsound -play $filename ;;
+ * ) cat $filename > /dev/audio ;;
+ esac
+ else
+ autool -v 40 $filename
+ fi
+
+ trap 'rm -f $filename' 0 1 2 3 13 15
+ ;;
+"extract")
+ echo "$2; $3 -> $filename"
+ echo "extract to $filename"
+ tmdecode $3 $1 $filename
+ ;;
+esac
--- /dev/null
+#!/bin/sh -
+#
+# $Id: tm-file,v 1.4 1997/01/30 02:22:30 steve Exp $
+#
+# Copyright 1994,1995,1996,1997 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Emacs; see the file COPYING. If not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+PATH=${PATH:-/usr/bin:/bin}:`dirname $0 2>/dev/null`; export PATH
+
+if [ "$TM_TMP_DIR" = "" ]; then
+ TM_TMP_DIR=/tmp
+ export TM_TMP_DIR
+fi
+
+if [ "$5" = "" ]; then
+ filename="$TM_TMP_DIR/mime$$"
+else
+ filename="$TM_TMP_DIR/$5"
+fi
+
+
+echo "$2; $3 -> $filename"
+
+tmdecode $3 $1 $filename
--- /dev/null
+#!/bin/sh
+#
+# $Id: tm-html,v 1.4 1997/01/30 02:22:30 steve Exp $
+#
+# Copyright 1994,1995,1996,1997 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Emacs; see the file COPYING. If not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+PATH=${PATH:-/usr/bin:/bin}:`dirname $0 2>/dev/null`; export PATH
+
+if [ "$TM_TMP_DIR" = "" ]; then
+ TM_TMP_DIR=/tmp
+ export TM_TMP_DIR
+fi
+
+if [ "$TM_WWW_BROWSER" = "" ]; then
+ TM_WWW_BROWSER=netscape
+ export TM_WWW_BROWSER
+fi
+
+if [ "$5" = "" ]; then
+ filename="$TM_TMP_DIR/mime$$.html"
+else
+ filename="$TM_TMP_DIR/$5"
+fi
+
+echo "$2; $3 -> $filename"
+
+tmdecode "$3" $1 $filename
+
+case "$4" in
+"play")
+ if [ `echo $TM_WWW_BROWSER | grep netscape` ]; then
+ echo netscape
+ if [ -h $HOME/.netscape/lock ]; then
+ netscape -remote "openURL(file:$filename,new-window)"
+ else
+ netscape $filename
+ fi
+ else
+ echo not netscape
+ $TM_WWW_BROWSER $filename
+ fi
+ trap 'rm -f $filename' 0 1 2 3 13 15
+ ;;
+"extract")
+ echo "extract to $filename"
+ ;;
+esac
--- /dev/null
+#!/bin/sh -
+#
+# $Id: tm-image,v 1.4 1997/01/30 02:22:30 steve Exp $
+#
+# Copyright 1994, 1995, 1996 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Emacs; see the file COPYING. If not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+PATH=${PATH:-/usr/bin:/bin}:`dirname $0 2>/dev/null`; export PATH
+
+if [ "$TM_TMP_DIR" = "" ]; then
+ TM_TMP_DIR=/tmp
+ export TM_TMP_DIR
+fi
+if [ "$5" = "" ]; then
+ case "$2" in
+ "image/gif")
+ filename="$TM_TMP_DIR/mime$$.gif"
+ ;;
+ "image/jpeg")
+ filename="$TM_TMP_DIR/mime$$.jpg"
+ ;;
+ "image/tiff"|"image/x-tiff")
+ filename="$TM_TMP_DIR/mime$$.tif"
+ ;;
+ "image/x-xwd")
+ filename="$TM_TMP_DIR/mime$$.xwd"
+ ;;
+ "image/x-xbm")
+ filename="$TM_TMP_DIR/mime$$.xbm"
+ ;;
+ "image/x-pic")
+ filename="$TM_TMP_DIR/mime$$.pic"
+ ;;
+ "image/x-mag")
+ filename="$TM_TMP_DIR/mime$$.mag"
+ ;;
+ *)
+ filename="$TM_TMP_DIR/mime$$.img"
+ ;;
+ esac
+else
+ filename="$TM_TMP_DIR/$5"
+fi
+
+echo "$2; $3 -> $filename"
+
+tmdecode $3 $1 $filename
+
+case "$4" in
+"play")
+ xv -geometry +1+1 $filename
+ trap 'rm -f $filename' 0 1 2 3 13 15
+ ;;
+"extract")
+ echo "extract to $filename"
+ ;;
+esac
--- /dev/null
+#!/bin/sh -
+#
+# $Id: tm-mpeg,v 1.4 1997/01/30 02:22:30 steve Exp $
+#
+# Copyright 1994, 1995, 1996 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Emacs; see the file COPYING. If not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+PATH=${PATH:-/usr/bin:/bin}:`dirname $0 2>/dev/null`; export PATH
+
+if [ "$TM_TMP_DIR" = "" ]; then
+ TM_TMP_DIR=/tmp
+ export TM_TMP_DIR
+fi
+if [ "$5" = "" ]; then
+ filename="$TM_TMP_DIR/mime$$.mpg"
+else
+ filename="$TM_TMP_DIR/$5"
+fi
+
+echo "$2; $3 -> $filename"
+
+tmdecode $3 $1 $filename
+
+case "$4" in
+"play")
+ if [ "$VIDEO_DITHER" = "" ]; then
+ VIDEO_DITHER=gray
+ export VIDEO_DITHER
+ fi
+ mpeg_play -dither $VIDEO_DITHER $filename
+ trap 'rm -f $filename' 0 1 2 3 13 15
+ ;;
+"extract")
+ echo "extract to $filename"
+ ;;
+esac
--- /dev/null
+#!/bin/sh -
+#
+# $Id: tm-plain,v 1.4 1997/01/30 02:22:30 steve Exp $
+#
+# Copyright 1994,1995,1996,1997 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Emacs; see the file COPYING. If not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+PATH=${PATH:-/usr/bin:/bin}:`dirname $0 2>/dev/null`; export PATH
+
+if [ "$TM_TMP_DIR" = "" ]; then
+ TM_TMP_DIR=/tmp
+ export TM_TMP_DIR
+fi
+if [ "$5" = "" ]; then
+ filename="$TM_TMP_DIR/mime$$.pln"
+else
+ filename="$TM_TMP_DIR/$5"
+fi
+
+case "$4" in
+"play")
+ echo "$2; $3 ->"
+ tmdecode "$3" "$1" /dev/stdout
+ ;;
+"extract")
+ echo "$2; $3 -> $filename"
+ echo "extract to $filename"
+ tmdecode "$3" "$1" $filename
+ ;;
+"print")
+ echo "$2; $3 ->"
+ tmdecode "$3" "$1" /dev/stdout | lpr
+ ;;
+esac
--- /dev/null
+#!/bin/sh -
+#
+# $Id: tm-ps,v 1.4 1997/01/30 02:22:30 steve Exp $
+#
+# Copyright 1994, 1995, 1996 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Emacs; see the file COPYING. If not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+PATH=${PATH:-/usr/bin:/bin}:`dirname $0 2>/dev/null`; export PATH
+
+if [ "$TM_TMP_DIR" = "" ]; then
+ TM_TMP_DIR=/tmp
+ export TM_TMP_DIR
+fi
+if [ "$5" = "" ]; then
+ filename="$TM_TMP_DIR/mime$$.pln"
+else
+ filename="$TM_TMP_DIR/$5"
+fi
+
+case "$4" in
+"play")
+ echo "$2; $3 -> $filename"
+ tmdecode $3 $1 $filename
+ ghostview $filename
+ trap 'rm -f $filename' 0 1 2 3 13 15
+ ;;
+"extract")
+ echo "$2; $3 -> $filename"
+ echo "extract to $filename"
+ tmdecode "$3" "$1" $filename
+ ;;
+"print")
+ echo "$2; $3 ->"
+ tmdecode "$3" "$1" /dev/stdout | lpr
+ ;;
+esac
--- /dev/null
+#!/bin/sh -
+#
+# $Id: tmdecode,v 1.4 1997/01/30 02:22:30 steve Exp $
+#
+# Copyright 1994, 1995, 1996 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Emacs; see the file COPYING. If not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+PATH=${PATH:-/usr/bin:/bin}:`dirname $0 2>/dev/null`; export PATH
+
+trap 'rm -f $2' 0 1 2 3 13 15
+
+case "$3" in
+/dev/stdout)
+ OUTPUT=
+ ;;
+*)
+ OUTPUT='> $3'
+ ;;
+esac
+
+case "$1" in
+""|"7bit"|"8bit"|"binary")
+ eval "cat $2 $OUTPUT"
+ ;;
+"base64")
+ #eval "decode-b < $2 $OUTPUT"
+ eval "mmencode -u $2 $OUTPUT"
+ ;;
+"quoted-printable")
+ eval "mmencode -q -u $2 $OUTPUT"
+ ;;
+"x-uue"|"x-uuencode")
+ (cd $TM_TMP_DIR ; uudecode $2)
+ ;;
+"x-gzip64")
+ #eval "decode-b < $2 | gzip -cd $OUTPUT"
+ eval "mmencode -u $2 | gzip -cd $OUTPUT"
+ ;;
+*)
+ echo "unknown encoding"
+ exit -1
+ ;;
+esac
+
+# echo "$2 was removed."
--- /dev/null
+#!/bin/sh
+# update-elc.sh --- recompile all missing or out-of-date .elc files
+
+# Author: Jamie Zawinski, Ben Wing, Martin Buchholz
+# Maintainer: Martin Buchholz
+# Keywords: recompile byte-compile .el .elc
+
+# This file is part of XEmacs.
+
+# XEmacs is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# XEmacs is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with XEmacs; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+### Commentary:
+## Recompile all .elc files that need recompilation. Requires a
+## working version of "xemacs". Correctly handles the case where the
+## .elc files are missing; thus you can execute "rm lisp/*/*.elc"
+## before running this script. Run this from the parent of the
+## "lisp" directory, or another nearby directory.
+
+set -e
+
+# Try to find the lisp directory in several places.
+# (Sun workspaces have an "editor" directory)
+for dir in . .. ../.. editor ../editor ; do
+ if test -d $dir/lisp/. ; then cd $dir ; break ; fi
+done
+
+if test ! -d lisp/. ; then
+ echo "$0: Cannot find the \"lisp\" directory."
+ exit 1
+fi
+
+if test -z "$EMACS"; then EMACS="./src/xemacs"; fi
+export EMACS
+
+echo " (using $EMACS)"
+
+# fuckin' sysv, man...
+if [ "`uname -r | sed 's/[^0-9]*\([0-9]*\).*/\1/'`" -gt 4 ]; then
+ echon()
+ {
+ /bin/echo $* '\c'
+ }
+else
+ echon()
+ {
+ echo -n $*
+ }
+fi
+
+EMACS_DIR=`cd \`dirname $EMACS\` && pwd`;
+CANON_PWD=`pwd`
+# Account for various system automounter configurations
+if test -d "/net"; then
+ if test -d "/tmp_mnt/net"; then tdir="/tmp_mnt/net"; else tdir="/tmp_mnt"; fi
+ EMACS_DIR=`echo "$EMACS_DIR" | \
+ sed -e "s|^${tdir}/|/net/|" -e "s|^/a/|/net/|" -e "s|^/amd/|/net/|"`
+ CANON_PWD=`echo "$CANON_PWD" | \
+ sed -e "s|^${tdir}/|/net/|" -e "s|^/a/|/net/|" -e "s|^/amd/|/net/|"`
+fi
+REAL="$EMACS_DIR/`basename $EMACS`"
+
+echo "Recompiling in $CANON_PWD"
+echo " with $REAL..."
+
+BYTECOMP="$REAL -batch -vanilla "
+
+$EMACS -batch -vanilla -l $CANON_PWD/lisp/cleantree -f batch-remove-old-elc lisp
+
+prune_vc="( -name '.*' -o -name SCCS -o -name RCS -o -name CVS ) -prune -o"
+
+# $els is a list of all .el files
+# $elcs is a list of all .elc files
+els=/tmp/update-elc-1.$$ elcs=/tmp/update-elc-2.$$
+rm -f $els $elcs
+trap "rm -f $els $elcs" 0 1 2 3 15
+find lisp/. $prune_vc -name '*.el' -print | sort > $els
+find lisp/. $prune_vc -name '*.elc' -print | sed 's/elc$/el/' | sort > $elcs
+
+
+echon "Deleting .elc files without .el files..."
+comm -13 $els $elcs | sed -e '\!/vm.el!d' -e 's/el$/elc/' | \
+ while read file ; do echo rm "$file" ; rm "$file" ; done
+echo done.
+
+
+# Compute patterns to ignore when searching for files
+ignore_dirs=""
+ignore_pattern=''
+
+# Only use Mule XEmacs to compile Mule-specific elisp dirs
+echon "Checking for Mule support..."
+lisp_prog='(princ (featurep (quote mule)))'
+mule_p="`$EMACS -batch -vanilla -eval \"$lisp_prog\"`"
+if test "$mule_p" = nil ; then
+ echo No
+ ignore_dirs="$ignore_dirs mule"
+else
+ echo Yes
+fi
+
+# first recompile the byte-compiler, so that the other compiles take place
+# with the latest version (assuming we're compiling the lisp dir of the emacs
+# we're running, which might not be the case, but often is.)
+#echo "Checking the byte compiler..."
+#$BYTECOMP -f batch-byte-recompile-directory lisp/bytecomp
+
+# Prepare for byte-compiling directories with directory-specific instructions
+# Not necessary any more, but I want to keep the text current to cut & paste
+# into the package lisp maintenance tree.
+#make_special_commands=''
+#make_special () {
+# dir="$1"; shift;
+# ignore_dirs="$ignore_dirs $dir"
+# make_special_commands="$make_special_commands \
+#echo \"Compiling in lisp/$dir\"; \
+#(cd \"lisp/$dir\" && ${MAKE:-make} EMACS=$REAL ${1+$*}); \
+#echo \"lisp/$dir done.\";"
+#}
+
+#if test "$mule_p" != nil; then
+# make_special skk all
+#fi
+
+## AUCTeX is a package now
+# if test "$mule_p" = nil ; then
+# make_special auctex some
+# else
+# make_special auctex some MULE_ELC=tex-jp.elc
+# fi
+#make_special cc-mode all
+# EFS is now packaged
+# make_special efs x20
+#make_special eos -k # not strictly necessary...
+## make_special gnus some # Now this is a package.
+# hyperbole is now packaged
+# make_special hyperbole elc
+# We're not ready for the following, yet.
+#make_special ilisp XEmacsELC=custom-load.elc elc
+# ilisp is now packaged
+# make_special ilisp elc
+# oobr is now packaged
+# make_special oobr HYPB_ELC='' elc
+## W3 is a package now.
+#make_special w3 xemacs-w3
+
+for dir in $ignore_dirs ; do
+ ignore_pattern="${ignore_pattern}/\\/$dir\\//d
+/\\/$dir\$/d
+"
+done
+
+# Other special-case filenames that don't get byte-compiled
+ignore_pattern="$ignore_pattern"'
+\!/,!d
+\!/paths.el$!d
+\!/loadup.el$!d
+\!/loadup-el.el$!d
+\!/update-elc.el$!d
+\!/dumped-lisp.el$!d
+\!/make-docfile.el$!d
+\!/site-start.el$!d
+\!/site-load.el$!d
+\!/site-init.el$!d
+\!/version.el$!d
+\!/very-early-lisp.el$!d
+'
+
+echo "Compiling files without .elc..."
+NUMTOCOMPILE=20 # compile this many files with each invocation
+comm -23 $els $elcs | \
+ sed "$ignore_pattern" | \
+ xargs -t -n$NUMTOCOMPILE $BYTECOMP -f batch-byte-compile
+echo "Compiling files without .elc... Done"
+
+#if test "$mule_p" != nil; then
+# eval "$make_special_commands"
+#fi
-1999-06-24 Bob Weiner <weiner@beopen.com>
-
- * lib-complete.el (find-library):
- (find-library-other-window):
- (find-library-other-frame): Completely rewrote
- so that these functions actually work when called non-interactively.
- Also made them handle LIBRARY arguments which end with .el or .elc.
-
-1999-06-24 Bob Weiner <weiner@beopen.com>
-
- * simple.el (indent-new-comment-line): Locally bound
- `block-comment-start' to `comstart' or else when this is called
- from do-auto-fill, e.g. in Lisp mode, it will insert any non-nil
- `block-comment-start' value, ignoring any existing spacing after a
- comment prefix in the previous line and producing ugly comments.
-
-1999-06-23 Bob Weiner <weiner@beopen.com>
-
- * list-mode.el (mouse-choose-completion):
- (choose-completion):
- (completion-switch-to-minibuffer): Added.
- ([Tab]): [Tab] previously switched to the minibuffer
- but since [space] does that and since most applications in the
- world use [Tab] to select the next item in a list, do that in the
- *Completions* buffer too. This will cause the least confusion
- among the largest population of users. -- Bob Weiner, BeOpen.com,
- 06/23/1999.
-
-1999-06-22 Bob Weiner <weiner@beopen.com>
-
- * help.el (help-buffer-name): Added support for a null value
- of `help-buffer-prefix-string' since some buffers require no
- prefix.
-
-1999-06-20 Bob Weiner <weiner@beopen.com>
-
- * list-mode.el (completion-list-mode-quit): Added and bound to {q}
- in the completion-list-mode-map to bury the completions buffer
- even when the minibuffer is no longer active.
-
-1999-06-20 Bob Weiner <weiner@beopen.com>
-
- * list-mode.el (list-mode): It is visually disconcerting to have
- the text cursor disappear within list buffers, especially when
- moving from window to window, so leave it visible.
-
-1999-07-01 SL Baur <steve@miho.m17n.org>
-
- * menubar-items.el (default-menubar): Conditionalize the bug
- report menu item (which may not be possible in this XEmacs).
- Reported by: Ken'ichi Handa <handa@etl.go.jp>
-
-1999-06-30 SL Baur <steve@miho.m17n.org>
-
- * subr.el (with-current-buffer): DOC string fix.
- Suggested by Bob Weiner <weiner@altrasoft.com>
-
-1999-06-25 Charles G Waldman <cgw@fnal.gov>
-
- * cus-face.el (custom-face-italic): insert missing args
-
-1999-06-24 Michael Sperber [Mr. Preprocessor] <sperber@informatik.uni-tuebingen.de>
-
- * packages.el (package-locations): Changed default early package
- hierarchies to ~/.xemacs/mule-packages and
- ~/.xemacs/xemacs-packages.
-
-1999-06-23 SL Baur <steve@miho.m17n.org>
-
- * mule/mule-category.el (Top Level): ASCII is also latin-1.
-
-1999-06-15 Michael Sperber [Mr. Preprocessor] <sperber@informatik.uni-tuebingen.de>
-
- * packages.el (package-locations): Changed default early package
- hierarchy to ~/.xemacs/packages.
- (package-locations): Removed `packages' as a possible name for a
- late package hierarchy.
-
-1999-06-20 MORIOKA Tomohiko <tomo@etl.go.jp>
-
- * mule/mule-category.el (word-combining-categories): Set up new
- variable.
- (word-separating-categories): Likewise.
-
-1999-06-22 XEmacs Build Bot <builds@cvs.xemacs.org>
-
- * XEmacs 21.2.17 is released
-
-1999-06-17 Robert Pluim <rpluim@bigfoot.com>
-
- * font-menu.el (font-menu-set-font): allow for nil specification
- of font size.
-
-1999-06-16 MORIOKA Tomohiko <tomo@etl.go.jp>
-
- * mule/thai-xtis.el: Specify `columns' of the charset `thai-xtis'
- is 1.
-
-1999-06-12 MORIOKA Tomohiko <tomo@etl.go.jp>
-
- * mule/cyrillic.el (cyrillic-koi8-r-decode-table): Use NBSP of ISO
- 8859-5 instead of ISO 8859-1.
-
-1999-06-15 SL Baur <steve@steve1.m17n.org>
-
- * mule/vietnamese.el (viet-vscii-encode-table): Use split-char.
- (viet-viscii-encode-table): Ditto.
-
- * mule/mule-misc.el: Delete split-char & split-char-or-char-int.
- Make obsolete definition of char-octet.
-
-1999-06-14 SL Baur <steve@steve1.m17n.org>
-
- * subr.el: Move no-Mule make-char ...
- * help-nomule.el (make-char): To here.
- (string-width): Make Mule compatibility alias.
-
-1999-06-15 Andy Piper <andy@xemacs.org>
-
- * select.el (get-selection-no-error): really make there be no-error.
- (get-selection): revert to original.
-
-1999-06-11 Andy Piper <andy@xemacs.org>
-
- * select.el (selection-sets-clipboard): renamed.
- (own-selection): use it.
-
-1999-06-11 XEmacs Build Bot <builds@cvs.xemacs.org>
-
- * XEmacs 21.2.16 is released
-
-1999-06-09 MORIOKA Tomohiko <tomo@etl.go.jp>
-
- * mule/cyrillic.el (cyrillic-koi8-r-decode-table): Set 32 for
- missing characters to avoid crash.
-
-1999-06-09 Jan Vroonhof <vroonhof@math.ethz.ch>
-
- * coding.el (set-terminal-coding-system): Only set the console
- coding system on the selected console if it is a tty.
-
-1999-06-10 Jan Vroonhof <vroonhof@math.ethz.ch>
-
- * cus-face.el:
- * cus-edit.el:
- * faces.el:
- (custom):
- (face-spec-set):
- * faces.el (frob-face-property):
- * font-menu.el (font-menu-set-font):
- Actually apply changes from 1999-03-17
-
-1999-06-10 Andy Piper <andy@xemacs.org>
-
- * select.el (get-selection): abstract out non error-signalling
- part.
- (get-selection-no-error): get-selection without signalling an
- error.
- (selection-is-clipboard-p): new variable. controls whether the
- selection sets the clipboard.
- (own-selection): use it.
-
- * mouse.el (insert-selection): fallback to clipboard after trying
- primary selection and cutbuffer.
-
-1999-06-05 Andy Piper <andy@xemacs.org>
-
- * x-select.el (xselect-kill-buffer-hook-1): use generalised
- selection functions.
-
-1999-06-04 MORIOKA Tomohiko <tomo@etl.go.jp>
-
- * code-files.el (buffer-file-coding-system): Use `raw-text' as
- default value.
- (load): Use `raw-text' instead of `no-conversion'.
- (insert-file-contents): Likewise.
-
- * bytecomp.el (byte-compile-insert-header): Use `raw-text' instead
- of `no-conversion'.
-
-1999-06-03 MORIOKA Tomohiko <tomo@etl.go.jp>
-
- * coding.el: Don't copy `no-conversion' to `raw-text'.
-
-1999-06-07 Hrvoje Niksic <hniksic@srce.hr>
-
- * subr.el (make-char): Define it if Mule is not around.
-
-1999-06-07 SL Baur <steve@steve1.m17n.org>
-
- * mule/mule-help.el: Add trailing newline. Use mule keyword.
-
- * x-select.el (x-disown-selection-internal): Restore symbol as an
- obsolete alias.
- (xselect-kill-buffer-hook-1): Use disown-selection-internal.
-
-1999-06-04 XEmacs Build Bot <builds@cvs.xemacs.org>
-
- * XEmacs 21.2.15 is released
-
-1999-06-02 Oscar Figueiredo <oscar@xemacs.org>
-
- * subr.el (split-string): Avoid infinite looping
-
-1999-05-30 Oscar Figueiredo <Oscar.Figueiredo@di.epfl.ch>
-
- * ldap.el (ldap-ignore-attribute-codings): New variable
- (ldap-default-attribute-decoder): New variable
- (ldap-coding-system): New variable
- (ldap-attribute-syntax-encoders): New variable
- (ldap-attribute-syntax-decoders): New variable
- (ldap-attribute-syntaxes-alist): New variable
- (ldap-encode-boolean): New function
- (ldap-decode-boolean): New function
- (ldap-encode-country-string): New function
- (ldap-decode-string): New function
- (ldap-decode-address): New function
- (ldap-encode-address): New function
- (ldap-decode-attribute): New function
- (ldap-search): Use some of these
-
-1999-05-25 Jan Vroonhof <jan@xemacs.org>
-
- * version.el (emacs-version): Make the patch level/beta come
- before the XEmacs qualifier so that it gets into (funcall
- emacs-version) and thus in the bug reports.
- (emacs-version>=): Support patch levels.
-
-1999-06-03 SL Baur <steve@xemacs.org>
-
- * version.el: implement x.y.z version number
- From Jan Vroonhof <vroonhof@math.ethz.ch>
-
-1999-05-27 Yoshiki Hayashi <g740685@komaba.ecc.u-tokyo.ac.jp>
-
- * mule/mule-cmds.el (read-input-method-name): set input-method properly.
-
-1999-05-22 Vin Shelton <acs@xemacs.org>
-
- * startup.el: Document -private and break out non-standard X options.
-
-1999-05-26 SL Baur <steve@gneiss.etl.go.jp>
-
- * mule/mule-charset.el (charset-after): New function.
- (charset-direction): Synch with Mule, update docstring.
- (get-charset-property): New function.
- (put-charset-property): New function.
- (charset-plist): New function.
-
- * mule/mule-charset.el (compose-region):
- (decompose-region): remove; these functions (which don't work
- since we don't do composite characters) have been moved to
- mule-util.el.
- (toplevel): follow coding standards
-
-1999-05-26 SL Baur <steve@gneiss.etl.go.jp>
-
- * dumped-lisp.el (preloaded-file-list): mule-files.el does not
- exist any more.
-
- * code-files.el: Fix commentary to follow coding standards. Move
- the single line left in mule-files.el to here.
-
- * mule/mule-files.el: delete.
-
-1999-05-24 SL Baur <steve@gneiss.etl.go.jp>
-
- * info.el (Info-scroll-prev): Use event functions instead of the
- old emacs 19 interface.
-
-1999-06-02 Andy Piper <andy@xemacs.org>
-
- * x-font-menu.el (x-font-menu-load-font):
- font-menu-registry-encoding -> x-font-menu-registry-encoding type.
-
-1999-05-31 Andy Piper <andy@xemacs.org>
-
- * font-menu.el (font-menu-ignore-scaled-fonts): move to font-menu
- group.
- (font-menu-this-frame-only-p): ditto.
- (font-menu-max-items): reinstate, from Jan Vroonhof
- <vroonhof@math.ethz.ch>
- (font-menu-submenu-name-format): ditto.
- (font-menu-split-long-menu): ditto, for use by the family
- constructor.
- (font-menu-family-constructor): use it.
-
-1999-05-30 Andy Piper <andy@xemacs.org>
-
- * msw-faces.el (mswindows-font-regexp): new font matching regexp
- for use by the font menu.
-
- * msw-font-menu.el: new file implementing mswindows specific
- font-menu behaviour.
- (mswindows-font-menu-registry-encoding): new function mirroring x version.
- (mswindows-font-menu-junk-families): ditto.
- (hack-font-truename): ditto.
- (mswindows-font-regexp-ascii): ditto.
- (mswindows-reset-device-font-menus): ditto.
- (mswindows-font-menu-font-data): ditto.
- (mswindows-font-menu-load-font): ditto.
-
- * x-font-menu.el (x-reset-device-font-menus): made device specific.
- (x-font-menu-font-data): ditto.
- (x-font-menu-load-font): ditto.
-
- * font-menu.el: new file implementing generic font menu behaviour.
- (font-menu-ignore-scaled-fonts): copied from x-font-menu.el and
- made device independent.
- (font-menu-this-frame-only-p): ditto.
- (font-menu-preferred-resolution): ditto.
- (font-menu-size-scaling): new variable used to determine whether
- sizes are in points or tenths of a point.
- (vassoc): moved from x-font-menu.el.
- (device-fonts-cache): ditto.
- (device-fonts-cache): ditto.
- (flush-device-fonts-cache): ditto.
- (reset-device-font-menus): copied from x-font-menu.el and made
- device independent. Most functionality deferred to
- device-dependent versions.
- (font-menu-family-constructor): copied from x-font-menu.el and
- made device independent.
- (font-menu-size-constructor): ditto.
- (font-menu-weight-constructor): ditto.
- (font-menu-set-font): ditto.
- (font-menu-change-face): ditto.
- (font-menu-load-font): new device method.
- (font-menu-font-data): ditto.
-
- * x-font-menu.el: The above functions deleted.
-
-1999-05-26 Andy Piper <andy@xemacs.org>
-
- * update-elc.el:
- * make-docfile.el:
- * loadup.el: rehash expand-file-name usage to not use default-directory.
-
-1999-05-21 Andy Piper <andy@xemacs.org>
-
- * x-select.el (x-select-convert-to-text):
- (x-selected-text-type):
- (x-get-selection):
- (xselect-convert-to-string):
- (xselect-convert-to-compound-text):
- (xselect-convert-to-length):
- (xselect-convert-to-targets):
- (xselect-convert-to-delete):
- (xselect-convert-to-filename):
- (xselect-convert-to-charpos):
- (xselect-convert-to-lineno):
- (xselect-convert-to-colno):
- (xselect-convert-to-sourceloc):
- (xselect-convert-to-os):
- (xselect-convert-to-host):
- (xselect-convert-to-user):
- (xselect-convert-to-class):
- (xselect-convert-to-name):
- (xselect-convert-to-integer):
- (xselect-convert-to-atom):
- (xselect-convert-to-identity): functions renamed from x-* and
- moved to select.el.
- (x-get-secondary-selection): use rename get-selection.
- (x-get-clipboard): ditto.
- (x-own-selection): moved to select.el.
- (x-valid-simple-selection-p): ditto.
- (x-dehilight-selection): ditto.
- (x-own-clipboard): ditto.
- (x-disown-selection): ditto.
-
- * x-mouse.el (x-yank-function): moved to mouse.el.
- (x-insert-selection): ditto.
- (x-set-point-and-move-selection): use renamed function.
-
- * select.el (selected-text-type): moved and renamed from
- x-select.el.
- (selection-owner-p): moved to C.
- (selection-exists-p): ditto.
- (get-cutbuffer): new device method.
- (get-selection): generalised and moved from x-select.el.
- (own-selection): moved x-own-selection functionality into here.
- (dehilight-selection): renamed and moved from x-select.el.
- (own-clipboard): functionality moved from x-select.el using new
- generic C builtins.
- (disown-clipboard): ditto.
- (select-convert-to-text):
- (select-convert-to-string):
- (select-convert-to-compound-text):
- (select-convert-to-length):
- (select-convert-to-targets):
- (select-convert-to-delete):
- (select-convert-to-filename):
- (select-convert-to-charpos):
- (select-convert-to-lineno):
- (select-convert-to-colno):
- (select-convert-to-sourceloc):
- (select-convert-to-os):
- (select-convert-to-host):
- (select-convert-to-user):
- (select-convert-to-class):
- (select-convert-to-name):
- (select-convert-to-integer):
- (select-convert-to-atom):
- (select-convert-to-identity): new functions renamed from x-* and
- moved from x-select.el.
-
- * mouse.el (mouse-consolidated-yank): subsume x-yank-function
- into here and use as the default window-system mouse yank.
- (insert-selection): generalised and moved from x-mouse.el.
- (own-clipboard): moved to C.
-
- * msw-select.el (mswindows-selection-owned-p): deleted.
- (mswindows-own-selection): generalised and moved to select.el.
- (mswindows-disown-selection): generalised and moved to C.
- (mswindows-selection-owner-p): ditto.
-
1999-05-14 XEmacs Build Bot <builds@cvs.xemacs.org>
* XEmacs 21.2.14 is released
;;;***
\f
-;;;### (autoloads (mswindows-font-menu-weight-constructor font-menu-size-constructor font-menu-family-constructor reset-device-font-menus) "font-menu" "lisp/font-menu.el")
-
-(defcustom font-menu-ignore-scaled-fonts nil "*If non-nil, then the font menu will try to show only bitmap fonts." :type 'boolean :group 'x)
-
-(defcustom font-menu-this-frame-only-p nil "*If non-nil, then changing the default font from the font menu will only\naffect one frame instead of all frames." :type 'boolean :group 'x)
-
-(fset 'install-font-menus 'reset-device-font-menus)
-
-(autoload 'reset-device-font-menus "font-menu" "\
-Generates the `Font', `Size', and `Weight' submenus for the Options menu.
-This is run the first time that a font-menu is needed for each device.
-If you don't like the lazy invocation of this function, you can add it to
-`create-device-hook' and that will make the font menus respond more quickly
-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)
-
-(autoload 'font-menu-family-constructor "font-menu" nil nil nil)
-
-(autoload 'font-menu-size-constructor "font-menu" nil nil nil)
-
-(autoload 'mswindows-font-menu-weight-constructor "font-menu" nil nil nil)
-
-;;;***
-\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)
;;;***
\f
-;;;### (autoloads (mswindows-reset-device-font-menus) "msw-font-menu" "lisp/msw-font-menu.el")
-
-(autoload 'mswindows-reset-device-font-menus "msw-font-menu" "\
-Generates the `Font', `Size', and `Weight' submenus for the Options menu.
-This is run the first time that a font-menu is needed for each device.
-If you don't like the lazy invocation of this function, you can add it to
-`create-device-hook' and that will make the font menus respond more quickly
-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 (capitalize (match-string 1 name))) (setq entry (vassoc family (aref dcache 0)))) (when (and (null entry) (string-match mswindows-font-regexp truename)) (setq family (capitalize (match-string 1 truename))) (setq entry (vassoc family (aref dcache 0)))) (when (null entry) (return-from font-menu-font-data (make-vector 5 nil))) (when (string-match mswindows-font-regexp name) (setq weight (capitalize (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 (capitalize (match-string 2 truename)))) (when (not (member size (aref entry 2))) (setq size (string-to-int (match-string 4 truename)))) (setq slant (capitalize (match-string 5 truename)))) (vector entry family size weight slant)))
-
-;;;***
-\f
;;;### (autoloads (mwheel-install) "mwheel" "lisp/mwheel.el")
(autoload 'mwheel-install "mwheel" "\
;;;***
\f
-;;;### (autoloads (x-reset-device-font-menus) "x-font-menu" "lisp/x-font-menu.el")
+;;;### (autoloads (font-menu-weight-constructor font-menu-size-constructor font-menu-family-constructor reset-device-font-menus) "x-font-menu" "lisp/x-font-menu.el")
+
+(defcustom font-menu-ignore-scaled-fonts t "*If non-nil, then the font menu will try to show only bitmap fonts." :type 'boolean :group 'font-menu)
+
+(defcustom font-menu-this-frame-only-p nil "*If non-nil, then changing the default font from the font menu will only\naffect one frame instead of all frames." :type 'boolean :group 'font-menu)
-(autoload 'x-reset-device-font-menus "x-font-menu" "\
+(fset 'install-font-menus 'reset-device-font-menus)
+
+(autoload 'reset-device-font-menus "x-font-menu" "\
Generates the `Font', `Size', and `Weight' submenus for the Options menu.
This is run the first time that a font-menu is needed for each device.
If you don't like the lazy invocation of this function, you can add it to
when they are selected for the first time. If you add fonts to your system,
or if you change your font path, you can call this to re-initialize the menus." nil nil)
-(defun* x-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 x-font-regexp-foundry-and-family name) (setq family (capitalize (match-string 1 name))) (setq entry (vassoc family (aref dcache 0)))) (when (and (null entry) (string-match x-font-regexp-foundry-and-family truename)) (setq family (capitalize (match-string 1 truename))) (setq entry (vassoc family (aref dcache 0)))) (when (null entry) (return-from font-menu-font-data (make-vector 5 nil))) (when (string-match x-font-regexp name) (setq weight (capitalize (match-string 1 name))) (setq size (string-to-int (match-string 6 name)))) (when (string-match x-font-regexp truename) (when (not (member weight (aref entry 1))) (setq weight (capitalize (match-string 1 truename)))) (when (not (member size (aref entry 2))) (setq size (string-to-int (match-string 6 truename)))) (setq slant (capitalize (match-string 2 truename)))) (vector entry family size weight slant)))
+(autoload 'font-menu-family-constructor "x-font-menu" nil nil nil)
+
+(autoload 'font-menu-size-constructor "x-font-menu" nil nil nil)
+
+(autoload 'font-menu-weight-constructor "x-font-menu" nil nil nil)
;;;***
\f
;; file if under Mule. If there are any extended characters in the
;; input file, use `escape-quoted' to make sure that both binary and
;; extended characters are output properly and distinguished properly.
- ;; Otherwise, use `raw-text' for maximum portability with non-Mule
+ ;; Otherwise, use `no-conversion' for maximum portability with non-Mule
;; Emacsen.
(when (featurep 'mule)
(defvar buffer-file-coding-system)
(skip-chars-forward (concat (char-to-string 0) "-"
(char-to-string 255)))
(eq (point) (point-max)))
- (setq buffer-file-coding-system 'raw-text)
+ (setq buffer-file-coding-system 'no-conversion)
(insert "(require 'mule)\n;;;###coding system: escape-quoted\n")
(setq buffer-file-coding-system 'escape-quoted)
;; #### Lazy loading not yet implemented for MULE files
--- /dev/null
+;;; cleantree.el --- Remove out of date .elcs in lisp directories
+
+;; Copyright (C) 1997 by Free Software Foundation, Inc.
+
+;; Author: Steven L Baur <steve@altair.xemacs.org>
+;; Keywords: internal
+
+;; This file is part of XEmacs.
+
+;; XEmacs is free software; you can redistribute it and/or modify it
+;; under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; XEmacs is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;; General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with XEmacs; see the file COPYING. If not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+;; 02111-1307, USA.
+
+;;; Synched up with: Not in FSF
+
+;;; Commentary:
+
+;; This code is derived from Gnus based on a suggestion by
+;; David Moore <dmoore@ucsd.edu>
+
+;;; Code:
+
+(defun remove-old-elc-1 (dir &optional seen)
+ (setq dir (file-name-as-directory dir))
+ ;; Only scan this sub-tree if we haven't been here yet.
+ (unless (member (file-truename dir) seen)
+ (push (file-truename dir) seen)
+ ;; We descend recursively
+ (let ((dirs (directory-files dir t nil t))
+ dir)
+ (while (setq dir (pop dirs))
+ (when (and (not (member (file-name-nondirectory dir) '("." "..")))
+ (file-directory-p dir))
+ (remove-old-elc-1 dir seen))))
+ ;; Do this directory.
+ (let ((files (directory-files dir t ".el$"))
+ file file-c)
+ (while (setq file (car files))
+ (setq files (cdr files))
+ (setq file-c (concat file "c"))
+ (when (and (file-exists-p file-c)
+ (file-newer-than-file-p file file-c))
+ (message file-c)
+ (delete-file file-c))))))
+
+;;;###autoload
+(defun batch-remove-old-elc ()
+ (defvar command-line-args-left)
+ (unless noninteractive
+ (error "`batch-remove-old-elc' is to be used only with -batch"))
+ (let ((dir (car command-line-args-left)))
+ (message "Cleaning out of date .elcs in directory `%s'..." dir)
+ (remove-old-elc-1 dir)
+ (message "Cleaning out of date .elcs in directory `%s'...done" dir))
+ (setq command-line-args-left nil))
+
+;;; cleantree.el ends here
(when-feature mule "mule-coding")
;; Handle I/O of files with extended characters.
(when-feature file-coding "code-files")
+ (when-feature mule "mule-files")
;; Handle process with encoding/decoding non-ascii coding-system.
(when-feature file-coding "code-process")
(when-feature mule "mule-help")
--- /dev/null
+;;; finder-inf.el --- keyword-to-package mapping
+;; Keywords: help
+;;; Commentary:
+;; Don't edit this file. It's generated by finder.el
+
+;;; Code:
+
+(defconst finder-package-info '(
+ ("eos.el"
+ "Intereactively loads the XEmacs/SPARCworks interface"
+ (sparcworks eos era on sparcworks load)
+ "/home/martin/x/packages/lisp/Sun/")
+ ("sccs.el"
+ "easy-to-use SCCS control from within Emacs"
+ nil
+ "/home/martin/x/packages/lisp/Sun/")
+ ("sun-eos-browser.el"
+ "Implements the XEmacs/SPARCworks SourceBrowser interface"
+ (sparcworks eos era on sparcworks sbrowser source browser)
+ "/home/martin/x/packages/lisp/Sun/")
+ ("sun-eos-debugger-extra.el"
+ "Implements the XEmacs/SPARCworks Debugger interface"
+ (sparcworks eos era on sparcworks debugger dbx)
+ "/home/martin/x/packages/lisp/Sun/")
+ ("sun-eos-debugger.el"
+ "Implements the XEmacs/SPARCworks interface"
+ (sparcworks eos era on sparcworks debugger dbx)
+ "/home/martin/x/packages/lisp/Sun/")
+ ("sun-eos-editor.el"
+ "Implements the XEmacs/SPARCworks editor protocol"
+ (sparcworks eos era on sparcworks editor)
+ "/home/martin/x/packages/lisp/Sun/")
+ ("sun-eos-init.el"
+ "Initializes the XEmacs/SPARCworks interface"
+ (sparcworks eos era on sparcworks initialize)
+ "/home/martin/x/packages/lisp/Sun/")
+ ("sun-eos-load.el"
+ "Loads the XEmacs/SPARCworks interface code"
+ (sparcworks eos era on sparcworks debugger dbx)
+ "/home/martin/x/packages/lisp/Sun/")
+ ("sun-eos-menubar.el"
+ "Implements the XEmacs/SPARCworks menubar"
+ (sparcworks eos era on sparcworks menubar)
+ "/home/martin/x/packages/lisp/Sun/")
+ ("sun-eos-toolbar.el"
+ "Implements the EOS toolbar interface"
+ (sparcworks eos era on sparcworks toolbar)
+ "/home/martin/x/packages/lisp/Sun/")
+ ("sun-eos.el"
+ "Intereactively loads the XEmacs/SPARCworks interface"
+ (sparcworks eos era on sparcworks load)
+ "/home/martin/x/packages/lisp/Sun/")
+ ("sunpro-keys.el"
+ "SunPro-specific key bindings"
+ nil
+ "/home/martin/x/packages/lisp/Sun/")
+ ("sunpro-menubar.el"
+ "Initialize the SunPro menubar"
+ (sunpro menubar initialization)
+ "/home/martin/x/packages/lisp/Sun/")
+ ("sunpro-sparcworks.el"
+ "support SPARCworks manager ToolTalk messages"
+ (sparcworks tooltalk messages)
+ "/home/martin/x/packages/lisp/Sun/")
+ ("ada-mode.el"
+ "An Emacs major-mode for editing Ada source."
+ (languages oop ada)
+ "/home/martin/x/packages/lisp/ada/")
+ ("custom-load.el"
+ "automatically extracted custom dependencies"
+ nil
+ "/home/martin/x/packages/lisp/ada/")
+ ("atype.el"
+ "atype functions"
+ (atype)
+ "/home/martin/x/packages/lisp/apel/")
+ ("emu-20.el"
+ "emu API implementation for Emacs 20 and XEmacs/mule"
+ (emulation compatibility mule)
+ "/home/martin/x/packages/lisp/apel/")
+ ("emu-e19.el"
+ "emu module for Emacs 19 and XEmacs 19"
+ (emulation compatibility mule latin-1)
+ "/home/martin/x/packages/lisp/apel/")
+ ("emu-x20.el"
+ "emu API implementation for XEmacs with mule"
+ (emulation compatibility mule xemacs)
+ "/home/martin/x/packages/lisp/apel/")
+ ("emu-xemacs.el"
+ "emu API implementation for XEmacs"
+ (emulation compatibility xemacs)
+ "/home/martin/x/packages/lisp/apel/")
+ ("emu.el"
+ "Emulation module for each Emacs variants"
+ (emulation compatibility nemacs mule emacs/mule xemacs)
+ "/home/martin/x/packages/lisp/apel/")
+ ("file-detect.el"
+ "Path management or file detection utility"
+ (file detection install module)
+ "/home/martin/x/packages/lisp/apel/")
+ ("filename.el"
+ "file name filter"
+ (file name string)
+ "/home/martin/x/packages/lisp/apel/")
+ ("install.el"
+ "Emacs Lisp package install utility"
+ (install byte-compile directory detection)
+ "/home/martin/x/packages/lisp/apel/")
+ ("mule-caesar.el"
+ "ROT 13-47 Caesar rotation utility"
+ (rot 13-47 caesar mail news text/x-rot13-47)
+ "/home/martin/x/packages/lisp/apel/")
+ ("path-util.el"
+ "Emacs Lisp file detection utility"
+ (file detection install module)
+ "/home/martin/x/packages/lisp/apel/")
+ ("richtext.el"
+ "read and save files in text/richtext format"
+ (wp faces mime multimedia)
+ "/home/martin/x/packages/lisp/apel/")
+ ("std11-parse.el"
+ "STD 11 parser for GNU Emacs"
+ (mail news rfc 822 std 11)
+ "/home/martin/x/packages/lisp/apel/")
+ ("std11.el"
+ "STD 11 functions for GNU Emacs"
+ (mail news rfc 822 std 11)
+ "/home/martin/x/packages/lisp/apel/")
+ ("font-latex.el"
+ "LaTeX fontification for Font Lock mode."
+ (latex faces)
+ "/home/martin/x/packages/lisp/auctex/")
+ ("latex.el"
+ "Support for LaTeX documents."
+ (wp)
+ "/home/martin/x/packages/lisp/auctex/")
+ ("multi-prompt.el"
+ "completing read of multiple strings."
+ (extensions)
+ "/home/martin/x/packages/lisp/auctex/")
+ ("tex.el"
+ "Support for TeX documents."
+ (wp)
+ "/home/martin/x/packages/lisp/auctex/")
+ ("bbdb-print.el"
+ "for printing BBDB databases using TeX."
+ nil
+ "/home/martin/x/packages/lisp/bbdb/")
+ ("bbdb-reportmail.el"
+ "Hooks the Insidious Big Brother Database"
+ nil
+ "/home/martin/x/packages/lisp/bbdb/")
+ ("bbdb-snarf.el"
+ "convert free-form text to BBDB records"
+ nil
+ "/home/martin/x/packages/lisp/bbdb/")
+ ("bbdb-whois.el"
+ "Big Brother gets a little help from Big Brother"
+ nil
+ "/home/martin/x/packages/lisp/bbdb/")
+ ("c-comment-edit.el"
+ "edit C comments"
+ (languages)
+ "/home/martin/x/packages/lisp/c-support/")
+ ("c-comment.el"
+ "edit C comments"
+ (languages)
+ "/home/martin/x/packages/lisp/c-support/")
+ ("c-style.el"
+ "sets c-style control variables."
+ nil
+ "/home/martin/x/packages/lisp/c-support/")
+ ("cmacexp.el"
+ "expand C macros in a region"
+ (c)
+ "/home/martin/x/packages/lisp/c-support/")
+ ("ctypes.el"
+ "Enhanced Font lock support for custom defined types."
+ nil
+ "/home/martin/x/packages/lisp/c-support/")
+ ("hideif.el"
+ "hides selected code within ifdef."
+ (c outlines)
+ "/home/martin/x/packages/lisp/c-support/")
+ ("hideshow.el"
+ "minor mode cmds to selectively display blocks of code"
+ (c c++ lisp tools editing)
+ "/home/martin/x/packages/lisp/c-support/")
+ ("appt.el"
+ "appointment notification functions."
+ (calendar)
+ "/home/martin/x/packages/lisp/calendar/")
+ ("cal-china.el"
+ "calendar functions for the Chinese calendar."
+ (calendar)
+ "/home/martin/x/packages/lisp/calendar/")
+ ("cal-coptic.el"
+ "calendar functions for the Coptic/Ethiopic calendars."
+ (calendar)
+ "/home/martin/x/packages/lisp/calendar/")
+ ("cal-dst.el"
+ "calendar functions for daylight savings rules."
+ (calendar)
+ "/home/martin/x/packages/lisp/calendar/")
+ ("cal-french.el"
+ "calendar functions for the French Revolutionary calendar."
+ (calendar)
+ "/home/martin/x/packages/lisp/calendar/")
+ ("cal-hebrew.el"
+ "calendar functions for the Hebrew calendar."
+ (calendar)
+ "/home/martin/x/packages/lisp/calendar/")
+ ("cal-islam.el"
+ "calendar functions for the Islamic calendar."
+ (calendar)
+ "/home/martin/x/packages/lisp/calendar/")
+ ("cal-iso.el"
+ "calendar functions for the ISO calendar."
+ (calendar)
+ "/home/martin/x/packages/lisp/calendar/")
+ ("cal-julian.el"
+ "calendar functions for the Julian calendar."
+ (calendar)
+ "/home/martin/x/packages/lisp/calendar/")
+ ("cal-mayan.el"
+ "calendar functions for the Mayan calendars."
+ (calendar)
+ "/home/martin/x/packages/lisp/calendar/")
+ ("cal-move.el"
+ "calendar functions for movement in the calendar"
+ (calendar)
+ "/home/martin/x/packages/lisp/calendar/")
+ ("cal-persia.el"
+ "calendar functions for the Persian calendar."
+ (calendar)
+ "/home/martin/x/packages/lisp/calendar/")
+ ("cal-tex.el"
+ "calendar functions for printing calendars with LaTeX."
+ (calendar)
+ "/home/martin/x/packages/lisp/calendar/")
+ ("cal-x.el"
+ "calendar windows in dedicated frames in x-windows"
+ (calendar)
+ "/home/martin/x/packages/lisp/calendar/")
+ ("cal-xemacs.el"
+ "calendar functions for menu bar and popup menu support"
+ (calendar)
+ "/home/martin/x/packages/lisp/calendar/")
+ ("calendar.el"
+ "Calendar functions. -*-byte-compile-dynamic: t;-*-"
+ (calendar)
+ "/home/martin/x/packages/lisp/calendar/")
+ ("diary-lib.el"
+ "diary functions."
+ (calendar)
+ "/home/martin/x/packages/lisp/calendar/")
+ ("holidays.el"
+ "holiday functions for the calendar package"
+ (holidays calendar)
+ "/home/martin/x/packages/lisp/calendar/")
+ ("lunar.el"
+ "calendar functions for phases of the moon."
+ (calendar)
+ "/home/martin/x/packages/lisp/calendar/")
+ ("solar.el"
+ "calendar functions for solar events."
+ (calendar)
+ "/home/martin/x/packages/lisp/calendar/")
+ ("cc-align.el"
+ "custom indentation functions for CC Mode"
+ (c languages oop)
+ "/home/martin/x/packages/lisp/cc-mode/")
+ ("cc-cmds.el"
+ "user level commands for CC Mode "
+ (c languages oop)
+ "/home/martin/x/packages/lisp/cc-mode/")
+ ("cc-compat.el"
+ "cc-mode compatibility with c-mode.el confusion"
+ (c languages oop)
+ "/home/martin/x/packages/lisp/cc-mode/")
+ ("cc-defs.el"
+ "compile time definitions for CC Mode"
+ (c languages oop)
+ "/home/martin/x/packages/lisp/cc-mode/")
+ ("cc-engine.el"
+ "core syntax guessing engine for CC mode"
+ (c languages oop)
+ "/home/martin/x/packages/lisp/cc-mode/")
+ ("cc-langs.el"
+ "specific language support for CC Mode"
+ (c languages oop)
+ "/home/martin/x/packages/lisp/cc-mode/")
+ ("cc-menus.el"
+ "imenu support for CC Mode"
+ (c languages oop)
+ "/home/martin/x/packages/lisp/cc-mode/")
+ ("cc-mode.el"
+ "major mode for editing C, C++, Objective-C, and Java code"
+ (c languages oop)
+ "/home/martin/x/packages/lisp/cc-mode/")
+ ("cc-styles.el"
+ "support for styles in CC Mode"
+ (c languages oop)
+ "/home/martin/x/packages/lisp/cc-mode/")
+ ("cc-vars.el"
+ "user customization variables for CC Mode"
+ (c languages oop)
+ "/home/martin/x/packages/lisp/cc-mode/")
+ ("cookie1.el"
+ "retrieve random phrases from fortune cookie files"
+ (games)
+ "/home/martin/x/packages/lisp/cookie/")
+ ("spook.el"
+ "spook phrase utility for overloading the NSA line eater"
+ (games)
+ "/home/martin/x/packages/lisp/cookie/")
+ ("yow.el"
+ "quote random zippyisms"
+ (games)
+ "/home/martin/x/packages/lisp/cookie/")
+ ("crisp.el"
+ "CRiSP/Brief Emacs emulator"
+ (emulations brief crisp)
+ "/home/martin/x/packages/lisp/crisp/")
+ ("scroll-lock.el"
+ "scroll-locking minor mode"
+ (scroll crisp brief lock)
+ "/home/martin/x/packages/lisp/crisp/")
+ ("dbx.el"
+ "run dbx under Emacs"
+ (c unix tools debugging)
+ "/home/martin/x/packages/lisp/debug/")
+ ("gdb-highlight.el"
+ "make gdb buffers be mouse-sensitive."
+ (extensions c unix tools debugging)
+ "/home/martin/x/packages/lisp/debug/")
+ ("gdb.el"
+ "run gdb under Emacs"
+ (c unix tools debugging)
+ "/home/martin/x/packages/lisp/debug/")
+ ("gdbsrc.el"
+ "Source-based (as opposed to comint-based) debugger"
+ (c unix tools debugging)
+ "/home/martin/x/packages/lisp/debug/")
+ ("gud.el"
+ "Grand Unified Debugger mode for gdb, sdb, dbx, or xdb"
+ (c unix tools debugging)
+ "/home/martin/x/packages/lisp/debug/")
+ ("history.el"
+ "Generic history stuff"
+ nil
+ "/home/martin/x/packages/lisp/debug/")
+ ("advise-eval-region.el"
+ "Wrap advice around eval-region"
+ (extensions lisp)
+ "/home/martin/x/packages/lisp/edebug/")
+ ("cust-print.el"
+ "handles print-level and print-circle."
+ (extensions)
+ "/home/martin/x/packages/lisp/edebug/")
+ ("edebug-cl-read.el"
+ "Edebug reader macros for use with cl-read."
+ (lisp tools maint)
+ "/home/martin/x/packages/lisp/edebug/")
+ ("edebug.el"
+ "a source-level debugger for Emacs Lisp"
+ (lisp tools maint)
+ "/home/martin/x/packages/lisp/edebug/")
+ ("eval-reg.el"
+ "Redefine eval-region, and subrs that use it, in Lisp"
+ (lisp)
+ "/home/martin/x/packages/lisp/edebug/")
+ ("ediff-diff.el"
+ "diff-related utilities"
+ nil
+ "/home/martin/x/packages/lisp/ediff/")
+ ("ediff-help.el"
+ "Code related to the contents of Ediff help buffers"
+ nil
+ "/home/martin/x/packages/lisp/ediff/")
+ ("ediff-hook.el"
+ "setup for Ediff's menus and autoloads"
+ nil
+ "/home/martin/x/packages/lisp/ediff/")
+ ("ediff-init.el"
+ "Macros, variables, and defsubsts used by Ediff"
+ nil
+ "/home/martin/x/packages/lisp/ediff/")
+ ("ediff-merg.el"
+ "merging utilities"
+ nil
+ "/home/martin/x/packages/lisp/ediff/")
+ ("ediff-mult.el"
+ "support for multi-file/multi-buffer processing in Ediff"
+ nil
+ "/home/martin/x/packages/lisp/ediff/")
+ ("ediff-ptch.el"
+ "Ediff's patch support"
+ nil
+ "/home/martin/x/packages/lisp/ediff/")
+ ("ediff-tbar.el"
+ "A toolbar for Ediff control buffer"
+ nil
+ "/home/martin/x/packages/lisp/ediff/")
+ ("ediff-util.el"
+ "the core commands and utilities of ediff"
+ nil
+ "/home/martin/x/packages/lisp/ediff/")
+ ("ediff-vers.el"
+ "version control interface to Ediff"
+ nil
+ "/home/martin/x/packages/lisp/ediff/")
+ ("ediff-wind.el"
+ "window manipulation utilities"
+ nil
+ "/home/martin/x/packages/lisp/ediff/")
+ ("ediff.el"
+ "a comprehensive visual interface to diff & patch"
+ (comparing merging patching version control.)
+ "/home/martin/x/packages/lisp/ediff/")
+ ("abbrevlist.el"
+ "list one abbrev table alphabetically ordered."
+ (abbrev)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("after-save-commands.el"
+ "Run a shell command after saving a file"
+ (processes unix)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("array.el"
+ "array editing commands for XEmacs"
+ (extensions)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("atomic-extents.el"
+ "treat regions of text as a single object"
+ (extensions)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("avoid.el"
+ "make mouse pointer stay out of the way of editing"
+ (mouse)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("backup-dir.el"
+ "allow backup files to live in some other directory(s)."
+ (backup file)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("big-menubar.el"
+ "an alternate menubar"
+ (mouse menubar)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("blink-cursor.el"
+ "Blink the cursor on or off"
+ (display)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("blink-paren.el"
+ "blink the matching paren, just like Zmacs"
+ (faces)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("bookmark.el"
+ "set bookmarks, maybe annotate them, jump to them later."
+ (bookmarks placeholders annotations)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("compare-w.el"
+ "compare text between windows for Emacs."
+ nil
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("completion.el"
+ "dynamic word-completion code"
+ (abbrev)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("dabbrev.el"
+ "dynamic abbreviation package"
+ (abbrev expand completion)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("desktop.el"
+ "save partial status of Emacs when killed"
+ (customization)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("detached-minibuf.el"
+ "Support a detached minibuffer for XEmacs."
+ (extensions)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("edit-faces.el"
+ "interactive face editing mode"
+ (faces)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("edit-toolbar.el"
+ "Interactive toolbar editing mode for XEmacs"
+ (tools)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("fast-lock.el"
+ "Automagic text properties caching for fast Font Lock mode."
+ (faces files)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("file-part.el"
+ "treat a section of a buffer as a separate file"
+ (extensions tools)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("floating-toolbar.el"
+ "popup toolbar support for XEmacs."
+ (lisp)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("flow-ctrl.el"
+ "help for lusers on cu(1) or ttys with wired-in ^S/^Q flow control"
+ (hardware)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("foldout.el"
+ "Folding extensions for outline-mode and outline-minor-mode."
+ (folding outline)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("func-menu.el"
+ "Jump to a function within a buffer."
+ (tools c lisp)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("hippie-exp.el"
+ "expand text trying various ways to find its expansion."
+ (abbrev)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("id-select.el"
+ "Select larger and larger syntax-driven regions in a buffer"
+ (matching mouse)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("info-look.el"
+ "major-mode-sensitive Info index lookup facility."
+ (help languages)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("iswitchb.el"
+ "switch between buffers using substrings"
+ (extensions)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("lazy-lock.el"
+ "Lazy demand-driven fontification for fast Font Lock mode."
+ (faces files)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("lazy-shot.el"
+ "Lazy font locking for XEmacs"
+ (languages faces)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("lispm-fonts.el"
+ "quick hack to parse LISPM-style font-shift codes"
+ (faces)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("live-icon.el"
+ "make frame icons represent the current frame contents"
+ nil
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("makesum.el"
+ "generate key binding summary for Emacs"
+ (help)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("man.el"
+ "browse UNIX manual pages"
+ (help)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("mic-paren.el"
+ "highlight matching parenthesises."
+ (languages faces)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("outl-mouse.el"
+ "outline mode mouse commands for Emacs"
+ (outlines mouse)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("page-ext.el"
+ "extended page handling commands"
+ nil
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("paren.el"
+ "highlight (un)matching parens and whole expressions"
+ (languages faces)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("permanent-buffers.el"
+ "Permanent buffers management package."
+ (extensions)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("popper.el"
+ "shrink-wrapped temporary windows for Emacs"
+ (temporary window popup window)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("recent-files.el"
+ "Maintain menu of recently opened files."
+ (menu file)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("redo.el"
+ "Redo/undo system for XEmacs"
+ (lisp extensions)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("resume.el"
+ "process command line args from within a suspended Emacs job"
+ (processes)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("rsz-minibuf.el"
+ "dynamically resize minibuffer to display entire contents"
+ (minibuffer window frames display)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("savehist.el"
+ "Save minibuffer history"
+ (minibuffer)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("saveplace.el"
+ "automatically save place in files."
+ (bookmarks placeholders)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("tempo.el"
+ "Flexible template insertion"
+ (extensions languages tools)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("toolbar-utils.el"
+ "Toolbar utility functions for XEmacs"
+ (extensions)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("uniquify.el"
+ "unique buffer names dependent on file name"
+ nil
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("where-was-i-db.el"
+ "Keep persistent state in visited files."
+ (tools data wp)
+ "/home/martin/x/packages/lisp/edit-utils/")
+ ("edt-lk201.el"
+ "Enhanced EDT Keypad Mode Emulation for LK-201 Keyboards"
+ (emulations)
+ "/home/martin/x/packages/lisp/edt/")
+ ("edt-mapper.el"
+ "Create an EDT LK-201 Map File for X-Windows Emacs"
+ (emulations)
+ "/home/martin/x/packages/lisp/edt/")
+ ("edt-pc.el"
+ "Enhanced EDT Keypad Mode Emulation for PC 101 Keyboards"
+ (emulations)
+ "/home/martin/x/packages/lisp/edt/")
+ ("edt-vt100.el"
+ "Enhanced EDT Keypad Mode Emulation for VT Series Terminals"
+ (emulations)
+ "/home/martin/x/packages/lisp/edt/")
+ ("edt.el"
+ "Enhanced EDT Keypad Mode Emulation for GNU Emacs 19"
+ (emulations)
+ "/home/martin/x/packages/lisp/edt/")
+ ("dll-debug.el"
+ "A slow implementation of dll for debugging."
+ (extensions lisp)
+ "/home/martin/x/packages/lisp/elib/")
+ ("emerge.el"
+ "merge diffs under Emacs control"
+ (unix tools)
+ "/home/martin/x/packages/lisp/emerge/")
+ ("term.el"
+ "general command interpreter in a window stuff"
+ nil
+ "/home/martin/x/packages/lisp/eterm/")
+ ("tshell.el"
+ "specialized term.el for running the shell."
+ (processes)
+ "/home/martin/x/packages/lisp/eterm/")
+ ("eudc-bbdb.el"
+ "Emacs Unified Directory Client - BBDB Backend"
+ (help)
+ "/home/martin/x/packages/lisp/eudc/")
+ ("eudc-custom-vars.el"
+ "Emacs Unified Directory Client"
+ (help)
+ "/home/martin/x/packages/lisp/eudc/")
+ ("eudc-ldap.el"
+ "Emacs Unified Directory Client - LDAP Backend"
+ (help)
+ "/home/martin/x/packages/lisp/eudc/")
+ ("eudc-ph.el"
+ "Emacs Unified Directory Client - CCSO PH/QI Backend"
+ (help)
+ "/home/martin/x/packages/lisp/eudc/")
+ ("eudc.el"
+ "Emacs Unified Directory Client"
+ (help)
+ "/home/martin/x/packages/lisp/eudc/")
+ ("footnote-cyrillic.el"
+ "Cyrillic lettering for footnote mode"
+ (mule news mail)
+ "/home/martin/x/packages/lisp/footnote/")
+ ("footnote-greek.el"
+ "Greek lettering for footnote mode"
+ (mule news mail)
+ "/home/martin/x/packages/lisp/footnote/")
+ ("footnote-han.el"
+ "Han Japanese footnote support"
+ (mail news mule)
+ "/home/martin/x/packages/lisp/footnote/")
+ ("footnote-hebrew.el"
+ "Hebrew lettering for footnote mode"
+ (mule news mail)
+ "/home/martin/x/packages/lisp/footnote/")
+ ("footnote-kana.el"
+ "more Japanese footnote support"
+ (mail news mule)
+ "/home/martin/x/packages/lisp/footnote/")
+ ("footnote.el"
+ "Footnote support for message mode"
+ (mail news)
+ "/home/martin/x/packages/lisp/footnote/")
+ ("forms-d2.el"
+ "demo forms-mode"
+ nil
+ "/home/martin/x/packages/lisp/forms/")
+ ("forms-pass.el"
+ "passwd file demo for forms-mode"
+ nil
+ "/home/martin/x/packages/lisp/forms/")
+ ("forms.el"
+ "Forms mode: edit a file as a form to fill in"
+ (extensions)
+ "/home/martin/x/packages/lisp/forms/")
+ ("frame-icon.el"
+ "set up mode-specific icons for each frame under XEmacs"
+ (frames lisp extensions)
+ "/home/martin/x/packages/lisp/frame-icon/")
+ ("overlay.el"
+ "overlay support."
+ (internal)
+ "/home/martin/x/packages/lisp/fsf-compat/")
+ ("thingatpt.el"
+ "Get the `thing' at point"
+ (extensions matching mouse)
+ "/home/martin/x/packages/lisp/fsf-compat/")
+ ("timer.el"
+ "run a function with args at some time in future."
+ nil
+ "/home/martin/x/packages/lisp/fsf-compat/")
+ ("x-popup-menu.el"
+ "Mimic x-popup-menu in FSF Emacs"
+ (frames)
+ "/home/martin/x/packages/lisp/fsf-compat/")
+ ("gamegrid.el"
+ "Library for implementing grid-based games on Emacs."
+ (games)
+ "/home/martin/x/packages/lisp/games/")
+ ("snake.el"
+ "Implementation of Snake for Emacs."
+ (games)
+ "/home/martin/x/packages/lisp/games/")
+ ("sokoban.el"
+ "Implementation of Sokoban for Emacs."
+ (games)
+ "/home/martin/x/packages/lisp/games/")
+ ("tetris.el"
+ "Implementation of Tetris for Emacs."
+ (games)
+ "/home/martin/x/packages/lisp/games/")
+ ("dgnushack.el"
+ "a hack to set the load path for byte-compiling"
+ (news path)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("earcon.el"
+ "Sound effects for messages"
+ nil
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-agent.el"
+ "unplugged support for Gnus"
+ nil
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-art.el"
+ "article mode commands for Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-async.el"
+ "asynchronous support for Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-audio.el"
+ "Sound effects for Gnus"
+ nil
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-bcklg.el"
+ "backlog functions for Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-cache.el"
+ "cache interface for Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-cite.el"
+ "parse citations in articles for Gnus"
+ nil
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-cus.el"
+ "customization commands for Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-demon.el"
+ "daemonic Gnus behaviour"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-draft.el"
+ "draft message support for Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-dup.el"
+ "suppression of duplicate articles in Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-eform.el"
+ "a mode for editing forms for Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-ems.el"
+ "functions for making Gnus work under different Emacsen"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-gl.el"
+ "an interface to GroupLens for Gnus"
+ (news score)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-group.el"
+ "group mode commands for Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-int.el"
+ "backend interface functions for Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-kill.el"
+ "kill commands for Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-load.el"
+ "automatically extracted custom dependencies"
+ nil
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-logic.el"
+ "advanced scoring code for Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-mh.el"
+ "mh-e interface for Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-move.el"
+ "commands for moving Gnus from one server to another"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-msg.el"
+ "mail and post interface for Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-nocem.el"
+ "NoCeM pseudo-cancellation treatment"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-picon.el"
+ "displaying pretty icons in Gnus"
+ (news xpm annotation glyph faces)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-range.el"
+ "range and sequence functions for Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-salt.el"
+ "alternate summary mode interfaces for Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-score.el"
+ "scoring code for Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-setup.el"
+ "Initialization & Setup for Gnus 5"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-soup.el"
+ "SOUP packet writing support for Gnus"
+ (news mail)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-spec.el"
+ "format spec functions for Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-srvr.el"
+ "virtual server support for Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-start.el"
+ "startup functions for Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-sum.el"
+ "summary mode commands for Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-topic.el"
+ "a folding minor mode for Gnus group buffers"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-undo.el"
+ "minor mode for undoing in Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-util.el"
+ "utility functions for Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-uu.el"
+ "extract (uu)encoded files in Gnus"
+ nil
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-vm.el"
+ "vm interface for Gnus"
+ (news mail)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-win.el"
+ "window configuration functions for Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus-xmas.el"
+ "Gnus functions for XEmacs"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("gnus.el"
+ "a newsreader for GNU Emacs"
+ (news mail)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("mailheader.el"
+ "Mail header parsing, merging, formatting"
+ (tools mail news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("md5.el"
+ "MD5 Message Digest Algorithm"
+ nil
+ "/home/martin/x/packages/lisp/gnus/")
+ ("message.el"
+ "composing mail and news messages"
+ (mail news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("messagexmas.el"
+ "XEmacs extensions to message"
+ (mail news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("messcompat.el"
+ "making message mode compatible with mail mode"
+ (mail news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("nnagent.el"
+ "offline backend for Gnus"
+ (news mail)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("nnbabyl.el"
+ "rmail mbox access for Gnus"
+ (news mail)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("nndb.el"
+ "nndb access for Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("nndir.el"
+ "single directory newsgroup access for Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("nndoc.el"
+ "single file access for Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("nndraft.el"
+ "draft article access for Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("nneething.el"
+ "arbitrary file access for Gnus"
+ (news mail)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("nnfolder.el"
+ "mail folder access for Gnus"
+ (mail)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("nngateway.el"
+ "posting news via mail gateways"
+ (news mail)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("nnheader.el"
+ "header access macros for Gnus and its backends"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("nnheaderxm.el"
+ "making Gnus backends work under XEmacs"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("nnkiboze.el"
+ "select virtual news access for Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("nnlistserv.el"
+ "retrieving articles via web mailing list archives"
+ (news mail)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("nnmail.el"
+ "mail support functions for the Gnus mail backends"
+ (news mail)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("nnmbox.el"
+ "mail mbox access for Gnus"
+ (news mail)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("nnmh.el"
+ "mhspool access for Gnus"
+ (news mail)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("nnml.el"
+ "mail spool access for Gnus"
+ (news mail)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("nnoo.el"
+ "OO Gnus Backends"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("nnsoup.el"
+ "SOUP access for Gnus"
+ (news mail)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("nnspool.el"
+ "spool access for GNU Emacs"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("nntp.el"
+ "nntp access for Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("nnvirtual.el"
+ "virtual newsgroups access for Gnus"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("nnweb.el"
+ "retrieving articles via web search engines"
+ (news)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("parse-time.el"
+ "Parsing time strings"
+ (util)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("pop3.el"
+ "Post Office Protocol (RFC 1460) interface"
+ (mail pop3)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("score-mode.el"
+ "mode for editing Gnus score files"
+ (news mail)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("smiley.el"
+ "displaying smiley faces"
+ (fun)
+ "/home/martin/x/packages/lisp/gnus/")
+ ("hm--html-menu.el"
+ "A menu for the hm--html-mode."
+ nil
+ "/home/martin/x/packages/lisp/hm--html-menus/")
+ ("hm--html-mode.el"
+ "Major mode for editing HTML documents for the WWW"
+ (hypermedia languages help docs wp)
+ "/home/martin/x/packages/lisp/hm--html-menus/")
+ ("html-view.el"
+ "routines for communicating with a NCSA Mosaic process"
+ (comm unix wp help)
+ "/home/martin/x/packages/lisp/hm--html-menus/")
+ ("internal-drag-and-drop.el"
+ "Internal drag and drop interface"
+ (mouse)
+ "/home/martin/x/packages/lisp/hm--html-menus/")
+ ("tmpl-minor-mode.el"
+ "Template Minor Mode"
+ (data tools)
+ "/home/martin/x/packages/lisp/hm--html-menus/")
+ ("igrep.el"
+ "An improved interface to `grep` and `find`."
+ nil
+ "/home/martin/x/packages/lisp/igrep/")
+ ("jde-db.el"
+ "Debugger mode for jdb."
+ (java tools)
+ "/home/martin/x/packages/lisp/jde/")
+ ("jde-gen.el"
+ "Integrated Development Environment for Java."
+ (java tools)
+ "/home/martin/x/packages/lisp/jde/")
+ ("jde-make.el"
+ "Integrated Development Environment for Java."
+ (java tools)
+ "/home/martin/x/packages/lisp/jde/")
+ ("jde-run.el"
+ "runs the Java app in the current buffer."
+ (tools processes)
+ "/home/martin/x/packages/lisp/jde/")
+ ("jde.el"
+ "Integrated Development Environment for Java."
+ (java tools)
+ "/home/martin/x/packages/lisp/jde/")
+ ("browse-url.el"
+ "ask a WWW browser to load a URL"
+ (hypertext)
+ "/home/martin/x/packages/lisp/mail-lib/")
+ ("highlight-headers.el"
+ "highlighting message headers."
+ (mail news)
+ "/home/martin/x/packages/lisp/mail-lib/")
+ ("mail-abbrevs.el"
+ "Abbrev-expansion of mail aliases."
+ nil
+ "/home/martin/x/packages/lisp/mail-lib/")
+ ("mail-extr.el"
+ "extract full name and address from RFC 822 mail header."
+ (mail)
+ "/home/martin/x/packages/lisp/mail-lib/")
+ ("mail-utils.el"
+ "utility functions used both by rmail and rnews"
+ (mail news)
+ "/home/martin/x/packages/lisp/mail-lib/")
+ ("reporter.el"
+ "customizable bug reporting of lisp programs"
+ (maint mail tools)
+ "/home/martin/x/packages/lisp/mail-lib/")
+ ("rfc822.el"
+ "hairy rfc822 parser for mail and news and suchlike"
+ (mail)
+ "/home/martin/x/packages/lisp/mail-lib/")
+ ("rmail-mini.el"
+ "minimal core of \"RMAIL\" mail reader for Emacs."
+ (mail)
+ "/home/martin/x/packages/lisp/mail-lib/")
+ ("rmailout.el"
+ "\"RMAIL\" mail reader for Emacs: output message to a file."
+ (mail)
+ "/home/martin/x/packages/lisp/mail-lib/")
+ ("sendmail.el"
+ "mail sending commands for Emacs."
+ (mail)
+ "/home/martin/x/packages/lisp/mail-lib/")
+ ("mc-remail.el"
+ "Remailer support for Mailcrypt"
+ nil
+ "/home/martin/x/packages/lisp/mailcrypt/")
+ ("mew-attach.el"
+ "attachments for Mew Draft mode"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-bq.el"
+ "Base64 and Quoted-Printable encoding for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-cache.el"
+ "Cache management for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-complete.el"
+ "Completion magic for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-decode.el"
+ "MIME syntax decoder for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-demo.el"
+ "Startup demo for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-draft.el"
+ "Draft mode for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-encode.el"
+ "MIME syntax encoder for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-env.el"
+ "Environment setup for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-ext.el"
+ "Message/External-Body support for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-fib.el"
+ "Filling blanks for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-func.el"
+ "Basic functions for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-header.el"
+ "Mail header stuff for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-highlight.el"
+ "Highlight for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-lang-jp.el"
+ "Japanese specific stuff for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-mark.el"
+ "Marking for Mew Summary and Virtual mode"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-message.el"
+ "Message mode for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-mime.el"
+ "MIME launcher for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-minibuf.el"
+ "Minibuffer input methods for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-mule0.el"
+ "Environment of non-Mule for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-mule2.el"
+ "Environment of Mule version 2 for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-mule3.el"
+ "Environment of Mule version 3 for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-pgp.el"
+ "PGP/MIME for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-pick.el"
+ "Picking up messages for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-refile.el"
+ "Refile for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-scan.el"
+ "Scanning messages for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-sort.el"
+ "Sorting messages for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-summary.el"
+ "Summary mode for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-syntax.el"
+ "Internal syntax for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-temacs.el"
+ "Environment of Text Emacs for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-unix.el"
+ "MIME content type for UNIX"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-vars.el"
+ "Variables and Constants for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-virtual.el"
+ "Virtual mode for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-win32.el"
+ "Settings for Mew on Win32"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew-xemacs.el"
+ "Environment of XEmacs for Mew"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mew.el"
+ "Messaging in the Emacs World"
+ nil
+ "/home/martin/x/packages/lisp/mew/")
+ ("mh-comp.el"
+ "mh-e functions for composing messages"
+ nil
+ "/home/martin/x/packages/lisp/mh-e/")
+ ("mh-e.el"
+ "GNU Emacs interface to the MH mail system"
+ (mail)
+ "/home/martin/x/packages/lisp/mh-e/")
+ ("mh-funcs.el"
+ "mh-e functions not everyone will use right away"
+ nil
+ "/home/martin/x/packages/lisp/mh-e/")
+ ("mh-mime.el"
+ "mh-e support for composing MIME messages"
+ nil
+ "/home/martin/x/packages/lisp/mh-e/")
+ ("mh-pick.el"
+ "make a search pattern and search for a message in mh-e"
+ nil
+ "/home/martin/x/packages/lisp/mh-e/")
+ ("mh-seq.el"
+ "mh-e sequences support"
+ nil
+ "/home/martin/x/packages/lisp/mh-e/")
+ ("mh-utils.el"
+ "mh-e code needed for both sending and reading"
+ nil
+ "/home/martin/x/packages/lisp/mh-e/")
+ ("xmine.el"
+ "Mine game for XEmacs"
+ (games)
+ "/home/martin/x/packages/lisp/mine/")
+ ("NeXTify.el"
+ "Character insertion variation"
+ (games)
+ "/home/martin/x/packages/lisp/misc-games/")
+ ("advocacy.el"
+ "blatant XEmacs self promotion"
+ nil
+ "/home/martin/x/packages/lisp/misc-games/")
+ ("blackbox.el"
+ "blackbox game in Emacs Lisp"
+ (games)
+ "/home/martin/x/packages/lisp/misc-games/")
+ ("conx.el"
+ "Yet another dissociater"
+ (games)
+ "/home/martin/x/packages/lisp/misc-games/")
+ ("decipher.el"
+ "Cryptanalyze monoalphabetic substitution ciphers"
+ (games)
+ "/home/martin/x/packages/lisp/misc-games/")
+ ("dissociate.el"
+ "scramble text amusingly for Emacs."
+ (games)
+ "/home/martin/x/packages/lisp/misc-games/")
+ ("doctor.el"
+ "psychological help for frustrated users."
+ (games)
+ "/home/martin/x/packages/lisp/misc-games/")
+ ("dunnet.el"
+ "Text adventure for Emacs"
+ (games)
+ "/home/martin/x/packages/lisp/misc-games/")
+ ("flame.el"
+ "Automated insults"
+ (games)
+ "/home/martin/x/packages/lisp/misc-games/")
+ ("gomoku.el"
+ "Gomoku game between you and Emacs"
+ (games)
+ "/home/martin/x/packages/lisp/misc-games/")
+ ("hanoi.el"
+ "towers of hanoi in GNUmacs"
+ (games)
+ "/home/martin/x/packages/lisp/misc-games/")
+ ("life.el"
+ "John Horton Conway's `Life' game for GNU Emacs"
+ (games)
+ "/home/martin/x/packages/lisp/misc-games/")
+ ("morse.el"
+ "Convert text to morse code and back."
+ nil
+ "/home/martin/x/packages/lisp/misc-games/")
+ ("mpuz.el"
+ "multiplication puzzle for XEmacs"
+ (games)
+ "/home/martin/x/packages/lisp/misc-games/")
+ ("rot13.el"
+ "display a buffer in rot13."
+ nil
+ "/home/martin/x/packages/lisp/misc-games/")
+ ("studly.el"
+ "StudlyCaps (tm)(r)(c)(xxx)"
+ (games)
+ "/home/martin/x/packages/lisp/misc-games/")
+ ("emacsbug.el"
+ "command to report Emacs bugs to appropriate mailing list."
+ (maint mail)
+ "/home/martin/x/packages/lisp/net-utils/")
+ ("feedmail.el"
+ "assist other email packages to massage outgoing messages "
+ (email queue mail sendmail message spray smtp draft)
+ "/home/martin/x/packages/lisp/net-utils/")
+ ("metamail.el"
+ "Metamail interface for GNU Emacs"
+ (mail news mime multimedia)
+ "/home/martin/x/packages/lisp/net-utils/")
+ ("net-utils.el"
+ "Network functions"
+ nil
+ "/home/martin/x/packages/lisp/net-utils/")
+ ("rcompile.el"
+ "run a compilation on a remote machine"
+ (tools processes)
+ "/home/martin/x/packages/lisp/net-utils/")
+ ("shadowfile.el"
+ "automatic file copying for Emacs 19"
+ (comm)
+ "/home/martin/x/packages/lisp/net-utils/")
+ ("webjump.el"
+ "programmable Web hotlist"
+ (comm www)
+ "/home/martin/x/packages/lisp/net-utils/")
+ ("webster-www.el"
+ "Look up a word in WWW Merriam-Webster dictionaries"
+ (comm hypermedia)
+ "/home/martin/x/packages/lisp/net-utils/")
+ ("arc-mode.el"
+ "simple editing of archives"
+ (data unix)
+ "/home/martin/x/packages/lisp/os-utils/")
+ ("background.el"
+ "fun with background jobs"
+ (processes)
+ "/home/martin/x/packages/lisp/os-utils/")
+ ("crypt.el"
+ "code for handling all sorts of compressed and encrypted files"
+ (extensions)
+ "/home/martin/x/packages/lisp/os-utils/")
+ ("ftelnet.el"
+ "remote login interface"
+ (unix comm)
+ "/home/martin/x/packages/lisp/os-utils/")
+ ("inf-lisp.el"
+ "an inferior-lisp mode"
+ (processes lisp)
+ "/home/martin/x/packages/lisp/os-utils/")
+ ("jka-compr.el"
+ "reading/writing/loading compressed files"
+ (data)
+ "/home/martin/x/packages/lisp/os-utils/")
+ ("kermit.el"
+ "additions to shell mode for use with kermit, etc."
+ (comm)
+ "/home/martin/x/packages/lisp/os-utils/")
+ ("ledit.el"
+ "Emacs side of ledit interface"
+ nil
+ "/home/martin/x/packages/lisp/os-utils/")
+ ("lpr.el"
+ "print Emacs buffer on line printer."
+ (unix)
+ "/home/martin/x/packages/lisp/os-utils/")
+ ("mchat.el"
+ "Multicast Chatting package for XEmacs."
+ (comm processes)
+ "/home/martin/x/packages/lisp/os-utils/")
+ ("ps-print.el"
+ "Jim's Pretty-Good PostScript Generator for Emacs 19."
+ (print postscript)
+ "/home/martin/x/packages/lisp/os-utils/")
+ ("rlogin.el"
+ "remote login interface"
+ (unix comm)
+ "/home/martin/x/packages/lisp/os-utils/")
+ ("spell.el"
+ "spelling correction interface for Emacs."
+ (wp unix)
+ "/home/martin/x/packages/lisp/os-utils/")
+ ("ssh.el"
+ "remote login interface"
+ (unix comm)
+ "/home/martin/x/packages/lisp/os-utils/")
+ ("tar-mode.el"
+ "simple editing of tar files from GNU emacs"
+ (unix)
+ "/home/martin/x/packages/lisp/os-utils/")
+ ("telnet.el"
+ "run a telnet session from within an Emacs buffer"
+ (comm unix)
+ "/home/martin/x/packages/lisp/os-utils/")
+ ("terminal.el"
+ "terminal emulator for GNU Emacs."
+ (comm terminals)
+ "/home/martin/x/packages/lisp/os-utils/")
+ ("uncompress.el"
+ "auto-decompression hook for visiting .Z files"
+ (unix extensions)
+ "/home/martin/x/packages/lisp/os-utils/")
+ ("delbs.el"
+ "a small lisp package to allow you to swap around DEL/BS keys"
+ (lisp terminals)
+ "/home/martin/x/packages/lisp/pc/")
+ ("fusion.el"
+ "CodeWright Fusion-style motion and text selection"
+ (keyboard selection region)
+ "/home/martin/x/packages/lisp/pc/")
+ ("pc-select.el"
+ "PC shift selection minor mode for XEmacs"
+ (hardware mouse)
+ "/home/martin/x/packages/lisp/pc/")
+ ("pending-del.el"
+ "Making insertions replace any selected text."
+ nil
+ "/home/martin/x/packages/lisp/pc/")
+ ("s-region.el"
+ "set region using shift key."
+ (terminals)
+ "/home/martin/x/packages/lisp/pc/")
+ ("dired-cvs.el"
+ "Extensions to dired."
+ nil
+ "/home/martin/x/packages/lisp/pcl-cvs/")
+ ("generic-sc.el"
+ "generic interface to source control systems"
+ (tools unix)
+ "/home/martin/x/packages/lisp/pcl-cvs/")
+ ("pcl-cvs.el"
+ "A Front-end to CVS. Release R-2_0-Beta_2."
+ (cvs version control release management)
+ "/home/martin/x/packages/lisp/pcl-cvs/")
+ ("ph.el"
+ "Client for the CCSO directory system (aka PH/QI)"
+ (help)
+ "/home/martin/x/packages/lisp/ph/")
+ ("asm-mode.el"
+ "mode for editing assembler code"
+ (tools languages)
+ "/home/martin/x/packages/lisp/prog-modes/")
+ ("autoconf-mode.el"
+ "autoconf code editing commands for Emacs"
+ (languages faces m4 configure)
+ "/home/martin/x/packages/lisp/prog-modes/")
+ ("awk-mode.el"
+ "AWK code editing commands for Emacs"
+ (unix languages)
+ "/home/martin/x/packages/lisp/prog-modes/")
+ ("cl-indent.el"
+ "enhanced lisp-indent mode"
+ (lisp tools)
+ "/home/martin/x/packages/lisp/prog-modes/")
+ ("cperl-mode.el"
+ "Perl code editing commands for XEmacs"
+ (languages)
+ "/home/martin/x/packages/lisp/prog-modes/")
+ ("cvs.el"
+ "Light cvs support for emacs (ediff + msb + dired + mode line)"
+ (cvs ediff mode-line)
+ "/home/martin/x/packages/lisp/prog-modes/")
+ ("f90.el"
+ "Fortran-90 mode (free format)"
+ (fortran f90 languages)
+ "/home/martin/x/packages/lisp/prog-modes/")
+ ("fortran-misc.el"
+ "Routines than can be used with fortran mode."
+ (languages)
+ "/home/martin/x/packages/lisp/prog-modes/")
+ ("fortran.el"
+ "Fortran mode for GNU Emacs"
+ (languages)
+ "/home/martin/x/packages/lisp/prog-modes/")
+ ("icon.el"
+ "mode for editing Icon code"
+ (languages)
+ "/home/martin/x/packages/lisp/prog-modes/")
+ ("ksh-mode.el"
+ "sh (ksh, bash) script editing mode for GNU Emacs."
+ (shell korn bourne sh ksh bash)
+ "/home/martin/x/packages/lisp/prog-modes/")
+ ("m4-mode.el"
+ "m4 code editing commands for Emacs"
+ (languages faces)
+ "/home/martin/x/packages/lisp/prog-modes/")
+ ("make-mode.el"
+ "makefile editing commands for Emacs"
+ (unix tools)
+ "/home/martin/x/packages/lisp/prog-modes/")
+ ("modula2.el"
+ "Modula-2 editing support package"
+ (languages)
+ "/home/martin/x/packages/lisp/prog-modes/")
+ ("pascal.el"
+ "major mode for editing pascal source in Emacs"
+ (languages)
+ "/home/martin/x/packages/lisp/prog-modes/")
+ ("perl-mode.el"
+ "Perl code editing commands for GNU Emacs"
+ (languages)
+ "/home/martin/x/packages/lisp/prog-modes/")
+ ("postscript.el"
+ "major mode for editing PostScript programs"
+ (langauges)
+ "/home/martin/x/packages/lisp/prog-modes/")
+ ("prolog.el"
+ "major mode for editing and running Prolog under Emacs"
+ (languages)
+ "/home/martin/x/packages/lisp/prog-modes/")
+ ("python-mode.el"
+ "Major mode for editing Python programs"
+ (python languages oop)
+ "/home/martin/x/packages/lisp/prog-modes/")
+ ("rexx-mode.el"
+ "major mode for editing REXX program files"
+ (languages)
+ "/home/martin/x/packages/lisp/prog-modes/")
+ ("simula.el"
+ "SIMULA 87 code editing commands for Emacs"
+ (languages)
+ "/home/martin/x/packages/lisp/prog-modes/")
+ ("sql.el"
+ "specialized comint.el for SQL interpreters"
+ (processes sql)
+ "/home/martin/x/packages/lisp/prog-modes/")
+ ("tcl.el"
+ "Tcl code editing commands for Emacs"
+ (languages)
+ "/home/martin/x/packages/lisp/prog-modes/")
+ ("teco.el"
+ "Teco interpreter for Gnu Emacs, version 1."
+ (emulators)
+ "/home/martin/x/packages/lisp/prog-modes/")
+ ("verilog-mode.el"
+ "major mode for editing verilog source in Emacs"
+ (languages)
+ "/home/martin/x/packages/lisp/prog-modes/")
+ ("vrml-mode.el"
+ "major mode for editing VRML (.wrl) files"
+ (languages vrml modes)
+ "/home/martin/x/packages/lisp/prog-modes/")
+ ("iso-sgml.el"
+ "display SGML entity references as ISO 8859-1 characters"
+ (sgml html iso latin i18n)
+ "/home/martin/x/packages/lisp/psgml/")
+ ("psgml-api.el"
+ "Extra API functions for PSGML"
+ nil
+ "/home/martin/x/packages/lisp/psgml/")
+ ("psgml-dtd.el"
+ "DTD parser for SGML-editing mode with parsing support"
+ nil
+ "/home/martin/x/packages/lisp/psgml/")
+ ("psgml-edit.el"
+ "Editing commands for SGML-mode with parsing support"
+ nil
+ "/home/martin/x/packages/lisp/psgml/")
+ ("psgml-fs.el"
+ "Format a SGML-file according to a style file"
+ nil
+ "/home/martin/x/packages/lisp/psgml/")
+ ("psgml-html.el"
+ "HTML mode in conjunction with PSGML"
+ nil
+ "/home/martin/x/packages/lisp/psgml/")
+ ("psgml-other.el"
+ "Part of SGML-editing mode with parsing support"
+ nil
+ "/home/martin/x/packages/lisp/psgml/")
+ ("psgml-parse.el"
+ "Parser for SGML-editing mode with parsing support"
+ nil
+ "/home/martin/x/packages/lisp/psgml/")
+ ("psgml-xemacs.el"
+ "Part of SGML-editing mode with parsing support"
+ nil
+ "/home/martin/x/packages/lisp/psgml/")
+ ("psgml.el"
+ "SGML-editing mode with parsing support"
+ (languages)
+ "/home/martin/x/packages/lisp/psgml/")
+ ("reftex.el"
+ "Minor mode for doing \\label, \\ref and \\cite in LaTeX"
+ (tex)
+ "/home/martin/x/packages/lisp/reftex/")
+ ("rmail-kill.el"
+ "Mail filtering for rmail"
+ (mail)
+ "/home/martin/x/packages/lisp/rmail/")
+ ("rmail-xemacs.el"
+ "Mouse and font support for RMAIL running on XEmacs"
+ (mail)
+ "/home/martin/x/packages/lisp/rmail/")
+ ("rmail.el"
+ "main code of \"RMAIL\" mail reader for Emacs."
+ (mail)
+ "/home/martin/x/packages/lisp/rmail/")
+ ("rmailedit.el"
+ "\"RMAIL edit mode\" Edit the current message."
+ (mail)
+ "/home/martin/x/packages/lisp/rmail/")
+ ("rmailkwd.el"
+ "part of the \"RMAIL\" mail reader for Emacs."
+ (mail)
+ "/home/martin/x/packages/lisp/rmail/")
+ ("rmailmsc.el"
+ "miscellaneous support functions for the RMAIL mail reader"
+ (mail)
+ "/home/martin/x/packages/lisp/rmail/")
+ ("rmailsort.el"
+ "Rmail: sort messages."
+ (mail)
+ "/home/martin/x/packages/lisp/rmail/")
+ ("rmailsum.el"
+ "make summary buffers for the mail reader"
+ (mail)
+ "/home/martin/x/packages/lisp/rmail/")
+ ("undigest.el"
+ "digest-cracking support for the RMAIL mail reader"
+ (mail)
+ "/home/martin/x/packages/lisp/rmail/")
+ ("unrmail.el"
+ "convert Rmail files to mailbox files."
+ (mail)
+ "/home/martin/x/packages/lisp/rmail/")
+ ("cmuscheme.el"
+ "Scheme process in a buffer. Adapted from tea.el."
+ (processes lisp)
+ "/home/martin/x/packages/lisp/scheme/")
+ ("cmuscheme48.el"
+ "Scheme process in a buffer. Adapted from cmuscheme.el."
+ nil
+ "/home/martin/x/packages/lisp/scheme/")
+ ("scheme.el"
+ "Scheme (and DSSSL) editing mode."
+ (languages lisp)
+ "/home/martin/x/packages/lisp/scheme/")
+ ("xscheme.el"
+ "Run MIT-Scheme under XEmacs"
+ (languages lisp)
+ "/home/martin/x/packages/lisp/scheme/")
+ ("linuxdoc-sgml.el"
+ "sgml-mode enhancements for linuxdoc"
+ (docs languages)
+ "/home/martin/x/packages/lisp/sgml/")
+ ("sgml-mode.el"
+ "SGML- and HTML-editing modes"
+ (wp hypermedia comm languages)
+ "/home/martin/x/packages/lisp/sgml/")
+ ("executable.el"
+ "base functionality for executable interpreter scripts"
+ (languages unix)
+ "/home/martin/x/packages/lisp/sh-script/")
+ ("sh-script.el"
+ "shell-script editing commands for Emacs"
+ (languages unix)
+ "/home/martin/x/packages/lisp/sh-script/")
+ ("color-selector.el"
+ "a graphical widget of three sliders to change faces. "
+ (extensions faces)
+ "/home/martin/x/packages/lisp/slider/")
+ ("slider.el"
+ "graphical sliders for XEmacs. (c) 1997"
+ (utilities)
+ "/home/martin/x/packages/lisp/slider/")
+ ("sb-gud.el"
+ "Speedbar support for the Grand Unified Debugger"
+ (tools gud)
+ "/home/martin/x/packages/lisp/speedbar/")
+ ("sb-info.el"
+ "Speedbar support for Info"
+ (file tags tools)
+ "/home/martin/x/packages/lisp/speedbar/")
+ ("sb-rmail.el"
+ "Speedbar support for rmail"
+ (file tags tools)
+ "/home/martin/x/packages/lisp/speedbar/")
+ ("sb-w3.el"
+ "Speedbar support for w3."
+ (file tags tools)
+ "/home/martin/x/packages/lisp/speedbar/")
+ ("speedbar.el"
+ "quick access to files and tags"
+ (file tags tools)
+ "/home/martin/x/packages/lisp/speedbar/")
+ ("speedbspec.el"
+ "Buffer specialized configurations for speedbar"
+ (file tags tools)
+ "/home/martin/x/packages/lisp/speedbar/")
+ ("strokes.el"
+ "Control XEmacs through mouse strokes --"
+ (lisp mouse extensions)
+ "/home/martin/x/packages/lisp/strokes/")
+ ("supercite.el"
+ "minor mode for citing mail and news replies"
+ (citation attribution mail news article reply followup)
+ "/home/martin/x/packages/lisp/supercite/")
+ ("detexinfo.el"
+ "remove Texinfo commands from a Texinfo source file"
+ (tex docs)
+ "/home/martin/x/packages/lisp/texinfo/")
+ ("informat.el"
+ "info support functions package for Emacs"
+ (help)
+ "/home/martin/x/packages/lisp/texinfo/")
+ ("makeinfo.el"
+ "run makeinfo conveniently"
+ nil
+ "/home/martin/x/packages/lisp/texinfo/")
+ ("tex-mode.el"
+ "TeX, LaTeX, and SliTeX mode commands."
+ nil
+ "/home/martin/x/packages/lisp/texinfo/")
+ ("texinfmt.el"
+ "format Texinfo files into Info files."
+ nil
+ "/home/martin/x/packages/lisp/texinfo/")
+ ("texinfo.el"
+ "major mode for editing Texinfo files"
+ (maint tex docs)
+ "/home/martin/x/packages/lisp/texinfo/")
+ ("texnfo-upd.el"
+ "utilities for updating nodes and menus in Texinfo files"
+ (maint tex docs)
+ "/home/martin/x/packages/lisp/texinfo/")
+ ("autoinsert.el"
+ "automatic mode-dependent insertion of text into new files"
+ nil
+ "/home/martin/x/packages/lisp/text-modes/")
+ ("flyspell.el"
+ "On-the-fly spell checker"
+ (convenience)
+ "/home/martin/x/packages/lisp/text-modes/")
+ ("folding.el"
+ "A folding-editor-like minor mode."
+ (tools)
+ "/home/martin/x/packages/lisp/text-modes/")
+ ("hexl.el"
+ "edit a file in a hex dump format using the hexl filter."
+ (data)
+ "/home/martin/x/packages/lisp/text-modes/")
+ ("image-mode.el"
+ "Major mode for navigate images"
+ (image graphics)
+ "/home/martin/x/packages/lisp/text-modes/")
+ ("iso-acc.el"
+ "minor mode providing electric accent keys"
+ (i18n)
+ "/home/martin/x/packages/lisp/text-modes/")
+ ("iso-ascii.el"
+ "set up char tables for ISO 8859/1 on ASCII terminals."
+ (i18n)
+ "/home/martin/x/packages/lisp/text-modes/")
+ ("iso-cvt.el"
+ "translate to ISO 8859-1 from/to net/TeX conventions"
+ (tex iso latin i18n)
+ "/home/martin/x/packages/lisp/text-modes/")
+ ("iso-insert.el"
+ "insert functions for ISO 8859/1."
+ (i18n)
+ "/home/martin/x/packages/lisp/text-modes/")
+ ("iso-swed.el"
+ "set up char tables for ISO 8859/1 for Swedish/Finnish ttys"
+ (i18n)
+ "/home/martin/x/packages/lisp/text-modes/")
+ ("nroff-mode.el"
+ "GNU Emacs major mode for editing nroff source"
+ (wp)
+ "/home/martin/x/packages/lisp/text-modes/")
+ ("scribe.el"
+ "scribe mode, and its idiosyncratic commands."
+ (wp)
+ "/home/martin/x/packages/lisp/text-modes/")
+ ("swedish.el"
+ "miscellaneous functions for dealing with Swedish."
+ (i18n)
+ "/home/martin/x/packages/lisp/text-modes/")
+ ("tabify.el"
+ "tab conversion commands for XEmacs"
+ nil
+ "/home/martin/x/packages/lisp/text-modes/")
+ ("underline.el"
+ "insert/remove underlining (done by overstriking) in Emacs."
+ (wp)
+ "/home/martin/x/packages/lisp/text-modes/")
+ ("whitespace-mode.el"
+ "minor mode for making whitespace visible"
+ (modes extensions)
+ "/home/martin/x/packages/lisp/text-modes/")
+ ("winmgr-mode.el"
+ "generic window manager mode"
+ (languages)
+ "/home/martin/x/packages/lisp/text-modes/")
+ ("ws-mode.el"
+ "WordStar emulation mode for GNU Emacs"
+ (emulations)
+ "/home/martin/x/packages/lisp/text-modes/")
+ ("xpm-mode.el"
+ "minor mode for editing XPM files"
+ (data tools)
+ "/home/martin/x/packages/lisp/text-modes/")
+ ("xrdb-mode.el"
+ "mode for editing X resource database files"
+ (data languages)
+ "/home/martin/x/packages/lisp/text-modes/")
+ ("bib-mode.el"
+ "bib-mode, major mode for editing bib files."
+ (bib)
+ "/home/martin/x/packages/lisp/textools/")
+ ("bibtex.el"
+ "BibTeX mode for GNU Emacs"
+ (bibtex latex tex)
+ "/home/martin/x/packages/lisp/textools/")
+ ("doctex.el"
+ "grind GNU Emacs DOC file into LaTeX input"
+ (tex docs)
+ "/home/martin/x/packages/lisp/textools/")
+ ("refbib.el"
+ "convert refer-style references to ones usable by Latex bib"
+ (bib tex)
+ "/home/martin/x/packages/lisp/textools/")
+ ("time.el"
+ "display time and load in mode line of Emacs."
+ nil
+ "/home/martin/x/packages/lisp/time/")
+ ("char-util.el"
+ "character utility"
+ (character emacs/mule)
+ "/home/martin/x/packages/lisp/tm/")
+ ("cless.el"
+ "Common lisp and Emacs Lisp source sharing"
+ (common lisp)
+ "/home/martin/x/packages/lisp/tm/")
+ ("gnus-art-mime.el"
+ "MIME extension for article mode of Gnus"
+ (news mime multimedia multilingual encoded-word)
+ "/home/martin/x/packages/lisp/tm/")
+ ("gnus-charset.el"
+ "MIME charset extension for Gnus"
+ (news mime multimedia multilingual encoded-word)
+ "/home/martin/x/packages/lisp/tm/")
+ ("gnus-mime.el"
+ "MIME extensions for Gnus"
+ (news mime multimedia multilingual encoded-word)
+ "/home/martin/x/packages/lisp/tm/")
+ ("gnus-sum-mime.el"
+ "MIME extension for summary mode of Gnus"
+ (news mime multimedia multilingual encoded-word)
+ "/home/martin/x/packages/lisp/tm/")
+ ("latex-math-symbol.el"
+ "LaTeX math symbol decoder"
+ (latex math mule)
+ "/home/martin/x/packages/lisp/tm/")
+ ("message-mime.el"
+ "MIME extensions for message.el"
+ (news mime multimedia multilingual encoded-word)
+ "/home/martin/x/packages/lisp/tm/")
+ ("mime-setup.el"
+ "setup file for tm viewer and composer."
+ (mail news mime multimedia multilingual encoded-word)
+ "/home/martin/x/packages/lisp/tm/")
+ ("mu-bbdb.el"
+ "`attribution' function for mu-cite with BBDB."
+ nil
+ "/home/martin/x/packages/lisp/tm/")
+ ("mu-cite.el"
+ "yet another citation tool for GNU Emacs"
+ (mail news citation)
+ "/home/martin/x/packages/lisp/tm/")
+ ("range.el"
+ "range functions"
+ (range)
+ "/home/martin/x/packages/lisp/tm/")
+ ("signature.el"
+ "a signature utility for GNU Emacs"
+ (mail news signature)
+ "/home/martin/x/packages/lisp/tm/")
+ ("texi-util.el"
+ "Texinfo utility"
+ (texinfo)
+ "/home/martin/x/packages/lisp/tm/")
+ ("tl-atype.el"
+ "atype functions"
+ (atype)
+ "/home/martin/x/packages/lisp/tm/")
+ ("tl-list.el"
+ "utility functions about list"
+ (list)
+ "/home/martin/x/packages/lisp/tm/")
+ ("tl-misc.el"
+ "miscellaneous utility of tl."
+ (load-path module structure)
+ "/home/martin/x/packages/lisp/tm/")
+ ("tl-seq.el"
+ "sequence functions"
+ (sequence)
+ "/home/martin/x/packages/lisp/tm/")
+ ("tl-str.el"
+ "Emacs Lisp Library module about string"
+ (string)
+ "/home/martin/x/packages/lisp/tm/")
+ ("tm-bbdb.el"
+ "tm shared module for BBDB"
+ (mail news mime multimedia multilingual bbdb)
+ "/home/martin/x/packages/lisp/tm/")
+ ("tm-def.el"
+ "definition module for tm"
+ (mail news mime multimedia definition)
+ "/home/martin/x/packages/lisp/tm/")
+ ("tm-edit-mc.el"
+ "Mailcrypt interface for tm-edit"
+ (mail news mime multimedia multilingual security pgp)
+ "/home/martin/x/packages/lisp/tm/")
+ ("tm-edit.el"
+ "Simple MIME Composer for GNU Emacs"
+ (mail news mime multimedia multilingual)
+ "/home/martin/x/packages/lisp/tm/")
+ ("tm-ew-d.el"
+ "RFC 2047 based encoded-word decoder for GNU Emacs"
+ (encoded-word mime multilingual header mail news)
+ "/home/martin/x/packages/lisp/tm/")
+ ("tm-ew-e.el"
+ "RFC 2047 based encoded-word encoder for GNU Emacs"
+ (encoded-word mime multilingual header mail news)
+ "/home/martin/x/packages/lisp/tm/")
+ ("tm-file.el"
+ "tm-view internal method for file extraction"
+ (mail news mime multimedia file extract)
+ "/home/martin/x/packages/lisp/tm/")
+ ("tm-ftp.el"
+ "tm-view internal method for anonymous ftp"
+ (anonymous ftp mime multimedia mail news)
+ "/home/martin/x/packages/lisp/tm/")
+ ("tm-image.el"
+ "tm-view filter to display images in XEmacs or MULE buffers"
+ (image picture x-face mime multimedia mail news)
+ "/home/martin/x/packages/lisp/tm/")
+ ("tm-mail.el"
+ "mail-mode extension."
+ (mail mime multimedia)
+ "/home/martin/x/packages/lisp/tm/")
+ ("tm-mh-e.el"
+ "MIME extension for mh-e"
+ (mail mh mime multimedia encoded-word multilingual)
+ "/home/martin/x/packages/lisp/tm/")
+ ("tm-parse.el"
+ "MIME message parser"
+ (mail news mime multimedia)
+ "/home/martin/x/packages/lisp/tm/")
+ ("tm-partial.el"
+ "Grabbing all MIME \"message/partial\"s."
+ (mail news mime multimedia message/partial)
+ "/home/martin/x/packages/lisp/tm/")
+ ("tm-pgp.el"
+ "tm-view internal methods for PGP."
+ (mail news mime multimedia pgp security)
+ "/home/martin/x/packages/lisp/tm/")
+ ("tm-play.el"
+ "decoder for tm-view.el"
+ (mail news mime multimedia)
+ "/home/martin/x/packages/lisp/tm/")
+ ("tm-rmail.el"
+ "MIME extension for RMAIL"
+ (mail mime multimedia multilingual encoded-word)
+ "/home/martin/x/packages/lisp/tm/")
+ ("tm-setup.el"
+ "setup file for tm viewer."
+ (mail news mime multimedia multilingual encoded-word)
+ "/home/martin/x/packages/lisp/tm/")
+ ("tm-view.el"
+ "interactive MIME viewer for GNU Emacs"
+ (mail news mime multimedia)
+ "/home/martin/x/packages/lisp/tm/")
+ ("tm-vm.el"
+ "tm-MUA (MIME Extension module) for VM"
+ (mail mime multimedia multilingual encoded-word)
+ "/home/martin/x/packages/lisp/tm/")
+ ("tmh-comp.el"
+ "tm-mh-e functions for composing messages"
+ (mail mh mime multimedia encoded-word multilingual)
+ "/home/martin/x/packages/lisp/tm/")
+ ("tu-comment.el"
+ "a comment out utility for Lisp programs."
+ (comment lisp)
+ "/home/martin/x/packages/lisp/tm/")
+ ("tu-replace.el"
+ "a replacing utility for GNU Emacs"
+ (replace)
+ "/home/martin/x/packages/lisp/tm/")
+ ("tpu-doc.el"
+ "Documentation for TPU-edt"
+ (emulations)
+ "/home/martin/x/packages/lisp/tpu/")
+ ("tpu-edt.el"
+ "Emacs emulating TPU emulating EDT"
+ (emulations)
+ "/home/martin/x/packages/lisp/tpu/")
+ ("tpu-extras.el"
+ "Scroll margins and free cursor mode for TPU-edt"
+ (emulations)
+ "/home/martin/x/packages/lisp/tpu/")
+ ("tpu-mapper.el"
+ "Create a TPU-edt X-windows keymap file"
+ (emulations)
+ "/home/martin/x/packages/lisp/tpu/")
+ ("vc-hooks.el"
+ "resident support for version-control"
+ nil
+ "/home/martin/x/packages/lisp/vc/")
+ ("vc.el"
+ "drive a version-control system from within Emacs"
+ nil
+ "/home/martin/x/packages/lisp/vc/")
+ ("vhdl-mode.el"
+ "major mode for editing VHDL code"
+ (languages vhdl)
+ "/home/martin/x/packages/lisp/vhdl/")
+ ("view-process-mode.el"
+ "Display current running processes"
+ (processes)
+ "/home/martin/x/packages/lisp/view-process/")
+ ("view-process-system-specific.el"
+ "System specific stuff for view-process"
+ (processes)
+ "/home/martin/x/packages/lisp/view-process/")
+ ("view-process-xemacs.el"
+ "XEmacs specific code for view-process"
+ (processes)
+ "/home/martin/x/packages/lisp/view-process/")
+ ("viper-cmd.el"
+ "Vi command support for Viper"
+ nil
+ "/home/martin/x/packages/lisp/viper/")
+ ("viper-ex.el"
+ "functions implementing the Ex commands for Viper"
+ nil
+ "/home/martin/x/packages/lisp/viper/")
+ ("viper-init.el"
+ "some common definitions for Viper"
+ nil
+ "/home/martin/x/packages/lisp/viper/")
+ ("viper-keym.el"
+ "Viper keymaps"
+ nil
+ "/home/martin/x/packages/lisp/viper/")
+ ("viper-macs.el"
+ "functions implementing keyboard macros for Viper"
+ nil
+ "/home/martin/x/packages/lisp/viper/")
+ ("viper-mous.el"
+ "mouse support for Viper"
+ nil
+ "/home/martin/x/packages/lisp/viper/")
+ ("viper-util.el"
+ "Utilities used by viper.el"
+ nil
+ "/home/martin/x/packages/lisp/viper/")
+ ("viper.el"
+ "A full-featured Vi emulator for GNU Emacs and XEmacs,"
+ (emulations)
+ "/home/martin/x/packages/lisp/viper/")
+ ("vm-easymenu.el"
+ "support the easymenu interface for defining a menu."
+ (emulations)
+ "/home/martin/x/packages/lisp/vm/")
+ ("vm-loaddefs.el"
+ "autoloads for VM formerly in loaddefs.el"
+ (mail dumped)
+ "/home/martin/x/packages/lisp/vm/")
+ ("base64.el"
+ "Base64 encoding functions"
+ (extensions)
+ "/home/martin/x/packages/lisp/w3/")
+ ("css.el"
+ "Cascading Style Sheet parser"
+ nil
+ "/home/martin/x/packages/lisp/w3/")
+ ("dsssl-flow.el"
+ "DSSSL flow objects"
+ nil
+ "/home/martin/x/packages/lisp/w3/")
+ ("dsssl.el"
+ "DSSSL parser"
+ nil
+ "/home/martin/x/packages/lisp/w3/")
+ ("images.el"
+ "Automatic image converters"
+ (images)
+ "/home/martin/x/packages/lisp/w3/")
+ ("mm.el"
+ "Mailcap parsing routines, and MIME handling"
+ (mail news hypermedia)
+ "/home/martin/x/packages/lisp/w3/")
+ ("mule-sysdp.el"
+ "consolidate MULE-version dependencies in one file."
+ (lisp tools)
+ "/home/martin/x/packages/lisp/w3/")
+ ("socks.el"
+ "A Socks v5 Client for Emacs"
+ (comm firewalls)
+ "/home/martin/x/packages/lisp/w3/")
+ ("ssl.el"
+ "ssl functions for emacsen without them builtin"
+ (comm)
+ "/home/martin/x/packages/lisp/w3/")
+ ("url-auth.el"
+ "Uniform Resource Locator authorization modules"
+ (comm data processes hypermedia)
+ "/home/martin/x/packages/lisp/w3/")
+ ("url-cache.el"
+ "Uniform Resource Locator retrieval tool"
+ (comm data processes hypermedia)
+ "/home/martin/x/packages/lisp/w3/")
+ ("url-cookie.el"
+ "Netscape Cookie support"
+ (comm data processes hypermedia)
+ "/home/martin/x/packages/lisp/w3/")
+ ("url-file.el"
+ "File retrieval code"
+ (comm data processes)
+ "/home/martin/x/packages/lisp/w3/")
+ ("url-gopher.el"
+ "Gopher Uniform Resource Locator retrieval code"
+ (comm data processes)
+ "/home/martin/x/packages/lisp/w3/")
+ ("url-gw.el"
+ "Gateway munging for URL loading"
+ (comm data processes)
+ "/home/martin/x/packages/lisp/w3/")
+ ("url-http.el"
+ "HTTP Uniform Resource Locator retrieval code"
+ (comm data processes)
+ "/home/martin/x/packages/lisp/w3/")
+ ("url-irc.el"
+ "IRC URL interface"
+ (comm data processes)
+ "/home/martin/x/packages/lisp/w3/")
+ ("url-mail.el"
+ "Mail Uniform Resource Locator retrieval code"
+ (comm data processes)
+ "/home/martin/x/packages/lisp/w3/")
+ ("url-misc.el"
+ "Misc Uniform Resource Locator retrieval code"
+ (comm data processes)
+ "/home/martin/x/packages/lisp/w3/")
+ ("url-news.el"
+ "News Uniform Resource Locator retrieval code"
+ (comm data processes)
+ "/home/martin/x/packages/lisp/w3/")
+ ("url-nfs.el"
+ "NFS URL interface"
+ (comm data processes)
+ "/home/martin/x/packages/lisp/w3/")
+ ("url-ns.el"
+ "Various netscape-ish functions for proxy definitions"
+ (comm data processes hypermedia)
+ "/home/martin/x/packages/lisp/w3/")
+ ("url-parse.el"
+ "Uniform Resource Locator parser"
+ (comm data processes)
+ "/home/martin/x/packages/lisp/w3/")
+ ("url-vars.el"
+ "Variables for Uniform Resource Locator tool"
+ (comm data processes hypermedia)
+ "/home/martin/x/packages/lisp/w3/")
+ ("url.el"
+ "Uniform Resource Locator retrieval tool"
+ (comm data processes hypermedia)
+ "/home/martin/x/packages/lisp/w3/")
+ ("w3-about.el"
+ "About pages for emacs-w3"
+ (hypermedia)
+ "/home/martin/x/packages/lisp/w3/")
+ ("w3-cfg.el"
+ "Configuration info from Emacs/W3"
+ (hypermedia)
+ "/home/martin/x/packages/lisp/w3/")
+ ("w3-cus.el"
+ "Customization support for Emacs-W3"
+ (comm help hypermedia)
+ "/home/martin/x/packages/lisp/w3/")
+ ("w3-display.el"
+ "display engine"
+ (faces help hypermedia)
+ "/home/martin/x/packages/lisp/w3/")
+ ("w3-e19.el"
+ "Emacs 19.xx specific functions for emacs-w3"
+ (faces help mouse hypermedia)
+ "/home/martin/x/packages/lisp/w3/")
+ ("w3-e20.el"
+ "Emacs 20.xx specific functions for emacs-w3"
+ (faces help mouse hypermedia)
+ "/home/martin/x/packages/lisp/w3/")
+ ("w3-elisp.el"
+ "Scripting support for emacs-lisp"
+ (hypermedia scripting)
+ "/home/martin/x/packages/lisp/w3/")
+ ("w3-emulate.el"
+ "All variable definitions for emacs-w3"
+ (comm help hypermedia)
+ "/home/martin/x/packages/lisp/w3/")
+ ("w3-forms.el"
+ "Emacs-w3 forms parsing code for new display engine"
+ (faces help comm data languages)
+ "/home/martin/x/packages/lisp/w3/")
+ ("w3-hot.el"
+ "Main functions for emacs-w3 on all platforms/versions"
+ (faces help comm news mail processes mouse hypermedia)
+ "/home/martin/x/packages/lisp/w3/")
+ ("w3-imap.el"
+ "Imagemap functions"
+ (hypermedia)
+ "/home/martin/x/packages/lisp/w3/")
+ ("w3-jscript.el"
+ "Scripting support for javascript"
+ (hypermedia scripting)
+ "/home/martin/x/packages/lisp/w3/")
+ ("w3-keyword.el"
+ "Emacs-W3 binding style sheet mechanism"
+ (hypermedia)
+ "/home/martin/x/packages/lisp/w3/")
+ ("w3-latex.el"
+ "Emacs-W3 printing via LaTeX"
+ (hypermedia printing typesetting)
+ "/home/martin/x/packages/lisp/w3/")
+ ("w3-menu.el"
+ "Menu functions for emacs-w3"
+ (menu hypermedia)
+ "/home/martin/x/packages/lisp/w3/")
+ ("w3-mouse.el"
+ "Mouse specific functions for emacs-w3"
+ (mouse hypermedia)
+ "/home/martin/x/packages/lisp/w3/")
+ ("w3-prefs.el"
+ "Preferences panels for Emacs-W3"
+ (hypermedia preferences)
+ "/home/martin/x/packages/lisp/w3/")
+ ("w3-print.el"
+ "Printing support for emacs-w3"
+ (faces help printing hypermedia)
+ "/home/martin/x/packages/lisp/w3/")
+ ("w3-props.el"
+ "Additional text property stuff"
+ (faces)
+ "/home/martin/x/packages/lisp/w3/")
+ ("w3-script.el"
+ "Scripting support"
+ (hypermedia scripting)
+ "/home/martin/x/packages/lisp/w3/")
+ ("w3-speak.el"
+ "Emacs-W3 speech interface"
+ (hypermedia speech)
+ "/home/martin/x/packages/lisp/w3/")
+ ("w3-style.el"
+ "Emacs/W3 binding style sheet mechanism"
+ (faces hypermedia)
+ "/home/martin/x/packages/lisp/w3/")
+ ("w3-sysdp.el"
+ "consolidate Emacs-version dependencies in one file."
+ (lisp tools)
+ "/home/martin/x/packages/lisp/w3/")
+ ("w3-toolbar.el"
+ "Toolbar functions for emacs-w3"
+ (mouse toolbar)
+ "/home/martin/x/packages/lisp/w3/")
+ ("w3-vars.el"
+ "All variable definitions for emacs-w3"
+ (comm help hypermedia)
+ "/home/martin/x/packages/lisp/w3/")
+ ("w3-widget.el"
+ "An image widget"
+ (faces images)
+ "/home/martin/x/packages/lisp/w3/")
+ ("w3-xemac.el"
+ "XEmacs specific functions for emacs-w3"
+ (faces help mouse hypermedia)
+ "/home/martin/x/packages/lisp/w3/")
+ ("w3.el"
+ "Main functions for emacs-w3 on all platforms/versions"
+ (faces help comm news mail processes mouse hypermedia)
+ "/home/martin/x/packages/lisp/w3/")
+ ("add-log.el"
+ "change log maintenance commands for Emacs"
+ (maint)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("advice.el"
+ "an overloading mechanism for Emacs Lisp functions"
+ (extensions lisp tools)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("annotations.el"
+ "interface to marginal annotations"
+ (extensions hypermedia outlines)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("assoc.el"
+ "insert/delete/sort functions on association lists"
+ (extensions)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("case-table.el"
+ "code to extend the character set and support case tables."
+ (i18n)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("chistory.el"
+ "list command history"
+ nil
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("comint-xemacs.el"
+ "Face customizations for comint"
+ (help faces)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("comint.el"
+ "general command interpreter in a window stuff"
+ (processes)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("compile.el"
+ "run compiler as inferior of Emacs, parse error messages."
+ (tools processes)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("debug.el"
+ "debuggers and related commands for XEmacs"
+ nil
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("ebuff-menu.el"
+ "electric-buffer-list mode"
+ (frames)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("echistory.el"
+ "Electric Command History Mode"
+ (extensions)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("edmacro.el"
+ "keyboard macro editor"
+ (abbrev internal)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("ehelp.el"
+ "bindings for electric-help mode"
+ (help extensions)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("electric.el"
+ "window maker and Command loop for `electric' modes."
+ (extensions)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("enriched.el"
+ "read and save files in text/enriched format"
+ (wp faces)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("env.el"
+ "functions to manipulate environment variables."
+ (processes unix)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("facemenu.el"
+ "create a face menu for interactively adding fonts to text"
+ (faces)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("ffap.el"
+ "find file (or url) at point"
+ (files hypermedia matching mouse)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("helper.el"
+ "utility help package supporting help in electric modes"
+ (help)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("imenu.el"
+ "Framework for mode-specific buffer indexes."
+ (tools)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("iso-syntax.el"
+ "set up case-conversion and syntax tables for ISO 8859/1"
+ (i18n)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("macros.el"
+ "non-primitive commands for keyboard macros."
+ (abbrev)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("novice.el"
+ "handling of disabled commands (\"novice mode\") for XEmacs."
+ (internal help)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("outline.el"
+ "outline mode commands for Emacs"
+ (outlines)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("passwd.el"
+ "Prompting for passwords semi-securely"
+ (comm extensions)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("pp.el"
+ "pretty printer for Emacs Lisp"
+ (lisp tools language extensions)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("regi.el"
+ "REGular expression Interpreting engine"
+ (extensions matching)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("ring.el"
+ "handle rings of items"
+ (extensions)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("shell.el"
+ "specialized comint.el for running the shell."
+ (processes shell terminal csh tcsh bash sh)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("skeleton.el"
+ "Lisp language extension for writing statement skeletons"
+ (extensions abbrev languages tools)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("sort.el"
+ "commands to sort text in an XEmacs buffer."
+ (unix)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("thing.el"
+ "find language-specific contiguous pieces of text"
+ (extensions languages)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("time-stamp.el"
+ "Maintain last change time stamps in files edited by Emacs"
+ (tools)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("timezone.el"
+ "time zone package for XEmacs"
+ (news)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("xbm-button.el"
+ "Create XBM text buttons under XEmacs"
+ (frames internal)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("xpm-button.el"
+ "create XPM buttons"
+ (frames internal)
+ "/home/martin/x/packages/lisp/xemacs-base/")
+ ("bench.el"
+ "benchmarking utility for emacsen"
+ (internal maint)
+ "/home/martin/x/packages/lisp/xemacs-devel/")
+ ("docref.el"
+ "Simple cross references for Elisp documentation strings"
+ (docs help lisp)
+ "/home/martin/x/packages/lisp/xemacs-devel/")
+ ("eldoc.el"
+ "show function arglist or variable docstring in echo area"
+ (extensions)
+ "/home/martin/x/packages/lisp/xemacs-devel/")
+ ("elp.el"
+ "Emacs Lisp Profiler"
+ (debugging lisp tools)
+ "/home/martin/x/packages/lisp/xemacs-devel/")
+ ("eval-expr.el"
+ "enhanced eval-expression command"
+ (extensions)
+ "/home/martin/x/packages/lisp/xemacs-devel/")
+ ("find-func.el"
+ "find the definition of the Emacs Lisp function near point"
+ (emacs-lisp functions variables)
+ "/home/martin/x/packages/lisp/xemacs-devel/")
+ ("find-gc.el"
+ "detect functions that call the garbage collector"
+ (maint)
+ "/home/martin/x/packages/lisp/xemacs-devel/")
+ ("hide-copyleft.el"
+ "hide obnoxious copyright prologs"
+ nil
+ "/home/martin/x/packages/lisp/xemacs-devel/")
+ ("ielm.el"
+ "interaction mode for Emacs Lisp"
+ (lisp)
+ "/home/martin/x/packages/lisp/xemacs-devel/")
+ ("pretty-print.el"
+ "Emacs Lisp pretty printer and macro expander"
+ (lisp internal)
+ "/home/martin/x/packages/lisp/xemacs-devel/")
+ ("profile.el"
+ "basic profiling commands for XEmacs"
+ (internal)
+ "/home/martin/x/packages/lisp/xemacs-devel/")
+ ("regexp-opt.el"
+ "generate efficient regexps to match strings."
+ (strings regexps)
+ "/home/martin/x/packages/lisp/xemacs-devel/")
+ ("reposition.el"
+ "center a Lisp function or comment on the screen"
+ nil
+ "/home/martin/x/packages/lisp/xemacs-devel/")
+ ("trace.el"
+ "tracing facility for Emacs Lisp functions"
+ (tools lisp)
+ "/home/martin/x/packages/lisp/xemacs-devel/")
+ ("zenirc-18.el"
+ "compatibility functions for Emacs 18"
+ (extensions zenirc)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc-8ball.el"
+ "magic 8 ball for ZenIRC"
+ (zenirc extensions magic 8ball)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc-away.el"
+ "fancy away processing for ZenIRC"
+ (zenirc extensions oink)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc-bork.el"
+ "Swedish Chef message catalog for ZenIRC"
+ (extensions)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc-color.el"
+ "color messages in zenirc"
+ (zenirc extensions)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc-complete.el"
+ "complete commands, nicknames, etc. in ZenIRC"
+ (zenirc completion extensions oink)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc-dcc.el"
+ "CTCP DCC module for ZenIRC"
+ (zenirc extensions)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc-doto.el"
+ "do things to who, list, links replies"
+ (extensions)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc-eval.el"
+ "join the \"mi emacs es tu emacs\" club"
+ (zenirc extensions eval oink)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc-fill.el"
+ "fill messages in zenirc"
+ (extensions)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc-finnish.el"
+ "Finnish message catalog for ZenIRC"
+ (extensions)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc-format.el"
+ "format nick!user@host for zenirc"
+ (zenirc extensions)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc-fortran.el"
+ "emulate F-BOT FORTRAN bot program with ZenIRC"
+ (extensions)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc-french.el"
+ "French message catalog for ZenIRC"
+ (extensions)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc-history.el"
+ "keep a history of commands in ZenIRC"
+ (zenirc history)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc-ignore.el"
+ "ignore module for zenirc."
+ (zenirc ignorance)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc-iwantop.el"
+ "IWANTOP ctcp for granting channel operator bits"
+ (zenirc extensions)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc-latin.el"
+ "Latin message catalog for ZenIRC"
+ (extensions)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc-make.el"
+ "a hack to set the load path for byte-compiling"
+ (zenirc make)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc-meditate.el"
+ "admonish others for disturbing your meditation"
+ (zenirc extensions)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc-netsplit.el"
+ "hide excessive spew from netsplits"
+ (zenirc extensions)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc-notify.el"
+ "Notifies you when people signon/off"
+ (zenirc notify extensions)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc-oink.el"
+ "auto-oink"
+ (zenirc extensions)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc-ojnk.el"
+ "Send ojnks - example of adding commands to zenirc"
+ (extensions)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc-popup.el"
+ "pop up zenirc buffer window on signal"
+ (extensions)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc-prime-p.el"
+ "flag prime numbers"
+ (zenirc extensions oink "mmmm primes")
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc-signal.el"
+ "Fancy signal formatting for ZenIRC"
+ (extensions)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc-stamp.el"
+ "timestamping for ZenIRC"
+ (extensions)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc-swedish.el"
+ "Swedish message catalog for ZenIRC"
+ (extensions)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc-yow-filter.el"
+ "neutralize yowage"
+ (zenirc extensions oink yow)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc-yow.el"
+ "important pinheadery for ZenIRC"
+ (zenirc extensions oink yow)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("zenirc.el"
+ "Waste time on Internet Relay Chat (ZenIRC client)"
+ (extensions zenirc)
+ "/home/martin/x/packages/lisp/zenirc/")
+ ("dui-registry.el"
+ "Registry of dui dictionary methods"
+ (mule dictionary)
+ "/home/martin/x/mule-packages/lisp/edict/")
+ ("dui.el"
+ "Dictionary user interface"
+ (mule dictionary)
+ "/home/martin/x/mule-packages/lisp/edict/")
+ ("edict-edit.el"
+ "Edit an EDICT dictionary."
+ (mule edict dictionary)
+ "/home/martin/x/mule-packages/lisp/edict/")
+ ("edict-english.el"
+ "English morphology rules for edict.el"
+ (mule edict dictionary)
+ "/home/martin/x/mule-packages/lisp/edict/")
+ ("edict-japanese.el"
+ "Japanese morphology rules for edict.el"
+ (mule edict dictionary)
+ "/home/martin/x/mule-packages/lisp/edict/")
+ ("edict-morphology.el"
+ "morphology rewrite engine for edict.el"
+ (mule edict dictionary)
+ "/home/martin/x/mule-packages/lisp/edict/")
+ ("edict.el"
+ "Word lookup (with deinflection) in EDICT"
+ (mule edict dictionary)
+ "/home/martin/x/mule-packages/lisp/edict/")
+ ("ts-mode.el"
+ "Insert time-stamps in buffers"
+ (minor mode)
+ "/home/martin/x/mule-packages/lisp/edict/")
+ ("egg-cwnn-leim.el"
+ "Egg/CWnn-related code for LEIM"
+ (japanese input method leim)
+ "/home/martin/x/mule-packages/lisp/egg-its/")
+ ("egg-kwnn-leim.el"
+ "Egg/CWnn-related code for LEIM"
+ (japanese input method leim)
+ "/home/martin/x/mule-packages/lisp/egg-its/")
+ ("egg-leim.el"
+ "Egg/Wnn-related code for LEIM"
+ (japanese input method leim)
+ "/home/martin/x/mule-packages/lisp/egg-its/")
+ ("egg-sj3-leim.el"
+ "Egg/SJ3-related code for LEIM"
+ (japanese input method leim)
+ "/home/martin/x/mule-packages/lisp/egg-its/")
+ ("egg-wnn.el"
+ "a inputting method communicating with [jck]server"
+ (inputting method)
+ "/home/martin/x/mule-packages/lisp/egg-its/")
+ ("cyril-jis.el"
+ "Quail package for inputting JISX0208 Cyrillic letters"
+ (multilingual input method cyrillic)
+ "/home/martin/x/mule-packages/lisp/leim/")
+ ("cyrillic.el"
+ "Quail package for inputting Cyrillic characters"
+ (multilingual input method cyrillic)
+ "/home/martin/x/mule-packages/lisp/leim/")
+ ("greek.el"
+ "Quail package for inputting Greek"
+ (multilingual input method greek)
+ "/home/martin/x/mule-packages/lisp/leim/")
+ ("hangul.el"
+ "Quail package for inputting Korean Hangul characters"
+ (multilingual input method korean hangul)
+ "/home/martin/x/mule-packages/lisp/leim/")
+ ("hangul3.el"
+ "Quail package for inputting Korean Hangul characters"
+ (multilingual input method korean hangul)
+ "/home/martin/x/mule-packages/lisp/leim/")
+ ("hanja-jis.el"
+ "Quail package for inputting Korean Hanja (JISX0208)"
+ (multilingual input method korean hangul)
+ "/home/martin/x/mule-packages/lisp/leim/")
+ ("hanja.el"
+ "Quail-package for Korean Hanja (KSC5601)"
+ (multilingual input method korean hanja)
+ "/home/martin/x/mule-packages/lisp/leim/")
+ ("ipa.el"
+ "Quail package for inputting IPA characters"
+ (multilingual input method ipa)
+ "/home/martin/x/mule-packages/lisp/leim/")
+ ("latin-pre.el"
+ "Quail packages for inputting various European characters."
+ (mule multilingual latin input method)
+ "/home/martin/x/mule-packages/lisp/leim/")
+ ("leim-list.el"
+ "list of LEIM (Library of Emacs Input Method)"
+ nil
+ "/home/martin/x/mule-packages/lisp/leim/")
+ ("py-punct.el"
+ "Quail packages for Chinese (pinyin + extra symbols)"
+ (multilingual input method chienese)
+ "/home/martin/x/mule-packages/lisp/leim/")
+ ("pypunct-b5.el"
+ "Quail packages for Chinese (pinyin + extra symbols)"
+ (multilingual input method chienese)
+ "/home/martin/x/mule-packages/lisp/leim/")
+ ("quail.el"
+ "Provides simple input method for multilingual text"
+ (mule multilingual input method)
+ "/home/martin/x/mule-packages/lisp/leim/")
+ ("symbol-ksc.el"
+ "Quail-package for Korean Symbol (KSC5601)"
+ (multilingual input method korean hangul)
+ "/home/martin/x/mule-packages/lisp/leim/")
+ ("arabic.el"
+ "pre-loaded support for Arabic."
+ nil
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("canna-leim.el"
+ "Canna-related code for LEIM"
+ (japanese input method leim)
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("canna.el"
+ "Interface to the Canna input method."
+ (canna japanese input method mule multilingual)
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("char-table.el"
+ "display table of charset"
+ (character mule)
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("chartblxmas.el"
+ "display table of charset by pop-up menu"
+ (character xemacs/mule)
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("china-util.el"
+ "utilities for Chinese"
+ (mule multilingual chinese)
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("chinese.el"
+ "Support for Chinese"
+ (multilingual chinese)
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("cyril-util.el"
+ "utilities for Cyrillic scripts"
+ (mule multilingual cyrillic)
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("english.el"
+ "English support"
+ (multibyte character character set syntax category)
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("european.el"
+ "Support for European languages"
+ (multilingual european)
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("hebrew.el"
+ "Support for Hebrew"
+ (multilingual hebrew)
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("isearch-mule.el"
+ "incremental search with front-end inputting method"
+ (search)
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("japan-util.el"
+ "utilities for Japanese"
+ (mule multilingual japanese)
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("japanese.el"
+ "Japanese support"
+ (multilingual japanese)
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("kinsoku.el"
+ "Kinsoku (line wrap) processing for XEmacs/Mule"
+ nil
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("korean.el"
+ "Support for Korean"
+ (multilingual korean)
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("misc-lang.el"
+ "support for miscellaneous languages (characters)"
+ (multilingual character set coding system)
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("mule-category.el"
+ "category functions for XEmacs/Mule."
+ nil
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("mule-ccl.el"
+ "CCL (Code Conversion Language) compiler"
+ (ccl mule multilingual character set coding-system)
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("mule-charset.el"
+ "Charset functions for Mule."
+ nil
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("mule-cmds.el"
+ "Commands for multilingual environment"
+ (mule multilingual)
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("mule-cne.el"
+ "interface between input methods Canna and EGG."
+ nil
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("mule-coding.el"
+ "Coding-system functions for Mule."
+ nil
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("mule-debug.el"
+ "debugging functions for Mule."
+ nil
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("mule-diag.el"
+ "Show diagnosis of multilingual environment (MULE)"
+ (multilingual charset coding system fontset diagnosis)
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("mule-files.el"
+ "File I/O functions for XEmacs/Mule."
+ nil
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("mule-help.el"
+ "Mule-ized Help functions "
+ (help internal)
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("mule-keyboard.el"
+ "Direct input of multilingual chars from keyboard."
+ nil
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("mule-misc.el"
+ "Miscellaneous Mule functions."
+ nil
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("mule-tty-init.el"
+ "Initialization code for console tty under MULE"
+ (mule tty console dumped)
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("mule-util.el"
+ "Utility functions for multilingual environment (mule)"
+ (mule multilingual)
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("mule-x-init.el"
+ "initialization code for X Windows under MULE"
+ (mule x11)
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("thai-util.el"
+ "utilities for Thai"
+ (mule multilingual thai)
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("thai.el"
+ "Support for Thai"
+ (multilingual thai)
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("viet-chars.el"
+ "pre-loaded support for Vietnamese, part 1."
+ nil
+ "/home/martin/x/mule-packages/lisp/mule-base/")
+ ("skk-auto.el"
+ "\e$BAw$j2>L>$N<+F0=hM}$N$?$a$N%W%m%0%i%`\e(B"
+ (japanese)
+ "/home/martin/x/mule-packages/lisp/skk/")
+ ("skk-comp.el"
+ "\e$BJd40$N$?$a$N%W%m%0%i%`\e(B"
+ (japanese)
+ "/home/martin/x/mule-packages/lisp/skk/")
+ ("skk-foreword.el"
+ "\e$BA0=q$-\e(B"
+ (japanese)
+ "/home/martin/x/mule-packages/lisp/skk/")
+ ("skk-gadget.el"
+ "\e$B<B9TJQ49$N$?$a$N%W%m%0%i%`\e(B"
+ (japanese)
+ "/home/martin/x/mule-packages/lisp/skk/")
+ ("skk-kakasi.el"
+ "KAKASI \e$B4XO"%W%m%0%i%`\e(B"
+ (japanese)
+ "/home/martin/x/mule-packages/lisp/skk/")
+ ("skk-kcode.el"
+ "\e$B4A;z%3!<%I$r;H$C$?JQ49$N$?$a$N%W%m%0%i%`\e(B"
+ (japanese)
+ "/home/martin/x/mule-packages/lisp/skk/")
+ ("skk-leim.el"
+ "SKK related code for LEIM"
+ (japanese)
+ "/home/martin/x/mule-packages/lisp/skk/")
+ ("skk-menu.el"
+ "SKK Menul related functions."
+ (japanese)
+ "/home/martin/x/mule-packages/lisp/skk/")
+ ("skk-num.el"
+ "\e$B?tCMJQ49$N$?$a$N%W%m%0%i%`\e(B"
+ (japanese)
+ "/home/martin/x/mule-packages/lisp/skk/")
+ ("skk-server.el"
+ "SKK \e$B%5!<%P!<$N$?$a$N%W%m%0%i%`\e(B"
+ (japanese)
+ "/home/martin/x/mule-packages/lisp/skk/")
+ ("skk-tree.el"
+ "\e$BLZ7A<0%G!<%?!<$r;H$C$?JQ49$N$?$a$N%W%m%0%i%`\e(B"
+ (japanese)
+ "/home/martin/x/mule-packages/lisp/skk/")
+ ("skk-vip.el"
+ "vip related functions for skk.el"
+ (japanese)
+ "/home/martin/x/mule-packages/lisp/skk/")
+ ("skk-viper.el"
+ "SKK related code for Viper"
+ (japanese)
+ "/home/martin/x/mule-packages/lisp/skk/")
+ ("abbrev.el"
+ "abbrev mode commands for Emacs"
+ (abbrev dumped)
+ "lisp/")
+ ("about.el"
+ "the About The Authors page (shameless self promotion)."
+ (extensions)
+ "lisp/")
+ ("alist.el"
+ "utility functions about assoc-list"
+ (alist)
+ "lisp/")
+ ("apropos.el"
+ "apropos commands for users and programmers."
+ (help)
+ "lisp/")
+ ("auto-save.el"
+ "Safer autosaving for EFS and tmp."
+ (extensions dumped)
+ "lisp/")
+ ("auto-show.el"
+ "perform automatic horizontal scrolling as point moves"
+ (extensions internal dumped)
+ "lisp/")
+ ("autoload.el"
+ "maintain autoloads in loaddefs.el."
+ (maint)
+ "lisp/")
+ ("backquote.el"
+ "Full backquote support for elisp. Reverse compatible too."
+ (extensions dumped)
+ "lisp/")
+ ("blessmail.el"
+ "Decide whether movemail needs special privileges."
+ (internal)
+ "lisp/")
+ ("buff-menu.el"
+ "buffer menu main function and support functions."
+ (extensions dumped)
+ "lisp/")
+ ("buffer.el"
+ "buffer routines taken from C"
+ (internal dumped)
+ "lisp/")
+ ("build-report.el"
+ "Automatically formatted build reports for XEmacs"
+ (internal)
+ "lisp/")
+ ("byte-optimize.el"
+ "the optimization passes of the emacs-lisp byte compiler."
+ (internal)
+ "lisp/")
+ ("bytecomp-runtime.el"
+ "byte-compiler support for inlining"
+ (internal dumped)
+ "lisp/")
+ ("bytecomp.el"
+ "compilation of Lisp code into byte code."
+ (internal)
+ "lisp/")
+ ("callers-of-rpt.el"
+ "generate call graph of lisp in XEmacs"
+ (internal)
+ "lisp/")
+ ("check-features.el"
+ "Do a sanity check on an XEmacs build"
+ (internal)
+ "lisp/")
+ ("cl-compat.el"
+ "Common Lisp extensions for GNU Emacs Lisp (compatibility)"
+ (extensions)
+ "lisp/")
+ ("cl-extra.el"
+ "Common Lisp extensions for GNU Emacs Lisp (part two)"
+ (extensions dumped)
+ "lisp/")
+ ("cl-macs.el"
+ "Common Lisp extensions for GNU Emacs Lisp (part four)"
+ (extensions)
+ "lisp/")
+ ("cl-seq.el"
+ "Common Lisp extensions for GNU Emacs Lisp (part three)"
+ (extensions dumped)
+ "lisp/")
+ ("cl.el"
+ "Common Lisp extensions for GNU Emacs Lisp"
+ (extensions dumped lisp)
+ "lisp/")
+ ("cleantree.el"
+ "Remove out of date .elcs in lisp directories"
+ (internal)
+ "lisp/")
+ ("cmdloop.el"
+ "support functions for the top-level command loop."
+ (internal dumped)
+ "lisp/")
+ ("code-files.el"
+ "File I/O functions for XEmacs."
+ nil
+ "lisp/")
+ ("code-process.el"
+ "Process coding functions for XEmacs."
+ (mule multilingual coding system process)
+ "lisp/")
+ ("coding.el"
+ "Coding-system functions for XEmacs."
+ nil
+ "lisp/")
+ ("config.el"
+ "access configuration parameters"
+ (configure)
+ "lisp/")
+ ("console.el"
+ "miscellaneous console functions not written in C"
+ (internal dumped)
+ "lisp/")
+ ("cus-dep.el"
+ "Find customization dependencies."
+ (internal)
+ "lisp/")
+ ("cus-edit.el"
+ "Tools for customizating Emacs and Lisp packages."
+ (help faces)
+ "lisp/")
+ ("cus-face.el"
+ "Support for Custom faces."
+ (help faces)
+ "lisp/")
+ ("cus-load.el"
+ "Batch load all available cus-load files"
+ (internal help faces)
+ "lisp/")
+ ("cus-start.el"
+ "define customization properties of builtins."
+ (internal dumped)
+ "lisp/")
+ ("custom.el"
+ "Tools for declaring and initializing options."
+ (help faces dumped)
+ "lisp/")
+ ("derived.el"
+ "allow inheritance of major modes."
+ (extensions dumped)
+ "lisp/")
+ ("device.el"
+ "miscellaneous device functions not written in C"
+ (internal dumped)
+ "lisp/")
+ ("dialog.el"
+ "Dialog-box support for XEmacs"
+ (extensions internal dumped)
+ "lisp/")
+ ("disass.el"
+ "disassembler for compiled Emacs Lisp code"
+ (internal)
+ "lisp/")
+ ("disp-table.el"
+ "functions for dealing with char tables."
+ (i18n internal)
+ "lisp/")
+ ("dragdrop.el"
+ "window system-independent Drag'n'Drop support."
+ (drag drop dumped)
+ "lisp/")
+ ("dump-paths.el"
+ "set up XEmacs paths for dumping"
+ (internal dumped)
+ "lisp/")
+ ("etags.el"
+ "etags facility for Emacs"
+ (tools)
+ "lisp/")
+ ("events.el"
+ "event functions for XEmacs."
+ (internal event dumped)
+ "lisp/")
+ ("extents.el"
+ "miscellaneous extent functions not written in C"
+ (internal dumped)
+ "lisp/")
+ ("faces.el"
+ "Lisp interface to the C \"face\" structure"
+ (faces internal dumped)
+ "lisp/")
+ ("files-nomule.el"
+ "file I/O stubs when not under Mule."
+ (extensions dumped)
+ "lisp/")
+ ("files.el"
+ "file input and output commands for XEmacs."
+ (extensions dumped)
+ "lisp/")
+ ("fill.el"
+ "fill commands for XEmacs."
+ (wp dumped)
+ "lisp/")
+ ("find-paths.el"
+ "setup various XEmacs paths"
+ (internal dumped)
+ "lisp/")
+ ("finder.el"
+ "topic & keyword-based code finder"
+ (help)
+ "lisp/")
+ ("float-sup.el"
+ "detect absence of floating-point support in XEmacs runtime"
+ (internal dumped)
+ "lisp/")
+ ("font-lock.el"
+ "decorating source files with fonts/colors based on syntax"
+ (languages faces)
+ "lisp/")
+ ("font.el"
+ "New font model"
+ (faces)
+ "lisp/")
+ ("fontl-hooks.el"
+ "pre-loaded stuff for font-lock."
+ nil
+ "lisp/")
+ ("format.el"
+ "read and save files in multiple formats"
+ (extensions dumped)
+ "lisp/")
+ ("frame.el"
+ "multi-frame management independent of window systems."
+ (internal dumped)
+ "lisp/")
+ ("glyphs.el"
+ "Lisp interface to C glyphs"
+ (extensions internal dumped)
+ "lisp/")
+ ("gnuserv.el"
+ "Lisp interface code between Emacs and gnuserv"
+ (environment processes terminals)
+ "lisp/")
+ ("gui.el"
+ "Basic GUI functions for XEmacs."
+ (internal dumped)
+ "lisp/")
+ ("help-macro.el"
+ "Makes command line help such as help-for-help"
+ nil
+ "lisp/")
+ ("help-nomule.el"
+ "Help functions when not in Mule"
+ (help internal dumped)
+ "lisp/")
+ ("help.el"
+ "help commands for XEmacs."
+ (help internal dumped)
+ "lisp/")
+ ("hyper-apropos.el"
+ "Hypertext emacs lisp documentation interface."
+ (lisp tools help docs matching)
+ "lisp/")
+ ("indent.el"
+ "indentation commands for XEmacs"
+ (lisp languages tools dumped)
+ "lisp/")
+ ("info.el"
+ "info package for Emacs."
+ (help)
+ "lisp/")
+ ("isearch-mode.el"
+ "Incremental search minor mode."
+ (extensions dumped)
+ "lisp/")
+ ("iso8859-1.el"
+ "Set case and syntax tables for Latin 1"
+ (internal dumped)
+ "lisp/")
+ ("itimer-autosave.el"
+ "Autosave functions with itimers"
+ (internal dumped)
+ "lisp/")
+ ("keydefs.el"
+ "Define standard keybindings."
+ (internal dumped)
+ "lisp/")
+ ("keymap.el"
+ "Keymap functions for XEmacs."
+ (internals dumped)
+ "lisp/")
+ ("ldap.el"
+ "LDAP support for Emacs"
+ (help comm)
+ "lisp/")
+ ("lib-complete.el"
+ "Completion on the lisp search path"
+ (lisp extensions dumped)
+ "lisp/")
+ ("lisp-mnt.el"
+ "minor mode for Emacs Lisp maintainers"
+ (docs maint)
+ "lisp/")
+ ("lisp-mode.el"
+ "Lisp mode, and its idiosyncratic commands."
+ (lisp languages dumped)
+ "lisp/")
+ ("lisp.el"
+ "Lisp editing commands for XEmacs"
+ (lisp languages dumped)
+ "lisp/")
+ ("list-mode.el"
+ "Major mode for buffers containing lists of items"
+ (extensions dumped)
+ "lisp/")
+ ("loaddefs.el"
+ "define standard autoloads of other files"
+ (internal)
+ "lisp/")
+ ("loadhist.el"
+ "lisp functions for working with feature groups"
+ (internal dumped)
+ "lisp/")
+ ("loadup.el"
+ "load up standardly loaded Lisp files for XEmacs."
+ (internal dumped)
+ "lisp/")
+ ("make-docfile.el"
+ "Cache docstrings in external file"
+ (internal)
+ "lisp/")
+ ("map-ynp.el"
+ "General-purpose boolean question-asker."
+ (lisp extensions dumped)
+ "lisp/")
+ ("menubar-items.el"
+ "Menubar and popup-menu content for XEmacs."
+ (frames extensions internal dumped)
+ "lisp/")
+ ("menubar.el"
+ "Menubar support for XEmacs"
+ (internal extensions dumped)
+ "lisp/")
+ ("minibuf.el"
+ "Minibuffer functions for XEmacs"
+ (internal dumped)
+ "lisp/")
+ ("misc.el"
+ "miscellaneous functions for XEmacs"
+ (extensions dumped)
+ "lisp/")
+ ("mode-motion.el"
+ "Mode-specific mouse-highlighting of text."
+ (internal mouse dumped)
+ "lisp/")
+ ("modeline.el"
+ "modeline hackery."
+ (extensions dumped)
+ "lisp/")
+ ("mouse.el"
+ "window system-independent mouse support."
+ (mouse dumped)
+ "lisp/")
+ ("msw-faces.el"
+ "mswindows-specific face stuff."
+ nil
+ "lisp/")
+ ("msw-glyphs.el"
+ "Support for glyphs in ms windows"
+ (extensions internal dumped)
+ "lisp/")
+ ("msw-init.el"
+ "initialization code for mswindows"
+ nil
+ "lisp/")
+ ("msw-mouse.el"
+ "Mouse support for MS Windows."
+ (mouse dumped)
+ "lisp/")
+ ("msw-select.el"
+ "Lisp interface to mswindows selections."
+ (extensions dumped)
+ "lisp/")
+ ("multicast.el"
+ "lisp frontend for multicast connections in XEmacs"
+ (dumped comm processes)
+ "lisp/")
+ ("mwheel.el"
+ "Mouse support for MS intelli-mouse type mice"
+ (mouse)
+ "lisp/")
+ ("objects.el"
+ "Lisp interface to C window-system objects"
+ (faces internal dumped)
+ "lisp/")
+ ("obsolete.el"
+ "obsoleteness support"
+ (internal dumped)
+ "lisp/")
+ ("package-admin.el"
+ "Installation and Maintenance of XEmacs packages"
+ (internal)
+ "lisp/")
+ ("package-get.el"
+ "Retrieve XEmacs package"
+ (internal)
+ "lisp/")
+ ("package-info.el"
+ "Generate information about an XEmacs package"
+ (internal)
+ "lisp/")
+ ("packages.el"
+ "Low level support for XEmacs packages"
+ (internal lisp dumped)
+ "lisp/")
+ ("page.el"
+ "page motion commands for emacs."
+ (extensions dumped)
+ "lisp/")
+ ("paragraphs.el"
+ "paragraph and sentence parsing."
+ (wp dumped)
+ "lisp/")
+ ("paths.el"
+ "define pathnames for use by various Emacs commands."
+ (internal dumped)
+ "lisp/")
+ ("picture.el"
+ "\"Picture mode\" -- editing using quarter-plane screen model."
+ nil
+ "lisp/")
+ ("process.el"
+ "commands for subprocesses; split out of simple.el"
+ (internal processes dumped)
+ "lisp/")
+ ("rect.el"
+ "rectangle functions for XEmacs."
+ (internal)
+ "lisp/")
+ ("register.el"
+ "register commands for Emacs."
+ (internal dumped)
+ "lisp/")
+ ("replace.el"
+ "search and replace commands for XEmacs."
+ (dumped matching)
+ "lisp/")
+ ("scrollbar.el"
+ "Scrollbar support for XEmacs"
+ (internal extensions dumped)
+ "lisp/")
+ ("select.el"
+ "Lisp interface to windows selections."
+ (extensions dumped)
+ "lisp/")
+ ("setup-paths.el"
+ "setup various XEmacs paths"
+ (internal dumped)
+ "lisp/")
+ ("shadow.el"
+ "Locate Emacs Lisp file shadowings."
+ (lisp)
+ "lisp/")
+ ("simple.el"
+ "basic editing commands for XEmacs"
+ (lisp extensions internal dumped)
+ "lisp/")
+ ("site-load.el"
+ "Template file for site-wide XEmacs customization"
+ (internal)
+ "lisp/")
+ ("sound.el"
+ "Loading sound files in XEmacs"
+ (internal)
+ "lisp/")
+ ("specifier.el"
+ "Lisp interface to specifiers"
+ (internal dumped)
+ "lisp/")
+ ("startup.el"
+ "process XEmacs shell arguments"
+ (internal dumped)
+ "lisp/")
+ ("subr.el"
+ "basic lisp subroutines for XEmacs"
+ (extensions dumped)
+ "lisp/")
+ ("symbol-syntax.el"
+ "find chars with symbol syntax"
+ (matching)
+ "lisp/")
+ ("symbols.el"
+ "functions for working with symbols and symbol values"
+ (internal)
+ "lisp/")
+ ("syntax.el"
+ "Syntax-table hacking stuff, moved from syntax.c"
+ nil
+ "lisp/")
+ ("text-mode.el"
+ "text mode, and its idiosyncratic commands."
+ (wp dumped)
+ "lisp/")
+ ("text-props.el"
+ "implements properties of characters"
+ (extensions wp faces dumped)
+ "lisp/")
+ ("toolbar-items.el"
+ "Static initialization of XEmacs toolbar"
+ (frames dumped)
+ "lisp/")
+ ("toolbar.el"
+ "Toolbar support for XEmacs"
+ (extensions internal dumped)
+ "lisp/")
+ ("tty-init.el"
+ "initialization code for tty's"
+ (terminals dumped)
+ "lisp/")
+ ("undo-stack.el"
+ "An \"undoable stack\" object."
+ (extensions dumped)
+ "lisp/")
+ ("update-elc.el"
+ "Bytecompile out-of-date dumped files"
+ (internal)
+ "lisp/")
+ ("userlock.el"
+ "handle file access contention between multiple users"
+ (internal)
+ "lisp/")
+ ("version.el"
+ "Record version number of Emacs."
+ (internal dumped)
+ "lisp/")
+ ("very-early-lisp.el"
+ "Lisp support always needed by temacs"
+ (internal dumped)
+ "lisp/")
+ ("view-less.el"
+ "Minor mode for browsing files with keybindings like `less'"
+ (wp unix)
+ "lisp/")
+ ("wid-browse.el"
+ "Functions for browsing widgets."
+ (extensions)
+ "lisp/")
+ ("wid-edit.el"
+ "Functions for creating and using widgets."
+ (extensions)
+ "lisp/")
+ ("widget.el"
+ "a library of user interface components."
+ (help extensions faces hypermedia dumped)
+ "lisp/")
+ ("window-xemacs.el"
+ "XEmacs window commands aside from those written in C."
+ (frames extensions dumped)
+ "lisp/")
+ ("window.el"
+ "XEmacs window commands aside from those written in C."
+ (frames extensions dumped)
+ "lisp/")
+ ("winnt.el"
+ "Lisp routines for Windows NT."
+ (mouse dumped)
+ "lisp/")
+ ("x-compose.el"
+ "Compose-key processing in XEmacs"
+ (i18n)
+ "lisp/")
+ ("x-faces.el"
+ "X-specific face frobnication, aka black magic."
+ (extensions internal dumped)
+ "lisp/")
+ ("x-font-menu.el"
+ "Managing menus of X fonts."
+ nil
+ "lisp/")
+ ("x-init.el"
+ "initialization code for X windows"
+ (terminals dumped)
+ "lisp/")
+ ("x-iso8859-1.el"
+ "Mapping between X keysym names and ISO 8859-1"
+ (extensions internal dumped)
+ "lisp/")
+ ("x-misc.el"
+ "miscellaneous X functions."
+ (extensions dumped)
+ "lisp/")
+ ("x-mouse.el"
+ "Mouse support for X window system."
+ (mouse dumped)
+ "lisp/")
+ ("x-scrollbar.el"
+ "scrollbar resourcing and such."
+ (extensions dumped)
+ "lisp/")
+ ("x-select.el"
+ "Lisp interface to X Selections."
+ (extensions dumped)
+ "lisp/")
+ ("x-win-sun.el"
+ "runtime initialization for Sun X servers and keyboards"
+ (terminals)
+ "lisp/")
+ ("x-win-xfree86.el"
+ "runtime initialization for XFree86 servers"
+ (terminals)
+ "lisp/")
+ ("AT386.el"
+ "terminal support package for IBM AT keyboards"
+ (terminals)
+ "lisp/term/")
+ ("apollo.el"
+ "Apollo Graphics Primitive Support Functions"
+ (hardware)
+ "lisp/term/")
+ ("bg-mouse.el"
+ "GNU Emacs code for BBN Bitgraph mouse."
+ (hardware)
+ "lisp/term/")
+ ("internal.el"
+ "setup support for PC keyboards and screens, internal terminal"
+ nil
+ "lisp/term/")
+ ("keyswap.el"
+ "swap BS and DEL keys"
+ (terminals)
+ "lisp/term/")
+ ("linux.el"
+ "define function key sequences for the Linux console"
+ (terminals)
+ "lisp/term/")
+ ("lk201.el"
+ "basic editing commands for XEmacs"
+ nil
+ "lisp/term/")
+ ("news.el"
+ "keypad and function key bindings for the Sony NEWS keyboard"
+ (terminals)
+ "lisp/term/")
+ ("pc-win.el"
+ "setup support for `PC windows' (whatever that is)."
+ nil
+ "lisp/term/")
+ ("scoansi.el"
+ "set up key names for SCO ansi console"
+ nil
+ "lisp/term/")
+ ("sun-mouse.el"
+ "mouse handling for Sun windows"
+ (hardware)
+ "lisp/term/")
+ ("sun.el"
+ "keybinding for standard default sunterm keys"
+ (terminals)
+ "lisp/term/")
+ ("sup-mouse.el"
+ "supdup mouse support for lisp machines"
+ (hardware)
+ "lisp/term/")
+ ("tvi970.el"
+ "terminal support for the Televideo 970"
+ (terminals)
+ "lisp/term/")
+ ("vt-control.el"
+ "Common VTxxx control functions"
+ (terminals)
+ "lisp/term/")
+ ("vt100-led.el"
+ "functions for LED control on VT-100 terminals & clones."
+ (hardware)
+ "lisp/term/")
+ ("vt100.el"
+ "define VT100 function key sequences in function-key-map"
+ (terminals)
+ "lisp/term/")
+ ("win32-win.el"
+ "parse switches controlling interface with win32"
+ (terminals)
+ "lisp/term/")
+ ("wyse50.el"
+ "terminal support code for Wyse 50"
+ (terminals)
+ "lisp/term/")
+ ("xterm.el"
+ "define function key sequences for xterm"
+ (terminals)
+ "lisp/term/")
+))
+
+(provide 'finder-inf)
+
+;;; finder-inf.el ends here
(set-face-font 'default new-default-face-font
(and font-menu-this-frame-only-p (selected-frame)))
;; OK Let Customize do it.
- (custom-set-face-update-spec 'default
- (list (list 'type (device-type)))
- (list :family family
- :size (concat
- (int-to-string
- (/ (or size from-size)
- (specifier-instance font-menu-size-scaling
- (selected-device))))
- "pt")))
+ (when (and family (not (equal family from-family)))
+ (setq new-props (append (list :family family) new-props)))
+ (when (and size (not (equal size from-size)))
+ (setq new-props (append
+ (list :size (concat (int-to-string (/ size (specifier-instance
+ font-menu-size-scaling
+ (selected-device)))) "pt")) new-props)))
+ (custom-set-face-update-spec 'default '((type x)) new-props)
(message "Font %s" (face-font-name 'default)))))
+++ /dev/null
-;;; ethiopic.el --- Support for Ethiopic
-
-;; Copyright (C) 1995 Electrotechnical Laboratory, JAPAN.
-;; Licensed to the Free Software Foundation.
-;; Copyright (C) 1997 MORIOKA Tomohiko
-
-;; Keywords: multilingual, Ethiopic
-
-;; This file is part of XEmacs.
-
-;; XEmacs is free software; you can redistribute it and/or modify it
-;; under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
-;; any later version.
-
-;; XEmacs is distributed in the hope that it will be useful, but
-;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;; General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with XEmacs; see the file COPYING. If not, write to the Free
-;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-;; 02111-1307, USA.
-
-;; Author: TAKAHASHI Naoto <ntakahas@etl.go.jp>
-;; modified by MORIOKA Tomohiko <morioka@jaist.ac.jp> for XEmacs.
-
-;;; Code:
-
-;; Ethiopic
-(make-charset 'ethiopic "Ethiopic"
- '(registry "Ethio"
- dimension 2
- chars 94
- final ?3
- graphic 0
- ))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; ETHIOPIC
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(define-category ?E "Ethiopic (Ge'ez) character.")
-(modify-category-entry 'ethiopic ?E)
-\f
-(define-ccl-program ccl-encode-ethio-font
- '(0
- ;; In: R0:ethiopic (not checked)
- ;; R1:position code 1
- ;; R2:position code 2
- ;; Out: R1:font code point 1
- ;; R2:font code point 2
- ((r1 -= 33)
- (r2 -= 33)
- (r1 *= 94)
- (r2 += r1)
- (if (r2 < 256)
- (r1 = ?\x12)
- (if (r2 < 448)
- ((r1 = ?\x13) (r2 -= 256))
- ((r1 = ?\xfd) (r2 -= 208))
- ))))
- "CCL program to encode an Ethiopic code to code point of Ethiopic font.")
-
-;; (setq font-ccl-encoder-alist
-;; (cons (cons "ethiopic" ccl-encode-ethio-font) font-ccl-encoder-alist))
-(set-charset-ccl-program 'ethiopic ccl-encode-ethio-font)
-
-(set-language-info-alist
- "Ethiopic" '((setup-function . setup-ethiopic-environment-internal)
- (exit-function . exit-ethiopic-environment)
- (charset ethiopic)
- (coding-system iso-2022-7bit)
- (coding-priority iso-2022-7bit)
- (input-method . "ethiopic")
- (features ethio-util)
- (sample-text . "\e$(3$Q#U!.\e(B")
- (documentation . t)))
-
-;;; ethiopic.el ends here
;;; mule-category.el --- category functions for XEmacs/Mule.
;; Copyright (C) 1992,93,94,95 Free Software Foundation, Inc.
-;; Copyright (C) 1995, 1997, 1999 Electrotechnical Laboratory, JAPAN.
-;; Licensed to the Free Software Foundation.
;; Copyright (C) 1995 Amdahl Corporation.
;; Copyright (C) 1995 Sun Microsystems.
(let (i l)
(define-category ?a "ASCII character set.")
- (define-category ?l "Latin-1 through Latin-5 character set")
(setq i 32)
(while (< i 127)
(modify-category-entry i ?a)
- (modify-category-entry i ?l)
(setq i (1+ i)))
(setq l predefined-category-list)
(while l
(modify-category-entry (car (car l)) (nth 1 (car l)))
(setq l (cdr l))))
-;;; Setting word boundary.
-
-(setq word-combining-categories
- '((?l . ?l)))
-
-(setq word-separating-categories ; (2-byte character sets)
- '((?A . ?K) ; Alpha numeric - Katakana
- (?A . ?C) ; Alpha numeric - Chinese
- (?H . ?A) ; Hiragana - Alpha numeric
- (?H . ?K) ; Hiragana - Katakana
- (?H . ?C) ; Hiragana - Chinese
- (?K . ?A) ; Katakana - Alpha numeric
- (?K . ?C) ; Katakana - Chinese
- (?C . ?A) ; Chinese - Alpha numeric
- (?C . ?K) ; Chinese - Katakana
- ))
-
;;; At the present, I know Japanese and Chinese text can
;;; break line at any point under a restriction of 'kinsoku'.
(defvar word-across-newline "\\(\\cj\\|\\cc\\|\\ct\\)"
;;; mule-charset.el --- Charset functions for Mule.
-
;; Copyright (C) 1992 Free Software Foundation, Inc.
;; Copyright (C) 1995 Amdahl Corporation.
;; Copyright (C) 1996 Sun Microsystems.
-;; Author: Unknown
-;; Keywords: i18n, mule, internal
-
;; This file is part of XEmacs.
;; XEmacs is free software; you can redistribute it and/or modify it
;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
;; Boston, MA 02111-1307, USA.
-;;; Synched up with: Not synched. API at source level synched with FSF 20.3.9.
-
-;;; Commentary:
+\f
+;;;; Composite character support
-;; These functions are not compatible at the bytecode level with Emacs/Mule,
-;; and they never will be. -sb [1999-05-26]
+(defun compose-region (start end &optional buffer)
+ "Compose characters in the current region into one composite character.
+From a Lisp program, pass two arguments, START to END.
+The composite character replaces the composed characters.
+BUFFER defaults to the current buffer if omitted."
+ (interactive "r")
+ (let ((ch (make-composite-char (buffer-substring start end buffer))))
+ (delete-region start end buffer)
+ (insert-char ch nil nil buffer)))
+
+(defun decompose-region (start end &optional buffer)
+ "Decompose any composite characters in the current region.
+From a Lisp program, pass two arguments, START to END.
+This converts each composite character into one or more characters,
+the individual characters out of which the composite character was formed.
+Non-composite characters are left as-is. BUFFER defaults to the current
+buffer if omitted."
+ (interactive "r")
+ (save-excursion
+ (set-buffer buffer)
+ (save-restriction
+ (narrow-to-region start end)
+ (goto-char (point-min))
+ (let ((compcharset (get-charset 'composite)))
+ (while (< (point) (point-max))
+ (let ((ch (char-after (point))))
+ (if (eq compcharset (char-charset ch))
+ (progn
+ (delete-char 1)
+ (insert (composite-char-string ch))))))))))
-;;; Code:
\f
;;;; Classifying text according to charsets
\f
;;;; Charset accessors
-(defun charset-iso-graphic-plane (charset)
+(defun charset-graphic (charset)
"Return the `graphic' property of CHARSET.
See `make-charset'."
(charset-property charset 'graphic))
-(defun charset-iso-final-char (charset)
+(defun charset-final (charset)
"Return the final byte of the ISO 2022 escape sequence designating CHARSET."
(charset-property charset 'final))
"Return the number of characters per dimension of CHARSET."
(charset-property charset 'chars))
-(defun charset-width (charset)
+(defun charset-columns (charset)
"Return the number of display columns per character of CHARSET.
This only applies to TTY mode (under X, the actual display width can
be automatically determined)."
(charset-property charset 'columns))
-;; #### FSFmacs returns 0
(defun charset-direction (charset)
- "Return the display direction (0 for `l2r' or 1 for `r2l') of CHARSET.
-Only left-to-right is currently implemented."
- (if (eq (charset-property charset 'direction) 'l2r)
- 0
- 1))
+ "Return the display direction (`l2r' or `r2l') of CHARSET."
+ (charset-property charset 'direction))
-;; Not in Emacs/Mule
(defun charset-registry (charset)
"Return the registry of CHARSET.
This is a regular expression matching the registry field of fonts
See `make-charset'."
(charset-property charset 'ccl-program))
-(defun charset-bytes (charset)
- "Useless in XEmacs, returns 1."
- 1)
-
-(define-obsolete-function-alias 'charset-columns 'charset-width) ;; 19990409
-(define-obsolete-function-alias 'charset-final 'charset-iso-final-char) ;; 19990409
-(define-obsolete-function-alias 'charset-graphic 'charset-iso-graphic-plane) ;; 19990409
-(define-obsolete-function-alias 'charset-doc-string 'charset-description) ;; 19990409
+(defun charset-leading-byte (charset)
+ "Return the leading byte of CHARSET.
+See `make-charset'."
+ (charset-property charset 'leading-byte))
;;;; Define setf methods for all settable Charset properties
(defsetf charset-registry set-charset-registry)
(defsetf charset-ccl-program set-charset-ccl-program)
-
-;;; FSF compatibility functions
-(defun charset-after (&optional pos)
- "Return charset of a character in current buffer at position POS.
-If POS is nil, it defauls to the current point.
-If POS is out of range, the value is nil."
- (when (null pos)
- (setq pos (point)))
- (check-argument-type 'integerp pos)
- (unless (or (< pos (point-min))
- (> pos (point-max)))
- (char-charset (char-after pos))))
-
-;; Yuck!
-;; We're not going to support this.
-;(defun charset-info (charset)
-; "Return a vector of information of CHARSET.
-;The elements of the vector are:
-; CHARSET-ID, BYTES, DIMENSION, CHARS, WIDTH, DIRECTION,
-; LEADING-CODE-BASE, LEADING-CODE-EXT,
-; ISO-FINAL-CHAR, ISO-GRAPHIC-PLANE,
-; REVERSE-CHARSET, SHORT-NAME, LONG-NAME, DESCRIPTION,
-; PLIST,
-;where
-;CHARSET-ID (integer) is the identification number of the charset.
-;BYTES (integer) is the length of multi-byte form of a character in
-; the charset: one of 1, 2, 3, and 4.
-;DIMENSION (integer) is the number of bytes to represent a character of
-;the charset: 1 or 2.
-;CHARS (integer) is the number of characters in a dimension: 94 or 96.
-;WIDTH (integer) is the number of columns a character in the charset
-; occupies on the screen: one of 0, 1, and 2.
-;DIRECTION (integer) is the rendering direction of characters in the
-; charset when rendering. If 0, render from left to right, else
-; render from right to left.
-;LEADING-CODE-BASE (integer) is the base leading-code for the
-; charset.
-;LEADING-CODE-EXT (integer) is the extended leading-code for the
-; charset. All charsets of less than 0xA0 has the value 0.
-;ISO-FINAL-CHAR (character) is the final character of the
-; corresponding ISO 2022 charset.
-;ISO-GRAPHIC-PLANE (integer) is the graphic plane to be invoked
-; while encoding to variants of ISO 2022 coding system, one of the
-; following: 0/graphic-plane-left(GL), 1/graphic-plane-right(GR).
-;REVERSE-CHARSET (integer) is the charset which differs only in
-; LEFT-TO-RIGHT value from the charset. If there's no such a
-; charset, the value is -1.
-;SHORT-NAME (string) is the short name to refer to the charset.
-;LONG-NAME (string) is the long name to refer to the charset
-;DESCRIPTION (string) is the description string of the charset.
-;PLIST (property list) may contain any type of information a user
-; want to put and get by functions `put-charset-property' and
-; `get-charset-property' respectively."
-; (vector
-; (charset-id charset)
-; 1
-; (charset-dimension charset)
-; (charset-chars charset)
-; (charset-width charset)
-; (charset-direction charset)
-; nil ;; (charset-leading-code-base (charset))
-; nil ;; (charset-leading-code-ext (charset))
-; (charset-iso-final-char charset)
-; (charset-iso-graphic-plane charset)
-; -1
-; (charset-short-name charset)
-; (charset-long-name charset)
-; (charset-description charset)
-; (charset-plist charset)))
-
-;(make-compatible 'charset-info "Don't use this if you can help it.")
-
-(defun define-charset (charset-id charset property-vector)
- "Define CHARSET-ID as the identification number of CHARSET with INFO-VECTOR.
-If CHARSET-ID is nil, it is decided automatically, which means CHARSET is
- treated as a private charset.
-INFO-VECTOR is a vector of the format:
- [DIMENSION CHARS WIDTH DIRECTION ISO-FINAL-CHAR ISO-GRAPHIC-PLANE
- SHORT-NAME LONG-NAME DESCRIPTION]
-The meanings of each elements is as follows:
-DIMENSION (integer) is the number of bytes to represent a character: 1 or 2.
-CHARS (integer) is the number of characters in a dimension: 94 or 96.
-WIDTH (integer) is the number of columns a character in the charset
-occupies on the screen: one of 0, 1, and 2.
-
-DIRECTION (integer) is the rendering direction of characters in the
-charset when rendering. If 0, render from left to right, else
-render from right to left.
-
-ISO-FINAL-CHAR (character) is the final character of the
-corresponding ISO 2022 charset.
-
-ISO-GRAPHIC-PLANE (integer) is the graphic plane to be invoked
-while encoding to variants of ISO 2022 coding system, one of the
-following: 0/graphic-plane-left(GL), 1/graphic-plane-right(GR).
-
-
-SHORT-NAME (string) is the short name to refer to the charset.
-
-LONG-NAME (string) is the long name to refer to the charset.
-
-DESCRIPTION (string) is the description string of the charset."
- (make-charset charset (aref property-vector 8)
- (list
- 'short-name (aref property-vector 6)
- 'long-name (aref property-vector 7)
- 'dimension (aref property-vector 0)
- 'columns (aref property-vector 2)
- 'chars (aref property-vector 1)
- 'final (aref property-vector 4)
- 'graphic (aref property-vector 5)
- 'direction (aref property-vector 3))))
-
-(make-compatible 'define-charset "")
-
-;;; Charset property
-
-(defalias 'get-charset-property 'get)
-(defalias 'put-charset-property 'put)
-(defalias 'charset-plist 'object-plist)
-(defalias 'set-charset-plist 'setplist)
-
-;;; mule-charset.el ends here
nil t nil 'input-method-history)
;;default)
))
- (if (string-equal input-method "")
- (setq input-method default))
(if (> (length input-method) 0)
input-method
(if inhibit-null
--- /dev/null
+;;; mule-files.el --- File I/O functions for XEmacs/Mule.
+
+;; Copyright (C) 1992,93,94,95 Free Software Foundation, Inc.
+;; Copyright (C) 1995 Amdahl Corporation.
+;; Copyright (C) 1995 Sun Microsystems.
+
+;; This file is part of XEmacs.
+
+;; XEmacs is free software; you can redistribute it and/or modify it
+;; under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; XEmacs is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;; General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with XEmacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Derived from mule.el in the original Mule but heavily modified
+;;; by Ben Wing. Mostly moved to code-files.el
+
+;; 1997/3/11 modified by MORIOKA Tomohiko to sync with Emacs 20 API.
+
+;;; Code:
+
+(setq-default buffer-file-coding-system 'iso-2022-8)
+
+;;; mule-files.el ends here
+++ /dev/null
-;;; thai-xtis.el --- Thai support for pre-composed font (for XTIS).
-
-;; Copyright (C) 1999 Electrotechnical Laboratory, JAPAN.
-;; Licensed to the Free Software Foundation.
-
-;; Author: TAKAHASHI Naoto <ntakahas@etl.go.jp>
-;; MORIOKA Tomohiko <tomo@etl.go.jp>
-;; Created: 1998-03-27 for Emacs-20.3 by TAKAHASHI Naoto
-;; 1999-03-29 imported and modified for XEmacs by MORIOKA Tomohiko
-
-;; Keywords: mule, multilingual, Thai, XTIS
-
-;; This file is part of XEmacs.
-
-;; XEmacs is free software; you can redistribute it and/or modify it
-;; under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
-;; any later version.
-
-;; XEmacs is distributed in the hope that it will be useful, but
-;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;; General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with XEmacs; see the file COPYING. If not, write to the Free
-;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-;; 02111-1307, USA.
-
-;;; Commentary:
-
-;; For Thai, the pre-composed character set proposed by
-;; Virach Sornlertlamvanich <virach@links.nectec.or.th> is supported.
-
-;;; Code:
-
-(when (featurep 'xemacs)
- (make-charset 'thai-xtis "Precomposed Thai (XTIS by Virach)."
- '(registry "xtis-0"
- dimension 2
- columns 1
- chars 94
- final ??
- graphic 0))
-
- (modify-syntax-entry 'thai-xtis "w")
-
- (define-category ?T "Precomposed Thai character.")
- (modify-category-entry 'thai-xtis ?T)
- )
-
-
-(defvar leading-code-private-21 #x9F)
-
-(defconst thai-xtis-leading-code
- (concat (char-to-string leading-code-private-21)
- (char-to-string (charset-id 'thai-xtis))))
-
-(define-ccl-program ccl-thai-xtis-consonant
- `(0
- (if (r1 == 0)
- ((write ,thai-xtis-leading-code)
- (write r0)
- (r1 = r2))
- (if (r1 == r2)
- ((write r1)
- (write ,thai-xtis-leading-code)
- (write r0))
- ((write r1)
- (write ,thai-xtis-leading-code)
- (write r0)
- (r1 = r2))))))
-
-(define-ccl-program ccl-thai-xtis-vowel-d1
- `(0
- (if (r1 == 0)
- ((write ,thai-xtis-leading-code)
- (write r0 r2))
- (if (r1 == r2)
- (r1 = ?\xb8)
- ((write r1)
- (write ,thai-xtis-leading-code)
- (write r0 r2)
- (r1 = 0))))))
-
-(define-ccl-program ccl-thai-xtis-vowel
- `(0
- (if (r1 == 0)
- ((write ,thai-xtis-leading-code)
- (write r0 r2))
- (if (r1 == r2)
- (r1 = ((r0 - 188) << 3))
- ((write r1)
- (write ,thai-xtis-leading-code)
- (write r0 r2)
- (r1 = 0))))))
-
-(define-ccl-program ccl-thai-xtis-vowel-ee
- `(0
- (if (r1 == 0)
- ((write ,thai-xtis-leading-code)
- (write r0 r2))
- (if (r1 == r2)
- (r1 = ?\xf8)
- ((write r1)
- (write ,thai-xtis-leading-code)
- (write r0 r2)
- (r1 = 0))))))
-
-(define-ccl-program ccl-thai-xtis-tone
- `(0
- (if (r1 == 0)
- ((write ,thai-xtis-leading-code)
- (write r0 r2))
- (if (r1 == r2)
- ((r0 -= 54)
- (write r0)
- (r1 = 0))
- ((r1 += (r0 - ?\xe6))
- (write r1)
- (r1 = 0))))))
-
-(define-ccl-program ccl-thai-xtis-symbol
- `(0
- (if (r1 == 0)
- ((write ,thai-xtis-leading-code)
- (write r0 r2))
- (if (r1 == r2)
- ((write r2)
- (write ,thai-xtis-leading-code)
- (write r0 r2)
- (r1 = 0))
- ((write r1)
- (write ,thai-xtis-leading-code)
- (write r0 r2)
- (r1 = 0))))))
-
-(define-ccl-program ccl-decode-thai-xtis
- `(4
- ((read r0)
- (r1 = 0)
- (r2 = ?\xb0)
- (loop
- (if (r0 < 161)
- (if (r1 == 0)
- (write r0)
- (if (r1 == r2)
- ((write r2 r0)
- (r1 = 0))
- ((write r1 r0)
- (r1 = 0))))
- (branch (r0 - 161)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-symbol)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-symbol)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-consonant)
- (call ccl-thai-xtis-symbol)
- (call ccl-thai-xtis-symbol)
- (call ccl-thai-xtis-vowel-d1)
- (call ccl-thai-xtis-symbol)
- (call ccl-thai-xtis-symbol)
- (call ccl-thai-xtis-vowel)
- (call ccl-thai-xtis-vowel)
- (call ccl-thai-xtis-vowel)
- (call ccl-thai-xtis-vowel)
- (call ccl-thai-xtis-vowel)
- (call ccl-thai-xtis-vowel)
- (call ccl-thai-xtis-vowel)
- nil
- nil
- nil
- nil
- (call ccl-thai-xtis-symbol)
- (call ccl-thai-xtis-symbol)
- (call ccl-thai-xtis-symbol)
- (call ccl-thai-xtis-symbol)
- (call ccl-thai-xtis-symbol)
- (call ccl-thai-xtis-symbol)
- (call ccl-thai-xtis-symbol)
- (call ccl-thai-xtis-symbol)
- (call ccl-thai-xtis-tone)
- (call ccl-thai-xtis-tone)
- (call ccl-thai-xtis-tone)
- (call ccl-thai-xtis-tone)
- (call ccl-thai-xtis-tone)
- (call ccl-thai-xtis-tone)
- (call ccl-thai-xtis-tone)
- (call ccl-thai-xtis-vowel-ee)
- (call ccl-thai-xtis-symbol)
- (call ccl-thai-xtis-symbol)
- (call ccl-thai-xtis-symbol)
- (call ccl-thai-xtis-symbol)
- (call ccl-thai-xtis-symbol)
- (call ccl-thai-xtis-symbol)
- (call ccl-thai-xtis-symbol)
- (call ccl-thai-xtis-symbol)
- (call ccl-thai-xtis-symbol)
- (call ccl-thai-xtis-symbol)
- (call ccl-thai-xtis-symbol)
- (call ccl-thai-xtis-symbol)
- (call ccl-thai-xtis-symbol)
- nil
- nil
- nil))
- (read r0)
- (repeat)))
-
- (if (r1 != 0)
- (write r1)
- nil)))
-
-(define-ccl-program ccl-encode-thai-xtis
- `(1
- ((read r0)
- (loop
- (if (r0 == ,leading-code-private-21)
- ((read r1)
- (if (r1 == ,(charset-id 'thai-xtis))
- ((read r0)
- (write r0)
- (read r0)
- (r1 = (r0 & 7))
- (r0 = ((r0 - ?\xb0) >> 3))
- (if (r0 != 0)
- (write r0 [0 209 212 213 214 215 216 217 218 238]))
- (if (r1 != 0)
- (write r1 [0 231 232 233 234 235 236 237]))
- (read r0)
- (repeat))
- ((write r0 r1)
- (read r0)
- (repeat))))
- (write-read-repeat r0))))))
-
-(if (featurep 'xemacs)
- (make-coding-system
- 'tis-620 'ccl
- "external=tis620, internal=thai-xtis"
- `(mnemonic "TIS620"
- decode ,ccl-decode-thai-xtis
- encode ,ccl-encode-thai-xtis))
- (make-coding-system
- 'tis-620 4 ?T "external=tis620, internal=thai-xtis"
- '(ccl-decode-thai-xtis . ccl-encode-thai-xtis)
- '((safe-charsets . t)))
- )
-
-
-(set-language-info-alist
- "Thai-XTIS"
- '((setup-function . setup-thai-xtis-environment)
- (exit-function . exit-thai-xtis-environment)
- (charset thai-xtis)
- (coding-system tis-620 iso-2022-7bit)
- (coding-priority tis-620 iso-2022-7bit)
- (sample-text . "\e$(?!:\e(B")
- (documentation . t)))
-
-;; thai-xtis.el ends here.
+++ /dev/null
-;;; vietnamese.el --- Support for Vietnamese
-
-;; Copyright (C) 1995 Electrotechnical Laboratory, JAPAN.
-;; Licensed to the Free Software Foundation.
-;; Copyright (C) 1997 MORIOKA Tomohiko
-
-;; Keywords: multilingual, Vietnamese
-
-;; This file is part of XEmacs.
-
-;; XEmacs is free software; you can redistribute it and/or modify it
-;; under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
-;; any later version.
-
-;; XEmacs is distributed in the hope that it will be useful, but
-;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;; General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with XEmacs; see the file COPYING. If not, write to the Free
-;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-;; 02111-1307, USA.
-
-;;; Commentary:
-
-;; For Vietnames, the character sets VISCII and VSCII are supported.
-
-;;; Code:
-
-(eval-and-compile
-
-(defvar viet-viscii-decode-table
- [;; VISCII is a full 8-bit code.
- 0 1 ?\e,2F\e(B 3 4 ?\e,2G\e(B ?\e,2g\e(B 7 8 9 10 11 12 13 14 15
- 16 17 18 19 ?\e,2V\e(B 21 22 23 24 ?\e,2[\e(B 26 27 28 29 ?\e,2\\e(B 31
- 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
- 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
- 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
- 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
- 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
- 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
- ?\e,2U\e(B ?\e,2!\e(B ?\e,2"\e(B ?\e,2#\e(B ?\e,2$\e(B ?\e,2%\e(B ?\e,2&\e(B ?\e,2'\e(B ?\e,2(\e(B ?\e,2)\e(B ?\e,2*\e(B ?\e,2+\e(B ?\e,2,\e(B ?\e,2-\e(B ?\e,2.\e(B ?\e,2/\e(B
- ?\e,20\e(B ?\e,21\e(B ?\e,22\e(B ?\e,25\e(B ?\e,2~\e(B ?\e,2>\e(B ?\e,26\e(B ?\e,27\e(B ?\e,28\e(B ?\e,2v\e(B ?\e,2w\e(B ?\e,2o\e(B ?\e,2|\e(B ?\e,2{\e(B ?\e,2x\e(B ?\e,2O\e(B
- ?\e,2u\e(B ?\e,1!\e(B ?\e,1"\e(B ?\e,1#\e(B ?\e,1$\e(B ?\e,1%\e(B ?\e,1&\e(B ?\e,1'\e(B ?\e,1(\e(B ?\e,1)\e(B ?\e,1*\e(B ?\e,1+\e(B ?\e,1,\e(B ?\e,1-\e(B ?\e,1.\e(B ?\e,1/\e(B
- ?\e,10\e(B ?\e,11\e(B ?\e,12\e(B ?\e,2^\e(B ?\e,2=\e(B ?\e,15\e(B ?\e,16\e(B ?\e,17\e(B ?\e,18\e(B ?\e,2q\e(B ?\e,2Q\e(B ?\e,2W\e(B ?\e,2X\e(B ?\e,1=\e(B ?\e,1>\e(B ?\e,2_\e(B
- ?\e,2`\e(B ?\e,2a\e(B ?\e,2b\e(B ?\e,2c\e(B ?\e,2d\e(B ?\e,2e\e(B ?\e,1F\e(B ?\e,1G\e(B ?\e,2h\e(B ?\e,2i\e(B ?\e,2j\e(B ?\e,2k\e(B ?\e,2l\e(B ?\e,2m\e(B ?\e,2n\e(B ?\e,1O\e(B
- ?\e,2p\e(B ?\e,1Q\e(B ?\e,2r\e(B ?\e,2s\e(B ?\e,2t\e(B ?\e,1U\e(B ?\e,1V\e(B ?\e,1W\e(B ?\e,1X\e(B ?\e,2y\e(B ?\e,2z\e(B ?\e,1[\e(B ?\e,1\\e(B ?\e,2}\e(B ?\e,1^\e(B ?\e,1_\e(B
- ?\e,1`\e(B ?\e,1a\e(B ?\e,1b\e(B ?\e,1c\e(B ?\e,1d\e(B ?\e,1e\e(B ?\e,1f\e(B ?\e,1g\e(B ?\e,1h\e(B ?\e,1i\e(B ?\e,1j\e(B ?\e,1k\e(B ?\e,1l\e(B ?\e,1m\e(B ?\e,1n\e(B ?\e,1o\e(B
- ?\e,1p\e(B ?\e,1q\e(B ?\e,1r\e(B ?\e,1s\e(B ?\e,1t\e(B ?\e,1u\e(B ?\e,1v\e(B ?\e,1w\e(B ?\e,1x\e(B ?\e,1y\e(B ?\e,1z\e(B ?\e,1{\e(B ?\e,1|\e(B ?\e,1}\e(B ?\e,1~\e(B ?\e,2f\e(B ]
- "Vietnamese VISCII decoding table.")
-
-(defvar viet-viscii-encode-table
- (let ((table-lower (make-vector 128 0))
- (table-upper (make-vector 128 0))
- (i 0)
- char-component)
- (while (< i 256)
- (setq char-component
- (split-char (aref viet-viscii-decode-table i)))
- (cond ((eq (car char-component) 'vietnamese-viscii-lower)
- (aset table-lower (nth 1 char-component) i))
- ((eq (car char-component) 'vietnamese-viscii-upper)
- (aset table-upper (nth 1 char-component) i)))
- (setq i (1+ i)))
- (cons table-lower table-upper))
- "Vietnamese VISCII encoding table.
-Cons of tables for encoding lower-case chars and upper-case characters.
-Both tables are indexed by the position code of Vietnamese characters.")
-
-(defvar viet-vscii-decode-table
- [;; VSCII is a full 8-bit code.
- 0 ?\e,2z\e(B ?\e,2x\e(B 3 ?\e,2W\e(B ?\e,2X\e(B ?\e,2f\e(B 7 8 9 10 11 12 13 14 15
- 16 ?\e,2Q\e(B ?\e,2_\e(B ?\e,2O\e(B ?\e,2V\e(B ?\e,2[\e(B ?\e,2}\e(B ?\e,2\\e(B 24 25 26 27 28 29 30 31
- 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
- 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
- 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
- 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
- 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
- 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
- ?\e,2`\e(B ?\e,2d\e(B ?\e,2c\e(B ?\e,2a\e(B ?\e,2U\e(B ?\e,2#\e(B ?\e,2'\e(B ?\e,2h\e(B ?\e,2k\e(B ?\e,2(\e(B ?\e,2i\e(B ?\e,2)\e(B ?\e,2.\e(B ?\e,2l\e(B ?\e,2o\e(B ?\e,2n\e(B
- ?\e,2m\e(B ?\e,28\e(B ?\e,2r\e(B ?\e,2v\e(B ?\e,2u\e(B ?\e,2s\e(B ?\e,2w\e(B ?\e,25\e(B ?\e,26\e(B ?\e,27\e(B ?\e,2^\e(B ?\e,2>\e(B ?\e,2~\e(B ?\e,2y\e(B ?\e,2|\e(B ?\e,2{\e(B
- 160 ?\e,2e\e(B ?\e,2b\e(B ?\e,2j\e(B ?\e,2t\e(B ?\e,2=\e(B ?\e,2_\e(B ?\e,2p\e(B ?\e,1e\e(B ?\e,1b\e(B ?\e,1j\e(B ?\e,1t\e(B ?\e,1>\e(B ?\e,1y\e(B ?\e,1p\e(B ?\e,2"\e(B
- 192 193 194 195 196 ?\e,1`\e(B ?\e,1d\e(B ?\e,1c\e(B ?\e,1a\e(B ?\e,1U\e(B ?\e,2F\e(B ?\e,1"\e(B ?\e,1F\e(B ?\e,1G\e(B ?\e,1!\e(B ?\e,2G\e(B
- ?\e,2!\e(B ?\e,2%\e(B ?\e,2&\e(B ?\e,2g\e(B ?\e,2%\e(B ?\e,2+\e(B ?\e,1#\e(B ?\e,1%\e(B ?\e,1&\e(B ?\e,1g\e(B ?\e,1$\e(B ?\e,1'\e(B ?\e,1h\e(B ?\e,2,\e(B ?\e,1k\e(B ?\e,1(\e(B
- ?\e,1i\e(B ?\e,1)\e(B ?\e,1+\e(B ?\e,1,\e(B ?\e,1-\e(B ?\e,1*\e(B ?\e,1.\e(B ?\e,1l\e(B ?\e,1o\e(B ?\e,2-\e(B ?\e,2*\e(B ?\e,20\e(B ?\e,1n\e(B ?\e,1m\e(B ?\e,18\e(B ?\e,1r\e(B
- ?\e,21\e(B ?\e,1v\e(B ?\e,1u\e(B ?\e,1s\e(B ?\e,1w\e(B ?\e,10\e(B ?\e,11\e(B ?\e,12\e(B ?\e,1/\e(B ?\e,15\e(B ?\e,16\e(B ?\e,17\e(B ?\e,1^\e(B ?\e,1>\e(B ?\e,1~\e(B ?\e,1y\e(B
- ?\e,22\e(B ?\e,1|\e(B ?\e,1{\e(B ?\e,1z\e(B ?\e,1x\e(B ?\e,1W\e(B ?\e,1X\e(B ?\e,1f\e(B ?\e,1Q\e(B ?\e,1q\e(B ?\e,1O\e(B ?\e,1V\e(B ?\e,1[\e(B ?\e,1}\e(B ?\e,1\\e(B ?\e,2/\e(B]
- "Vietnamese VSCII decoding table.")
-
-(defvar viet-vscii-encode-table
- (let ((table-lower (make-vector 128 0))
- (table-upper (make-vector 128 0))
- (i 0)
- char-component)
- (while (< i 256)
- (setq char-component
- (split-char (aref viet-vscii-decode-table i)))
- (cond ((eq (car char-component) 'vietnamese-viscii-lower)
- (aset table-lower (nth 1 char-component) i))
- ((eq (car char-component) 'vietnamese-viscii-upper)
- (aset table-upper (nth 1 char-component) i)))
- (setq i (1+ i)))
- (cons table-lower table-upper))
- "Vietnamese VSCII encoding table.
-Cons of tables for encoding lower-case chars and upper-case characters.
-Both tables are indexed by the position code of Vietnamese characters.")
-
-)
-
-(define-ccl-program ccl-decode-viscii
- `(3
- ((read r0)
- (loop
- (write-read-repeat r0 ,viet-viscii-decode-table))
- ))
- "CCL program to decode VISCII 1.1")
-
-;; Multibyte form of a Vietnamese character is as follows (3-byte):
-;; LEADING-CODE-PRIVATE-11 LEADING-CODE-EXTENDED-11 POSITION-CODE
-;; where LEADING-CODE-EXTENDED-11 for Vietnamese is
-;; `vietnamese-viscii-lower' or `vietnamese-viscii-upper'.
-
-(defvar leading-code-private-11 #x9E)
-
-(define-ccl-program ccl-encode-viscii
- `(1
- ((read r0)
- (loop
- (if (r0 < 128)
- ;; ASCII
- (write-read-repeat r0)
- ;; not ASCII
- (if (r0 != ,leading-code-private-11)
- ;; not Vietnamese
- (write-read-repeat r0)
- ((read-if (r0 == ,(charset-id 'vietnamese-viscii-lower))
- (;; Vietnamese lower
- (read r0)
- (r0 -= 128)
- (write-read-repeat r0 ,(car viet-viscii-encode-table)))
- (if (r0 == ,(charset-id 'vietnamese-viscii-upper))
- (;; Vietnamese upper
- (read r0)
- (r0 -= 128)
- (write-read-repeat r0 ,(cdr viet-viscii-encode-table)))
- ;; not Vietnamese
- (write-read-repeat r0)))))))))
- "CCL program to encode VISCII 1.1")
-
-(define-ccl-program ccl-encode-viscii-font
- `(0
- ;; In: R0:vietnamese-viscii-lower/vietnamese-viscii-upper
- ;; R1:position code
- ;; Out: R1:font code point
- (if (r0 == ,(charset-id 'vietnamese-viscii-lower))
- (r1 = r1 ,(car viet-viscii-encode-table))
- (r1 = r1 ,(cdr viet-viscii-encode-table)))
- )
- "CCL program to encode Vietnamese chars to VISCII 1.1 font")
-
-(define-ccl-program ccl-decode-vscii
- `(3
- ((read r0)
- (loop
- (write-read-repeat r0 ,viet-vscii-decode-table))
- ))
- "CCL program to decode VSCII-1.")
-
-(define-ccl-program ccl-encode-vscii
- `(1
- ((read r0)
- (loop
- (if (r0 < 128)
- ;; ASCII
- (write-read-repeat r0)
- ;; not ASCII
- (if (r0 != ,leading-code-private-11)
- ;; not Vietnamese
- (write-read-repeat r0)
- (read-if (r0 == ,(charset-id 'vietnamese-viscii-lower))
- (;; Vietnamese lower
- (read r0)
- (r0 -= 128)
- (write-read-repeat r0 ,(car viet-vscii-encode-table)))
- (if (r0 == ,(charset-id 'vietnamese-viscii-upper))
- (;; Vietnamese upper
- (read r0)
- (r0 -= 128)
- (write-read-repeat r0 ,(cdr viet-viscii-encode-table)))
- ;; not Vietnamese
- (write-read-repeat r0))))))))
- "CCL program to encode VSCII-1.")
-
-(define-ccl-program ccl-encode-vscii-font
- `(0
- ;; In: R0:vietnamese-viscii-lower/vietnamese-viscii-upper
- ;; R1:position code
- ;; Out: R1:font code point
- (if (r0 == ,(charset-id 'vietnamese-viscii-lower))
- (r1 = r1 ,(car viet-vscii-encode-table))
- (r1 = r1 ,(cdr viet-vscii-encode-table)))
- )
- "CCL program to encode Vietnamese chars to VSCII-1 font.")
-
-
-(make-coding-system
- 'viscii 'ccl
- "Coding-system used for VISCII 1.1."
- `(mnemonic "VISCII"
- decode ,ccl-decode-viscii
- encode ,ccl-encode-viscii))
-
-;; (make-coding-system
-;; 'vietnamese-viscii 4 ?V
-;; "8-bit encoding for Vietnamese VISCII 1.1 (MIME:VISCII)"
-;; (cons ccl-decode-viscii ccl-encode-viscii))
-
-;; (define-coding-system-alias 'viscii 'vietnamese-viscii)
-
-(make-coding-system
- 'vscii 'ccl
- "Coding-system used for VSCII 1.1."
- `(mnemonic "VSCII"
- decode ,ccl-decode-vscii
- encode ,ccl-encode-vscii))
-
-;; (make-coding-system
-;; 'vietnamese-vscii 4 ?v
-;; "8-bit encoding for Vietnamese VSCII-1"
-;; (cons ccl-decode-vscii ccl-encode-vscii))
-
-;; (define-coding-system-alias 'vscii 'vietnamese-vscii)
-
-(make-coding-system
- 'viqr 'no-conversion
- "Coding-system used for VIQR."
- '(mnemonic "VIQR"
- eol-type lf
- post-read-conversion viqr-post-read-conversion
- pre-write-conversion viqr-pre-write-conversion))
-
-;; (make-coding-system
-;; 'vietnamese-viqr 0 ?q
-;; "Vietnamese latin transcription (VIQR)"
-;; nil)
-;; (put 'vietnamese-viqr 'post-read-conversion 'viqr-post-read-conversion)
-;; (put 'vietnamese-viqr 'pre-write-conversion 'viqr-pre-write-conversion)
-
-;; (define-coding-system-alias 'viqr 'vietnamese-viqr)
-
-;; For VISCII users
-(set-charset-ccl-program 'vietnamese-viscii-lower
- ccl-encode-viscii-font)
-(set-charset-ccl-program 'vietnamese-viscii-upper
- ccl-encode-viscii-font)
-;; For VSCII users
-(set-charset-ccl-program 'vietnamese-viscii-lower ccl-encode-vscii-font)
-(set-charset-ccl-program 'vietnamese-viscii-upper ccl-encode-vscii-font)
-
-;; (setq font-ccl-encoder-alist
-;; (cons (cons "viscii" ccl-encode-viscii-font) font-ccl-encoder-alist))
-
-;; (setq font-ccl-encoder-alist
-;; (cons (cons "vscii" ccl-encode-vscii-font) font-ccl-encoder-alist))
-
-(set-language-info-alist
- "Vietnamese" '((setup-function . setup-vietnamese-environment)
- (charset . (vietnamese-viscii-lower
- vietnamese-viscii-upper))
- (coding-system . (viscii vscii viqr))
- (sample-text . "Vietnamese (Ti\e,1*\e(Bng Vi\e,1.\e(Bt) Ch\e,1`\e(Bo b\e,1U\e(Bn")
- (documentation . "\
-For Vietnamese, Emacs uses special charasets internally.
-They can be decoded from and encoded to VISCC, VSCII, and VIQR.")
- ))
-
-;;; vietnamese.el ends here
;; ### This function is not compatible with FSF in some cases. Hard
;; to fix, because it is hard to trace the logic of the FSF function.
-;; In case we need the exact behavior, we can always copy the FSF
+;; In case we need the exact behaviour, we can always copy the FSF
;; version, which is very long and does lots of unnecessary stuff.
(defun truncate-string-to-width (str end-column &optional start-column padding)
"Truncate string STR to end at column END-COLUMN.
(make-obsolete 'function-called-at-point 'function-at-point)
-(provide 'obsolete)
;;; obsolete.el ends here
--- /dev/null
+(setq package-get-base
+'((eudc
+ (standards-version 1.0
+ version "1.09"
+ author-version "1.09"
+ date "1998-06-30"
+ build-date "1998-06-30"
+ maintainer "Oscar Figueiredo <Oscar.Figueiredo@epfl.ch>"
+ distribution stable
+ priority low
+ category "comm"
+ dump nil
+ description "Emacs Unified Directory Client (LDAP, PH)."
+ filename "eudc-1.09-pkg.tar.gz"
+ md5sum "517bfd3112700fd3dcfc59e02bbb0b12"
+ size 40867
+ provides (eudc eudc-ldap eudc-ph)
+ requires (fsf-compat xemacs-base)
+ type regular
+))
+(footnote
+ (standards-version 1.0
+ version "1.03"
+ author-version "0.18x"
+ date "1998-06-01"
+ build-date "1998-06-01"
+ maintainer "SL Baur <steve@xemacs.org>"
+ distribution stable
+ priority low
+ category "comm"
+ dump nil
+ description "Footnoting in mail message editing modes."
+ filename "footnote-1.03-pkg.tar.gz"
+ md5sum "bea3aa23b37988f690fa56ba8cc11e92"
+ size 18199
+ provides (footnote)
+ requires (mail-lib xemacs-base)
+ type regular
+))
+(gnats
+ (standards-version 1.0
+ version "1.03"
+ author-version "3.101"
+ date "1998-04-06"
+ build-date "1998-04-17"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority high
+ category "comm"
+ dump nil
+ description "XEmacs bug reports."
+ filename "gnats-1.03-pkg.tar.gz"
+ md5sum "2b8f3a25baa78ffd23927ac5bb5777b5"
+ size 126412
+ provides (gnats gnats-admin send-pr)
+ requires (mail-lib xemacs-base)
+ type regular
+))
+(gnus
+ (standards-version 1.0
+ version "1.21"
+ author-version "5.6.23"
+ date "1998-07-06"
+ build-date "1998-07-09"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority medium
+ category "comm"
+ dump nil
+ description "The Gnus Newsreader and Mailreader."
+ filename "gnus-1.21-pkg.tar.gz"
+ md5sum "6d58f34293ec00bbd297a6abb98fe2e9"
+ size 1693384
+ provides (gnus message)
+ requires (gnus w3 mh-e mailcrypt rmail mail-lib xemacs-base)
+ type regular
+))
+(mailcrypt
+ (standards-version 1.0
+ version "1.04"
+ author-version "3.4"
+ date "1998-01-24"
+ build-date "1998-06-14"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority low
+ category "comm"
+ dump nil
+ description "Support for messaging encryption with PGP."
+ filename "mailcrypt-1.04-pkg.tar.gz"
+ md5sum "66601a110f1499d3c6f815f806e43a71"
+ size 66937
+ provides (mailcrypt)
+ requires (gnus vm mail-lib xemacs-base)
+ type regular
+))
+(mew
+ (standards-version 1.0
+ version "1.0"
+ author-version "1.93b38"
+ date "1998-06-21"
+ build-date "1998-06-21"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution contrib
+ priority low
+ category "comm"
+ dump nil
+ description "Messaging in an Emacs World."
+ filename "mew-1.0-pkg.tar.gz"
+ md5sum "be366b8dd9495ecb7b3b6a7a46563faa"
+ size 441775
+ provides (mew)
+ requires (mew)
+ type regular
+))
+(mh-e
+ (standards-version 1.0
+ version "1.05"
+ author-version "21.0"
+ date "1998-01-24"
+ build-date "1998-06-14"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution contrib
+ priority low
+ category "comm"
+ dump nil
+ description "Front end support for MH."
+ filename "mh-e-1.05-pkg.tar.gz"
+ md5sum "62b8598c55698c74ddfe71e874f0fe5e"
+ size 129257
+ provides (mh-e)
+ requires (mail-lib xemacs-base)
+ type regular
+))
+(net-utils
+ (standards-version 1.0
+ version "1.08"
+ author-version "21.0"
+ date "1998-07-01"
+ build-date "1998-07-09"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority low
+ category "comm"
+ dump nil
+ description "Miscellaneous Networking Utilities."
+ filename "net-utils-1.08-pkg.tar.gz"
+ md5sum "2591eca88f5ea04272012e479ea8665c"
+ size 107983
+ provides (ilisp-browse-cltl2 emacsbug feedmail metamail net-utils rcompile shadowfile webjump webster-www)
+ requires (w3 efs mail-lib xemacs-base)
+ type single
+))
+(rmail
+ (standards-version 1.0
+ version "1.04"
+ author-version "21.0"
+ date "1998-06-28"
+ build-date "1998-07-09"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution contrib
+ priority low
+ category "comm"
+ dump nil
+ description "An obsolete Emacs mailer."
+ filename "rmail-1.04-pkg.tar.gz"
+ md5sum "5a4fc73565cb0e9ea62d6b0665ccb013"
+ size 85711
+ provides (rmail rmailsum)
+ requires (tm apel mail-lib xemacs-base)
+ type regular
+))
+(supercite
+ (standards-version 1.0
+ version "1.07"
+ author-version "3.55x"
+ date "1998-05-07"
+ build-date "1998-06-14"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority low
+ category "comm"
+ dump nil
+ description "An Emacs citation tool for News & Mail messages."
+ filename "supercite-1.07-pkg.tar.gz"
+ md5sum "c1ef998b1819e6b19efd10bf0e48534c"
+ size 71084
+ provides (supercite)
+ requires (mail-lib xemacs-base)
+ type regular
+))
+(tm
+ (standards-version 1.0
+ version "1.09"
+ author-version "21.0"
+ date "1998-06-09"
+ build-date "1998-07-09"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority low
+ category "comm"
+ dump nil
+ description "Emacs MIME support."
+ filename "tm-1.09-pkg.tar.gz"
+ md5sum "a5697117fc719a9c5a74a62f6b812101"
+ size 253269
+ provides (tm tm-edit tm-view mime-setup)
+ requires (gnus mh-e rmail vm mailcrypt mail-lib apel xemacs-base)
+ type regular
+))
+(vm
+ (standards-version 1.0
+ version "1.09"
+ author-version "6.53"
+ date "1998-06-26"
+ build-date "1998-07-09"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority medium
+ category "comm"
+ dump t
+ description "An Emacs mailer."
+ filename "vm-1.09-pkg.tar.gz"
+ md5sum "a3dd4a14155abf835275120c62ca82fd"
+ size 514307
+ provides (vm)
+ requires (mail-lib xemacs-base)
+ type regular
+))
+(w3
+ (standards-version 1.0
+ version "1.06"
+ author-version "4.0pre18"
+ date "1998-05-01"
+ build-date "1998-05-02"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution experimental
+ priority high
+ category "comm"
+ dump nil
+ description "A Web browser."
+ filename "w3-1.06-pkg.tar.gz"
+ md5sum "fea5098f9e8dd5b3b82e3ebe7d447b9c"
+ size 581731
+ provides (w3 url)
+ requires (w3 mail-lib xemacs-base)
+ type regular
+))
+(cookie
+ (standards-version 1.0
+ version "1.07"
+ author-version "21.0b36"
+ date "1998-04-07"
+ build-date "1998-04-17"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority low
+ category "games"
+ dump nil
+ description "Spook and Yow (Zippy quotes)."
+ filename "cookie-1.07-pkg.tar.gz"
+ md5sum "df97f80082395667a0e23eda8f68b8dd"
+ size 34184
+ provides (cookie1 yow)
+ requires (xemacs-base)
+ type regular
+))
+(games
+ (standards-version 1.0
+ version "1.05"
+ author-version "1.04"
+ date "1998-06-04"
+ build-date "1998-07-09"
+ maintainer "Glynn Clements <glynn@sensei.co.uk>"
+ distribution stable
+ priority low
+ category "games"
+ dump nil
+ description "Tetris, Sokoban, and Snake."
+ filename "games-1.05-pkg.tar.gz"
+ md5sum "2b856bc25a05ad32400bdd947fec6231"
+ size 32000
+ provides (gamegrid snake tetris sokoban)
+ requires (xemacs-base)
+ type regular
+))
+(mine
+ (standards-version 1.0
+ version "1.05"
+ author-version "1.8x1"
+ date "1998-03-31"
+ build-date "1998-04-04"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority low
+ category "games"
+ dump nil
+ description "Minehunt Game."
+ filename "mine-1.05-pkg.tar.gz"
+ md5sum "330cd395304f600487b748d466993e06"
+ size 67568
+ provides (xmine)
+ requires (xemacs-base)
+ type regular
+))
+(misc-games
+ (standards-version 1.0
+ version "1.06"
+ author-version "21.0b35"
+ date "1998-03-22"
+ build-date "1998-04-04"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority low
+ category "games"
+ dump nil
+ description "Other amusements and diversions."
+ filename "misc-games-1.06-pkg.tar.gz"
+ md5sum "48d883e7e6092c227b476386ece41672"
+ size 165586
+ provides (decipher gomoku hanoi life morse rot13)
+ requires (xemacs-base)
+ type single
+))
+(Sun
+ (standards-version 1.0
+ version "1.05"
+ author-version "21.0b35"
+ date "1998-03-06"
+ build-date "1998-04-04"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution sun
+ priority low
+ category "libs"
+ dump t
+ description "Support for Sparcworks."
+ filename "Sun-1.05-pkg.tar.gz"
+ md5sum "70a776046ea5b12d08ca7276484f6139"
+ size 63826
+ provides (sccs eos-browser eos-common eos-debugger eos-debugger eos-editor eos-init eos-load eos-menubar eos-toolbar sunpro)
+ requires (cc-mode xemacs-base)
+ type regular
+))
+(apel
+ (standards-version 1.0
+ version "1.04"
+ author-version "3.3"
+ date "1998-01-24"
+ build-date "1998-04-04"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution mule
+ priority high
+ category "libs"
+ dump nil
+ description "A Portable Emacs Library. Used by XEmacs MIME support."
+ filename "apel-1.04-pkg.tar.gz"
+ md5sum "7082f6eaa80bfef9e655e1c603ff68d3"
+ size 34597
+ provides (atype emu-20 emu-e19 emu-x20 emu-xemacs emu file-detect filename install mule-caesar path-util richtext std11-parse std11 tinyrich)
+ requires (fsf-compat xemacs-base)
+ type regular
+))
+(dired
+ (standards-version 1.0
+ version "1.01"
+ author-version "7.9"
+ date "1998-05-05"
+ build-date "1998-05-05"
+ maintainer "Mike Sperber <sperber@informatik.uni-tuebingen.de>"
+ distribution stable
+ priority medium
+ category "libs"
+ dump nil
+ description "Manage file systems."
+ filename "dired-1.01-pkg.tar.gz"
+ md5sum "d9748d8e8af8a63095aaaab9924987ef"
+ size 187526
+ provides (diff dired)
+ requires (xemacs-base)
+ type regular
+))
+(edebug
+ (standards-version 1.0
+ version "1.04"
+ author-version "21.0b35"
+ date "1998-03-12"
+ build-date "1998-04-04"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority low
+ category "libs"
+ dump nil
+ description "An Emacs Lisp debugger."
+ filename "edebug-1.04-pkg.tar.gz"
+ md5sum "d4a46e9bee361d60cb079731e5b152e9"
+ size 118141
+ provides (edebug cl-read cust-print eval-reg cl-specs)
+ requires (xemacs-base)
+ type regular
+))
+(efs
+ (standards-version 1.0
+ version "1.08"
+ author-version "1.16x1"
+ date "1998-03-21"
+ build-date "1998-04-04"
+ maintainer "Mike Sperber <sperber@informatik.uni-tuebingen.de>"
+ distribution stable
+ priority medium
+ category "libs"
+ dump nil
+ description "Treat files on remote systems the same as local files."
+ filename "efs-1.08-pkg.tar.gz"
+ md5sum "1ec45851fe72d06d32a6f941877ae544"
+ size 347544
+ provides (efs)
+ requires (xemacs-base vm dired)
+ type regular
+))
+(fsf-compat
+ (standards-version 1.0
+ version "1.0"
+ author-version "21.0b39"
+ date "1998-03-25"
+ build-date "1998-05-06"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution mule
+ priority high
+ category "libs"
+ dump nil
+ description "FSF Emacs compatibility files."
+ filename "fsf-compat-1.0-pkg.tar.gz"
+ md5sum "71351ff26a69b341015612d9b88dfc55"
+ size 16083
+ provides (overlay thingatpt timer)
+ requires ()
+ type single
+))
+(mail-lib
+ (standards-version 1.0
+ version "1.16"
+ author-version "21.0"
+ date "1998-06-08"
+ build-date "1998-06-14"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority medium
+ category "libs"
+ dump nil
+ description "Fundamental lisp files for providing email support."
+ filename "mail-lib-1.16-pkg.tar.gz"
+ md5sum "8466339df937c3e7dc4176df85987cf3"
+ size 120230
+ provides (browse-url highlight-headers mail-abbrevs mail-extr mail-utils reporter rfc822 rmail-mini rmailout sendmail smtpmail)
+ requires (xemacs-base)
+ type regular
+))
+(sounds-au
+ (standards-version 1.0
+ version "1.02"
+ author-version "21.0"
+ date "1998-06-30"
+ build-date "1998-07-09"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority high
+ category "libs"
+ dump nil
+ description "XEmacs Sun sound files."
+ filename "sounds-au-1.02-pkg.tar.gz"
+ md5sum "061ab67267c7cdfe37472141130d19ff"
+ size 125736
+ provides ()
+ requires ()
+ type regular
+))
+(sounds-wav
+ (standards-version 1.0
+ version "1.02"
+ author-version "21.0"
+ date "1998-06-30"
+ build-date "1998-07-09"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority high
+ category "libs"
+ dump nil
+ description "XEmacs Microsoft sound files."
+ filename "sounds-wav-1.02-pkg.tar.gz"
+ md5sum "c970808088c408bfd780dc8466a848b3"
+ size 148621
+ provides ()
+ requires ()
+ type regular
+))
+(tooltalk
+ (standards-version 1.0
+ version "1.04"
+ author-version "21.0b35"
+ date "1998-01-24"
+ build-date "1998-04-04"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution contrib
+ priority low
+ category "libs"
+ dump t
+ description "Support for building with Tooltalk."
+ filename "tooltalk-1.04-pkg.tar.gz"
+ md5sum "60ea390c4aa203ea26d66ddb2f3ad99f"
+ size 9245
+ provides ()
+ requires ()
+ type regular
+))
+(xemacs-base
+ (standards-version 1.0
+ version "1.21"
+ author-version "21.0"
+ date "1998-07-02"
+ build-date "1998-07-09"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution mule
+ priority high
+ category "libs"
+ dump nil
+ description "Fundamental XEmacs support, you almost certainly need this."
+ filename "xemacs-base-1.21-pkg.tar.gz"
+ md5sum "1807f3591bc644c52d41bf472cd30bfc"
+ size 458268
+ provides (add-log advice annotations assoc case-table chistory comint-xemacs comint compile debug ebuff-menu echistory edmacro ehelp electric enriched env facemenu ffap helper imenu iso-syntax macros novice outline overlay passwd pp regi ring shell skeleton sort thing time-stamp timezone xbm-button xpm-button)
+ requires ()
+ type regular
+))
+(xemacs-devel
+ (standards-version 1.0
+ version "1.13"
+ author-version "21.0"
+ date "1998-06-15"
+ build-date "1998-06-19"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority medium
+ category "libs"
+ dump nil
+ description "Emacs Lisp developer support."
+ filename "xemacs-devel-1.13-pkg.tar.gz"
+ md5sum "3bec2cd2b955fa86617335ad14480e1a"
+ size 78840
+ provides (docref eldoc elp find-func hide-copyleft ielm regexp-opt trace)
+ requires (xemacs-base)
+ type single
+))
+(edict
+ (standards-version 1.0
+ version "1.03"
+ author-version "0.9.8"
+ date "1998-06-29"
+ build-date "1998-07-09"
+ maintainer "Stephen J. Turnbull <turnbull@sk.tsukuba.ac.jp>"
+ distribution mule
+ priority high
+ category "mule"
+ dump nil
+ description "Lisp Interface to EDICT, Kanji Dictionary"
+ filename "edict-1.03-pkg.tar.gz"
+ md5sum "0f317174ab3e163780f26c6fcfe0eccb"
+ size 94823
+ provides (dui-registry dui edict-edit edict-english edict-japanese edict-morphology edict-test edict ts-mode)
+ requires (mule-base xemacs-base)
+ type regular
+))
+(egg-its
+ (standards-version 1.0
+ version "1.05"
+ author-version "21.0"
+ date "1998-06-20"
+ build-date "1998-07-09"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution mule
+ priority high
+ category "mule"
+ dump t
+ description "Wnn (4.2 and 6) support. SJ3 support."
+ filename "egg-its-1.05-pkg.tar.gz"
+ md5sum "ef131233410ea57fad940b40cb3c786c"
+ size 259670
+ provides (egg-cnpinyin egg-cnzhuyin egg-cwnn-leim egg-jisx0201 egg-jsymbol egg-kwnn-leim egg-leim egg-sj3-client egg-sj3-leim egg-sj3 egg-wnn egg)
+ requires (leim mule-base xemacs-base)
+ type regular
+))
+(leim
+ (standards-version 1.0
+ version "1.07"
+ author-version "21.0b36"
+ date "1998-04-09"
+ build-date "1998-04-17"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution mule
+ priority medium
+ category "mule"
+ dump nil
+ description "Quail. All non-English and non-Japanese language support."
+ filename "leim-1.07-pkg.tar.gz"
+ md5sum "91ef40389a36d7236ce3e9536c5097e1"
+ size 1744016
+ provides ()
+ requires (mule-base fsf-compat xemacs-base)
+ type regular
+))
+(locale
+ (standards-version 1.0
+ version "1.04"
+ author-version "21.0b35"
+ date "1998-03-01"
+ build-date "1998-04-04"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution mule
+ priority high
+ category "mule"
+ dump nil
+ description "Localized menubars and localized splash screens."
+ filename "locale-1.04-pkg.tar.gz"
+ md5sum "5d6dd1391ac017f4f210a810db2541cb"
+ size 34651
+ provides ()
+ requires (mule-base)
+ type regular
+))
+(mule-base
+ (standards-version 1.0
+ version "1.19"
+ author-version "21.0"
+ date "1998-07-09"
+ build-date "1998-07-09"
+ maintainer "SL Baur <steve@altair.xemacs.org>"
+ distribution mule
+ priority high
+ category "mule"
+ dump t
+ description "Basic Mule support, required for building with Mule."
+ filename "mule-base-1.19-pkg.tar.gz"
+ md5sum "ac5ed26ee38de23d3591c37a283bc7b5"
+ size 488988
+ provides (canna-leim canna char-table china-util cyril-util isearch-ext japan-util ccl can-n-egg mule-help)
+ requires (fsf-compat xemacs-base)
+ type regular
+))
+(skk
+ (standards-version 1.0
+ version "1.06"
+ author-version "10.38"
+ date "1998-04-28"
+ build-date "1998-05-01"
+ maintainer "SL Baur <steve@altair.xemacs.org>"
+ distribution mule
+ priority medium
+ category "mule"
+ dump t
+ description "Japanese Language Input Method."
+ filename "skk-1.06-pkg.tar.gz"
+ md5sum "ccc92c60519be92efef3c40696897ef7"
+ size 1467006
+ provides (skk skk-tut)
+ requires (viper mule-base xemacs-base)
+ type regular
+))
+(calc
+ (standards-version 1.0
+ version "1.05"
+ author-version "2.02fX1"
+ date "1998-02-27"
+ build-date "1998-06-14"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority low
+ category "oa"
+ dump nil
+ description "Emacs calculator"
+ filename "calc-1.05-pkg.tar.gz"
+ md5sum "cc170d1a19718a152144dfd0a66f6865"
+ size 1165091
+ provides (calc)
+ requires ()
+ type regular
+))
+(calendar
+ (standards-version 1.0
+ version "1.04"
+ author-version "21.0"
+ date "1998-06-19"
+ build-date "1998-07-09"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority low
+ category "oa"
+ dump nil
+ description "Calendar and diary support."
+ filename "calendar-1.04-pkg.tar.gz"
+ md5sum "c0955508d51af1524ca8ef6687b362f1"
+ size 239851
+ provides (appt cal-dst cal-french cal-mayan cal-x cal-xemacs calendar diary-ins diary-lib holidays lunar solar)
+ requires (xemacs-base)
+ type regular
+))
+(edit-utils
+ (standards-version 1.0
+ version "1.24"
+ author-version "21.0"
+ date "1998-06-13"
+ build-date "1998-06-14"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority high
+ category "oa"
+ dump nil
+ description "Miscellaneous editor extensions, you probably need this."
+ filename "edit-utils-1.24-pkg.tar.gz"
+ md5sum "0b7136586f8b47e9b000bcf08f9b75a0"
+ size 584396
+ provides (abbrevlist atomic-extents avoid backup-dir balloon-help big-menubar blink-cursor blink-paren bookmark compare-w completion dabbrev desktop detached-minibuf edit-toolbar fast-lock file-part floating-toolbar flow-ctrl foldout func-menu hippie-exp icomplete id-select info-look iswitchb lazy-lock lazy-shot live-icon man mic-paren paren popper mode-motion+ outl-mouse page-ext blink-paren paren permanent-buffers recent-files redo reportmail rsz-minibuf saveconfsavehist saveplace scroll-in-place tempo toolbar-utils tree-menu uniquify where-was-i-db)
+ requires (xemacs-base)
+ type single
+))
+(forms
+ (standards-version 1.0
+ version "1.06"
+ author-version "2.10"
+ date "1998-01-25"
+ build-date "1998-06-14"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution contrib
+ priority low
+ category "oa"
+ dump nil
+ description "Forms editing support (obsolete, use Widget instead)."
+ filename "forms-1.06-pkg.tar.gz"
+ md5sum "ebee64ebf564f934e15fed3503e3b15e"
+ size 39948
+ provides (forms forms-mode)
+ requires ()
+ type regular
+))
+(frame-icon
+ (standards-version 1.0
+ version "1.02"
+ author-version "21.0b35"
+ date "1998-02-26"
+ build-date "1998-04-04"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution contrib
+ priority low
+ category "oa"
+ dump nil
+ description "Set up mode-specific icons for each frame under XEmacs"
+ filename "frame-icon-1.02-pkg.tar.gz"
+ md5sum "82d098425df2fd7e3a7e7d16c9a9e12b"
+ size 33568
+ provides (forms forms-mode)
+ requires ()
+ type regular
+))
+(hm--html-menus
+ (standards-version 1.0
+ version "1.06"
+ author-version "5.9"
+ date "1998-01-25"
+ build-date "1998-06-14"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority low
+ category "oa"
+ dump nil
+ description "HTML editing."
+ filename "hm--html-menus-1.06-pkg.tar.gz"
+ md5sum "2570d8211b63c2edcc114ec3560a075f"
+ size 147168
+ provides (adapt hm--date hm--html-configuration hm--html-drag-and-drop hm--html-indentation hm--html-keys hm--html-menu hm--html-mode hm--html-not-standard hm--html html-view tmpl-minor-mode)
+ requires (xemacs-base)
+ type regular
+))
+(ispell
+ (standards-version 1.0
+ version "1.08"
+ author-version "3.0x1"
+ date "1998-04-01"
+ build-date "1998-04-04"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority low
+ category "oa"
+ dump nil
+ description "Spell-checking with GNU ispell."
+ filename "ispell-1.08-pkg.tar.gz"
+ md5sum "54cd76987a472eca72c24592a10756d6"
+ size 64990
+ provides (ispell)
+ requires ()
+ type regular
+))
+(pc
+ (standards-version 1.0
+ version "1.10"
+ author-version "21.0b38"
+ date "1998-04-22"
+ build-date "1998-04-26"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority low
+ category "oa"
+ dump nil
+ description "PC style interface emulation."
+ filename "pc-1.10-pkg.tar.gz"
+ md5sum "e750bebcb0d2b7632796b1c6c4fc4c16"
+ size 16004
+ provides (delbs fusion pc-select pending-del s-region)
+ requires (xemacs-base)
+ type regular
+))
+(psgml
+ (standards-version 1.0
+ version "1.08"
+ author-version "1.01"
+ date "1998-07-06"
+ build-date "1998-07-09"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority medium
+ category "oa"
+ dump nil
+ description "Validated HTML/SGML editing."
+ filename "psgml-1.08-pkg.tar.gz"
+ md5sum "757842225e4d3e9841bf6de1d3fdbbc4"
+ size 419252
+ provides (psgml sgml)
+ requires (edit-utils)
+ type regular
+))
+(sgml
+ (standards-version 1.0
+ version "1.01"
+ author-version "21.0b35"
+ date "1998-01-25"
+ build-date "1998-04-04"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution contrib
+ priority low
+ category "oa"
+ dump nil
+ description "SGML/Linuxdoc-SGML editing."
+ filename "sgml-1.01-pkg.tar.gz"
+ md5sum "4e7039730eb4399c09b1a85d1758381c"
+ size 26874
+ provides (sgml linuxdoc-sgml)
+ requires (xemacs-base)
+ type regular
+))
+(slider
+ (standards-version 1.0
+ version "1.05"
+ author-version "0.3"
+ date "1998-01-25"
+ build-date "1998-04-04"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution experimental
+ priority low
+ category "oa"
+ dump nil
+ description "User interface tool."
+ filename "slider-1.05-pkg.tar.gz"
+ md5sum "67b376e5b886a78f5094eb13c61ff8ec"
+ size 12116
+ provides (slider color-selector)
+ requires ()
+ type regular
+))
+(speedbar
+ (standards-version 1.0
+ version "1.05"
+ author-version "0.6.2"
+ date "1998-02-07"
+ build-date "1998-04-04"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority low
+ category "oa"
+ dump nil
+ description "??? Document me."
+ filename "speedbar-1.05-pkg.tar.gz"
+ md5sum "8a988bada9d09dac0e934f0859f88613"
+ size 95018
+ provides (speedbar)
+ requires (xemacs-base)
+ type regular
+))
+(strokes
+ (standards-version 1.0
+ version "1.01"
+ author-version "21.0b35"
+ date "1998-01-25"
+ build-date "1998-04-04"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority medium
+ category "oa"
+ dump nil
+ description "Mouse enhancement utility."
+ filename "strokes-1.01-pkg.tar.gz"
+ md5sum "a160a62e0570fc69f3c03b6ee1693fcd"
+ size 43743
+ provides (strokes)
+ requires (text-modes edit-utils mail-lib xemacs-base)
+ type regular
+))
+(text-modes
+ (standards-version 1.0
+ version "1.08"
+ author-version "21.0"
+ date "1998-07-03"
+ build-date "1998-07-09"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority high
+ category "oa"
+ dump nil
+ description "Miscellaneous support for editing text files."
+ filename "text-modes-1.08-pkg.tar.gz"
+ md5sum "7334a90ddbcedec459caecf8e0314bad"
+ size 171811
+ provides (autoinsert crontab-edit filladapt fold-isearch folding image-mode iso-acc iso-ascii iso-cvt iso-insert iso-swed swedish tabify whitespace-mode winmgr-mode xpm-mode xrdb-mode)
+ requires (fsf-compat xemacs-base)
+ type regular
+))
+(time
+ (standards-version 1.0
+ version "1.04"
+ author-version "1.17"
+ date "1998-04-24"
+ build-date "1998-04-26"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority medium
+ category "oa"
+ dump nil
+ description "Display time & date on the modeline."
+ filename "time-1.04-pkg.tar.gz"
+ md5sum "e25caf29cf9684887460d9cd124639d4"
+ size 19905
+ provides (time)
+ requires (xemacs-base)
+ type regular
+))
+(eterm
+ (standards-version 1.0
+ version "1.05"
+ author-version "21.0"
+ date "1998-06-28"
+ build-date "1998-07-09"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority medium
+ category "os"
+ dump nil
+ description "Terminal emulation."
+ filename "eterm-1.05-pkg.tar.gz"
+ md5sum "0c1660a9a8426077534caf84762e7ec1"
+ size 144233
+ provides (eterm)
+ requires (xemacs-base)
+ type regular
+))
+(igrep
+ (standards-version 1.0
+ version "1.01"
+ author-version "21.0b35"
+ date "1998-01-24"
+ build-date "1998-04-04"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority low
+ category "os"
+ dump nil
+ description "Enhanced front-end for Grep."
+ filename "igrep-1.01-pkg.tar.gz"
+ md5sum "e50e3a5ac2d6ca5eea67d7f664dee406"
+ size 13971
+ provides (igrep)
+ requires (dired xemacs-base)
+ type regular
+))
+(ilisp
+ (standards-version 1.0
+ version "1.04"
+ author-version "5.8"
+ date "1998-01-24"
+ build-date "1998-06-14"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority low
+ category "os"
+ dump nil
+ description "Front-end for Inferior Lisp."
+ filename "ilisp-1.04-pkg.tar.gz"
+ md5sum "1fa1b08bd6b7cc3c71f512ad412e1b24"
+ size 223559
+ provides (ilisp completer)
+ requires (xemacs-base)
+ type regular
+))
+(os-utils
+ (standards-version 1.0
+ version "1.08"
+ author-version "21.0"
+ date "1998-06-07"
+ build-date "1998-06-14"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority medium
+ category "os"
+ dump nil
+ description "Miscellaneous O/S utilities."
+ filename "os-utils-1.08-pkg.tar.gz"
+ md5sum "9fdcc24ee2d83c6d214f4afa1f41c617"
+ size 229921
+ provides (archive-mode background crypt crypt++ inf-lisp jka-compr lpr mchat ps-print tar-mode telnet terminal uncompress)
+ requires (xemacs-base)
+ type single
+))
+(view-process
+ (standards-version 1.0
+ version "1.03"
+ author-version "2.4"
+ date "1998-01-24"
+ build-date "1998-04-04"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority low
+ category "os"
+ dump nil
+ description "A Unix process browsing tool."
+ filename "view-process-1.03-pkg.tar.gz"
+ md5sum "96bcf35e325034ee3c37563fecfe623d"
+ size 59886
+ provides (view-process-mode)
+ requires (xemacs-base)
+ type regular
+))
+(ada
+ (standards-version 1.0
+ version "1.03"
+ author-version "2.27"
+ date "1998-01-24"
+ build-date "1998-04-04"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority low
+ category "prog"
+ dump nil
+ description "Ada language support."
+ filename "ada-1.03-pkg.tar.gz"
+ md5sum "661f8c0ac17fe447f8cc0e54f753704d"
+ size 54323
+ provides (ada-mode ada-stmt)
+ requires ()
+ type regular
+))
+(c-support
+ (standards-version 1.0
+ version "1.07"
+ author-version "21.0b35"
+ date "1998-03-25"
+ build-date "1998-04-04"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution contrib
+ priority low
+ category "prog"
+ dump nil
+ description "Basic single-file add-ons for editing C code."
+ filename "c-support-1.07-pkg.tar.gz"
+ md5sum "771e606d76e18922efb6559e101c7ecf"
+ size 68651
+ provides (c-comment-edit cmacexp ctypes hideif hideshow)
+ requires (cc-mode xemacs-base)
+ type regular
+))
+(cc-mode
+ (standards-version 1.0
+ version "1.11"
+ author-version "5.22"
+ date "1998-03-05"
+ build-date "1998-06-14"
+ maintainer "Barry Warsaw <cc-mode-help@python.org>"
+ distribution stable
+ priority medium
+ category "prog"
+ dump nil
+ description "C, C++ and Java language support."
+ filename "cc-mode-1.11-pkg.tar.gz"
+ md5sum "dadf89d5a4dfbee90d0168831a33150f"
+ size 151138
+ provides (cc-mode)
+ requires (xemacs-base)
+ type regular
+))
+(debug
+ (standards-version 1.0
+ version "1.04"
+ author-version "21.0"
+ date "1998-07-09"
+ build-date "1998-07-09"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution contrib
+ priority low
+ category "prog"
+ dump nil
+ description "GUD, gdb, dbx debugging support."
+ filename "debug-1.04-pkg.tar.gz"
+ md5sum "f881ca1a0593d218ca6a0e19dd10d8a0"
+ size 90350
+ provides (dbx gdb-highlight gdb gdbsrc gud history)
+ requires (xemacs-base)
+ type regular
+))
+(ediff
+ (standards-version 1.0
+ version "1.08"
+ author-version "2.70.1"
+ date "1998-04-27"
+ build-date "1998-05-15"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority medium
+ category "prog"
+ dump nil
+ description "Interface over GNU patch."
+ filename "ediff-1.08-pkg.tar.gz"
+ md5sum "d73e47087119a6cb7d5b4f71fdba8b72"
+ size 243042
+ provides (ediff)
+ requires (pcl-cvs dired xemacs-base)
+ type regular
+))
+(emerge
+ (standards-version 1.0
+ version "1.02"
+ author-version "21.0b36"
+ date "1998-04-07"
+ build-date "1998-04-17"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority low
+ category "prog"
+ dump nil
+ description "Another interface over GNU patch."
+ filename "emerge-1.02-pkg.tar.gz"
+ md5sum "6f7687196172109d6014346d5ead6d3a"
+ size 60940
+ provides (emerge)
+ requires ()
+ type regular
+))
+(jde
+ (standards-version 1.0
+ version "1.04"
+ author-version "2.05"
+ date "1998-07-09"
+ build-date "1998-07-09"
+ maintainer "Andy Piper <andyp@parallax.co.uk>"
+ distribution stable
+ priority medium
+ category "prog"
+ dump nil
+ description "Java language and development support."
+ filename "jde-1.04-pkg.tar.gz"
+ md5sum "97b90e88928033f405005a9441b7e141"
+ size 126784
+ provides (jde)
+ requires (cc-mode debug speedbar edit-utils mail-lib xemacs-base)
+ type regular
+))
+(pcl-cvs
+ (standards-version 1.0
+ version "1.11"
+ author-version "21.0"
+ date "1998-06-18"
+ build-date "1998-07-09"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority low
+ category "prog"
+ dump nil
+ description "CVS frontend."
+ filename "pcl-cvs-1.11-pkg.tar.gz"
+ md5sum "7592786d2734d87778915e50561c472d"
+ size 141698
+ provides (pcl-cvs dll elib-node generic-sc)
+ requires (xemacs-base)
+ type regular
+))
+(prog-modes
+ (standards-version 1.0
+ version "1.06"
+ author-version "21.0"
+ date "1998-05-04"
+ build-date "1998-07-09"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority medium
+ category "prog"
+ dump nil
+ description "Support for various programming languages."
+ filename "prog-modes-1.06-pkg.tar.gz"
+ md5sum "38d494e334b846fe735f45d573759ed9"
+ size 539915
+ provides (autoconf-mode cperl-mode eiffel3 f90 fortran ksh-mode m4-mode makefile perl-mode postscript python-mode rexx-mode simula-mode tcl teco verilog-mod)
+ requires (mail-lib xemacs-base)
+ type regular
+))
+(scheme
+ (standards-version 1.0
+ version "1.03"
+ author-version "21.0b36"
+ date "1998-04-11"
+ build-date "1998-04-17"
+ maintainer "Karl M. Hegbloom <karlheg@bittersweet.inetarena.com>"
+ distribution contrib
+ priority low
+ category "prog"
+ dump nil
+ description "Front-end support for Inferior Scheme."
+ filename "scheme-1.03-pkg.tar.gz"
+ md5sum "f22026713da1be70eba93f8d59700499"
+ size 36833
+ provides (scheme xscheme cmuscheme cmuscheme48)
+ requires (xemacs-base)
+ type regular
+))
+(sh-script
+ (standards-version 1.0
+ version "1.05"
+ author-version "2.0e"
+ date "1998-05-12"
+ build-date "1998-05-15"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority low
+ category "prog"
+ dump nil
+ description "Support for editing shell scripts."
+ filename "sh-script-1.05-pkg.tar.gz"
+ md5sum "8462bd33b9edc71da72ebd134b8a77c6"
+ size 33785
+ provides (sh-script executable)
+ requires (xemacs-base)
+ type regular
+))
+(vc-cc
+ (standards-version 1.0
+ version "1.04"
+ author-version "21.0"
+ date "1998-06-30"
+ build-date "1998-07-09"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution contrib
+ priority low
+ category "prog"
+ dump t
+ description "Version Control for ClearCase (UnFree) systems."
+ filename "vc-cc-1.04-pkg.tar.gz"
+ md5sum "07557cc75c0b2aafc5966cca1c0a22e2"
+ size 96262
+ provides (vc)
+ requires (dired xemacs-base)
+ type regular
+))
+(vc
+ (standards-version 1.0
+ version "1.09"
+ author-version "21.0b42"
+ date "1998-05-30"
+ build-date "1998-06-01"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority low
+ category "prog"
+ dump t
+ description "Version Control for Free systems."
+ filename "vc-1.09-pkg.tar.gz"
+ md5sum "233d46c01ab9e5052395cf730420f41d"
+ size 83688
+ provides (vc)
+ requires (dired xemacs-base)
+ type regular
+))
+(vhdl
+ (standards-version 1.0
+ version "1.04"
+ author-version "2.74"
+ date "1998-01-24"
+ build-date "1998-06-14"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority low
+ category "prog"
+ dump nil
+ description "Support for VHDL."
+ filename "vhdl-1.04-pkg.tar.gz"
+ md5sum "8de144972dd6f33bcdd43314e6e6564d"
+ size 54169
+ provides (vhdl-mode)
+ requires ()
+ type regular
+))
+(auctex
+ (standards-version 1.0
+ version "1.08"
+ author-version "9.7p"
+ date "1998-04-10"
+ build-date "1998-04-17"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority medium
+ category "wp"
+ dump nil
+ description "Basic TeX/LaTeX support."
+ filename "auctex-1.08-pkg.tar.gz"
+ md5sum "e79c956bd2a7cfc086d91c399667c2ef"
+ size 305607
+ provides (auc-old bib-cite font-latex latex multi-prompt tex-buf tex-info tex-jp tex-site tex)
+ requires (xemacs-base)
+ type regular
+))
+(crisp
+ (standards-version 1.0
+ version "1.04"
+ author-version "1.33"
+ date "1998-01-24"
+ build-date "1998-07-09"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority low
+ category "wp"
+ dump nil
+ description "Crisp/Brief emulation."
+ filename "crisp-1.04-pkg.tar.gz"
+ md5sum "2a51917984d7556019b1b20ff85a9feb"
+ size 10189
+ provides (crisp scroll-lock)
+ requires ()
+ type regular
+))
+(edt
+ (standards-version 1.0
+ version "1.04"
+ author-version "21.0b36"
+ date "1998-04-07"
+ build-date "1998-04-17"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution contrib
+ priority low
+ category "wp"
+ dump nil
+ description "DEC EDIT/EDT emulation."
+ filename "edt-1.04-pkg.tar.gz"
+ md5sum "fabfedc63988de7296eae068d8b78ae0"
+ size 46095
+ provides (edt)
+ requires (xemacs-base)
+ type regular
+))
+(reftex
+ (standards-version 1.0
+ version "1.04"
+ author-version "3.22"
+ date "1998-03-21"
+ build-date "1998-04-04"
+ maintainer "Carsten Dominik <dominik@strw.LeidenUniv.nl>"
+ distribution stable
+ priority medium
+ category "wp"
+ dump nil
+ description "Emacs support for LaTeX cross-references, citations.."
+ filename "reftex-1.04-pkg.tar.gz"
+ md5sum "817a50763a3e909449a93780f662723c"
+ size 141810
+ provides (reftex)
+ requires (fsf-compat xemacs-base)
+ type regular
+))
+(texinfo
+ (standards-version 1.0
+ version "1.09"
+ author-version "21.0"
+ date "1998-07-01"
+ build-date "1998-07-09"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority high
+ category "wp"
+ dump nil
+ description "XEmacs TeXinfo support."
+ filename "texinfo-1.09-pkg.tar.gz"
+ md5sum "7ab1fa9774456869027cfc0846d8f3fc"
+ size 127683
+ provides (makeinfo tex-mode texinfmt texinfo texnfo-tex texnfo-upd)
+ requires (xemacs-base)
+ type regular
+))
+(textools
+ (standards-version 1.0
+ version "1.05"
+ author-version "21.0b38"
+ date "1998-04-29"
+ build-date "1998-05-01"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stabl
+ priority medium
+ category "wp"
+ dump nil
+ description "Miscellaneous TeX support."
+ filename "textools-1.05-pkg.tar.gz"
+ md5sum "4b0a417849ca270ed498c1e9c9aaa07b"
+ size 79125
+ provides (bib-mode bibtex refer-to-bibtex)
+ requires (xemacs-base)
+ type single
+))
+(tpu
+ (standards-version 1.0
+ version "1.04"
+ author-version "21.0b35"
+ date "1998-01-24"
+ build-date "1998-04-04"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution mule
+ priority high
+ category "wp"
+ dump nil
+ description "DEC EDIT/TPU support."
+ filename "tpu-1.04-pkg.tar.gz"
+ md5sum "f45c9f761d6a88b2d3bdb4a4af2abf25"
+ size 57425
+ provides (tpu)
+ requires ()
+ type regular
+))
+(viper
+ (standards-version 1.0
+ version "1.08"
+ author-version "3.03"
+ date "1998-02-25"
+ build-date "1998-06-01"
+ maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+ distribution stable
+ priority low
+ category "wp"
+ dump nil
+ description "VI emulation support."
+ filename "viper-1.08-pkg.tar.gz"
+ md5sum "f36b7e49bda79a19d7beeeeb6092bedd"
+ size 261090
+ provides (viper)
+ requires (xemacs-base)
+ type regular
+))
+))
+(provide 'package-get-base)
nil
configure-site-directory))
-(defun paths-find-site-module-directory (roots)
- "Find the site modules directory of the XEmacs hierarchy."
- (paths-find-site-directory roots "site-modules"
- nil
- configure-site-module-directory))
-
(defun paths-find-lisp-directory (roots)
"Find the main Lisp directory of the XEmacs hierarchy."
(paths-find-version-directory roots "lisp"
nil
configure-lisp-directory))
-(defun paths-find-module-directory (roots)
- "Find the main modules directory of the XEmacs hierarchy."
- (paths-find-architecture-directory roots "modules"
- configure-module-directory))
-
(defun paths-construct-load-path
(roots early-package-load-path late-package-load-path last-package-load-path
lisp-directory
lisp-load-path
last-package-load-path)))
-(defun paths-construct-module-load-path
- (root module-directory &optional site-module-directory)
- "Construct the modules load path."
- (let* ((envvar-value (getenv "EMACSMODULEPATH"))
- (env-module-path
- (and envvar-value
- (paths-decode-directory-path envvar-value 'drop-empties)))
- (site-module-load-path
- (and site-module-directory
- (paths-find-recursive-load-path (list site-module-directory)
- paths-load-path-depth)))
- (module-load-path
- (and module-directory
- (paths-find-recursive-load-path (list module-directory)
- paths-load-path-depth))))
- (append env-module-path
- site-module-load-path
- module-load-path)))
-
(defun paths-construct-info-path (roots early-packages late-packages last-packages)
"Construct the info path."
(let ((info-path-envval (getenv "INFOPATH")))
(defun paths-find-lock-directory (roots)
"Find the lock directory."
- (defvar configure-lock-directory)
(paths-find-site-directory roots "lock" "EMACSLOCKDIR" configure-lock-directory))
(defun paths-find-superlock-file (lock-directory)
"Find the superlock file."
- ;; #### There is no such variable configure-superlock-file!
(cond
((null lock-directory)
nil)
(paths-decode-directory-path path-envval 'drop-empties)))
(packages-find-package-exec-path early-packages)
(packages-find-package-exec-path late-packages)
+ (packages-find-package-exec-path last-packages)
(let ((emacspath-envval (getenv "EMACSPATH")))
(and emacspath-envval
(split-path emacspath-envval)))
(and exec-directory
- (list exec-directory))
- (packages-find-package-exec-path last-packages)))
+ (list exec-directory))))
(defun paths-find-data-directory (roots)
"Find the data directory."
(append
(packages-find-package-data-path early-packages)
(packages-find-package-data-path late-packages)
- (list data-directory)
- (packages-find-package-data-path last-packages)))
+ (packages-find-package-data-path last-packages)
+ (list data-directory)))
;;; setup-paths.el ends here
(defvar command-line-processed nil "t once command line has been processed")
(defconst startup-message-timeout 12000) ; More or less disable the timeout
-(defconst splash-frame-timeout 7) ; interval between splash frame elements
(defconst inhibit-startup-message nil
"*Non-nil inhibits the initial startup message.
(princ (concat "\n" (emacs-version) "\n\n"))
(princ
(if (featurep 'x)
- (concat "When creating a window on an X display, "
- (emacs-name)
- " accepts all standard X Toolkit
-command line options plus the following:
- -iconname <title> Use title as the icon name.
- -mc <color> Use color as the mouse color.
- -cr <color> Use color as the text-cursor foregound color.
- -private Install a private colormap.
-
-In addition, the")
+ (concat (emacs-name)
+ " accepts all standard X Toolkit command line options.\n"
+ "In addition, the")
"The"))
(princ " following options are accepted:
+
-t <device> Use TTY <device> instead of the terminal for input
and output. This implies the -nw option.
-nw Inhibit the use of any window-system-specific
(message "Back to top level.")
(setq command-line-processed t)
;; Canonicalize HOME (PWD is canonicalized by init_buffer in buffer.c)
- (let ((value (user-home-directory)))
- (if (and value
- (< (length value) (length default-directory))
- (equal (file-attributes default-directory)
- (file-attributes value)))
- (setq default-directory (file-name-as-directory value))))
+ (unless (eq system-type 'vax-vms)
+ (let ((value (user-home-directory)))
+ (if (and value
+ (< (length value) (length default-directory))
+ (equal (file-attributes default-directory)
+ (file-attributes value)))
+ (setq default-directory (file-name-as-directory value)))))
(setq default-directory (abbreviate-file-name default-directory))
(initialize-xemacs-paths)
(if (not inhibit-autoloads)
(progn
- (if (not inhibit-early-packages)
- (packages-load-package-auto-autoloads early-package-load-path))
+ (packages-load-package-auto-autoloads last-package-load-path)
(packages-load-package-auto-autoloads late-package-load-path)
- (packages-load-package-auto-autoloads last-package-load-path)))
+ (if (not inhibit-early-packages)
+ (packages-load-package-auto-autoloads early-package-load-path))))
(unwind-protect
(command-line)
(message "Error in init file: %s" (error-message-string error))
(display-warning 'initialization
(format "\
-An error has occurred while loading %s:
+An error has occured while loading %s:
%s
(when (string= (buffer-name) "*scratch*")
(unless (or inhibit-startup-message
(input-pending-p))
- (let (tmout circ-tmout)
+ (let ((timeout nil))
(unwind-protect
;; Guts of with-timeout
- (catch 'tmout
- (setq tmout (add-timeout startup-message-timeout
- (lambda (ignore)
- (condition-case nil
- (throw 'tmout t)
- (error nil)))
- nil))
- (setq circ-tmout (display-splash-frame))
+ (catch 'timeout
+ (setq timeout (add-timeout startup-message-timeout
+ (lambda (ignore)
+ (condition-case nil
+ (throw 'timeout t)
+ (error nil)))
+ nil))
+ (startup-splash-frame)
(or nil;; (pos-visible-in-window-p (point-min))
(goto-char (point-min)))
(sit-for 0)
(setq unread-command-event (next-command-event)))
- (when tmout (disable-timeout tmout))
- (when circ-tmout (disable-timeout circ-tmout)))))
+ (when timeout (disable-timeout timeout)))))
(with-current-buffer (get-buffer "*scratch*")
;; In case the XEmacs server has already selected
;; another buffer, erase the one our message is in.
(symbol-name e)))
(defun splash-frame-present-hack (e v)
- ;; (set-extent-property e 'mouse-face 'highlight)
- ;; (set-extent-property e 'keymap
- ;; startup-presentation-hack-keymap)
- ;; (set-extent-property e 'startup-presentation-hack v)
- ;; (set-extent-property e 'help-echo
- ;; 'startup-presentation-hack-help)
+ ;; (set-extent-property e 'mouse-face 'highlight)
+ ;; (set-extent-property e 'keymap
+ ;; startup-presentation-hack-keymap)
+ ;; (set-extent-property e 'startup-presentation-hack v)
+ ;; (set-extent-property e 'help-echo
+ ;; 'startup-presentation-hack-help))
)
(defun splash-hack-version-string ()
(+ left-margin
(round (/ (/ (- fill-area-width glyph-pixwidth) 2) avg-pixwidth)))))
-(defun splash-frame-body ()
- `[((face (blue bold underline)
- "\nDistribution, copying license, warranty:\n\n")
- "Please visit the XEmacs website at http://www.xemacs.org !\n\n"
- ,@(if (featurep 'sparcworks)
- `( "\
+(defun startup-splash-frame-body ()
+ `("\n" ,(emacs-version) "\n"
+ ,@(if (string-match "beta" emacs-version)
+ `( (face (bold blue) ( "This is an Experimental version of XEmacs. "
+ " Type " (key describe-beta)
+ " to see what this means.\n")))
+ `( "\n"))
+ (face bold-italic "\
+Copyright (C) 1985-1997 Free Software Foundation, Inc.
+Copyright (C) 1990-1994 Lucid, Inc.
+Copyright (C) 1993-1997 Sun Microsystems, Inc. All Rights Reserved.
+Copyright (C) 1994-1996 Board of Trustees, University of Illinois
+Copyright (C) 1995-1996 Ben Wing\n\n")
+
+ ,@(if (featurep 'sparcworks)
+ `( "\
Sun provides support for the WorkShop/XEmacs integration package only.
-All other XEmacs packages are provided to you \"AS IS\".\n"
- ,@(let ((lang (or (getenv "LC_ALL") (getenv "LC_MESSAGES")
- (getenv "LANG"))))
- (if (and
- (not (featurep 'mule)) ;; Already got mule?
- ;; No Mule support on tty's yet
- (not (eq 'tty (console-type)))
- lang ;; Non-English locale?
- (not (string= lang "C"))
- (not (string-match "^en" lang))
- ;; Comes with Sun WorkShop
- (locate-file "xemacs-mule" exec-path))
- '( "\
+All other XEmacs packages are provided to you \"AS IS\".
+For full details, type " (key describe-no-warranty)
+" to refer to the GPL Version 2, dated June 1991.\n\n"
+,@(let ((lang (or (getenv "LC_ALL") (getenv "LC_MESSAGES") (getenv "LANG"))))
+ (if (and
+ (not (featurep 'mule)) ; Already got mule?
+ (not (eq 'tty (console-type))) ; No Mule support on tty's yet
+ lang ; Non-English locale?
+ (not (string= lang "C"))
+ (not (string-match "^en" lang))
+ (locate-file "xemacs-mule" exec-path)) ; Comes with Sun WorkShop
+ '( "\
This version of XEmacs has been built with support for Latin-1 languages only.
To handle other languages you need to run a Multi-lingual (`Mule') version of
XEmacs, by either running the command `xemacs-mule', or by using the X resource
-`ESERVE*defaultXEmacsPath: xemacs-mule' when starting XEmacs from Sun WorkShop.
-\n")))))
- ((key describe-no-warranty)
- ": "(face (red bold) "XEmacs comes with ABSOLUTELY NO WARRANTY\n"))
- ((key describe-copying)
- ": conditions to give out copies of XEmacs\n")
- ((key describe-distribution)
- ": how to get the latest version\n")
- "\n--\n"
- (face italic "\
-Copyright (C) 1985-1999 Free Software Foundation, Inc.
-Copyright (C) 1990-1994 Lucid, Inc.
-Copyright (C) 1993-1997 Sun Microsystems, Inc. All Rights Reserved.
-Copyright (C) 1994-1996 Board of Trustees, University of Illinois
-Copyright (C) 1995-1996 Ben Wing\n"))
+`ESERVE*defaultXEmacsPath: xemacs-mule' when starting XEmacs from Sun WorkShop.\n\n"))))
+
+ '("XEmacs comes with ABSOLUTELY NO WARRANTY; type "
+ (key describe-no-warranty) " for full details.\n"))
- ((face (blue bold underline) "\nInformation, on-line help:\n\n")
- "XEmacs comes with plenty of documentation...\n\n"
- ,@(if (string-match "beta" emacs-version)
- `((key describe-beta)
- ": " (face (red bold)
- "This is an Experimental version of XEmacs.\n"))
- `( "\n"))
- ((key xemacs-local-faq)
- ": read the XEmacs FAQ (a " (face underline "capital") " F!)\n")
- ((key help-with-tutorial)
- ": read the XEmacs tutorial (also available through the "
- (face bold "Help") " menu)\n")
- ((key help-command)
- ": get help on using XEmacs (also available through the "
- (face bold "Help") " menu)\n")
- ((key info) ": read the on-line documentation\n\n")
- ((key describe-project) ": read about the GNU project\n")
- ((key about-xemacs) ": see who's developing XEmacs\n"))
-
- ((face (blue bold underline) "\nUseful stuff:\n\n")
- "Things that you should know rather quickly...\n\n"
- ((key find-file) ": visit a file\n")
- ((key save-buffer) ": save changes\n")
- ((key advertised-undo) ": undo changes\n")
- ((key save-buffers-kill-emacs) ": exit XEmacs\n"))
- ])
+ "You may give out copies of XEmacs; type "
+ (key describe-copying) " to see the conditions.\n"
+ "Type " (key describe-distribution)
+ " for information on getting the latest version.\n\n"
+
+ "Type " (key help-command) " or use the " (face bold "Help") " menu to get help.\n"
+ "Type " (key advertised-undo) " to undo changes (`C-' means use the Control key).\n"
+ "To get out of XEmacs, type " (key save-buffers-kill-emacs) ".\n"
+ "Type " (key help-with-tutorial) " for a tutorial on using XEmacs.\n"
+ "Type " (key info) " to enter Info, "
+ "which you can use to read online documentation.\n"
+ (face (bold red) ( "\
+For tips and answers to frequently asked questions, see the XEmacs FAQ.
+\(It's on the Help menu, or type " (key xemacs-local-faq) " [a capital F!].\)"))))
;; I really hate global variables, oh well.
;(defvar xemacs-startup-logo-function nil
; "If non-nil, function called to provide the startup logo.
;This function should return an initialized glyph if it is used.")
-;; This will hopefully go away when gettext is functionnal.
-(defconst splash-frame-static-body
- `(,(emacs-version) "\n\n"
- (face italic "`C-' means the control key,`M-' means the meta key\n\n")))
-
-
-(defun circulate-splash-frame-elements (client-data)
- (with-current-buffer (aref client-data 2)
- (let ((buffer-read-only nil)
- (elements (aref client-data 3))
- (indice (aref client-data 0)))
- (goto-char (aref client-data 1))
- (delete-region (point) (point-max))
- (splash-frame-present (aref elements indice))
- (set-buffer-modified-p nil)
- (aset client-data 0
- (if (= indice (- (length elements) 1))
- 0
- (1+ indice )))
- )))
-
-;; ### This function now returns the (possibly nil) timeout circulating the
-;; splash-frame elements
-(defun display-splash-frame ()
- (let ((logo xemacs-logo)
- (buffer-read-only nil)
+(defun startup-splash-frame ()
+ (let ((p (point))
+; (logo (cond (xemacs-startup-logo-function
+; (funcall xemacs-startup-logo-function))
+; (t xemacs-logo)))
+ (logo xemacs-logo)
(cramped-p (eq 'tty (console-type))))
(unless cramped-p (insert "\n"))
(indent-to (startup-center-spaces logo))
(set-extent-begin-glyph (make-extent (point) (point)) logo)
- ;;(splash-frame-present-hack (make-extent p (point)) 'about-xemacs))
- (insert "\n\n")
- (splash-frame-present splash-frame-static-body)
- (splash-hack-version-string)
- (goto-char (point-max))
- (let* ((after-change-functions nil) ; no font-lock, thank you
- (elements (splash-frame-body))
- (client-data `[ 1 ,(point) ,(current-buffer) ,elements ])
- tmout)
- (if (listp elements) ;; A single element to display
- (splash-frame-present (splash-frame-body))
- ;; several elements to rotate
- (splash-frame-present (aref elements 0))
- (setq tmout (add-timeout splash-frame-timeout
- 'circulate-splash-frame-elements
- client-data splash-frame-timeout)))
- (set-buffer-modified-p nil)
- tmout)))
+ (insert (if cramped-p "\n" "\n\n"))
+ (splash-frame-present-hack (make-extent p (point)) 'about-xemacs))
+
+ (let ((after-change-functions nil)) ; no font-lock, thank you
+ (dolist (l (startup-splash-frame-body))
+ (splash-frame-present l)))
+ (splash-hack-version-string)
+ (set-buffer-modified-p nil))
;; (let ((present-file
;; #'(lambda (f)
(load "setup-paths.el")
(load "dump-paths.el")
-(let ((autol (packages-list-autoloads (concat default-directory "../lisp"))))
+(let ((autol (packages-list-autoloads)))
;; (print (prin1-to-string autol))
(while autol
(let ((src (car autol)))
;; (print (prin1-to-string update-elc-files-to-compile))
(let (preloaded-file-list site-load-packages)
- (load (expand-file-name "../lisp/dumped-lisp.el"))
+ (load (concat default-directory "../lisp/dumped-lisp.el"))
;; Path setup
(let ((package-preloaded-file-list
(defconst emacs-version
(purecopy
- (format "%d.%d %s%s%s%s"
+ (format "%d.%d %s%s%s"
emacs-major-version
emacs-minor-version
- (if emacs-patch-level
- (format "(patch %d)" emacs-patch-level)
+ (if xemacs-codename
+ (concat "\"" xemacs-codename "\"")
"")
+ " XEmacs Lucid"
(if xemacs-betaname
(concat " " xemacs-betaname)
- "")
- (if xemacs-codename
- (concat " \"" xemacs-codename "\"")
- "")
- " XEmacs Lucid"))
+ "")))
"Version numbers of this version of XEmacs.")
(if (featurep 'infodock)
(t (insert version-string))))))
;; from emacs-vers.el
-(defun emacs-version>= (major &optional minor patch)
- "Return true if the Emacs version is >= to the given MAJOR, MINOR,
- and PATCH numbers.
-The MAJOR version number argument is required, but the other arguments
-argument are optional. Only the Non-nil arguments are used in the test."
- (let ((emacs-patch (or emacs-patch-level emacs-beta-version -1)))
- (cond ((> emacs-major-version major))
- ((< emacs-major-version major) nil)
- ((null minor))
- ((> emacs-minor-version minor))
- ((< emacs-minor-version minor) nil)
- ((null patch))
- ((>= emacs-patch patch)))))
+(defun emacs-version>= (major &optional minor)
+ "Return true if the Emacs version is >= to the given MAJOR and MINOR numbers.
+The MAJOR version number argument is required, but the MINOR version number
+argument is optional. If the minor version number is not specified (or is the
+symbol `nil') then only the major version numbers are considered in the test."
+ (if (null minor)
+ (>= emacs-major-version major)
+ (or (> emacs-major-version major)
+ (and (= emacs-major-version major)
+ (>= emacs-minor-version minor)))))
;;; We hope that this alias is easier for people to find.
(define-function 'version 'emacs-version)
;; `what(1)' can extract from the executable or a core file. We don't
;; actually need this to be pointed to from lisp; pure objects can't
;; be GCed.
-(or (memq system-type '(windows-nt ms-dos))
+(or (memq system-type '(vax-vms windows-nt ms-dos))
(purecopy (concat "\n@" "(#)" (emacs-version)
"\n@" "(#)" "Configuration: "
system-configuration "\n")))
--- /dev/null
+;;; winnt.el --- Lisp routines for Windows NT.
+
+;; Copyright (C) 1994 Free Software Foundation, Inc.
+
+;; Maintainer: XEmacs Development Team
+;; Keywords: mouse, dumped
+
+;; This file is part of XEmacs.
+
+;; XEmacs is free software; you can redistribute it and/or modify it
+;; under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; XEmacs is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;; General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with XEmacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Synched up with: Not synched with FSF. Almost completely divergent.
+
+;;; Commentary:
+
+;; This file is dumped with XEmacs for MS Windows (without cygwin).
+
+;; Based on NT Emacs version by Geoff Voelker (voelker@cs.washington.edu)
+;; Ported to XEmacs by Marc Paquette <marcpa@cam.org>
+;; Largely modified by Kirill M. Katsnelson <kkm@kis.ru>
+
+;;; Code:
+
+;; The cmd.exe shell uses the "/c" switch instead of the "-c" switch
+;; for executing its command line argument (from simple.el).
+;; #### Oh if we had an alist of shells and their command switches.
+(setq shell-command-switch "/c")
+
+;; For appending suffixes to directories and files in shell completions.
+(defun nt-shell-mode-hook ()
+ (setq comint-completion-addsuffix '("\\" . " ")
+ comint-process-echoes t))
+(add-hook 'shell-mode-hook 'nt-shell-mode-hook)
+
+;; Use ";" instead of ":" as a path separator (from files.el).
+(setq path-separator ";")
+
+;; Set the null device (for compile.el).
+;; #### There should be such a global thingy as null-device - kkm
+(setq grep-null-device "NUL")
+
+;; Set the grep regexp to match entries with drive letters.
+(setq grep-regexp-alist
+ '(("^\\(\\([a-zA-Z]:\\)?[^:( \t\n]+\\)[:( \t]+\\([0-9]+\\)[:) \t]" 1 3)))
+
+;;----------------------------------------------------------------------
+;; Autosave hack
+;;--------------------
+
+;; Avoid creating auto-save file names containing invalid characters
+;; (primarily "*", eg. for the *mail* buffer).
+;; Avoid "doc lost for function" warning
+(defun original-make-auto-save-file-name (&optional junk)
+ "You do not want to call this."
+ )
+(fset 'original-make-auto-save-file-name
+ (symbol-function 'make-auto-save-file-name))
+
+(defun make-auto-save-file-name ()
+ "Return file name to use for auto-saves of current buffer.
+Does not consider `auto-save-visited-file-name' as that variable is checked
+before calling this function. You can redefine this for customization.
+See also `auto-save-file-name-p'."
+ (let ((name (original-make-auto-save-file-name))
+ (start 0))
+ ;; destructively replace occurences of * or ? with $
+ (while (string-match "[?*]" name start)
+ (aset name (match-beginning 0) ?$)
+ (setq start (1+ (match-end 0))))
+ name))
+
+;;----------------------------------------------------------------------
+;; Quoting process args
+;;--------------------
+
+(defun nt-quote-args-verbatim (args)
+ "Copy ARG list verbatim, separating each arg with space."
+ (mapconcat 'identity args " "))
+
+(defun nt-quote-args-prefix-quote (prefix args)
+ (mapconcat (lambda (str)
+ (concat "\""
+ (mapconcat (lambda (ch)
+ (concat (if (eq ch ?\") prefix)
+ (char-to-string ch)))
+ str nil)
+ "\""))
+ args " "))
+
+(defun nt-quote-args-backslash-quote (args)
+ "Place ARG list in quotes, prefixing quotes in args with backslashes."
+ (nt-quote-args-prefix-quote "\\" args))
+
+(defun nt-quote-args-double-quote (args)
+ "Place ARG list in quotes, doubling quotes in args."
+ (nt-quote-args-prefix-quote "\"" args))
+
+(defvar nt-quote-args-functions-alist
+ '(("^.?.?sh\\." . nt-quote-args-double-quote))
+ "An alist for determining proper argument quoting given executable file name.
+Car of each cons must be a string, a regexp against which a file name sans
+directory is matched. Cdr is a function symbol. The list is mathced in
+forward order, and mathcing entry cdr's funcrion is called with a list of
+strings, process arguments. It must return a string which is passed to
+the newly created process.
+
+If not found, then `nt-quote-args-verbatim' is called on the argument list.")
+
+(defun nt-quote-process-args (args)
+ ;;Properly quote process ARGS for executing (car ARGS).
+ (let ((fname (file-name-nondirectory (car args)))
+ (alist nt-quote-args-functions-alist)
+ (case-fold-search nil)
+ (return-me nil)
+ (assoc nil))
+ (while (and alist
+ (null return-me))
+ (setq assoc (pop alist))
+ (if (string-match (car assoc) fname)
+ (setq return-me (funcall (cdr assoc) (cdr args)))))
+ (or return-me
+ (nt-quote-args-verbatim (cdr args)))))
+
+;;; winnt.el ends here
--- /dev/null
+Dummy file to keep CVS happy.
--- /dev/null
+/* lwlib/config.h. Generated automatically by configure. */
+/* Lwlib site configuration template file. -*- C -*-
+ Copyright (C) 1997 Sun Microsystems, Inc.
+
+This file is part of XEmacs.
+
+XEmacs is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+XEmacs is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with XEmacs; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/* Not in FSF. */
+
+#ifndef _LWLIB_CONFIG_H_
+#define _LWLIB_CONFIG_H_
+
+#include <../src/config.h>
+
+/* #undef NEED_MOTIF */
+/* #undef NEED_ATHENA */
+/* #undef NEED_LUCID */
+
+#endif /* _LWLIB_CONFIG_H_ */
--- /dev/null
+\input texinfo @c -*-texinfo-*-
+@comment %**start of header
+@setfilename ../info/info-stnd.info
+@settitle GNU Info
+@set InfoProgVer 2.11
+@paragraphindent none
+@footnotestyle end
+@synindex vr cp
+@synindex fn cp
+@synindex ky cp
+@comment %**end of header
+@comment $Id: info-stnd.texi,v 1.3 1998/06/30 06:35:28 steve Exp $
+
+@dircategory Texinfo documentation system
+@direntry
+* info program: (info-stnd). Standalone Info-reading program.
+@end direntry
+
+@ifinfo
+This file documents GNU Info, a program for viewing the on-line formatted
+versions of Texinfo files. This documentation is different from the
+documentation for the Info reader that is part of GNU Emacs. If you do
+not know how to use Info, but have a working Info reader, you should
+read that documentation first.
+
+Copyright @copyright{} 1992, 93, 96, 97 Free Software Foundation, Inc.
+
+Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+@ignore
+Permission is granted to process this file through TeX and print the
+results, provided the printed document carries a copying permission
+notice identical to this one except for the removal of this paragraph
+(this paragraph not being relevant to the printed manual).
+@end ignore
+
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided also that the
+sections entitled ``Copying'' and ``GNU General Public License'' are
+included exactly as in the original, and provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that this permission notice may be stated in a translation
+approved by the Free Software Foundation.
+@end ifinfo
+
+@titlepage
+@title GNU Info User's Guide
+@subtitle For GNU Info version @value{InfoProgVer}
+@author Brian J. Fox (bfox@@ai.mit.edu)
+@page
+@vskip 0pt plus 1filll
+Copyright @copyright{} 1992, 1993, 1997 Free Software Foundation
+
+Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided also that the
+sections entitled ``Copying'' and ``GNU General Public License'' are
+included exactly as in the original, and provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that this permission notice may be stated in a translation
+approved by the Free Software Foundation.
+@end titlepage
+
+@ifinfo
+@node Top, What is Info, , (dir)
+@top The GNU Info Program
+
+This file documents GNU Info, a program for viewing the on-line
+formatted versions of Texinfo files, version @value{InfoProgVer}. This
+documentation is different from the documentation for the Info reader
+that is part of GNU Emacs.
+@end ifinfo
+
+@menu
+* What is Info::
+* Options:: Options you can pass on the command line.
+* Cursor Commands:: Commands which move the cursor within a node.
+* Scrolling Commands:: Commands for moving the node around
+ in a window.
+* Node Commands:: Commands for selecting a new node.
+* Searching Commands:: Commands for searching an Info file.
+* Xref Commands:: Commands for selecting cross references.
+* Window Commands:: Commands which manipulate multiple windows.
+* Printing Nodes:: How to print out the contents of a node.
+* Miscellaneous Commands:: A few commands that defy categories.
+* Variables:: How to change the default behavior of Info.
+* GNU Info Global Index:: Global index containing keystrokes,
+ command names, variable names,
+ and general concepts.
+@end menu
+
+@node What is Info, Options, Top, Top
+@chapter What is Info?
+
+@iftex
+This file documents GNU Info, a program for viewing the on-line formatted
+versions of Texinfo files, version @value{InfoProgVer}.
+@end iftex
+
+@dfn{Info} is a program which is used to view Info files on an ASCII
+terminal. @dfn{Info files} are the result of processing Texinfo files
+with the program @code{makeinfo} or with one of the Emacs commands, such
+as @code{M-x texinfo-format-buffer}. Texinfo itself is a documentation
+system that uses a single source file to produce both on-line
+information and printed output. You can typeset and print the
+files that you read in Info.@refill
+
+@node Options, Cursor Commands, What is Info, Top
+@chapter Command Line Options
+@cindex command line options
+@cindex arguments, command line
+
+GNU Info accepts several options to control the initial node being
+viewed, and to specify which directories to search for Info files. Here
+is a template showing an invocation of GNU Info from the shell:
+
+@example
+info [--@var{option-name} @var{option-value}] @var{menu-item}@dots{}
+@end example
+
+The following @var{option-names} are available when invoking Info from
+the shell:
+
+@table @code
+@cindex directory path
+@item --directory @var{directory-path}
+@itemx -d @var{directory-path}
+Add @var{directory-path} to the list of directory paths searched when
+Info needs to find a file. You may issue @code{--directory} multiple
+times; once for each directory which contains Info files.
+Alternatively, you may specify a value for the environment variable
+@code{INFOPATH}; if @code{--directory} is not given, the value of
+@code{INFOPATH} is used. The value of @code{INFOPATH} is a colon
+separated list of directory names. If you do not supply @code{INFOPATH}
+or @code{--directory-path}, Info uses a default path.
+
+@item --file @var{filename}
+@itemx -f @var{filename}
+@cindex Info file, selecting
+Specify a particular Info file to visit. By default, Info visits
+the file @code{dir}; if you use this option, Info will start with
+@code{(@var{filename})Top} as the first file and node.
+
+@item --index-search @var{string}
+@cindex index search, selecting
+@cindex online help, using Info as
+Go to the index entry @var{string} in the Info file specified with
+@samp{--file}. If no such entry, print @samp{no entries found} and exit
+with nonzero status. This can used from another program as a way to
+provide online help.
+
+@item --node @var{nodename}
+@itemx -n @var{nodename}
+@cindex node, selecting
+Specify a particular node to visit in the initial file that Info
+loads. This is especially useful in conjunction with
+@code{--file}@footnote{Of course, you can specify both the file and node
+in a @code{--node} command; but don't forget to escape the open and
+close parentheses from the shell as in: @code{info --node
+"(emacs)Buffers"}}. You may specify @code{--node} multiple times; for
+an interactive Info, each @var{nodename} is visited in its own window,
+for a non-interactive Info (such as when @code{--output} is given) each
+@var{nodename} is processed sequentially.
+
+@item --output @var{filename}
+@itemx -o @var{filename}
+@cindex file, outputting to
+@cindex outputting to a file
+Specify @var{filename} as the name of a file to which to direct output.
+Each node that Info visits will be output to @var{filename} instead of
+interactively viewed. A value of @code{-} for @var{filename} specifies
+the standard output.
+
+@item --subnodes
+@cindex @code{--subnodes}, command line option
+This option only has meaning when given in conjunction with
+@code{--output}. It means to recursively output the nodes appearing in
+the menus of each node being output. Menu items which resolve to
+external Info files are not output, and neither are menu items which are
+members of an index. Each node is only output once.
+
+@item --help
+@itemx -h
+Produces a relatively brief description of the available Info options.
+
+@item --version
+@cindex version information
+Prints the version information of Info and exits.
+
+@item @var{menu-item}
+@cindex menu, following
+Info treats its remaining arguments as the names of menu items. The
+first argument is a menu item in the initial node visited, while
+the second argument is a menu item in the first argument's node.
+You can easily move to the node of your choice by specifying the menu
+names which describe the path to that node. For example,
+
+@example
+info emacs buffers
+@end example
+
+@noindent
+first selects the menu item @samp{Emacs} in the node @samp{(dir)Top},
+and then selects the menu item @samp{Buffers} in the node
+@samp{(emacs)Top}.
+@end table
+
+@node Cursor Commands, Scrolling Commands, Options, Top
+@chapter Moving the Cursor
+@cindex cursor, moving
+
+Many people find that reading screens of text page by page is made
+easier when one is able to indicate particular pieces of text with some
+kind of pointing device. Since this is the case, GNU Info (both the
+Emacs and standalone versions) have several commands which allow you to
+move the cursor about the screen. The notation used in this manual to
+describe keystrokes is identical to the notation used within the Emacs
+manual, and the GNU Readline manual. @xref{Characters, , Character
+Conventions, emacs, the GNU Emacs Manual}, if you are unfamiliar with the
+notation.
+
+The following table lists the basic cursor movement commands in Info.
+Each entry consists of the key sequence you should type to execute the
+cursor movement, the @code{M-x}@footnote{@code{M-x} is also a command; it
+invokes @code{execute-extended-command}. @xref{M-x, , Executing an
+extended command, emacs, the GNU Emacs Manual}, for more detailed
+information.} command name (displayed in parentheses), and a short
+description of what the command does. All of the cursor motion commands
+can take an @dfn{numeric} argument (@pxref{Miscellaneous Commands,
+@code{universal-argument}}), to find out how to supply them. With a
+numeric argument, the motion commands are simply executed that
+many times; for example, a numeric argument of 4 given to
+@code{next-line} causes the cursor to move down 4 lines. With a
+negative numeric argument, the motion is reversed; an argument of -4
+given to the @code{next-line} command would cause the cursor to move
+@emph{up} 4 lines.
+
+@table @asis
+@item @code{C-n} (@code{next-line})
+@kindex C-n
+@findex next-line
+Move the cursor down to the next line.
+
+@item @code{C-p} (@code{prev-line})
+@kindex C-p
+@findex prev-line
+Move the cursor up to the previous line.
+
+@item @code{C-a} (@code{beginning-of-line})
+@kindex C-a, in Info windows
+@findex beginning-of-line
+Move the cursor to the start of the current line.
+
+@item @code{C-e} (@code{end-of-line})
+@kindex C-e, in Info windows
+@findex end-of-line
+Move the cursor to the end of the current line.
+
+@item @code{C-f} (@code{forward-char})
+@kindex C-f, in Info windows
+@findex forward-char
+Move the cursor forward a character.
+
+@item @code{C-b} (@code{backward-char})
+@kindex C-b, in Info windows
+@findex backward-char
+Move the cursor backward a character.
+
+@item @code{M-f} (@code{forward-word})
+@kindex M-f, in Info windows
+@findex forward-word
+Move the cursor forward a word.
+
+@item @code{M-b} (@code{backward-word})
+@kindex M-b, in Info windows
+@findex backward-word
+Move the cursor backward a word.
+
+@item @code{M-<} (@code{beginning-of-node})
+@itemx @code{b}
+@kindex b, in Info windows
+@kindex M-<
+@findex beginning-of-node
+Move the cursor to the start of the current node.
+
+@item @code{M->} (@code{end-of-node})
+@kindex M->
+@findex end-of-node
+Move the cursor to the end of the current node.
+
+@item @code{M-r} (@code{move-to-window-line})
+@kindex M-r
+@findex move-to-window-line
+Move the cursor to a specific line of the window. Without a numeric
+argument, @code{M-r} moves the cursor to the start of the line in the
+center of the window. With a numeric argument of @var{n}, @code{M-r}
+moves the cursor to the start of the @var{n}th line in the window.
+@end table
+
+@node Scrolling Commands, Node Commands, Cursor Commands, Top
+@chapter Moving Text Within a Window
+@cindex scrolling
+
+Sometimes you are looking at a screenful of text, and only part of the
+current paragraph you are reading is visible on the screen. The
+commands detailed in this section are used to shift which part of the
+current node is visible on the screen.
+
+@table @asis
+@item @code{SPC} (@code{scroll-forward})
+@itemx @code{C-v}
+@kindex SPC, in Info windows
+@kindex C-v
+@findex scroll-forward
+Shift the text in this window up. That is, show more of the node which
+is currently below the bottom of the window. With a numeric argument,
+show that many more lines at the bottom of the window; a numeric
+argument of 4 would shift all of the text in the window up 4 lines
+(discarding the top 4 lines), and show you four new lines at the bottom
+of the window. Without a numeric argument, @key{SPC} takes the bottom
+two lines of the window and places them at the top of the window,
+redisplaying almost a completely new screenful of lines.
+
+@item @code{DEL} (@code{scroll-backward})
+@itemx @code{M-v}
+@kindex DEL, in Info windows
+@kindex M-v
+@findex scroll-backward
+Shift the text in this window down. The inverse of
+@code{scroll-forward}.
+@end table
+
+@cindex scrolling through node structure
+The @code{scroll-forward} and @code{scroll-backward} commands can also
+move forward and backward through the node structure of the file. If
+you press @key{SPC} while viewing the end of a node, or @key{DEL} while
+viewing the beginning of a node, what happens is controlled by the
+variable @code{scroll-behavior}. @xref{Variables,
+@code{scroll-behavior}}, for more information.
+
+@table @asis
+@item @code{C-l} (@code{redraw-display})
+@kindex C-l
+@findex redraw-display
+Redraw the display from scratch, or shift the line containing the cursor
+to a specified location. With no numeric argument, @samp{C-l} clears
+the screen, and then redraws its entire contents. Given a numeric
+argument of @var{n}, the line containing the cursor is shifted so that
+it is on the @var{n}th line of the window.
+
+@item @code{C-x w} (@code{toggle-wrap})
+@kindex C-w
+@findex toggle-wrap
+Toggles the state of line wrapping in the current window. Normally,
+lines which are longer than the screen width @dfn{wrap}, i.e., they are
+continued on the next line. Lines which wrap have a @samp{\} appearing
+in the rightmost column of the screen. You can cause such lines to be
+terminated at the rightmost column by changing the state of line
+wrapping in the window with @code{C-x w}. When a line which needs more
+space than one screen width to display is displayed, a @samp{$} appears
+in the rightmost column of the screen, and the remainder of the line is
+invisible.
+@end table
+
+@node Node Commands, Searching Commands, Scrolling Commands, Top
+@chapter Selecting a New Node
+@cindex nodes, selection of
+
+This section details the numerous Info commands which select a new node
+to view in the current window.
+
+The most basic node commands are @samp{n}, @samp{p}, @samp{u}, and
+@samp{l}.
+
+When you are viewing a node, the top line of the node contains some Info
+@dfn{pointers} which describe where the next, previous, and up nodes
+are. Info uses this line to move about the node structure of the file
+when you use the following commands:
+
+@table @asis
+@item @code{n} (@code{next-node})
+@kindex n
+@findex next-node
+Select the `Next' node.
+
+@item @code{p} (@code{prev-node})
+@kindex p
+@findex prev-node
+Select the `Prev' node.
+
+@item @code{u} (@code{up-node})
+@kindex u
+@findex up-node
+Select the `Up' node.
+@end table
+
+You can easily select a node that you have already viewed in this window
+by using the @samp{l} command -- this name stands for "last", and
+actually moves through the list of already visited nodes for this
+window. @samp{l} with a negative numeric argument moves forward through
+the history of nodes for this window, so you can quickly step between
+two adjacent (in viewing history) nodes.
+
+@table @asis
+@item @code{l} (@code{history-node})
+@kindex l
+@findex history-node
+Select the most recently selected node in this window.
+@end table
+
+Two additional commands make it easy to select the most commonly
+selected nodes; they are @samp{t} and @samp{d}.
+
+@table @asis
+@item @code{t} (@code{top-node})
+@kindex t
+@findex top-node
+Select the node @samp{Top} in the current Info file.
+
+@item @code{d} (@code{dir-node})
+@kindex d
+@findex dir-node
+Select the directory node (i.e., the node @samp{(dir)}).
+@end table
+
+Here are some other commands which immediately result in the selection
+of a different node in the current window:
+
+@table @asis
+@item @code{<} (@code{first-node})
+@kindex <
+@findex first-node
+Selects the first node which appears in this file. This node is most
+often @samp{Top}, but it does not have to be.
+
+@item @code{>} (@code{last-node})
+@kindex >
+@findex last-node
+Select the last node which appears in this file.
+
+@item @code{]} (@code{global-next-node})
+@kindex ]
+@findex global-next-node
+Move forward or down through node structure. If the node that you are
+currently viewing has a @samp{Next} pointer, that node is selected.
+Otherwise, if this node has a menu, the first menu item is selected. If
+there is no @samp{Next} and no menu, the same process is tried with the
+@samp{Up} node of this node.
+
+@item @code{[} (@code{global-prev-node})
+@kindex [
+@findex global-prev-node
+Move backward or up through node structure. If the node that you are
+currently viewing has a @samp{Prev} pointer, that node is selected.
+Otherwise, if the node has an @samp{Up} pointer, that node is selected,
+and if it has a menu, the last item in the menu is selected.
+@end table
+
+You can get the same behavior as @code{global-next-node} and
+@code{global-prev-node} while simply scrolling through the file with
+@key{SPC} and @key{DEL}; @xref{Variables, @code{scroll-behavior}}, for
+more information.
+
+@table @asis
+@item @code{g} (@code{goto-node})
+@kindex g
+@findex goto-node
+Read the name of a node and select it. No completion is done while
+reading the node name, since the desired node may reside in a separate
+file. The node must be typed exactly as it appears in the Info file. A
+file name may be included as with any node specification, for example
+
+@example
+@code{g(emacs)Buffers}
+@end example
+
+finds the node @samp{Buffers} in the Info file @file{emacs}.
+
+@item @code{C-x k} (@code{kill-node})
+@kindex C-x k
+@findex kill-node
+Kill a node. The node name is prompted for in the echo area, with a
+default of the current node. @dfn{Killing} a node means that Info tries
+hard to forget about it, removing it from the list of history nodes kept
+for the window where that node is found. Another node is selected in
+the window which contained the killed node.
+
+@item @code{C-x C-f} (@code{view-file})
+@kindex C-x C-f
+@findex view-file
+Read the name of a file and selects the entire file. The command
+@example
+@code{C-x C-f @var{filename}}
+@end example
+is equivalent to typing
+@example
+@code{g(@var{filename})*}
+@end example
+
+@item @code{C-x C-b} (@code{list-visited-nodes})
+@kindex C-x C-b
+@findex list-visited-nodes
+Make a window containing a menu of all of the currently visited nodes.
+This window becomes the selected window, and you may use the standard
+Info commands within it.
+
+@item @code{C-x b} (@code{select-visited-node})
+@kindex C-x b
+@findex select-visited-node
+Select a node which has been previously visited in a visible window.
+This is similar to @samp{C-x C-b} followed by @samp{m}, but no window is
+created.
+@end table
+
+@node Searching Commands, Xref Commands, Node Commands, Top
+@chapter Searching an Info File
+@cindex searching
+
+GNU Info allows you to search for a sequence of characters throughout an
+entire Info file, search through the indices of an Info file, or find
+areas within an Info file which discuss a particular topic.
+
+@table @asis
+@item @code{s} (@code{search})
+@kindex s
+@findex search
+Read a string in the echo area and search for it.
+
+@item @code{C-s} (@code{isearch-forward})
+@kindex C-s
+@findex isearch-forward
+Interactively search forward through the Info file for a string as you
+type it.
+
+@item @code{C-r} (@code{isearch-backward})
+@kindex C-r
+@findex isearch-backward
+Interactively search backward through the Info file for a string as
+you type it.
+
+@item @code{i} (@code{index-search})
+@kindex i
+@findex index-search
+Look up a string in the indices for this Info file, and select a node
+where the found index entry points to.
+
+@item @code{,} (@code{next-index-match})
+@kindex ,
+@findex next-index-match
+Move to the node containing the next matching index item from the last
+@samp{i} command.
+@end table
+
+The most basic searching command is @samp{s} (@code{search}). The
+@samp{s} command prompts you for a string in the echo area, and then
+searches the remainder of the Info file for an occurrence of that string.
+If the string is found, the node containing it is selected, and the
+cursor is left positioned at the start of the found string. Subsequent
+@samp{s} commands show you the default search string within @samp{[} and
+@samp{]}; pressing @key{RET} instead of typing a new string will use the
+default search string.
+
+@dfn{Incremental searching} is similar to basic searching, but the
+string is looked up while you are typing it, instead of waiting until
+the entire search string has been specified.
+
+@node Xref Commands, Window Commands, Searching Commands, Top
+@chapter Selecting Cross References
+
+We have already discussed the @samp{Next}, @samp{Prev}, and @samp{Up}
+pointers which appear at the top of a node. In addition to these
+pointers, a node may contain other pointers which refer you to a
+different node, perhaps in another Info file. Such pointers are called
+@dfn{cross references}, or @dfn{xrefs} for short.
+
+@menu
+* Parts of an Xref:: What a cross reference is made of.
+* Selecting Xrefs:: Commands for selecting menu or note items.
+@end menu
+
+@node Parts of an Xref, Selecting Xrefs, , Xref Commands
+@section Parts of an Xref
+
+Cross references have two major parts: the first part is called the
+@dfn{label}; it is the name that you can use to refer to the cross
+reference, and the second is the @dfn{target}; it is the full name of
+the node that the cross reference points to.
+
+The target is separated from the label by a colon @samp{:}; first the
+label appears, and then the target. For example, in the sample menu
+cross reference below, the single colon separates the label from the
+target.
+
+@example
+* Foo Label: Foo Target. More information about Foo.
+@end example
+
+Note the @samp{.} which ends the name of the target. The @samp{.} is
+not part of the target; it serves only to let Info know where the target
+name ends.
+
+A shorthand way of specifying references allows two adjacent colons to
+stand for a target name which is the same as the label name:
+
+@example
+* Foo Commands:: Commands pertaining to Foo.
+@end example
+
+In the above example, the name of the target is the same as the name of
+the label, in this case @code{Foo Commands}.
+
+You will normally see two types of cross reference while viewing nodes:
+@dfn{menu} references, and @dfn{note} references. Menu references
+appear within a node's menu; they begin with a @samp{*} at the beginning
+of a line, and continue with a label, a target, and a comment which
+describes what the contents of the node pointed to contains.
+
+Note references appear within the body of the node text; they begin with
+@code{*Note}, and continue with a label and a target.
+
+Like @samp{Next}, @samp{Prev}, and @samp{Up} pointers, cross references
+can point to any valid node. They are used to refer you to a place
+where more detailed information can be found on a particular subject.
+Here is a cross reference which points to a node within the Texinfo
+documentation: @xref{xref, , Writing an Xref, texinfo, the Texinfo
+Manual}, for more information on creating your own texinfo cross
+references.
+
+@node Selecting Xrefs, , Parts of an Xref, Xref Commands
+@section Selecting Xrefs
+
+The following table lists the Info commands which operate on menu items.
+
+@table @asis
+@item @code{1} (@code{menu-digit})
+@itemx @code{2} @dots{} @code{9}
+@cindex 1 @dots{} 9, in Info windows
+@kindex 1 @dots{} 9, in Info windows
+@findex menu-digit
+Within an Info window, pressing a single digit, (such as @samp{1}),
+selects that menu item, and places its node in the current window.
+For convenience, there is one exception; pressing @samp{0} selects the
+@emph{last} item in the node's menu.
+
+@item @code{0} (@code{last-menu-item})
+@kindex 0, in Info windows
+@findex last-menu-item
+Select the last item in the current node's menu.
+
+@item @code{m} (@code{menu-item})
+@kindex m
+@findex menu-item
+Reads the name of a menu item in the echo area and selects its node.
+Completion is available while reading the menu label.
+
+@item @code{M-x find-menu}
+@findex find-menu
+Move the cursor to the start of this node's menu.
+@end table
+
+This table lists the Info commands which operate on note cross references.
+
+@table @asis
+@item @code{f} (@code{xref-item})
+@itemx @code{r}
+@kindex f
+@kindex r
+@findex xref-item
+Reads the name of a note cross reference in the echo area and selects
+its node. Completion is available while reading the cross reference
+label.
+@end table
+
+Finally, the next few commands operate on menu or note references alike:
+
+@table @asis
+@item @code{TAB} (@code{move-to-next-xref})
+@kindex TAB, in Info windows
+@findex move-to-next-xref
+Move the cursor to the start of the next nearest menu item or note
+reference in this node. You can then use @key{RET}
+(@code{select-reference-this-line}) to select the menu or note reference.
+
+@item @code{M-TAB} (@code{move-to-prev-xref})
+@kindex M-TAB, in Info windows
+@findex move-to-prev-xref
+Move the cursor the start of the nearest previous menu item or note
+reference in this node.
+
+@item @code{RET} (@code{select-reference-this-line})
+@kindex RET, in Info windows
+@findex select-reference-this-line
+Select the menu item or note reference appearing on this line.
+@end table
+
+@node Window Commands, Printing Nodes, Xref Commands, Top
+@chapter Manipulating Multiple Windows
+@cindex windows, manipulating
+
+A @dfn{window} is a place to show the text of a node. Windows have a
+view area where the text of the node is displayed, and an associated
+@dfn{mode line}, which briefly describes the node being viewed.
+
+GNU Info supports multiple windows appearing in a single screen; each
+window is separated from the next by its modeline. At any time, there
+is only one @dfn{active} window, that is, the window in which the cursor
+appears. There are commands available for creating windows, changing
+the size of windows, selecting which window is active, and for deleting
+windows.
+
+@menu
+* The Mode Line:: What appears in the mode line?
+* Basic Windows:: Manipulating windows in Info.
+* The Echo Area:: Used for displaying errors and reading input.
+@end menu
+
+@node The Mode Line, Basic Windows, , Window Commands
+@section The Mode Line
+
+A @dfn{mode line} is a line of inverse video which appears at the bottom
+of an Info window. It describes the contents of the window just above
+it; this information includes the name of the file and node appearing in
+that window, the number of screen lines it takes to display the node,
+and the percentage of text that is above the top of the window. It can
+also tell you if the indirect tags table for this Info file needs to be
+updated, and whether or not the Info file was compressed when stored on
+disk.
+
+Here is a sample mode line for a window containing an uncompressed file
+named @file{dir}, showing the node @samp{Top}.
+
+@example
+@group
+-----Info: (dir)Top, 40 lines --Top---------------------------------------
+ ^^ ^ ^^^ ^^
+ (file)Node #lines where
+@end group
+@end example
+
+When a node comes from a file which is compressed on disk, this is
+indicated in the mode line with two small @samp{z}'s. In addition, if
+the Info file containing the node has been split into subfiles, the name
+of the subfile containing the node appears in the modeline as well:
+
+@example
+--zz-Info: (emacs)Top, 291 lines --Top-- Subfile: emacs-1.Z---------------
+@end example
+
+When Info makes a node internally, such that there is no corresponding
+info file on disk, the name of the node is surrounded by asterisks
+(@samp{*}). The name itself tells you what the contents of the window
+are; the sample mode line below shows an internally constructed node
+showing possible completions:
+
+@example
+-----Info: *Completions*, 7 lines --All-----------------------------------
+@end example
+
+@node Basic Windows, The Echo Area, The Mode Line, Window Commands
+@section Window Commands
+
+It can be convenient to view more than one node at a time. To allow
+this, Info can display more than one @dfn{window}. Each window has its
+own mode line (@pxref{The Mode Line}) and history of nodes viewed in that
+window (@pxref{Node Commands, , @code{history-node}}).
+
+@table @asis
+@item @code{C-x o} (@code{next-window})
+@cindex windows, selecting
+@kindex C-x o
+@findex next-window
+Select the next window on the screen. Note that the echo area can only be
+selected if it is already in use, and you have left it temporarily.
+Normally, @samp{C-x o} simply moves the cursor into the next window on
+the screen, or if you are already within the last window, into the first
+window on the screen. Given a numeric argument, @samp{C-x o} moves over
+that many windows. A negative argument causes @samp{C-x o} to select
+the previous window on the screen.
+
+@item @code{M-x prev-window}
+@findex prev-window
+Select the previous window on the screen. This is identical to
+@samp{C-x o} with a negative argument.
+
+@item @code{C-x 2} (@code{split-window})
+@cindex windows, creating
+@kindex C-x 2
+@findex split-window
+Split the current window into two windows, both showing the same node.
+Each window is one half the size of the original window, and the cursor
+remains in the original window. The variable @code{automatic-tiling}
+can cause all of the windows on the screen to be resized for you
+automatically, please @pxref{Variables, , automatic-tiling} for more
+information.
+
+@item @code{C-x 0} (@code{delete-window})
+@cindex windows, deleting
+@kindex C-x 0
+@findex delete-window
+Delete the current window from the screen. If you have made too many
+windows and your screen appears cluttered, this is the way to get rid of
+some of them.
+
+@item @code{C-x 1} (@code{keep-one-window})
+@kindex C-x 1
+@findex keep-one-window
+Delete all of the windows excepting the current one.
+
+@item @code{ESC C-v} (@code{scroll-other-window})
+@kindex ESC C-v, in Info windows
+@findex scroll-other-window
+Scroll the other window, in the same fashion that @samp{C-v} might
+scroll the current window. Given a negative argument, scroll the
+"other" window backward.
+
+@item @code{C-x ^} (@code{grow-window})
+@kindex C-x ^
+@findex grow-window
+Grow (or shrink) the current window. Given a numeric argument, grow
+the current window that many lines; with a negative numeric argument,
+shrink the window instead.
+
+@item @code{C-x t} (@code{tile-windows})
+@cindex tiling
+@kindex C-x t
+@findex tile-windows
+Divide the available screen space among all of the visible windows.
+Each window is given an equal portion of the screen in which to display
+its contents. The variable @code{automatic-tiling} can cause
+@code{tile-windows} to be called when a window is created or deleted.
+@xref{Variables, , @code{automatic-tiling}}.
+@end table
+
+@node The Echo Area, , Basic Windows, Window Commands
+@section The Echo Area
+@cindex echo area
+
+The @dfn{echo area} is a one line window which appears at the bottom of
+the screen. It is used to display informative or error messages, and to
+read lines of input from you when that is necessary. Almost all of the
+commands available in the echo area are identical to their Emacs
+counterparts, so please refer to that documentation for greater depth of
+discussion on the concepts of editing a line of text. The following
+table briefly lists the commands that are available while input is being
+read in the echo area:
+
+@table @asis
+@item @code{C-f} (@code{echo-area-forward})
+@kindex C-f, in the echo area
+@findex echo-area-forward
+Move forward a character.
+
+@item @code{C-b} (@code{echo-area-backward})
+@kindex C-b, in the echo area
+@findex echo-area-backward
+Move backward a character.
+
+@item @code{C-a} (@code{echo-area-beg-of-line})
+@kindex C-a, in the echo area
+@findex echo-area-beg-of-line
+Move to the start of the input line.
+
+@item @code{C-e} (@code{echo-area-end-of-line})
+@kindex C-e, in the echo area
+@findex echo-area-end-of-line
+Move to the end of the input line.
+
+@item @code{M-f} (@code{echo-area-forward-word})
+@kindex M-f, in the echo area
+@findex echo-area-forward-word
+Move forward a word.
+
+@item @code{M-b} (@code{echo-area-backward-word})
+@kindex M-b, in the echo area
+@findex echo-area-backward-word
+Move backward a word.
+
+@item @code{C-d} (@code{echo-area-delete})
+@kindex C-d, in the echo area
+@findex echo-area-delete
+Delete the character under the cursor.
+
+@item @code{DEL} (@code{echo-area-rubout})
+@kindex DEL, in the echo area
+@findex echo-area-rubout
+Delete the character behind the cursor.
+
+@item @code{C-g} (@code{echo-area-abort})
+@kindex C-g, in the echo area
+@findex echo-area-abort
+Cancel or quit the current operation. If completion is being read,
+@samp{C-g} discards the text of the input line which does not match any
+completion. If the input line is empty, @samp{C-g} aborts the calling
+function.
+
+@item @code{RET} (@code{echo-area-newline})
+@kindex RET, in the echo area
+@findex echo-area-newline
+Accept (or forces completion of) the current input line.
+
+@item @code{C-q} (@code{echo-area-quoted-insert})
+@kindex C-q, in the echo area
+@findex echo-area-quoted-insert
+Insert the next character verbatim. This is how you can insert control
+characters into a search string, for example.
+
+@item @var{printing character} (@code{echo-area-insert})
+@kindex printing characters, in the echo area
+@findex echo-area-insert
+Insert the character.
+
+@item @code{M-TAB} (@code{echo-area-tab-insert})
+@kindex M-TAB, in the echo area
+@findex echo-area-tab-insert
+Insert a TAB character.
+
+@item @code{C-t} (@code{echo-area-transpose-chars})
+@kindex C-t, in the echo area
+@findex echo-area-transpose-chars
+Transpose the characters at the cursor.
+@end table
+
+The next group of commands deal with @dfn{killing}, and @dfn{yanking}
+text. For an in depth discussion of killing and yanking,
+@pxref{Killing, , Killing and Deleting, emacs, the GNU Emacs Manual}
+
+@table @asis
+@item @code{M-d} (@code{echo-area-kill-word})
+@kindex M-d, in the echo area
+@findex echo-area-kill-word
+Kill the word following the cursor.
+
+@item @code{M-DEL} (@code{echo-area-backward-kill-word})
+@kindex M-DEL, in the echo area
+@findex echo-area-backward-kill-word
+Kill the word preceding the cursor.
+
+@item @code{C-k} (@code{echo-area-kill-line})
+@kindex C-k, in the echo area
+@findex echo-area-kill-line
+Kill the text from the cursor to the end of the line.
+
+@item @code{C-x DEL} (@code{echo-area-backward-kill-line})
+@kindex C-x DEL, in the echo area
+@findex echo-area-backward-kill-line
+Kill the text from the cursor to the beginning of the line.
+
+@item @code{C-y} (@code{echo-area-yank})
+@kindex C-y, in the echo area
+@findex echo-area-yank
+Yank back the contents of the last kill.
+
+@item @code{M-y} (@code{echo-area-yank-pop})
+@kindex M-y, in the echo area
+@findex echo-area-yank-pop
+Yank back a previous kill, removing the last yanked text first.
+@end table
+
+Sometimes when reading input in the echo area, the command that needed
+input will only accept one of a list of several choices. The choices
+represent the @dfn{possible completions}, and you must respond with one
+of them. Since there are a limited number of responses you can make,
+Info allows you to abbreviate what you type, only typing as much of the
+response as is necessary to uniquely identify it. In addition, you can
+request Info to fill in as much of the response as is possible; this
+is called @dfn{completion}.
+
+The following commands are available when completing in the echo area:
+
+@table @asis
+@item @code{TAB} (@code{echo-area-complete})
+@itemx @code{SPC}
+@kindex TAB, in the echo area
+@kindex SPC, in the echo area
+@findex echo-area-complete
+Insert as much of a completion as is possible.
+
+@item @code{?} (@code{echo-area-possible-completions})
+@kindex ?, in the echo area
+@findex echo-area-possible-completions
+Display a window containing a list of the possible completions of what
+you have typed so far. For example, if the available choices are:
+
+@example
+@group
+bar
+foliate
+food
+forget
+@end group
+@end example
+
+@noindent
+and you have typed an @samp{f}, followed by @samp{?}, the possible
+completions would contain:
+
+@example
+@group
+foliate
+food
+forget
+@end group
+@end example
+
+@noindent
+i.e., all of the choices which begin with @samp{f}. Pressing @key{SPC}
+or @key{TAB} would result in @samp{fo} appearing in the echo area, since
+all of the choices which begin with @samp{f} continue with @samp{o}.
+Now, typing @samp{l} followed by @samp{TAB} results in @samp{foliate}
+appearing in the echo area, since that is the only choice which begins
+with @samp{fol}.
+
+@item @code{ESC C-v} (@code{echo-area-scroll-completions-window})
+@kindex ESC C-v, in the echo area
+@findex echo-area-scroll-completions-window
+Scroll the completions window, if that is visible, or the "other"
+window if not.
+@end table
+
+@node Printing Nodes, Miscellaneous Commands, Window Commands, Top
+@chapter Printing Out Nodes
+@cindex printing
+
+You may wish to print out the contents of a node as a quick reference
+document for later use. Info provides you with a command for doing
+this. In general, we recommend that you use @TeX{} to format the
+document and print sections of it, by running @code{tex} on the Texinfo
+source file.
+
+@table @asis
+@item @code{M-x print-node}
+@findex print-node
+@cindex INFO_PRINT_COMMAND, environment variable
+Pipe the contents of the current node through the command in the
+environment variable @code{INFO_PRINT_COMMAND}. If the variable does not
+exist, the node is simply piped to @code{lpr}.
+@end table
+
+@node Miscellaneous Commands, Variables, Printing Nodes, Top
+@chapter Miscellaneous Commands
+
+GNU Info contains several commands which self-document GNU Info:
+
+@table @asis
+@item @code{M-x describe-command}
+@cindex functions, describing
+@cindex commands, describing
+@findex describe-command
+Read the name of an Info command in the echo area and then display a
+brief description of what that command does.
+
+@item @code{M-x describe-key}
+@cindex keys, describing
+@findex describe-key
+Read a key sequence in the echo area, and then display the name and
+documentation of the Info command that the key sequence invokes.
+
+@item @code{M-x describe-variable}
+Read the name of a variable in the echo area and then display a brief
+description of what the variable affects.
+
+@item @code{M-x where-is}
+@findex where-is
+Read the name of an Info command in the echo area, and then display
+a key sequence which can be typed in order to invoke that command.
+
+@item @code{C-h} (@code{get-help-window})
+@itemx @code{?}
+@kindex C-h
+@kindex ?, in Info windows
+@findex get-help-window
+Create (or Move into) the window displaying @code{*Help*}, and place
+a node containing a quick reference card into it. This window displays
+the most concise information about GNU Info available.
+
+@item @code{h} (@code{get-info-help-node})
+@kindex h
+@findex get-info-help-node
+Try hard to visit the node @code{(info)Help}. The Info file
+@file{info.texi} distributed with GNU Info contains this node. Of
+course, the file must first be processed with @code{makeinfo}, and then
+placed into the location of your Info directory.
+@end table
+
+Here are the commands for creating a numeric argument:
+
+@table @asis
+@item @code{C-u} (@code{universal-argument})
+@cindex numeric arguments
+@kindex C-u
+@findex universal-argument
+Start (or multiply by 4) the current numeric argument. @samp{C-u} is
+a good way to give a small numeric argument to cursor movement or
+scrolling commands; @samp{C-u C-v} scrolls the screen 4 lines, while
+@samp{C-u C-u C-n} moves the cursor down 16 lines.
+
+@item @code{M-1} (@code{add-digit-to-numeric-arg})
+@itemx @code{M-2} @dots{} @code{M-9}
+@kindex M-1 @dots{} M-9
+@findex add-digit-to-numeric-arg
+Add the digit value of the invoking key to the current numeric
+argument. Once Info is reading a numeric argument, you may just type
+the digits of the argument, without the Meta prefix. For example, you
+might give @samp{C-l} a numeric argument of 32 by typing:
+
+@example
+@kbd{C-u 3 2 C-l}
+@end example
+
+@noindent
+or
+
+@example
+@kbd{M-3 2 C-l}
+@end example
+@end table
+
+@samp{C-g} is used to abort the reading of a multi-character key
+sequence, to cancel lengthy operations (such as multi-file searches) and
+to cancel reading input in the echo area.
+
+@table @asis
+@item @code{C-g} (@code{abort-key})
+@cindex cancelling typeahead
+@cindex cancelling the current operation
+@kindex C-g, in Info windows
+@findex abort-key
+Cancel current operation.
+@end table
+
+The @samp{q} command of Info simply quits running Info.
+
+@table @asis
+@item @code{q} (@code{quit})
+@cindex quitting
+@kindex q
+@findex quit
+Exit GNU Info.
+@end table
+
+If the operating system tells GNU Info that the screen is 60 lines tall,
+and it is actually only 40 lines tall, here is a way to tell Info that
+the operating system is correct.
+
+@table @asis
+@item @code{M-x set-screen-height}
+@findex set-screen-height
+@cindex screen, changing the height of
+Read a height value in the echo area and set the height of the
+displayed screen to that value.
+@end table
+
+Finally, Info provides a convenient way to display footnotes which might
+be associated with the current node that you are viewing:
+
+@table @asis
+@item @code{ESC C-f} (@code{show-footnotes})
+@kindex ESC C-f
+@findex show-footnotes
+@cindex footnotes, displaying
+Show the footnotes (if any) associated with the current node in another
+window. You can have Info automatically display the footnotes
+associated with a node when the node is selected by setting the variable
+@code{automatic-footnotes}. @xref{Variables, , @code{automatic-footnotes}}.
+@end table
+
+@node Variables, GNU Info Global Index, Miscellaneous Commands, Top
+@chapter Manipulating Variables
+
+GNU Info contains several @dfn{variables} whose values are looked at by
+various Info commands. You can change the values of these variables,
+and thus change the behavior of Info to more closely match your
+environment and Info file reading manner.
+
+@table @asis
+@item @code{M-x set-variable}
+@cindex variables, setting
+@findex set-variable
+Read the name of a variable, and the value for it, in the echo area and
+then set the variable to that value. Completion is available when
+reading the variable name; often, completion is available when reading
+the value to give to the variable, but that depends on the variable
+itself. If a variable does @emph{not} supply multiple choices to
+complete over, it expects a numeric value.
+
+@item @code{M-x describe-variable}
+@cindex variables, describing
+@findex describe-variable
+Read the name of a variable in the echo area and then display a brief
+description of what the variable affects.
+@end table
+
+Here is a list of the variables that you can set in Info.
+
+@table @code
+@item automatic-footnotes
+@vindex automatic-footnotes
+When set to @code{On}, footnotes appear and disappear automatically.
+This variable is @code{On} by default. When a node is selected, a
+window containing the footnotes which appear in that node is created,
+and the footnotes are displayed within the new window. The window that
+Info creates to contain the footnotes is called @samp{*Footnotes*}. If
+a node is selected which contains no footnotes, and a @samp{*Footnotes*}
+window is on the screen, the @samp{*Footnotes*} window is deleted.
+Footnote windows created in this fashion are not automatically tiled so
+that they can use as little of the display as is possible.
+
+@item automatic-tiling
+@vindex automatic-tiling
+When set to @code{On}, creating or deleting a window resizes other
+windows. This variable is @code{Off} by default. Normally, typing
+@samp{C-x 2} divides the current window into two equal parts. When
+@code{automatic-tiling} is set to @code{On}, all of the windows are
+resized automatically, keeping an equal number of lines visible in each
+window. There are exceptions to the automatic tiling; specifically, the
+windows @samp{*Completions*} and @samp{*Footnotes*} are @emph{not}
+resized through automatic tiling; they remain their original size.
+
+@item visible-bell
+@vindex visible-bell
+When set to @code{On}, GNU Info attempts to flash the screen instead of
+ringing the bell. This variable is @code{Off} by default. Of course,
+Info can only flash the screen if the terminal allows it; in the case
+that the terminal does not allow it, the setting of this variable has no
+effect. However, you can make Info perform quietly by setting the
+@code{errors-ring-bell} variable to @code{Off}.
+
+@item errors-ring-bell
+@vindex errors-ring-bell
+When set to @code{On}, errors cause the bell to ring. The default
+setting of this variable is @code{On}.
+
+@item gc-compressed-files
+@vindex gc-compressed-files
+When set to @code{On}, Info garbage collects files which had to be
+uncompressed. The default value of this variable is @code{Off}.
+Whenever a node is visited in Info, the Info file containing that node
+is read into core, and Info reads information about the tags and nodes
+contained in that file. Once the tags information is read by Info, it
+is never forgotten. However, the actual text of the nodes does not need
+to remain in core unless a particular Info window needs it. For
+non-compressed files, the text of the nodes does not remain in core when
+it is no longer in use. But de-compressing a file can be a time
+consuming operation, and so Info tries hard not to do it twice.
+@code{gc-compressed-files} tells Info it is okay to garbage collect the
+text of the nodes of a file which was compressed on disk.
+
+@item show-index-match
+@vindex show-index-match
+When set to @code{On}, the portion of the matched search string is
+highlighted in the message which explains where the matched search
+string was found. The default value of this variable is @code{On}.
+When Info displays the location where an index match was found,
+(@pxref{Searching Commands, , @code{next-index-match}}), the portion of the
+string that you had typed is highlighted by displaying it in the inverse
+case from its surrounding characters.
+
+@item scroll-behavior
+@vindex scroll-behavior
+Control what happens when forward scrolling is requested at the end of
+a node, or when backward scrolling is requested at the beginning of a
+node. The default value for this variable is @code{Continuous}. There
+are three possible values for this variable:
+
+@table @code
+@item Continuous
+Try to get the first item in this node's menu, or failing that, the
+@samp{Next} node, or failing that, the @samp{Next} of the @samp{Up}.
+This behavior is identical to using the @samp{]}
+(@code{global-next-node}) and @samp{[} (@code{global-prev-node})
+commands.
+
+@item Next Only
+Only try to get the @samp{Next} node.
+
+@item Page Only
+Simply give up, changing nothing. If @code{scroll-behavior} is
+@code{Page Only}, no scrolling command can change the node that is being
+viewed.
+@end table
+
+@item scroll-step
+@vindex scroll-step
+The number of lines to scroll when the cursor moves out of the window.
+Scrolling happens automatically if the cursor has moved out of the
+visible portion of the node text when it is time to display. Usually
+the scrolling is done so as to put the cursor on the center line of the
+current window. However, if the variable @code{scroll-step} has a
+nonzero value, Info attempts to scroll the node text by that many lines;
+if that is enough to bring the cursor back into the window, that is what
+is done. The default value of this variable is 0, thus placing the
+cursor (and the text it is attached to) in the center of the window.
+Setting this variable to 1 causes a kind of "smooth scrolling" which
+some people prefer.
+
+@item ISO-Latin
+@cindex ISO Latin characters
+@vindex ISO-Latin
+When set to @code{On}, Info accepts and displays ISO Latin characters.
+By default, Info assumes an ASCII character set. @code{ISO-Latin} tells
+Info that it is running in an environment where the European standard
+character set is in use, and allows you to input such characters to
+Info, as well as display them.
+@end table
+
+
+
+@c the following is incomplete
+@ignore
+@c node Info for Sys Admins
+@c chapter Info for System Administrators
+
+This text describes some common ways of setting up an Info hierarchy
+from scratch, and details the various options that are available when
+installing Info. This text is designed for the person who is installing
+GNU Info on the system; although users may find the information present
+in this section interesting, none of it is vital to understanding how to
+use GNU Info.
+
+@menu
+* Setting the INFOPATH:: Where are my Info files kept?
+* Editing the DIR node:: What goes in `DIR', and why?
+* Storing Info files:: Alternate formats allow flexibility in setups.
+* Using `localdir':: Building DIR on the fly.
+* Example setups:: Some common ways to organize Info files.
+@end menu
+
+@c node Setting the INFOPATH
+@c section Setting the INFOPATH
+
+Where are my Info files kept?
+
+@c node Editing the DIR node
+@c section Editing the DIR node
+
+What goes in `DIR', and why?
+
+@c node Storing Info files
+@c section Storing Info files
+
+Alternate formats allow flexibility in setups.
+
+@c node Using `localdir'
+@c section Using `localdir'
+
+Building DIR on the fly.
+
+@c node Example setups
+@c section Example setups
+
+Some common ways to organize Info files.
+@end ignore
+
+@node GNU Info Global Index, , Variables, Top
+@appendix Global Index
+
+@printindex cp
+
+@contents
+@bye
--- /dev/null
+# Makefile for the XEmacs Internals Manual.
+
+# This file is part of XEmacs.
+
+# XEmacs is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2, or (at your option) any
+# later version.
+
+# XEmacs is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with XEmacs; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+VERSION=1.0
+NAME=internals
+manual = xemacs-internals-manual-19-$(VERSION)
+
+TEXI2DVI = texi2dvi
+MAKEINFO = makeinfo
+
+# Uncomment this line for permuted index.
+# permuted_index = 1
+
+# List of all the texinfo files in the manual:
+
+srcs = internals.texi index.unperm index.perm
+
+all : info
+info : ../../info/$(NAME).info
+
+../../info/$(NAME).info: $(srcs) index.texi
+ @echo "Expect a coredump if you are not using makeinfo 1.68 (or later)"
+ $(MAKEINFO) $(NAME).texi
+ @rm -f core
+
+dvi : $(NAME).dvi
+
+$(NAME).dvi: $(srcs) index.texi
+ # Avoid losing old contents of aux file entirely.
+ -mv $(NAME).aux $(NAME).oaux
+ # First shot to define xrefs:
+ $(TEX) $(NAME).texi
+ if [ a${permuted_index} != a ]; \
+ then ./permute-index && mv permuted.fns $(NAME).fns; \
+ else texindex $(NAME).??; \
+ fi
+ $(TEX) $(NAME).texi
+
+index.texi:
+ if [ a${permuted_index} != a ]; \
+ then ln -s index.perm index.texi; \
+ else ln -s index.unperm index.texi; \
+ fi
+
+.PHONY: mostlyclean clean distclean realclean extraclean
+mostlyclean:
+ rm -f *.toc *.aux *.log *.cp *.cps *.fn *.fns *.tp *.tps \
+ *.vr *.vrs *.pg *.pgs *.ky *.kys
+clean: mostlyclean
+ rm -f *.dvi *.ps make.out core index.texi
+distclean: clean
+realclean: clean
+extraclean: clean
+ -rm -f *~ \#*
--- /dev/null
+@c -*-texinfo-*-
+@setfilename ../../info/index.info
+
+@c Indexing guidelines
+
+@c I assume that all indexes will be combined.
+@c Therefore, if a generated findex and permutations
+@c cover the ways an index user would look up the entry,
+@c then no cindex is added.
+@c Concept index (cindex) entries will also be permuted. Therefore, they
+@c have no commas and few irrelevant connectives in them.
+
+@c I tried to include words in a cindex that give the context of the entry,
+@c particularly if there is more than one entry for the same concept.
+@c For example, "nil in keymap"
+@c Similarly for explicit findex and vindex entries, e.g. "print example".
+
+@c Error codes are given cindex entries, e.g. "end-of-file error".
+
+@c pindex is used for .el files and Unix programs
+
+@node Index, , Interface to X Windows, Top
+@unnumbered Index
+
+
+All variables, functions, keys, programs, files, and concepts are
+in this one index.
+
+All names and concepts are permuted, so they appear several times, one
+for each permutation of the parts of the name. For example,
+@code{function-name} would appear as @b{function-name} and @b{name,
+function-}. Key entries are not permuted, however.
+
+
+@c Print the indices
+
+@printindex fn
--- /dev/null
+@c -*-texinfo-*-
+@setfilename ../../info/index.info
+
+@c Indexing guidelines
+
+@c I assume that all indexes will be combined.
+@c Therefore, if a generated findex and permutations
+@c cover the ways an index user would look up the entry,
+@c then no cindex is added.
+@c Concept index (cindex) entries will also be permuted. Therefore, they
+@c have no commas and few irrelevant connectives in them.
+
+@c I tried to include words in a cindex that give the context of the entry,
+@c particularly if there is more than one entry for the same concept.
+@c For example, "nil in keymap"
+@c Similarly for explicit findex and vindex entries, e.g. "print example".
+
+@c Error codes are given cindex entries, e.g. "end-of-file error".
+
+@c pindex is used for .el files and Unix programs
+
+@node Index, , Interface to X Windows, Top
+@unnumbered Index
+
+@ignore
+All variables, functions, keys, programs, files, and concepts are
+in this one index.
+
+All names and concepts are permuted, so they appear several times, one
+for each permutation of the parts of the name. For example,
+@code{function-name} would appear as @b{function-name} and @b{name,
+function-}. Key entries are not permuted, however.
+@end ignore
+
+@c Print the indices
+
+@printindex fn
--- /dev/null
+# Makefile for the XEmacs Lisp Programmer's Manual.
+
+# This file is part of XEmacs.
+
+# XEmacs is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2, or (at your option) any
+# later version.
+
+# XEmacs is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with XEmacs; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+VERSION=2.4
+NAME=lispref
+manual = elisp-manual-19-$(VERSION)
+
+TEXI2DVI = texi2dvi
+MAKEINFO = makeinfo
+
+# Uncomment this line for permuted index.
+# permuted_index = 1
+
+# List of all the texinfo files in the manual:
+
+srcs = abbrevs.texi annotations.texi back.texi backups.texi buffers.texi \
+ building.texi commands.texi compile.texi consoles-devices.texi control.texi \
+ databases.texi debugging.texi dialog.texi display.texi edebug-inc.texi \
+ edebug.texi errors.texi eval.texi extents.texi faces.texi files.texi \
+ frames.texi functions.texi glyphs.texi hash-tables.texi help.texi \
+ hooks.texi index.texi internationalization.texi intro.texi \
+ keymaps.texi ldap.texi lispref.texi lists.texi loading.texi locals.texi \
+ macros.texi maps.texi markers.texi menus.texi minibuf.texi modes.texi \
+ mouse.texi mule.texi numbers.texi objects.texi os.texi positions.texi \
+ processes.texi range-tables.texi scrollbars.texi searching.texi \
+ sequences.texi specifiers.texi streams.texi strings.texi symbols.texi \
+ syntax.texi text.texi tips.texi toolbar.texi tooltalk.texi variables.texi \
+ windows.texi x-windows.texi index.unperm index.perm
+
+all : info
+info : ../../info/$(NAME).info
+
+../../info/$(NAME).info: $(srcs) index.texi
+ $(MAKEINFO) -o $@ $(NAME).texi
+
+dvi: $(NAME).dvi
+
+$(NAME).dvi: $(srcs) index.texi
+ # Avoid losing old contents of aux file entirely.
+ -mv $(NAME).aux $(NAME).oaux
+ # First shot to define xrefs:
+ $(TEX) $(NAME).texi
+ if [ a${permuted_index} != a ]; \
+ then ./permute-index && mv permuted.fns $(NAME).fns; \
+ else texindex $(NAME).??; \
+ fi
+ $(TEX) $(NAME).texi
+
+index.texi:
+ if [ a${permuted_index} != a ]; \
+ then ln -s index.perm index.texi; \
+ else ln -s index.unperm index.texi; \
+ fi
+
+.PHONY: mostlyclean clean distclean realclean extraclean
+mostlyclean:
+ rm -f *.toc *.aux *.log *.cp *.cps *.fn *.fns *.tp *.tps \
+ *.vr *.vrs *.pg *.pgs *.ky *.kys
+clean: mostlyclean
+ rm -f *.dvi *.ps make.out core index.texi
+distclean: clean
+realclean: distclean
+extraclean: distclean
+ -rm -f *~ \#*
--- /dev/null
+@c -*-texinfo-*-
+@setfilename ../../info/index.info
+
+@c Indexing guidelines
+
+@c I assume that all indexes will be combined.
+@c Therefore, if a generated findex and permutations
+@c cover the ways an index user would look up the entry,
+@c then no cindex is added.
+@c Concept index (cindex) entries will also be permuted. Therefore, they
+@c have no commas and few irrelevant connectives in them.
+
+@c I tried to include words in a cindex that give the context of the entry,
+@c particularly if there is more than one entry for the same concept.
+@c For example, "nil in keymap"
+@c Similarly for explicit findex and vindex entries, e.g. "print example".
+
+@c Error codes are given cindex entries, e.g. "end-of-file error".
+
+@c pindex is used for .el files and Unix programs
+
+@node Index, , Standard Hooks, Top
+@unnumbered Index
+
+
+All variables, functions, keys, programs, files, and concepts are
+in this one index.
+
+All names and concepts are permuted, so they appear several times, one
+for each permutation of the parts of the name. For example,
+@code{function-name} would appear as @b{function-name} and @b{name,
+function-}. Key entries are not permuted, however.
+
+
+@c Print the indices
+
+@printindex fn
--- /dev/null
+@c -*-texinfo-*-
+@setfilename ../../info/index.info
+
+@c Indexing guidelines
+
+@c I assume that all indexes will be combined.
+@c Therefore, if a generated findex and permutations
+@c cover the ways an index user would look up the entry,
+@c then no cindex is added.
+@c Concept index (cindex) entries will also be permuted. Therefore, they
+@c have no commas and few irrelevant connectives in them.
+
+@c I tried to include words in a cindex that give the context of the entry,
+@c particularly if there is more than one entry for the same concept.
+@c For example, "nil in keymap"
+@c Similarly for explicit findex and vindex entries, e.g. "print example".
+
+@c Error codes are given cindex entries, e.g. "end-of-file error".
+
+@c pindex is used for .el files and Unix programs
+
+@node Index, , Standard Hooks, Top
+@unnumbered Index
+
+@ignore
+All variables, functions, keys, programs, files, and concepts are
+in this one index.
+
+All names and concepts are permuted, so they appear several times, one
+for each permutation of the parts of the name. For example,
+@code{function-name} would appear as @b{function-name} and @b{name,
+function-}. Key entries are not permuted, however.
+@end ignore
+
+@c Print the indices
+
+@printindex fn
--- /dev/null
+#!/bin/csh -f
+# Generate a permuted index of all names.
+# The result is a file called index.fns.
+
+# You will need to modify this for your needs.
+
+
+set TEXINDEX=texindex # path to texindex command
+#set EMACS=xemacs # your emacs command
+#set TEX=tex # your tex command
+
+set MANUAL=lispref # the base name of the manual
+
+# goto 3
+
+1:
+echo "Extract raw index from texinfo fn index."
+# Let texindex combine duplicate entries, later.
+# But it wants to protect non-alphanumerics thus confusing ptx.
+# Also change `\ ' to just a ` ', since texindex will fail. This is produced
+# by `@findex two words' in an example environment (no doubt among others).
+# delete wrapper parens
+# change dots {} to dots{}
+# change {-} to char form, so ptx wont ignore it.
+# delete leading \entry {
+# change '\ ' to ' '
+# change lines with = < > since they mess up field extraction.
+# separate into fields delimited by "
+cat ${MANUAL}.fn | \
+ sed \
+ -e 's/(\([^)]*\))/\1/' \
+ -e 's/\\dots {}/(\\dots{})/' \
+ -e "s/{-}/{{\\tt\\char'055}}/" \
+ -e 's,^[^ ]* {,,' \
+ -e 's, },},' \
+ -e 's,\\ , ,g' \
+ -e 's/{\\tt\\char61}/=/' \
+ -e 's/{\\tt\\gtr}/>/' \
+ -e 's/{\\tt\\less}/</' \
+ -e 's/}{/"/g' \
+ | awk -F\" '{print $2, $1}' >! permuted.raw
+
+2:
+# Build break file for ptx.
+cat <<EOF > permuted.break
+-
+:
+EOF
+# Build the ignore file for ptx.
+# We would like to ignore "and", "or", and "for",
+# but ptx ignores ignore words even if they stand alone.
+cat <<EOF > permuted.ignore
+the
+in
+to
+as
+a
+an
+of
+on
+them
+how
+from
+by
+EOF
+
+echo "Make troff permuted index."
+ptx -i permuted.ignore -b permuted.break -f -r -w 144 \
+ < permuted.raw >! permuted.t
+
+3:
+echo "Extract the desired fields."
+awk -F\" '{printf "%s\"%s\"%s\n", $4,$6,$9}' permuted.t >! permuted.fields
+
+4:
+echo "Format for texindex."
+# delete lines that start with "and ", "for "
+sed < permuted.fields \
+ -e 's/=/{\\tt\\char61}/' \
+ -e 's/>/{\\tt\\gtr}/' \
+ -e 's/</{\\tt\\less}/' \
+ -e '/"and /d' \
+ -e '/"for /d' \
+ | awk -F\" 'NF>0 {if ($1=="") {\
+ print "\entry {" $2 "}{" 0+$3 "}{" $2 "}" }\
+ else {\
+ print "\entry {" $2 ", " $1 "}{" 0+$3 "}{" $2 ", " $1 "}"} }'\
+ > permuted.fn
+
+5:
+echo "Sort with texindex."
+${TEXINDEX} permuted.fn
+#mv permuted.fns ${MANUAL}.fns
+
+# The resulting permuted.fns will be read when we run TeX
+# on the manual the second time. Or you can use permuted.texinfo here.
+#${TEX} permuted.texinfo
+
+6:
+echo "Clean up."
+rm -f permuted.fields permuted.t permuted.raw
+rm -f permuted.break permuted.ignore permuted.fn
--- /dev/null
+# Makefile for the XEmacs New Users Guide
+
+# This file is part of XEmacs.
+
+# XEmacs is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2, or (at your option) any
+# later version.
+
+# XEmacs is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with XEmacs; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+NAME=new-users-guide
+
+SHELL = /bin/sh
+TEXI2DVI = texi2dvi
+MAKEINFO = makeinfo
+
+# List of all the texinfo files in the manual:
+
+srcs = new-users-guide.texi custom1.texi files.texi region.texi \
+ custom2.texi help.texi search.texi edit.texi modes.texi \
+ xmenu.texi enter.texi
+
+all : info
+info : ../../info/$(NAME).info
+
+../../info/$(NAME).info: $(srcs)
+ $(MAKEINFO) -o $@ $(NAME).texi
+
+dvi : $(NAME).dvi
+.texi.dvi :
+ $(TEXI2DVI) $<
+
+.PHONY: mostlyclean clean distclean realclean extraclean
+mostlyclean:
+ rm -f *.toc *.aux *.oaux *.log *.cp *.cps *.fn *.fns *.tp *.tps \
+ *.vr *.vrs *.pg *.pgs *.ky *.kys
+clean: mostlyclean
+ rm -f *.dvi *.ps make.out core
+distclean: clean
+realclean: clean
+extraclean: clean
+ -rm -f *~ \#*
--- /dev/null
+# Makefile for the XEmacs Reference Manual.
+
+# This file is part of XEmacs.
+
+# XEmacs is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2, or (at your option) any
+# later version.
+
+# XEmacs is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with XEmacs; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# Modified by Ben Wing, February 1994
+
+NAME=xemacs
+
+MAKEINFO = makeinfo
+TEXI2DVI = texi2dvi
+
+# List of all the texinfo files in the manual:
+
+srcs = xemacs.texi abbrevs.texi basic.texi buffers.texi building.texi \
+ calendar.texi cmdargs.texi custom.texi display.texi entering.texi \
+ files.texi fixit.texi glossary.texi gnu.texi help.texi indent.texi \
+ keystrokes.texi killing.texi xemacs.texi m-x.texi major.texi mark.texi \
+ menus.texi mini.texi misc.texi mouse.texi new.texi picture.texi \
+ programs.texi reading.texi regs.texi frame.texi search.texi sending.texi \
+ text.texi trouble.texi undo.texi windows.texi
+
+all : info
+info : ../../info/$(NAME).info
+
+dvi: $(NAME).dvi
+.texi.dvi :
+ $(TEXI2DVI) $<
+
+../../info/$(NAME).info: $(srcs)
+ $(MAKEINFO) -o $@ $(NAME).texi
+
+.PHONY: mostlyclean clean distclean realclean extraclean
+mostlyclean:
+ rm -f *.toc *.aux *.oaux *.log *.cp *.cps *.fn *.fns *.tp *.tps \
+ *.vr *.vrs *.pg *.pgs *.ky *.kys
+clean: mostlyclean
+ rm -f *.dvi *.ps make.out core
+distclean: clean
+realclean: distclean
+extraclean: distclean
+ -rm -f *~ \#*
--- /dev/null
+@SET_MAKE@
+SUBDIR=ldap base64 zlib example
+RECURSIVE_MAKE=@RECURSIVE_MAKE@
+SHELL = /bin/sh
+RM = rm -f
+
+all:
+ -for d in $(SUBDIR) ; do (cd ./$${d} && $(RECURSIVE_MAKE) $@) ; done
+
+install clean mostlyclean:
+ -for d in $(SUBDIR) ; do (cd ./$${d} && $(RECURSIVE_MAKE) $@) ; done
+
+distclean:
+ $(RM) Makefile config.*
+ -for d in $(SUBDIR) ; do (cd ./$${d} && $(RECURSIVE_MAKE) $@) ; done
+
+realclean extraclean:
+ $(RM) *~ \#*
+ -for d in $(SUBDIR) ; do (cd ./$${d} && $(RECURSIVE_MAKE) $@) ; done
--- /dev/null
+AC_DEFUN(XE_EMACS, [
+ dnl
+ dnl Apparently, if you run a shell window in Emacs, it sets the EMACS
+ dnl environment variable to 't'. Lets undo the damage.
+ dnl
+ if test "${EMACS}" = "t"; then
+ EMACS=""
+ fi
+
+ AC_ARG_WITH(xemacs, --with-xemacs Use XEmacs to build, [ if test "${withval}" = "yes"; then EMACS=xemacs; else EMACS=${withval}; fi ])
+ AC_ARG_WITH(emacs, --with-emacs Use Emacs to build, [ if test "${withval}" = "yes"; then EMACS=emacs; else EMACS=${withval}; fi ])
+ AC_CHECK_PROG(EMACS, xemacs, xemacs, emacs)
+ AC_SUBST(EMACS)
+])
+
+AC_DEFUN(XE_CONFIG_VALUE, [
+ OUTPUT=./conftest-$$
+ rm -f ${OUTPUT}
+ ${EMACS} -batch -eval "
+(let ((hash (config-value-hash-table))
+ (desired (split-string \"$1\")))
+ (mapcar
+ (lambda (key)
+ (message \"Checking for %S\" (intern key))
+ (if (config-value (intern key))
+ (progn
+ (write-region (format \"%s=\\\"%s\\\"\n\" key (config-value (intern key)))
+ nil \"${OUTPUT}\" t))))
+ desired))
+" 2> /dev/null > /dev/null
+ test -f ${OUTPUT} && . ${OUTPUT}
+ rm -f ${OUTPUT}
+ for ac_func in $1; do
+ :
+ done
+])
--- /dev/null
+# NOTE!!
+# The use of BLDDIR here is _BOGUS_.
+# What really needs to happen is that we should install config.h into
+# the architecture dependent directory when we really hash all this
+# out.
+
+blddir=@blddir@
+dll_cflags=@dll_cflags@
+dll_oflags=@dll_oflags@
+dll_lflags=@dll_lflags@
+dll_ld=@dll_ld@
+
+INCLUDES=-I$(blddir)/src
+CFLAGS=@CFLAGS@ $(INCLUDES)
+CC=@CC@
+RM=@RM@
+
+TARGET=base64
+
+.PHONY: clean mostlyclean distclean realclean install
+
+all: $(TARGET).ell
+
+$(TARGET).ell: $(TARGET).o
+ $(dll_ld) $(dll_oflags) $@ $(dll_lflags) $^
+
+install:
+ echo "Don't know how to install yet"
+
+clean mostlyclean:
+ $(RM) *.o $(TARGET).ell
+
+distclean: clean
+ $(RM) Makefile
+
+realclean extraclean: distclean
+ $(RM) *~ \#*
--- /dev/null
+AC_PREREQ(2.12)
+AC_INIT(configure.in)
+
+XE_EMACS
+XE_CONFIG_VALUE(dll_cflags dll_ld dll_lflags dll_oflags CFLAGS CC DEFS INSTALL top_srcdir blddir)
+
+RM='rm -f'
+
+AC_SUBST(INSTALL)
+AC_SUBST(RM)
+AC_SUBST(CC)
+AC_SUBST(dll_cflags)
+AC_SUBST(dll_oflags)
+AC_SUBST(dll_lflags)
+AC_SUBST(dll_ld)
+AC_SUBST(top_srcdir)
+AC_SUBST(blddir)
+
+AC_OUTPUT(Makefile
+ ldap/Makefile
+ base64/Makefile
+ example/Makefile
+ zlib/Makefile)
--- /dev/null
+# NOTE!!
+# The use of BLDDIR here is _BOGUS_.
+# What really needs to happen is that we should install config.h into
+# the architecture dependent directory when we really hash all this
+# out.
+
+blddir=@blddir@
+dll_cflags=@dll_cflags@
+dll_oflags=@dll_oflags@
+dll_lflags=@dll_lflags@
+dll_ld=@dll_ld@
+INCLUDES=-I$(blddir)/src
+CFLAGS=@CFLAGS@ $(INCLUDES)
+CC=@CC@
+RM=@RM@
+
+TARGET=purified
+all: $(TARGET).ell
+
+.PHONY: clean mostlyclean distclean realclean install
+
+$(TARGET).ell: $(TARGET).o
+ $(dll_ld) $(dll_oflags) $@ $(dll_lflags) $^
+
+install:
+ echo "Don't know how to install yet"
+
+clean mostlyclean:
+ $(RM) *.o $(TARGET).ell
+
+distclean: clean
+ $(RM) Makefile
+
+realclean extraclean: distclean
+ $(RM) *~ \#*
--- /dev/null
+#include <config.h>
+#include "lisp.h"
+#include "emacsfns.h"
+
+DEFUN ("purifiedp", Fpurifiedp, 1, 1, 0, /*
+*/
+ (obj))
+{
+ return purified(obj) ? Qt : Qnil;
+}
+
+void
+syms_of()
+{
+ DEFSUBR(Fpurifiedp);
+}
--- /dev/null
+# NOTE!!
+# The use of BLDDIR here is _BOGUS_.
+# What really needs to happen is that we should install config.h into
+# the architecture dependent directory when we really hash all this
+# out.
+
+blddir=@blddir@
+dll_cflags=@dll_cflags@
+dll_oflags=@dll_oflags@
+dll_lflags=@dll_lflags@
+dll_ld=@dll_ld@
+
+INCLUDES=-I$(blddir)/src
+CFLAGS=@CFLAGS@ $(INCLUDES)
+CC=@CC@
+RM=@RM@
+
+TARGET=eldap
+
+.PHONY: clean mostlyclean distclean realclean install
+
+all: $(TARGET).ell
+
+$(TARGET).ell: $(TARGET).o
+ $(dll_ld) $(dll_oflags) $@ $(dll_lflags) $^
+
+install:
+ echo "Don't know how to install yet"
+
+clean mostlyclean:
+ $(RM) *.o $(TARGET).ell
+
+distclean: clean
+ $(RM) Makefile
+
+realclean extraclean: distclean
+ $(RM) *~ \#*
--- /dev/null
+AC_PREREQ(2.12)
+AC_INIT(configure.in)
+
+XE_EMACS
+XE_CONFIG_VALUE(dll_cflags dll_ld dll_lflags dll_oflags CFLAGS CC DEFS INSTALL top_srcdir blddir)
+
+RM='rm -f'
+
+AC_SUBST(INSTALL)
+AC_SUBST(RM)
+AC_SUBST(CC)
+AC_SUBST(dll_cflags)
+AC_SUBST(dll_oflags)
+AC_SUBST(dll_lflags)
+AC_SUBST(dll_ld)
+AC_SUBST(top_srcdir)
+AC_SUBST(blddir)
+
+AC_OUTPUT(Makefile
+ ldap/Makefile
+ base64/Makefile
+ example/Makefile
+ zlib/Makefile)
--- /dev/null
+# NOTE!!
+# The use of BLDDIR here is _BOGUS_.
+# What really needs to happen is that we should install config.h into
+# the architecture dependent directory when we really hash all this
+# out.
+
+blddir=@blddir@
+dll_cflags=@dll_cflags@
+dll_oflags=@dll_oflags@
+dll_lflags=@dll_lflags@
+dll_ld=@dll_ld@
+
+INCLUDES=-I$(blddir)/src
+CFLAGS=@CFLAGS@ $(INCLUDES)
+CC=@CC@
+RM=@RM@
+
+TARGET=zlib
+
+.PHONY: clean mostlyclean distclean realclean install
+
+all: $(TARGET).ell
+
+$(TARGET).ell: $(TARGET).o
+ $(dll_ld) $(dll_oflags) $@ $(dll_lflags) $^
+
+install:
+ echo "Don't know how to install yet"
+
+clean mostlyclean:
+ $(RM) *.o $(TARGET).ell
+
+distclean: clean
+ $(RM) Makefile
+
+realclean extraclean: distclean
+ $(RM) *~ \#*
--- /dev/null
+MSW_LIBS =-luser32 -lgdi32 -lcomdlg32
+LDFLAGS =-Wl,--subsystem,windows
+CFLAGS =-g
+
+bindir =/usr/local/bin
+
+INSTALL = /usr/local/src/xemacs-21.0-b42/lib-src/installexe.sh /d/cygnus/h-i386-cygwin32/bin/install -c
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_DATA = ${INSTALL} -m 644
+
+runemacs.exe: runemacs.o
+ $(CC) $(LDFLAGS) runemacs.o $(MSW_LIBS) -o $@
+
+install: runemacs.exe
+ $(INSTALL_PROGRAM) runemacs.exe $(bindir)
--- /dev/null
+# List of problems with XEmacs. If anyone wants to work on these, please
+# mail me and I'll update the table below.
+
+# Core NT issues
+ 1. Subprocess support is completely broken.
+ 2. Networking support is completely broken. This is due to the fact that
+ the model relies on the subprocess support also working.
+ 4. No binary release. We know a binary release would be A Good Thing.
+ However we want to make things stable before producing one so we don't
+ have to field too many problems. Sorry.
+ 5. Support for dired is perhaps not quite there. We need to port ls-lisp.el
+ from FSF Emacs.
+ 6. Currently the backup files do not get the same permissions as the file
+ being edited. August Hill is looking at this one.
+ 7. Verify that CRLF issues are dealt with correctly. Marc Paquette is
+ looking at this.
+ 8. Use the registry to store the root directory(ies) of lisp packages; that
+ is the path name, not the elisp files.
+
+# X issues
+ 1. Redrawing on my (davidh) system seems fairly broken - I don't know if
+ this is the XEmacs redraw functionality, my X server or just something
+ strange with X under NT. Has anyone else experiences with this ?
+
+# Native GUI issues
+ 0. The entire event model.
+ 1. Calling mouse_[enter|leave]_frame_hook
+ 2. Can't change bold, italic or bold-italic face fonts
+ 3. Bogus delay when setting default- or initial-frame-plist
+ 4. Short timeouts don't seem to be very accurate
+ 5. Scrollbar dragging. Redisplay isn't called while dragging.
+ Also can't retrieve 32 bit tracking position with GetScrollInfo()
+ 6. Menubar
+ 7. Palette handling
+ 8. Middle mouse button emulation
+ 9. Drag'n'drop
+ 10. Images
+
+Old Issues.
+
+ 1. For some reason, HOME is a required environment variable.
+
--- /dev/null
+/* null version of <arpa/inet.h> - <sys/socket.h> has everything */
--- /dev/null
+/* null version of <netdb.h> - <sys/socket.h> has everything */
--- /dev/null
+/* null version of <netinet/in.h> - <sys/socket.h> has everything */
--- /dev/null
+#ifndef _PWD_H_
+#define _PWD_H_
+/*
+ * pwd.h doesn't exist on NT, so we put together our own.
+ */
+
+struct passwd {
+ char *pw_name;
+ char *pw_passwd;
+ int pw_uid;
+ int pw_gid;
+ int pw_quota;
+ char *pw_gecos;
+ char *pw_dir;
+ char *pw_shell;
+};
+
+#endif /* _PWD_H_ */
--- /dev/null
+/* This file is part of XEmacs.
+
+XEmacs is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+XEmacs is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with XEmacs; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/* Synched up with: FSF 19.30. */
+
+/*
+ <dir.h> -- definitions for 4.2BSD-compatible directory access
+
+ last edit: 09-Jul-1983 D A Gwyn
+*/
+
+#ifdef VMS
+#ifndef FAB$C_BID
+#include <fab.h>
+#endif
+#ifndef NAM$C_BID
+#include <nam.h>
+#endif
+#ifndef RMS$_SUC
+#include <rmsdef.h>
+#endif
+#include "vms-dir.h"
+#endif /* VMS */
+
+#define DIRBLKSIZ 512 /* size of directory block */
+#ifdef VMS
+#define MAXNAMLEN (DIR$S_NAME + 7) /* 80 plus room for version #. */
+#define MAXFULLSPEC NAM$C_MAXRSS /* Maximum full spec */
+#else
+#ifdef WINDOWSNT
+#define MAXNAMLEN 255
+#else /* not WINDOWSNT */
+#define MAXNAMLEN 15 /* maximum filename length */
+#endif /* not WINDOWSNT */
+#endif /* VMS */
+ /* NOTE: MAXNAMLEN must be one less than a multiple of 4 */
+
+struct direct /* data from readdir() */
+ {
+ long d_ino; /* inode number of entry */
+ unsigned short d_reclen; /* length of this record */
+ unsigned short d_namlen; /* length of string in d_name */
+ char d_name[MAXNAMLEN+1]; /* name of file */
+ };
+
+typedef struct
+ {
+ int dd_fd; /* file descriptor */
+ int dd_loc; /* offset in block */
+ int dd_size; /* amount of valid data */
+ char dd_buf[DIRBLKSIZ]; /* directory block */
+ } DIR; /* stream data from opendir() */
+
+DIR *opendir (CONST char *filename);
+void closedir (DIR *dirp);
+struct direct *readdir (DIR *dirp);
+struct direct *readdirver (DIR *dirp);
+long telldir (DIR *dirp);
+void seekdir (DIR *dirp, long loc);
+
+#define rewinddir( dirp ) seekdir( dirp, 0L )
--- /dev/null
+/*
+ * sys\file.h doesn't exist on NT - only needed for these constants
+ */
+
+#define F_OK 0
+#define X_OK 1
+#define W_OK 2
+#define R_OK 4
--- /dev/null
+/*
+ * sys\ioctl.h doesn't exist on NT...rather than including it conditionally
+ * in many of the source files, we just extend the include path so that the
+ * compiler will pick this up empty header instead.
+ */
--- /dev/null
+#ifndef _PARAM_H_
+#define _PARAM_H_
+
+/*
+ * sys\param.h doesn't exist on NT, so we'll make one.
+ */
+
+#define NBPG 4096
+
+#endif /* _PARAM_H_ */
--- /dev/null
+/* Workable version of <sys/socket.h> based on winsock.h */
+
+#ifndef _SOCKET_H_
+#define _SOCKET_H_
+
+/* defeat the multiple include protection */
+#ifdef _WINSOCKAPI_
+#undef _WINSOCKAPI_
+#endif
+
+#if 0 /* What's wrong with winsock.h version ? - kkm */
+/* avoid clashing with our version of FD_SET if already defined */
+#ifdef FD_SET
+#undef FD_SET
+#undef FD_CLR
+#undef FD_ISSET
+#undef FD_ZERO
+#endif
+
+/* allow us to provide our own version of fd_set */
+#define fd_set ws_fd_set
+#endif /* 0 */
+
+/* avoid duplicate definition of timeval */
+#ifdef HAVE_TIMEVAL
+#define timeval ws_timeval
+#endif
+
+#include <winsock.h>
+
+#if 0 /* What's wrong with winsock.h version ? - kkm */
+/* revert to our version of FD_SET */
+#undef FD_SET
+#undef FD_CLR
+#undef FD_ISSET
+#undef FD_ZERO
+#undef fd_set
+#include "nt.h"
+#endif /* 0 */
+
+#ifdef HAVE_TIMEVAL
+#undef timeval
+#endif
+
+/* map winsock error codes to standard names */
+#define EWOULDBLOCK WSAEWOULDBLOCK
+#define EINPROGRESS WSAEINPROGRESS
+#define EALREADY WSAEALREADY
+#define ENOTSOCK WSAENOTSOCK
+#define EDESTADDRREQ WSAEDESTADDRREQ
+#define EMSGSIZE WSAEMSGSIZE
+#define EPROTOTYPE WSAEPROTOTYPE
+#define ENOPROTOOPT WSAENOPROTOOPT
+#define EPROTONOSUPPORT WSAEPROTONOSUPPORT
+#define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT
+#define EOPNOTSUPP WSAEOPNOTSUPP
+#define EPFNOSUPPORT WSAEPFNOSUPPORT
+#define EAFNOSUPPORT WSAEAFNOSUPPORT
+#define EADDRINUSE WSAEADDRINUSE
+#define EADDRNOTAVAIL WSAEADDRNOTAVAIL
+#define ENETDOWN WSAENETDOWN
+#define ENETUNREACH WSAENETUNREACH
+#define ENETRESET WSAENETRESET
+#define ECONNABORTED WSAECONNABORTED
+#define ECONNRESET WSAECONNRESET
+#define ENOBUFS WSAENOBUFS
+#define EISCONN WSAEISCONN
+#define ENOTCONN WSAENOTCONN
+#define ESHUTDOWN WSAESHUTDOWN
+#define ETOOMANYREFS WSAETOOMANYREFS
+#define ETIMEDOUT WSAETIMEDOUT
+#define ECONNREFUSED WSAECONNREFUSED
+#define ELOOP WSAELOOP
+/* #define ENAMETOOLONG WSAENAMETOOLONG */
+#define EHOSTDOWN WSAEHOSTDOWN
+#define EHOSTUNREACH WSAEHOSTUNREACH
+/* #define ENOTEMPTY WSAENOTEMPTY */
+#define EPROCLIM WSAEPROCLIM
+#define EUSERS WSAEUSERS
+#define EDQUOT WSAEDQUOT
+#define ESTALE WSAESTALE
+#define EREMOTE WSAEREMOTE
+
+#endif /* _SOCKET_H_ */
+
+/* end of socket.h */
--- /dev/null
+/*
+ * sys/time.h doesn't exist on NT
+ */
+
+#include <time.h>
+
+struct timeval
+ {
+ long tv_sec; /* seconds */
+ long tv_usec; /* microseconds */
+ };
+
+struct timezone
+ {
+ int tz_minuteswest; /* minutes west of Greenwich */
+ int tz_dsttime; /* type of dst correction */
+ };
+
+#ifndef HAVE_X_WINDOWS
+/* X11R6 on NT provides the single parameter version of this command */
+void gettimeofday (struct timeval *, struct timezone *);
+#endif
+
+/* end of sys/time.h */
--- /dev/null
+/* Fake unistd.h: config.h already provides most of the relevant things. */
--- /dev/null
+/* Do not edit this file!
+ Automatically generated by XEmacs */
+# define PURESIZE_ADJUSTMENT (0)
--- /dev/null
+/*
+ Simple program to start Emacs with its console window hidden.
+
+ This program is provided purely for convenience, since most users will
+ use Emacs in windowing (GUI) mode, and will not want to have an extra
+ console window lying around. */
+
+/*
+ You may want to define this if you want to be able to install updated
+ emacs binaries even when other users are using the current version.
+ The problem with some file servers (notably Novell) is that an open
+ file cannot be overwritten, deleted, or even renamed. So if someone
+ is running emacs.exe already, you cannot install a newer version.
+ By defining CHOOSE_NEWEST_EXE, you can name your new emacs.exe
+ something else which matches "emacs*.exe", and runemacs will
+ automatically select the newest emacs executeable in the bin directory.
+ (So you'll probably be able to delete the old version some hours/days
+ later).
+*/
+
+/* #define CHOOSE_NEWEST_EXE */
+
+#define WIN32
+
+#include <windows.h>
+#include <string.h>
+#include <malloc.h>
+
+#if defined(__CYGWIN32__)
+#include <sys/types.h>
+#include <sys/stat.h>
+#endif
+
+int WINAPI
+WinMain (HINSTANCE hSelf, HINSTANCE hPrev, LPSTR cmdline, int nShow)
+{
+ STARTUPINFO start;
+ SECURITY_ATTRIBUTES sec_attrs;
+ SECURITY_DESCRIPTOR sec_desc;
+ PROCESS_INFORMATION child;
+ int wait_for_child = FALSE;
+ DWORD ret_code = 0;
+ char *new_cmdline;
+ char *p;
+ char modname[MAX_PATH];
+
+ if (!GetModuleFileName (NULL, modname, MAX_PATH))
+ goto error;
+ if ((p = strrchr (modname, '\\')) == NULL)
+ goto error;
+ *p = 0;
+
+ new_cmdline = alloca (MAX_PATH + strlen (cmdline) + 1);
+ strcpy (new_cmdline, modname);
+
+#ifdef CHOOSE_NEWEST_EXE
+ {
+ /* Silly hack to allow new versions to be installed on
+ server even when current version is in use. */
+
+ char * best_name = alloca (MAX_PATH + 1);
+ FILETIME best_time = {0,0};
+ WIN32_FIND_DATA wfd;
+ HANDLE fh;
+ p = new_cmdline + strlen (new_cmdline);
+ strcpy (p, "\\xemacs*.exe ");
+ fh = FindFirstFile (new_cmdline, &wfd);
+ if (fh == INVALID_HANDLE_VALUE)
+ goto error;
+ do
+ {
+ if (wfd.ftLastWriteTime.dwHighDateTime > best_time.dwHighDateTime
+ || (wfd.ftLastWriteTime.dwHighDateTime == best_time.dwHighDateTime
+ && wfd.ftLastWriteTime.dwLowDateTime > best_time.dwLowDateTime))
+ {
+ best_time = wfd.ftLastWriteTime;
+ strcpy (best_name, wfd.cFileName);
+ }
+ }
+ while (FindNextFile (fh, &wfd));
+ FindClose (fh);
+ *p++ = '\\';
+ strcpy (p, best_name);
+ strcat (p, " ");
+ }
+#else
+#if defined(__CYGWIN32__)
+ {
+ struct stat stbuf;
+ char sym_link_name[MAX_PATH+1], real_name[MAX_PATH+1];
+
+ strcpy(sym_link_name, new_cmdline);
+ strcat(sym_link_name, "\\xemacs");
+ if (lstat(sym_link_name, &stbuf) == 0)
+ {
+ if ((stbuf.st_mode & S_IFLNK) == S_IFLNK)
+ {
+ if (readlink(sym_link_name, real_name, sizeof(real_name)) == -1)
+ {
+ MessageBox (NULL, "Error reading symbolic link for xemacs",
+ "Error", MB_ICONSTOP);
+ return 1;
+ }
+ else
+ {
+ strcat(new_cmdline, "\\");
+ strcat(new_cmdline, real_name);
+ strcat(new_cmdline, " ");
+ }
+ }
+ else
+ strcat(new_cmdline, "\\xemacs ");
+ }
+ else
+ {
+ MessageBox (NULL, "can't locate XEmacs executable",
+ "Error", MB_ICONSTOP);
+ return 1;
+ }
+ }
+#else
+ strcat (new_cmdline, "\\xemacs.exe ");
+#endif
+#endif
+
+ /* Append original arguments if any; first look for -wait as first
+ argument, and apply that ourselves. */
+ if (strncmp (cmdline, "-wait", 5) == 0)
+ {
+ wait_for_child = TRUE;
+ cmdline += 5;
+ }
+ strcat (new_cmdline, cmdline);
+
+ /* Set emacs_dir variable if runemacs was in "%emacs_dir%\bin". */
+ if ((p = strrchr (modname, '\\')) && stricmp (p, "\\bin") == 0)
+ {
+ *p = 0;
+ for (p = modname; *p; p++)
+ if (*p == '\\') *p = '/';
+ SetEnvironmentVariable ("emacs_dir", modname);
+ }
+
+ memset (&start, 0, sizeof (start));
+ start.cb = sizeof (start);
+ start.dwFlags = STARTF_USESHOWWINDOW;
+ start.wShowWindow = SW_HIDE;
+
+ sec_attrs.nLength = sizeof (sec_attrs);
+ sec_attrs.lpSecurityDescriptor = NULL;
+ sec_attrs.bInheritHandle = FALSE;
+
+ if (CreateProcess (NULL, new_cmdline, &sec_attrs, NULL, TRUE, 0,
+ NULL, NULL, &start, &child))
+ {
+ if (wait_for_child)
+ {
+ WaitForSingleObject (child.hProcess, INFINITE);
+ GetExitCodeProcess (child.hProcess, &ret_code);
+ }
+ CloseHandle (child.hThread);
+ CloseHandle (child.hProcess);
+ }
+ else
+ goto error;
+ return (int) ret_code;
+
+error:
+ MessageBox (NULL, "Could not start XEmacs.", "Error", MB_ICONSTOP);
+ return 1;
+}
puresize-adjust.h
sheap-adjust.h
temacs
-xemacs
SATISFIED
update-elc.stamp
-1999-07-04 Andy Piper <andy@xemacs.org>
-
- * console.c: undo earlier Fprovide changes.
- * fns.c: ditto.
- * console.h: ditto.
-
- * console-tty.c (image_instantiator_format_create_glyphs_tty): new
- function. validate appropriate image formats for tty.
-
- * glyphs.h (INITIALIZE_IMAGE_INSTANTIATOR_FORMAT_NO_SYM):
- initialize consoles parameter.
- (struct image_instantiator_methods): add consoles parameter.
- (IIFORMAT_VALID_CONSOLE): new function. validate the format on the
- console.
- (INITIALIZE_DEVICE_IIFORMAT): validate the format on the given
- console.
-
- * glyphs-msw.c: declare instantiators for later use.
- (image_instantiator_format_create_glyphs_mswindows): validate xpm
- and friends on the mswindows console.
- * glyphs-x.c: ditto.
-
- * glyphs.c (valid_image_instantiator_format_p): disallow glyphs
- that have not been registered on the supplied device.
- (Fvalid_image_instantiator_format_p): add locale argument.
- (instantiate_image_instantiator): valid image instantiator on the
- device.
-
- * symsinit.h: add image_instantiator_format_create_glyphs_tty()
- declaration.
-
- * emacs.c (main_1): add call to
- image_instantiator_format_create_glyphs_tty().
-
-1999-06-29 Olivier Galibert <galibert@pobox.com>
-
- * lisp.h: Add #include <stddef.h>.
-
- * sysdep.c: Remove #include <stddef.h>.
- * symbols.c: Remove #include <stddef.h>.
- * sheap.c: Remove #include <stddef.h>.
- * opaque.c: Remove #include <stddef.h>.
- * nt.c: Remove #include <stddef.h>.
- * mule-charset.c: Remove #include <stddef.h>.
- * marker.c: Remove #include <stddef.h>.
- * file-coding.c: Remove #include <stddef.h>.
- * extents.c: Remove #include <stddef.h>.
- * elhash.c: Remove #include <stddef.h>.
- * data.c: Remove #include <stddef.h>.
- * chartab.c: Remove #include <stddef.h>.
- * bytecode.c: Remove #include <stddef.h>.
- * alloc.c: Remove #include <stddef.h>. Fix vector description
-
-1999-06-30 SL Baur <steve@miho.m17n.org>
-
- * editfns.c: Document "%s" format spec.
- Suggested by Bob Weiner <weiner@altrasoft.com>
-
-1999-06-29 Andy Piper <andy@xemacs.org>
-
- * event-msw.c: fix definition booboo.
-
-1999-06-28 Andy Piper <andy@xemacs.org>
-
- * glyphs-x.c: change tree -> tree-view, progress ->
- progress_gauge, edit -> edit-field, tab -> tab-control, combo ->
- combo-box.
- (complex_vars_of_glyphs_x): provide-on-console the implemented
- widget types.
-
- * glyphs-msw.c: ditto.
- (complex_vars_of_glyphs_mswindows): ditto.
-
- * lisp.h: add Fprovide_on_console.
-
- * fns.c (Ffeaturep): add extra optional console argument.
- (Fprovide_on_console): like Fprovide but provides only on the
- specified console-type.
- (Frequire): check console-features as well as global features.
-
- * console.c (Fconsole_features): new function. return features for
- this console.
- (syms_of_console): add Fconsole_features.
-
- * console.h (CONMETH_FEATURES): new function for accessing features.
- (CONSOLE_FEATURES): ditto.
- (struct console_methods): add features slot.
- (INITIALIZE_CONSOLE_TYPE): initialize features slot.
-
-1999-06-28 Andy Piper <andy@xemacs.org>
-
- * event-Xt.c (handle_focus_event_1): conditionally compile for
- X11R5.
-
- * s/cygwin32.h: fix me website address.
-
- * event-msw.c: add NMHDR for pre b20 cygwin builds.
-
- * gui-x.c (button_item_to_widget_value): only add callback if it
- is non-nil.
-
- * glyphs-x.c: add progress, edit and combo instantiators.
- (x_widget_set_property): new function. uses lwlib to set widget
- values.
- (x_widget_property): new function. uses lwlib to get widget
- values.
- (x_button_instantiate): support images in buttons.
- (x_button_property): new function. use lwlib to get the selected
- state.
- (x_progress_instantiate): new function for instantiating progress
- gauges.
- (x_progress_set_property): new function. sets the progress gauge
- position.
- (x_edit_instantiate): new function. for instantiating edit fields.
- (x_combo_instantiate): new function. for instantiating combo
- boxes.
- (image_instantiator_format_create_glyphs_x): add new device ii
- formats.
-
- * glyphs-msw.c (mswindows_tab_instantiate): remove redundant var.
-
- * console.h (CONSOLE_FEATURES): new features accesor.
-
- * conslots.h (MARKED_SLOT): add features entry.
-
-1999-06-25 Andy Piper <andy@xemacs.org>
-
- * menubar-x.c (menu_item_descriptor_to_widget_value_1): use new
- gui functions.
-
- * menubar-msw.c: move MAX_MENUITEM_LENGTH to gui.h
-
- * gui.h (struct Lisp_Gui_Item): add accelerator.
-
- * gui.c (gui_item_add_keyval_pair): deal with accelerators.
- (gui_item_init): ditto.
- (gui_add_item_keywords_to_plist): ditto.
- (mark_gui_item): ditto.
- (gui_item_hash): ditto.
- (gui_item_accelerator): new function.
- (gui_name_accelerator): new function stolen from gui-x.c
-
- * gui-x.c (popup_selection_callback): always define. mark
- subwindows changed after calling a callback.
- (menu_name_to_accelerator): deleted.
- (button_item_to_widget_value): forward gui_item things to gui_item
- functions.
-
- * glyphs-x.h (struct x_subwindow_data): add data for widgets. add
- appropriate accesors.
-
- * glyphs-x.c: declare new glyph formats.
- (x_finalize_image_instance): unmanage and destroy widgets if they
- exist.
- (x_unmap_subwindow): handle widgets specially.
- (x_map_subwindow): ditto. offset display of widgets by offset of
- text widget within container.
- (x_update_subwindow): new function. call lw_modify_all_widgets
- when we are a widget.
- (x_widget_instantiate): new function for generically creating
- widgets-glyphs. toolkit specifics forwarded to lwlib.
- (x_button_instantiate): new function for instantiating
- widgets-glyph buttons.
- (console_type_create_glyphs_x): register update_subwindow.
- (image_instantiator_format_create_glyphs_x): register widget and
- button types.
-
- * event-msw.c (mswindows_wnd_proc): remove redundant variable.
-
- * event-Xt.c (x_event_to_emacs_event): call handle_focus_event_1
- when we get a button press in case we do not have the focus.
- (handle_focus_event_1): set the keyboard focus to the text widget
- if we do not have it.
-
- * dialog-x.c (dbox_descriptor_to_widget_value): use new gui_item
- functions.
-
-1999-06-24 SL Baur <steve@miho.m17n.org>
-
- * syntax.c (scan_words): Restore non-Mule code.
- (word_constituent_p): Restore.
-
-1999-06-23 Olivier Galibert <galibert@pobox.com>
-
- * config.h.in: Add missing #undef *_USER_DEFINED.
-
-1999-06-23 SL Baur <steve@miho.m17n.org>
-
- * lisp.h (set_bit_vector_bit): Force promotion to unsigned long
- int (fixes a 64-bit problem).
-
- * chartab.c (word_boundary_p): Use EQ not == for lisp_object
- comparison.
-
-1999-03-23 Michael Sperber [Mr. Preprocessor] <sperber@informatik.uni-tuebingen.de>
-
- * paths.h.in (PATH_DOC): Made doc-directory configurable.
-
-1999-06-22 Olivier Galibert <galibert@pobox.com>
-
- * lrecord.h: Added basic external description system.
-
- * symbols.c: Added symbol, symbol-value-buffer-local,
- symbol-value-lisp-magic and symbol-value-varalias description.
- * mule-charset.c: Added charset description.
- * marker.c: Added marker description.
- * keymap.c: Added keymap description.
- * glyphs.c: Added glyph description.
- * floatfns.c: Added float description.
- * file-coding.c: Added coding-system description.
- * extents.c: Added extent description.
- * elhash.c: Added hash-table description.
- * data.c: Added weak-list desciption.
- * chartab.c: Added char-table-entry and char-table description.
- * bytecode.c: Added compiled-function description.
- * alloc.c: Added cons, vector and string description.
-
-1999-06-22 Olivier Galibert <galibert@pobox.com>
-
- * lrecord.h (struct lrecord_header): Reduced size to 4 bytes.
- Updated everything to the removal of the "flags" substructure.
-
- * lisp.h (subr_lheader_initializer): Updated.
- * symeval.h (symbol_value_forward_lheader_initializer): Updated.
-
-1999-06-20 MORIOKA Tomohiko <tomo@etl.go.jp>
-
- * syntax.c (word_constituent_p): Deleted.
- (scan_words): Use `WORD_BOUNDARY_P'.
-
- * chartab.c (Vword_combining_categories): New variable.
- (Vword_separating_categories): Likewise.
- (CATEGORYP): New macro.
- (CATEGORY_SET): Likewise.
- (CATEGORY_MEMBER): Likewise.
- (word_boundary_p): New function.
- (complex_vars_of_chartab): Set up new variable
- `word-combining-categories' and `word-separating-categories'.
-
-1999-06-18 Olivier Galibert <galibert@pobox.com>
-
- * lrecord.h: Added description as a placehold in the lrecord
- implementation structures. Added the parameter to all constructor
- defines.
-
- * alloc.c: Added placeholders.
- * buffer.c: Ditto.
- * bytecode.c: Ditto.
- * chartab.c: Ditto.
- * console.c: Ditto.
- * data.c: Ditto.
- * database.c: Ditto.
- * device.c: Ditto.
- * eldap.c: Ditto.
- * elhash.c: Ditto.
- * eval.c: Ditto.
- * event-stream.c: Ditto.
- * events.c: Ditto.
- * extents.c: Ditto.
- * faces.c: Ditto.
- * file-coding.c: Ditto.
- * floatfns.c: Ditto.
- * fns.c: Ditto.
- * frame.c: Ditto.
- * glyphs.c: Ditto.
- * gui-x.c: Ditto.
- * keymap.c: Ditto.
- * lstream.c: Ditto.
- * marker.c: Ditto.
- * mule-charset.c: Ditto.
- * objects.c: Ditto.
- * opaque.c: Ditto.
- * process.c: Ditto.
- * rangetab.c: Ditto.
- * specifier.c: Ditto.
- * symbols.c: Ditto.
- * toolbar.c: Ditto.
- * tooltalk.c: Ditto.
- * window.c: Ditto.
-
-1999-06-22 XEmacs Build Bot <builds@cvs.xemacs.org>
-
- * XEmacs 21.2.17 is released
-
-1999-06-13 Oscar Figueiredo <oscar@xemacs.org>
-
- * config.h.in (HAVE_LDAP_SET_OPTION): New define
- (HAVE_LDAP_GET_LDERRNO): Ditto
- (HAVE_LDAP_RESULT2ERROR): Ditto
- (HAVE_LDAP_PARSE_RESULT): Ditto
- (HAVE_UMICH_LDAP): Removed
- (HAVE_NS_LDAP): Removed
-
- * eldap.h (struct Lisp_LDAP): Removed the `livep' member as
- suggested by Olivier Galibert
- (CHECK_LIVE_LDAP): Test on `ld' instead of `livep'
-
- * eldap.c: Take the removal of `livep' into account in all the
- necessary functions
- (signal_ldap_error): Take two additional parameters
- Added new finer compilation conditions in order to use
- ldap_parse_result or ldap_result2error if available
- (Fldap_open): Conform to this new API
- (Fldap_search_internal): Ditto
-
-1999-06-17 SL Baur <steve@miho.m17n.org>
-
- * data.c (struct int_or_double): Should use EMACS_INT not int.
-
-1999-06-16 Norbert Koch <n.koch@eai-delta.de>
-
- * redisplay-msw.c: Run 'ccl_driver' with 'CCL_MODE_ENCODING' as in
- redisplay-x.c
-
-1999-06-12 MORIOKA Tomohiko <tomo@etl.go.jp>
-
- * redisplay-x.c (separate_textual_runs): Run `ccl_driver' with
- `CCL_MODE_ENCODING'.
-
- * file-coding.c (mule_decode): Run `ccl_driver' with
- `CCL_MODE_DECODING'.
- (mule_encode): Run `ccl_driver' with `CCL_MODE_ENCODING'.
-
- * mule-ccl.c (CCL_WRITE_CHAR): Refer `conversion_mode'.
- (ccl_driver): Add new argument `conversion_mode'.
- (Fccl_execute): Run `ccl_driver' with `CCL_MODE_ENCODING'.
- (Fccl_execute_on_string): Likewise [perhaps it is better to add
- new optional argument].
-
- * mule-ccl.h (CCL_MODE_ENCODING): New macro.
- (CCL_MODE_DECODING): New macro.
- (ccl_driver): Add new argument `conversion_mode'.
-
-1999-06-15 SL Baur <steve@miho.m17n.org>
-
- * mule-charset.c (Fsplit_char): New subr.
- (Fchar_octet): delete.
- (syms_of_mule_charset): DEFSUBR it.
-
-1999-06-13 Andy Piper <andy@xemacs.org>
-
- * menubar.h: update declarations involving gui_items.
-
- * lisp.h: declare Lisp_Gui_Item.
-
- * glyphs.h (struct Lisp_Image_Instance): update type of gui_item.
-
- * glyphs.c (mark_image_instance): modify for new lisp-based gui_items.
- (print_image_instance): ditto.
- (image_instance_equal): ditto.
- (image_instance_hash): ditto.
-
- * event-msw.c (mswindows_need_event): assert badly_p status.
- (mswindows_wnd_proc): modify WM_NOTIFY handling to cope with
- callbacks in tree-view and tab-control widgets.
- (emacs_mswindows_next_event): modify use of
- mswindows_dequeue_dispatch_event.
-
- * dialog-msw.c (mswindows_popup_dialog_box): modify for new
- lisp-based gui_items.
-
- * glyphs-msw.c (mswindows_update_subwindow): update use of
- gui_items.
- (mswindows_register_gui_item): new function.
- (mswindows_register_gui_item): fix to use lisp gui_items.
- (mswindows_widget_instantiate): ditto.
- (mswindows_button_instantiate): ditto.
- (add_tree_item): new function to recursively add tree view
- elements.
- (add_tree_item_list): ditto.
- (mswindows_tree_instantiate): new function. instantiate tree view
- controls.
- (add_tab_item): new function to add tabs to a tab control.
- (mswindows_tab_instantiate): new function. instantiate tab
- controls.
- (image_instantiator_format_create_glyphs_mswindows): add tree view
- and tab controls.
- (vars_of_glyphs_mswindows): ditto.
-
- * glyphs-widget.c (check_valid_item_list_1): allow nested lists in
- item lists.
- (check_valid_item_list): ditto.
- (initialize_widget_image_instance): fix to use new lisp gui_item.
- (widget_instantiate_1): allow the setting of default textwidth in
- characters.
- (widget_instantiate): change to use new widget_instantiate_1
- signature.
- (combo_instantiate): ditto.
- (static_instantiate): ditto.
- (tab_instantiate): new function for tab widgets.
- (image_instantiator_format_create_glyphs_widget): add tab and tree
- view widgets.
-
- * menubar-msw.c (displayable_menu_item): convert to use lisp
- gui_items.
- (populate_menu_add_item): ditto.
- (populate_or_checksum_helper): ditto.
-
- * menubar.c (menu_parse_submenu_keywords): convert to use lisp
- gui_items.
- (Fmenu_find_real_submenu): ditto.
-
- * gui.h (struct Lisp_Gui_Item): make gui_item a lisp oebjct.
-
- * gui.c (gui_item_add_keyval_pair): gui_items are now lisp
- objects, convert functions that use them accordingly.
- (gui_item_init): ditto.
- (gui_item_active_p): ditto.
- (gui_item_selected_p): ditto.
- (gui_item_included_p): ditto.
- (gui_item_display_flush_left): ditto.
- (gui_item_display_flush_right): ditto.
- (mark_gui_item): ditto.
- (allocate_gui_item): new function to create a gui_item.
- (make_gui_item_from_keywords_internal): ditto. create and return a
- gui_item as well as setting keywords.
- (gui_parse_item_keywords): ditto.
- (gui_parse_item_keywords_no_errors): ditto.
- (gui_add_item_keywords_to_plist): new function, not yet used.
- (gui_item_hash): new function.
- (gui_item_id_hash): use gui_item_hash.
- (gui_item_equal): new function.
- (print_gui_item): new function.
-
-1999-06-11 XEmacs Build Bot <builds@cvs.xemacs.org>
-
- * XEmacs 21.2.16 is released
-
-1999-06-10 Andy Piper <andy@xemacs.org>
-
- * select-msw.c (mswindows_own_selection): only set the clipboard
- if asked.
- (mswindows_get_foreign_selection): only get the clipboard if
- asked.
- (mswindows_disown_selection): only disown the clipboard if asked.
-
-1999-06-03 MORIOKA Tomohiko <tomo@etl.go.jp>
-
- * file-coding.c (coding_system_from_mask): Use `raw-text' instead
- of `no-conversion'.
- (complex_vars_of_mule_coding): Use `raw-text' as the coding-system
- of coding-category `no-conversion'.
-
-1999-06-03 MORIOKA Tomohiko <tomo@etl.go.jp>
-
- * file-coding.c (Qraw_text): New variable.
- (syms_of_mule_coding): Add new symbol `raw-text'.
- (complex_vars_of_mule_coding): Add new coding-system `raw-text';
- define coding-system `binary' independently; define coding-system
- `no-conversion' as an alias for `raw-text'.
-
- * file-coding.h (Qraw_text): New variable.
-
-1999-06-08 SL Baur <steve@xemacs.org>
-
- * s/decosf4-0.h: Explicitly #undef SYSTEM_MALLOC.
-
-1999-06-06 Hrvoje Niksic <hniksic@srce.hr>
-
- * fns.c (MIME_LINE_LENGTH): Default to 72, as in mimencode and
- base64.el.
- (base64_decode_1): Signal errors instead of returning -1.
-
-1999-06-07 Hrvoje Niksic <hniksic@srce.hr>
-
- * mule-charset.c (Fmake_char): Update docstring.
-
-1999-06-07 Hrvoje Niksic <hniksic@srce.hr>
-
- * fns.c (Fstring_lessp): Actually increment the Bufbyte pointers.
-
-1999-06-05 Hrvoje Niksic <hniksic@srce.hr>
-
- * fns.c (base64_decode_1): Allow and ignore any non-base64
- characters in input.
-
-1999-05-27 Olivier Galibert <galibert@pobox.com>
-
- * emacs.c (Fdump_emacs): Add clear_message() lost with the removal
- of report_pure_usage().
-
-1999-06-04 Hrvoje Niksic <hniksic@srce.hr>
-
- * fns.c (Fstring_lessp): Remove O(n^2) under Mule.
-
-1999-06-04 XEmacs Build Bot <builds@cvs.xemacs.org>
-
- * XEmacs 21.2.15 is released
-
-1999-06-01 Hirokazu FUKUI <fukui@atesoft.advantest.co.jp>
-
- * frame.c (Fset_mouse_position):
- (Fset_mouse_pixel_position):
- * window.c (Fsplit_window):
- (Fmove_to_window_line):
- Fix crash when invoking functions with an already-deleted window
- argument.
-
- * indent.c (vertical_motion_1):
- (vmotion_pixels):
- (Fvertical_motion_pixels):
- * window.c (Fwindow_displayed_text_pixel_height):
- Fix error message when invoking functions with an already-deleted
- window argument.
-
-1999-06-01 Jan Vroonhof <vroonhof@math.ethz.ch>
-
- * sysdep.c (request_sigio_on_device): Guard against glibc
- 2.1's stub streams implementation.
-
-1999-06-03 SL Baur <steve@xemacs.org>
-
- * config.h.in:
- * emacs.c: Implement x.y.z version numbers
- From Jan Vroonhof <vroonhof@math.ethz.ch>
-
-1999-05-20 MORIOKA Tomohiko <tomo@etl.go.jp>
-
- * mule-charset.c (complex_vars_of_mule_charset): Registry of
- japanese-jisx0208-1978 should not match with "jisx0208.1983" nor
- "jisc6226.1983".
-
-1999-06-03 SL Baur <steve@xemacs.org>
-
- * frame-x.c:
- * device-x.c: rename session option to wmcommand.
- From Oliver Graf <ograf@rhein-zeitung.de>
-
-1999-05-27 Hrvoje Niksic <hniksic@srce.hr>
-
- * fns.c (Fsubstring): Don't traverse the same region twice with
- charcount_to_bytecount().
-
-1999-06-03 SL Baur <steve@steve1.m17n.org>
-
- * m/alpha.h (SYSTEM_MALLOC): Fix indented preprocessor directive
- garbage.
-
- * s/decosf4-0.h: Defining ORDINARY_LINK here is redundant (and it
- doesn't really work as is implied by the commentary).
- Don't define SYSTEM_MALLOC so the old GNU malloc can be used.
-
-1999-06-02 SL Baur <steve@steve1.m17n.org>
-
- * symsinit.h: Declare vars_of_ntproc.
- * emacs.c (main_1): Call it.
-
- * ntproc.c (syms_of_ntproc): Move variable initializations from
- here ...
- (vars_of_ntproc): ... to here [new function].
-
- * file-coding.c (syms_of_file_coding): Rename.
- (vars_of_file_coding): Ditto.
- (complex_vars_of_file_coding): Ditto.
-
- * symsinit.h: Rename *_mule_coding to *_file_coding.
-
- * emacs.c (main_1): Call them by the proper name.
-
- * device-msw.c (syms_of_device_mswindows): Move variable
- initializations from here ...
- (vars_of_device_mswindows): ... to here.
-
- * chartab.c (vars_of_chartab): New function.
-
- * symsinit.h: New function, vars_of_chartab.
-
- * emacs.c (main_1): Call it.
-
- * mule-canna.c (syms_of_mule_canna): Move CANNA initialization ...
- (vars_of_mule_canna): ... to here.
-
- * mule-ccl.c (vars_of_mule_ccl): New function. Move variable
- initializations out of syms_of_mule_ccl.
-
- * symsinit.h: Declare new function vars_of_mule_ccl.
-
- * emacs.c (main_1): Call it.
-
-1999-05-27 Hrvoje Niksic <hniksic@srce.hr>
-
- * fns.c (base64_decode_1): Ignore whitespace.
-
-1999-05-27 Hrvoje Niksic <hniksic@srce.hr>
-
- * mule-charset.c (Fmake_char): Strip the eighth bit off ARG1 and
- ARG2.
-
-1999-05-21 Andy Piper <andy@xemacs.org>
-
- * xselect.c: deleted.
-
- * symsinit.h: declare select initialisation.
-
- * select.h: new file. declare commonly used select functions and
- variables.
-
- * select.c: new file. generalised from xselect.c.
- (clean_local_selection_data): moved from xselect.c.
- (get_local_selection): ditto. device specific pieces called via a
- devmeth.
- (handle_selection_clear): ditto.
- (Fown_selection_internal): renamed and generalised from
- Fx_own_selection_internal. moved from xselect.c.
- (Fdisown_selection_internal): ditto.
- (Fselection_owner_p): ditto.
- (Fselection_exists_p): ditto.
- (Fget_selection_internal): ditto.
- (syms_of_select): new function. QXXXX values moved from xselect.c
- (vars_of_select): new function. selection_converter_alist,
- lost_selection_hooks moved and renamed from xselect.c
-
- * select-x.c: renamed from xselect.c.
- (x_own_selection): converted to device specific. non-X-specific
- bits moved to select.c.
- (x_get_foreign_selection): ditto.
- (x_disown_selection): ditto.
- (x_selection_exists_p): ditto.
- (console_type_create_select_x): new function.
-
- * select-msw.c (mswindows_own_selection): new device method to set
- the clipboard when we 'own' the selection.
- (mswindows_get_foreign_selection): new device method to get the
- clipboard.
- (mswindows_disown_selection): new device method to delete the
- selection when we 'disown' it.
- (console_type_create_select_mswindows): new function.
-
- * emacs.c (main_1): add select to things to initialise.
-
- * console.h (struct console_methods): new console methods for
- selection.
-
- * Makefile.in.in (x_objs): xselect.c renamed to select-x.c
-
-1999-05-20 Hrvoje Niksic <hniksic@srce.hr>
-
- * print.c (long_to_string): Install a faster version.
-
-1999-05-16 Andy Piper <andy@xemacs.org>
-
- * ntproc.c (syms_of_ntproc): default
- win32-start-process-share-console to t.
-
-1999-05-14 Hrvoje Niksic <hniksic@srce.hr>
-
- * config.h.in: Do it here.
-
- * bytecode.c: Don't define ERROR_CHECK_TYPECHECK here.
-
-1999-05-14 Andy Piper <andy@xemacs.org>
-
- * toolbar-msw.c (mswindows_output_toolbar): hash on something
- hashable.
-
-1999-05-14 XEmacs Build Bot <builds@cvs.xemacs.org>
-
- * XEmacs 21.2.14 is released
-
-1999-05-12 Andy Piper <andy@xemacs.org>
-
- * ntproc.c (sys_spawnve): kludge argv[0] in a MS compatible way.
-
-1999-05-11 Gunnar Evermann <ge204@eng.cam.ac.uk>
-
- * emacs.c (Frun_emacs_from_temacs): (re)alloc natgs+2 entries for
- run_temacs_argv array -- fixes random memory corruption crash
-
-1999-05-12 Jan Vroonhof <vroonhof@math.ethz.ch>
-
- * window.c (Fcurrent_window_configuration):
- Save minibuffer height;
-
- * window.c (set_window_configuration): use it.
-
-1999-05-10 Robert Pluim <rpluim@bigfoot.com>
-
- * lisp.h (NNUNGCPRO): fix typo in name of DEBUG_GCPRO version
-
-1999-04-21 Jan Vroonhof <vroonhof@math.ethz.ch>
-
- * redisplay.c (redisplay_window): Do not put data
- in the line start cache if it is not guaranteed to be correct
-
-1999-04-02 Jan Vroonhof <vroonhof@math.ethz.ch>
-
- * window.c (struct window_config): Removed frame
- size members.
- (window_config_equal): No longer compare frame sizes.
- (Fset_window_configuration): Resize old top window to fit in the
- current frame directly, no longer use a fake frame resize.
- (Fcurrent_window_configuration): No longer save frame size
-
-1999-05-11 Andy Piper <andy@xemacs.org>
-
- * ntproc.c (sys_spawnve): actually assign argv[0] instead of the
- first character.
-
-1999-05-10 Hrvoje Niksic <hniksic@srce.hr>
-
- * sysdep.c (init_system_name): If gethostname gives a proper
- domain name, don't look further for one.
-
-1999-05-09 Hrvoje Niksic <hniksic@srce.hr>
-
- * symbols.c (Fintern): Avoid frequent XSYMBOL (foo).
- (Fintern_soft): Accept a symbol argument.
-
-1999-05-06 Hrvoje Niksic <hniksic@srce.hr>
-
- * symbols.c (Fintern): ...do it here.
-
- * lread.c (read_atom): Don't handle keywords here.
-
-1999-05-06 Hrvoje Niksic <hniksic@srce.hr>
-
- * symbols.c (reject_constant_symbols): Just use SYMBOL_IS_KEYWORD.
-
-1999-05-03 Olivier Galibert <galibert@pobox.com>
-
- * lisp.h (SYMBOL_IS_KEYWORD): A symbol can be a keyword only if it
- is interned in the main obarray.
-
-1999-04-23 Gunnar Evermann <ge204@eng.cam.ac.uk>
-
- * menubar-x.c (pre_activate_callback): set accelerator field in
- "No menu" entries to nil. Avoid crash in
- command_builder_operate_menu_accelerator
-
-1999-05-03 Olivier Galibert <galibert@pobox.com>
-
- * symeval.h (symbol_value_forward_lheader_initializer): Ditto.
-
- * lisp.h (DEFUN): Fix lrecord header initialisation.
-
-1999-05-02 Andy Piper <andy@xemacs.org>
-
- * objects-msw.c (mswindows_font_instance_truename): add a ';'.
-
- * ntproc.c (sys_kill): cast using MS mandated defines.
-
-1999-04-29 Andy Piper <andy@xemacs.org>
-
- * m/intel386.h: remove redundant definitions.
-
- * s/mingw32.h: new header for mingw32.
-
- * unexnt.c: (open_input_file): function moved to nt.c.
- (close_file_data): ditto.
- (rva_to_section): function moved to ntproc.
-
- * symsinit.h: declare syms_of_ntproc();
-
- * objects-msw.c (mswindows_font_instance_truename): new function.
-
- * ntproc.c: remove many warnings.
- (_sys_read_ahead): moved from nt.c and made static.
- (rva_to_section): moved from unexnt.c but not defined under
- mingw32.
- (win32_executable_type): implement what we can for mingw32
- headers.
- (sys_spawnve): fix bad MULE/GCPRO bug in filename handling.
-
- * ntheap.h: remove declarations of functions that are now static.
-
- * ntheap.c: support static heap.
-
- * nt.h: conditionalise X_OK definition.
-
- * nt.c: eliminate many warnings and support mingw32.
- (open_input_file): function moved from unexnt.c and made static
- (close_file_data): ditto.
- (_sys_read_ahead): moved to ntproc.c
-
- * emacs.c: make sure syms_of_ntptroc gets called under windows.
-
- * console-msw.h: support mingw32.
- * getloadavg.c: ditto.
- * ntplay.c: ditto.
- * sysdep.c: ditto.
- * sysdir.h: ditto.
- * systime.h: ditto.
- * systty.h: ditto.
-
- * config.h.in: dont turn on DEBUG_ENCAPSULATION by default because
- some systems don't have all of the encapsulated system calls.
-
- * callproc.c: warning elimination.
- * dired-msw.c: ditto.
- * process-nt.c: ditto.
- * realpath.c: ditto.
-
- * Makefile.in.in: tweak : and ; for building under mswindows.
-
-1999-04-26 Michael Harnois <mharnois@willinet.net>
-
- * eldap.c (allocate_ldap): Adapt to the new semantics of
- alloc_lcrecord_type().
-
-1999-03-16 MORIOKA Tomohiko <tomo@etl.go.jp>
-
- * file-coding.c (DECODE_HANDLE_END_OF_CONVERSION): fixed.
-
-1998-09-04 MORIOKA Tomohiko <morioka@jaist.ac.jp>
-
- * Delete mule-coding.c and mule-coding.h because they are not
- used.
-
-1999-04-22 Gunnar Evermann <ge204@eng.cam.ac.uk>
-
- * objects.c (print_font_instance): Check for NILP(f->device),
- i.e. Vthe_null_font_instance.
- (font_instance_truename_internal): ditto.
- (Ffont_instance_properties): ditto.
-
-1999-04-22 Olivier Galibert <galibert@pobox.com>
-
- * lrecord.h (DECLARE_LRECORD): lrecord_implementation isn't an
- array anymore.
-
-1999-04-22 Hrvoje Niksic <hniksic@srce.hr>
-
- * Makefile.in.in (tests): Don't mention tests explicitly -- makes
- it easier to add new ones.
-
-1999-04-22 Hrvoje Niksic <hniksic@srce.hr>
-
- * symbols.c (reject_constant_symbols): Ditto.
- (init_symbols_once_early): Ditto.
-
- * print.c (print_symbol): Don't use ->obarray.
-
- * symbols.c (Funintern): Ditto.
-
- * alloc.c (Fmake_symbol): Don't set ->obarray.
-
- * lisp.h (struct Lisp_Symbol): Removed .obarray field.
-
- * symbols.c (init_symbols_once_early): Removed
- Vpure_uninterned_symbol_table.
- (Fintern): Don't store to ->obarray field.
-
-1999-04-22 Hrvoje Niksic <hniksic@srce.hr>
-
- * data.c (vars_of_data): Default debug_issue_ebola_notices to 0.
- (eq_with_ebola_notice): Remove abracadabra support.
-
-1999-04-11 Oscar Figueiredo <Oscar.Figueiredo@di.epfl.ch>
-
- * eldap.c (Fldap_search_internal): Add a new parameter `withdn' to
- retrieve the distinguished names of entries
-
-1999-03-08 Martin Buchholz <martin@xemacs.org>
-
- * lread.c (read_escape): Make hex escapes read only two hex digits.
-
-1999-04-05 Olivier Galibert <galibert@pobox.com>
-
- * Makefile.in.in: Remove puresize-adjust.h and recursive makes.
- * make-src-depend: Remove puresize-adjust.h.
- * src-headers: Remove puresize-adjust.h.
- * config.h.in: Kill everything purespace/gung-ho related.
-
- * dbxrc: Make gung-ho mandatory.
- * gdbinit: Ditto.
-
- * lrecord.h: Make gung-ho mandatory. Remove pure flag and add
- c_readonly and lisp_readonly. Remove implementation arrays.
- (C_READONLY_RECORD_HEADER_P): Added.
- (LISP_READONLY_RECORD_HEADER_P): Added.
- (SET_C_READONLY_RECORD_HEADER): Added.
- (SET_LISP_READONLY_RECORD_HEADER): Added.
-
- * lisp.h: Kill everything purespace/non gung-ho related.
- (CHECK_C_WRITEABLE): Added.
- (CHECK_LISP_WRITEABLE): Added.
- (C_READONLY): Added.
- (LISP_READONLY): Added.
-
- * lisp-union.h: Make gung-ho mandatory.
- * lisp-disunion.h: Ditto.
-
- * alloc.c: Kill everything purespace/non gung-ho related. Fix all
- set_lheader_implementation calls.
- (c_readonly): Added.
- (lisp_readonly): Added.
- (make_string_nocopy): Added.
- (Fpurecopy): Changed to do nothing. Kept the old documentation
- for reference purposes for the next patches.
- (sweep_lcrecords_1): Don't free C readonly lcrecords.
- (sweep_bit_vectors_1): Don't free C readonly bitvectors.
- (SWEEP_FIXED_TYPE_BLOCK): Don't free C readonly lrecords.
-
- * fns.c: Make gung-ho mandatory.
- (Fput): CHECK_IMPURE -> CHECK_LISP_WRITEABLE.
- (Fremprop): Ditto.
- (Ffillarray): Ditto.
-
- * data.c: Make gung-ho mandatory.
- (pure_write_error): Removed.
- (c_write_error): Added.
- (lisp_write_error): Added.
- (Fsetcar): CHECK_IMPURE -> CHECK_LISP_WRITEABLE.
- (Fsetcdr): Ditto.
- (Faset): Ditto.
-
- * symbols.c: Make gung-ho mandatory. make_pure_pname ->
- make_string or make_string_nocopy. Fix various
- alloc_lcrecord_type.
-
- * lread.c: Remove everything purespace related.
- (Flocate_file_clear_hashing): purified -> c_readonly.
- (locate_file): Ditto.
- (read_atom): make_pure_pname -> make_string.
-
- * emacs.c (Frun_emacs_from_temacs): Remove purespace stats
- reporting.
- (Fdump_emacs): Ditto.
-
- * print.c (print_internal): Make gung-ho mandatory.
- * ntheap.c (sbrk): Ditto.
- * mem-limits.h (EXCEEDS_LISP_PTR): Ditto
- * symeval.h (symbol_value_forward_lheader_initializer): Ditto.
-
- * sheap.c (more_static_core): Remove puresize-adjust.h from
- message.
-
- * syntax.c (complex_vars_of_syntax): make_pure_string ->
- make_string_nocopy.
- * keymap.c (make_keymap): Fix alloc_lcrecord_type.
- (vars_of_keymap): make_pure_string -> make_string_nocopy.
- * events.c (deinitialize_event): Fix set_lheader_implementation.
- (zero_event): Ditto.
- * specifier.c (make_specifier_internal): Fix alloc_lcrecord.
- * menubar-x.c (set_frame_menubar): Fix alloc_lcrecord_type.
- * mule-charset.c (make_charset): Ditto.
- * console.c (allocate_console): Ditto.
- (complex_vars_of_console): Ditto.
- * file-coding.c (allocate_coding_system): Ditto.
- * device.c (allocate_device): Ditto
- * gui-x.c (gcpro_popup_callbacks): Ditto.
- * extents.c (allocate_extent_auxiliary): Ditto.
- (allocate_extent_info): Ditto.
- (copy_extent): Ditto.
- * glyphs.c (allocate_image_instance): Ditto.
- (allocate_glyph): Ditto.
- * frame.c (allocate_frame_core): Ditto.
- * database.c (allocate_database): Ditto.
- * tooltalk.c (make_tooltalk_message): Ditto.
- (make_tooltalk_pattern): Ditto.
- * rangetab.c (Fmake_range_table): Ditto.
- (Fcopy_range_table): Ditto.
- * process.c (make_process_internal): Ditto.
- * chartab.c (Fmake_char_table): Ditto.
- (make_char_table_entry): Ditto.
- (copy_char_table_entry): Ditto.
- (Fcopy_char_table): Ditto.
- * elhash.c (make_general_lisp_hash_table): Ditto.
- (Fcopy_hash_table): Ditto.
- * buffer.c (allocate_buffer): Ditto.
- (complex_vars_of_buffer): Ditto.
- * event-stream.c (allocate_command_builder): Ditto.
- * objects.c (Fmake_color_instance): Ditto.
- (Fmake_font_instance): Ditto.
- (vars_of_objects): Ditto.
- * toolbar.c (update_toolbar_button): Ditto.
- * window.c (allocate_window): Ditto.
- (make_dummy_parent): Ditto.
- (Fcurrent_window_configuration): Fix alloc_lcrecord.
- (vars_of_window): Fix make_lcrecord_list.
- * faces.c (allocate_face): Fix alloc_lcrecord_type. pure_list ->
- Flist.
- * lstream.c (Lstream_new): Fix make_lcrecord_list.
- * opaque.c (make_opaque): Fix alloc_lrecord.
- (make_opaque_list): Fix alloc_lrecord_type.
-
-1999-04-19 Hrvoje Niksic <hniksic@srce.hr>
-
- * process.c (Fstart_process_internal): Ditto.
-
- * ntproc.c (sys_spawnve): Use Vlisp_EXEC_SUFFIXES when calling
- locate_file().
-
- * glyphs-x.c (x_locate_pixmap_file): Ditto.
-
- * glyphs-msw.c (mswindows_locate_pixmap_file): Fix call to
- locate_file().
-
- * emodules.c (vars_of_module): New variable Vmodule_extensions.
- (emodules_load): Use it when calling locate_file().
-
- * emacs.c (main_1): Use Vlisp_EXEC_SUFFIXES when calling
- locate_file().
-
- * callproc.c: Vlisp_EXEC_SUFFIXES: New variable.
- (vars_of_callproc): Initialize it.
- (Fcall_process_internal): Use it when calling locate_file().
-
- * alloc.c (disksave_object_finalization): Use
- Flocate_file_clear_hashing().
-
- * lread.c (Flocate_file_clear_hashing): Clear all hasing when
- given `t' as argument.
-
-1999-04-18 Hrvoje Niksic <hniksic@srce.hr>
-
- * lread.c (locate_file): Expand `pathel' when appropriate.
- (Flocate_file_clear_hashing): Expand path elements.
- (Flocate_file_clear_hashing): Use Vlocate_file_hash_table.
-
- * dired.c (make_directory_hash_table): Create the hash-table only
- if the directory open is successful.
-
- * lread.c (decode_mode_1): New function.
- (decode_mode): Ditto.
- (Flocate_file): Use them.
- (Flocate_file): Expand FILENAME.
- (locate_file_map_suffixes): New function.
- (locate_file_in_directory_mapper): New function.
- (locate_file_in_directory): Use locate_file_in_directory_mapper()
- and locate_file_map_suffixes().
- (locate_file_construct_suffixed_files): Use
- locate_file_map_suffixes().
- (locate_file_without_hash): Don't GCPRO path.
- (Flocate_file_clear_hashing): Use EXTERNAL_LIST_LOOP.
- (syms_of_lread): Remove Qlocate_file_hash_table.
- (locate_file_find_directory_hash_table): Use
- Vlocate_file_hash_table.
- (locate_file_refresh_hashing): Ditto.
-
- * lread.c: Renamed read_objects to Vread_objects.
-
-1999-04-16 Olivier Galibert <galibert@pobox.com>
-
- * mule-charset.c: Generally resync with fsf 20.3 charset
- interface.
- (make_charset): Add long and short name. Use id instead of
- leading byte.
- (Fmake_charset): Ditto.
- (Fmake_reverse_direction_charset): Ditto.
- (Fcharset_property): Ditto.
- (Fcharset_short_name): Added.
- (Fcharset_long_name): Added.
- (Fcharset_description): Renamed from charset-doc-string.
- (syms_of_mule_charset): Synced symbols.
- (complex_vars_of_mule_charset): Synced charsets.
-
- * mule-charset.h: Removed leading byte (uses id instead), added
- short and long name.
-
-1999-04-15 Hrvoje Niksic <hniksic@srce.hr>
-
- * file-coding.c (Fdefine_coding_system_alias): New function.
-
-1999-04-08 Olivier Galibert <galibert@pobox.com>
-
- * mule-charset.c (complex_vars_of_mule_charset): Allow all iso8859
- and -ascii fonts for displaying ascii instead of iso8859-1 only.
-
-1998-12-14 Hrvoje Niksic <hniksic@srce.hr>
-
- * extents.c (set_extent_glyph_1): Make sure that the glyph we
- attach to the extent is valid.
-
-1998-12-12 Hrvoje Niksic <hniksic@srce.hr>
-
- * dired.c (user_name_completion): Mule-ize.
- (user_name_completion): Use xmalloc/xrealloc/xfree.
- (user_name_completion): Use DO_REALLOC.
- (user_name_completion): Cut down the number of static variables;
- use a structure.
- (user_name_completion): Username completion is always
- case-sensitive.
-
-1998-12-06 Hrvoje Niksic <hniksic@srce.hr>
-
- * fns.c (base64_decode_1): Remove COUNTER.
- (base64_decode_1): Accept CRLF in addition to CR.
- (base64_decode_1): Disallow a stray character after final EOF; the
- check was probably a remnant of buggy recode code.
-
-1998-12-05 Hrvoje Niksic <hniksic@srce.hr>
-
- * fns.c (init_provide_once): Provide `base64'.
-
-1998-12-04 Hrvoje Niksic <hniksic@srce.hr>
-
- * fns.c (XMALLOC_UNBIND): Include SPECCOUNT argument, for clarity.
- (Fbase64_encode_region): If buffer is read-only, bail out early.
- (Fbase64_decode_region): Ditto.
- (Fbase64_encode_region): Initialize SPECCOUNT to pacify the
- compiler.
- (Fbase64_encode_string): Ditto.
- (Fbase64_decode_region): Ditto.
- (Fbase64_decode_string): Ditto.
-
-1998-11-25 Hrvoje Niksic <hniksic@srce.hr>
-
- * dired.c (Fdirectory_files): Remove redundant code.
-
-1999-03-05 Philip Aston <philipa@parallax.co.uk>
-
- * frame-msw.c Make raise-frame restore minimised windows.
-
-1999-03-05 Philip Aston <philipa@parallax.co.uk>
-
- * device-msw.c: Fix DEFVAR format - Death to phantom quote, and
- add magic newline.
-
-1999-03-05 Philip Aston <philipa@parallax.co.uk>
-
- * toolbar-msw.c Consider captions when deciding whether to rebuild
- toolbar. This fixes the initial toolbar display for those of us
- who don't like captions. These patches applied by Andy Piper.
-
-1999-03-12 XEmacs Build Bot <builds@cvs.xemacs.org>
-
- * XEmacs 21.2.13 is released
-
-1999-03-12 SL Baur <steve@xemacs.org>
-
- * file-coding.c: Guard ucs table initialization with ifdef MULE.
-
-1999-03-10 Stephen J. Turnbull <turnbull@sk.tsukuba.ac.jp>
-
- * file-coding.c: docstring and comment improvements.
- (decode_ucs4) flag possible data loss with comment.
-
-1999-03-10 Martin Buchholz <martin@xemacs.org>
-
- * file-coding.c (Fset_ucs_char): add CHECK_INT, CHECK_CHAR
- (ucs_to_char):
- (Fucs_char):
- (Fset_char_ucs):
- (decode_coding_ucs4):
- (encode_coding_ucs4):
- (detect_coding_utf8):
- (decode_coding_utf8):
- (encode_utf8):
- (encode_coding_utf8):
- Add CHECK_* macros where needed to avoid crashes.
- #ifdef out all composite character support using
- #ifdef ENABLE_COMPOSITE_CHARS
- Use normal XEmacs coding standards.
- Fix docstrings.
- Remove CODING_STREAM_COMPOSE, CODING_STREAM_DECOMPOSE.
-
-1998-09-08 MORIOKA Tomohiko <morioka@jaist.ac.jp>
-
- * file-coding.c (make-coding-system): Add description about
- `ucs-4' and `utf-8'.
- (detection_state): Modify to implement ucs-4 and utf-8.
- (detect_coding_type): Likewise.
- (detect_coding_ucs4): New implementation.
- (detect_coding_utf8): New implementation.
- (encode_utf8): fixed.
- (syms_of_mule_coding): Rename `ucs4' and `utf8' to `ucs-4' and
- `utf-8'.
-
-1998-09-08 MORIOKA Tomohiko <morioka@jaist.ac.jp>
-
- * file-coding.c (mule_char_to_ucs4): Encode 94x94 chars in ISO
- 2022 registry to private area.
-
-1998-09-07 MORIOKA Tomohiko <morioka@jaist.ac.jp>
-
- * file-coding.c (encode_utf8): New function.
- (encode_coding_utf8): New implementation.
-
-1998-09-07 MORIOKA Tomohiko <morioka@jaist.ac.jp>
-
- * file-coding.c (ucs_to_mule_table): New variable; abolish
- `Vucs_to_mule_table'
- (mule_to_ucs_table): renamed from `Vmule_to_ucs_table'.
- (set-ucs-char): New function.
- (ucs_to_char): New function.
- (ucs-char): New function.
- (set-char-ucs): New function.
- (char-ucs): New function.
- (decode_ucs4): Use `ucs_to_char'.
- (complex_vars_of_mule_coding): Abolish `ucs-to-mule-table' and
- `mule-to-ucs-table'.
-
-1998-09-06 MORIOKA Tomohiko <morioka@jaist.ac.jp>
-
- * chartab.h: EXFUN `Fget_char_table'.
-
- * file-coding.c (encode_ucs4): New function.
- (encode_coding_ucs4): Use `encode_ucs4'.
-
-1998-09-06 MORIOKA Tomohiko <morioka@jaist.ac.jp>
-
- * file-coding.c (decode_coding_ucs4): New implementation.
-
-1998-09-06 MORIOKA Tomohiko <morioka@jaist.ac.jp>
-
- * file-coding.c (decode_coding_ucs4): fixed.
-
- * file-coding.c (Vmule_to_ucs_table): New variable.
- (mule_char_to_ucs4): New function.
- (encode_coding_ucs4): New implementation.
- (complex_vars_of_mule_coding): Define variable
- `mule-to-ucs-table'.
-
-1998-09-06 MORIOKA Tomohiko <morioka@jaist.ac.jp>
-
- * file-coding.c (decode_coding_utf8): New implementation.
-
-1998-09-06 MORIOKA Tomohiko <morioka@jaist.ac.jp>
-
- * file-coding.c (decode_coding_utf8): fixed.
-
-1998-09-06 MORIOKA Tomohiko <morioka@jaist.ac.jp>
-
- * file-coding.c (Vucs_to_mule_table): New variable.
- (decode_ucs4): Refer `Vucs_to_mule_table'.
- (complex_vars_of_mule_coding): Define variable
- `ucs-to-mule-table'.
-
-1998-09-04 MORIOKA Tomohiko <morioka@jaist.ac.jp>
-
- * file-coding.c (detect_coding_ucs4): New function (not
- implemented yet).
- (decode_coding_ucs4): New function.
- (encode_coding_ucs4): New function (not implemented yet).
- (detect_coding_utf8): New function (not implemented yet).
- (decode_coding_utf8): New function.
- (encode_coding_utf8): New function (not implemented yet).
- (make-coding-system): New type `ucs4' and `utf8'.
- (coding-system-type): Likewise.
- (detection_state): Add `ucs4' and `utf8'.
- (detect_coding_type): Likewise.
- (mule_decode): Use `decode_coding_ucs4' and `decode_coding_utf8'.
- (mule_encode): Use `encode_coding_ucs4' and `encode_coding_utf8'.
- (decode_ucs4): New function (very incomplete).
- (syms_of_mule_coding): Add `ucs4' and `utf8'.
-
- * file-coding.h: Add definitions for UCS-4 and UTF-8.
-
-1999-03-08 Martin Buchholz <martin@xemacs.org>
-
- * mule-charset.c:
- (non_ascii_valid_char_p):
- (lookup_composite_char):
- (composite_char_string):
- (make-composite-char):
- (composite-char-string):
- (syms_of_mule_charset):
- (complex_vars_of_mule_charset):
- * mule-charset.h (LEADING_BYTE_COMPOSITE):
- (CHAR_LEADING_BYTE):
- (MAKE_CHAR):
- * file-coding.h (CODING_STATE_COMPOSITE):
- (CODING_STATE_ISO2022_LOCK):
- (iso_esc_flag):
- (LEADING_BYTE_COMPOSITE):
- * file-coding.c (struct iso2022_decoder):
- (decoding_closer):
- (reset_iso2022):
- (parse_iso2022_esc):
- (encode_coding_iso2022):
- #ifdef out all composite character support using
- #ifdef ENABLE_COMPOSITE_CHARS
-
- * alloc.c: Define lrecord_coding_system only if ! FILE_CODING
-
-1999-03-04 Takeshi YAMADA <yamada@cslab.kecl.ntt.co.jp>
-
- * fns.c (Fbase64_encode_string): Calculate `allength' in the same
- way of `Fbase64_encode_region'.
-
-1999-02-18 Katsumi Yamaoka <yamaoka@jpl.org>
-
- * fns.c (base64_encode_1): Don't add a newline at the tail.
-
-1999-03-08 Andy Piper <andy@xemacs.org>
-
- * menubar-msw.c (displayable_menu_item): correct off-by-one &
- handling.
-
-1999-03-07 Martin Buchholz <martin@xemacs.org>
-
- * console-stream.h (struct stream_console):
- * event-unixoid.c (event_stream_unixoid_select_console):
- (event_stream_unixoid_unselect_console):
- * print.c (Fexternal_debugging_output):
- * sysdep.c (reset_one_device):
- * console-stream.c (stream_init_console):
- (stream_delete_console):
- (allocate_stream_console_struct): move into stream_init_console.
- (free_stream_console_struct): move into stream_delete_console.
- Use `fd' only for file descriptors.
- Therefore, rename members of struct stream_console.
-
- * systime.h: Unix98 says sys/time.h should define select(), but
- some systems define that in unistd.h. So include that file always.
-
- * glyphs.h (MAYBE_IIFORMAT_METH): Don't use leading `_'. Avoid
- multiple evaluation of first arg. Do proper do {} while (0) wrapping.
- (HAS_IIFORMAT_METH_P): Prevent macro from being used in
- non-boolean context
- (MAYBE_IIFORMAT_DEVMETH): Use standard internal macro naming convention.
-
- * EmacsShell.c:
- * balloon_help.c:
- Add #include <stdio.h>.
- Some versions of assert.h use printf() without #include'ing stdio.h
-
- * free-hook.c (blocktype): Add gcpro5_type to blocktype.
- (log_gcpro): Remove unused variable FRAME.
- (show_gcprohist): Ansify.
- Comment the #endif's
-
- * frame-x.c (x_delete_frame): Don't use FRAME_X_SHELL_WIDGET(f)
- after it's just been XtDestroy'ed!
-
-1999-02-18 Martin Buchholz <martin@xemacs.org>
-
- * opaque.c (print_opaque):
- (sizeof_opaque):
- (equal_opaque):
- (hash_opaque):
- Egcs 1.1.1 seems to have a bug where
- INTP (p->size_or_chain)
- will crash XEmacs. Fix by introducing intermediate variable.
-
- * sound.c (Fdevice_sound_enabled_p): Fix compiler warning.
-
- * dired.c (Fdirectory_files):
- (Ffile_name_completion):
- (Ffile_name_all_completions):
- (file_name_completion):
- - Use `directory' instead of `dirname' to sync with FSF Emacs and
- avoid compiler warnings.
- - Fix up docstrings so that C variables match documentation.
-
-1999-03-05 Martin Buchholz <martin@xemacs.org>
-
- * alloc.c: (garbage_collect_1): Reorg code to make scope of local
- variables as small as possible to help out the compiler and the maintainer.
-
- * alloc.c: (disksave_object_finalization):
- Set all the *-load-path variables to
- nil, not just load-path itself. This gets the locate-file hash
- tables garbage collected BEFORE dump, and has the side effect of
- preventing crashes on OSF4.0+egcs.
-
- * alloc.c:
- * gdbinit:
- * dbxrc:
- - Clean up gdb/dbx debugging support.
- - Storing an EMACS_INT in an enum is not 64-bit clean!
- - So change the enum to a set of separate variables.
- - Add test cases to help debug the debugging support!
- - Add `lisp-shadows' and `run-temacs' targets for dbx.
- - Both dbx and gdb have been tested now.
-
-1999-03-05 XEmacs Build Bot <builds@cvs.xemacs.org>
-
- * XEmacs 21.2.12 is released
-
-1999-02-16 Kazuyuki IENAGA <ienaga@jsys.co.jp>
-
- * device-x.c: Support to find best visual without flashing.
-
-1999-03-02 Paul Keusemann <pkeusem@visi.com>
-
- * database.c (berkdb_map): Add flags argument to cursor call (must
- be 0 according to docs) required for Berkeley DB 2.6.4 and later.
-
-1999-03-03 Martin Buchholz <martin@xemacs.org>
-
- * hash.c:
- * hash.h:
- General cleanup. Get free-hook.c working again.
- Remove unused functions:
- make_strings_hash_table, copy_hash, expand_hash_table.
-
- * malloc.c:
- * mem-limits.h:
- Always use new ANSI-style function prototypes.
-
- * unexalpha.c (unexec): Never use implicit int.
-
- * sgiplay.c (close_sound_file):
- (play_sound_file):
- (restore_audio_port):
- (play_sound_data):
- (audio_initialize):
- (play_internal):
- (drain_audio_port):
- (write_mulaw_8_chunk):
- (write_linear_chunk):
- (write_linear_32_chunk):
- (initialize_audio_port):
- (open_audio_port):
- (set_channels):
- (set_output_format):
- (adjust_audio_volume):
- (get_current_volumes):
- (parse_snd_header):
- Always use new ANSI-style function prototypes.
- Use unistd.h for missing prototypes.
-
- * unexelfsgi.c (round_up):
- (find_section):
- (unexec): Always use new ANSI-style function prototypes
-
- * elhash.c (struct Lisp_Hash_Table): rename golden to golden_ratio
-
- * console.h (struct console_methods): Always use full ANSI prototypes
-
- * emacs.c (__sti__iflPNGFile_c___): Always use full ANSI prototypes
-
-1999-03-02 Andy Piper <andy@xemacs.org>
-
- * event-stream.c (init_event_stream): make sure native mswindows
- gets an appropriate event loop.
-
-1999-02-22 Andy Piper <andy@xemacs.org>
-
- * frame-msw.c (mswindows_make_frame_visible): use SW_SHOW rather
- than SW_SHOWNORMAL to prevent resizing of maximised frames.
- (mswindows_raise_frame): remove comment.
-
-1999-03-01 XEmacs Build Bot <builds@cvs.xemacs.org>
-
- * XEmacs 21.2.11 is released
-
-1999-02-25 SL Baur <steve@xemacs.org>
-
- * mule-charset.c (Qleading_byte): New variable to implement
- charset-leading-byte function.
- (Fcharset_property): Use it.
- (syms_of_mule_charset): Initialize it.
- From Kazuyuki IENAGA <ienaga@jsys.co.jp>
-
-1999-02-17 Kazuo Oishi <oishi@ae.agr.yamaguchi-u.ac.jp>
-
- * glyphs-x.c (cononvert_EImage_to_XImage): correct
- bytes per pixel counting.
-
-1999-02-15 Andy Piper <andy@xemacs.org>
-
- * s/cygwin32.h (BROKEN_SIGIO): don't define this as it causes
- major lockups.
-
-1999-02-16 MORIOKA Tomohiko <morioka@jaist.ac.jp>
-
- * fns.c (Fbase64_encode_string): New optional argument
- `NO_LINE_BREAK'.
-
-1999-02-16 Martin Buchholz <martin@xemacs.org>
-
- * gdbinit: Fix up commands to run temacs. Add lisp-shadows command.
- * alloc.c (xcalloc): undef xcalloc, just like xmalloc
-
-1999-02-10 Martin Buchholz <martin@xemacs.org>
-
- * s/bsdos4.h: New file. Port to BSDI BSD/OS 4.0.
- * xintrinsic.h: Redo CONST support for X11 R4 compatibility.
-
-1999-02-05 XEmacs Build Bot <builds@cvs.xemacs.org>
-
- * XEmacs 21.2.10 is released
-
-1999-02-02 Gleb Arshinov <gleb@cs.stanford.edu>
-
- * process-nt.c (nt_send_process):
- Fix for process-send-region/process-send-string breaking when size
- of the input > 128 chars: change maximum chunk size for process
- stream from 512 to 128, thus guaranteeing that ntpipe_shove_writer
- succeeds.
-
-1999-02-02 XEmacs Build Bot <builds@cvs.xemacs.org>
-
- * XEmacs 21.2.9 is released
-
-1999-01-30 Martin Buchholz <martin@xemacs.org>
-
- * bytecode.c (funcall_compiled_function): Call
- UNBIND_TO_GCPRO instead of UNBIND_TO_GCPRO_VARIABLES_ONLY.
-
- * backtrace.h (UNBIND_TO_GCPRO_VARIABLES_ONLY):
- #ifdef 0 out unused macro.
-
-1999-01-27 Martin Buchholz <martin@xemacs.org>
-
- * gui.c (gui_parse_item_keywords_internal): Make static.
-
-1999-01-21 Andy Piper <andy@xemacs.org>
-
- * glyphs-msw.c: add xface support.
- (mswindows_xface_instantiate): new function copied from glyphs-x.c
- (image_instantiator_format_create_glyphs_mswindows): do device
- specific initialisation for xfaces.
- (xbm_create_bitmap_from_data): line data must be padded to a word
- boundary.
-
- * glyphs-x.c (xface_validate): moved to glyphs.c
- (xface_normalize): ditto.
- (xface_possible_dest_types): ditto.
- (image_instantiator_format_create_glyphs_x): do device specific
- initialisation for xfaces.
-
- * glyphs.h: declare xface symbol.
-
- * glyphs.c: move generic xface support here.
- (xface_validate): moved from glyphs-x.c
- (xface_normalize): ditto.
- (xface_possible_dest_types): ditto.
- (image_instantiator_format_create): xface declarations moved from
- glyphs-x.c.
-
-1999-01-14 Adrian Aichner <aichner@ecf.teradyne.com>
-
- * event-stream.c (vars_of_event_stream): Fixing documentation.
-
-1999-01-17 Gunnar Evermann <ge204@eng.cam.ac.uk>
-
- * glyphs-eimage.c (gif_instantiate): Correct handling of
- interlaced gifs to avoid writing past the end of the eimage
- buffer.
-
-1999-01-13 Hrvoje Niksic <hniksic@srce.hr>
-
- * search.c (Freplace_match): Handle single backslash at end of
- NEWTEXT correctly.
-
-1999-01-12 William M. Perry <wmperry@aventail.com>
-
- * eldap.c (Fldap_open): slow down interrupts around ldap_open to
- avoid connection errors.
-
-1999-01-12 Andy Piper <andy@xemacs.org>
-
- * redisplay-output.c (redisplay_update_line): backout change that
- shouldn't have gone ine.
-
-1999-01-09 Oscar Figueiredo <Oscar.Figueiredo@di.epfl.ch>
-
- * eldap.c (vars_of_ldap): Do no provide `ldap' here since it may
- collide with ldap.el
-
-1999-01-11 Andy Piper <andy@xemacs.org>
-
- * redisplay.h (DISPLAY_LINE_HEIGHT): new macro.
- (DISPLAY_LINE_YPOS): new macro.
-
- * redisplay-msw.c (mswindows_output_string): use it.
- (mswindows_output_pixmap): ditto.
- (mswindows_output_display_block): ditto.
-
- * redisplay-output.c (redisplay_output_display_block): new
- function. just call the devmeth, maybe insert some generic code
- here later.
- (compare_display_blocks): use it.
- (output_display_line): ditto.
- (redisplay_unmap_subwindows_maybe): new function. potentially
- unmap subwindows in the given area.
-
- * glyphs.c (reset_subwindow_cachels): unmap subwindows that we are
- resetting.
-
-1999-01-10 J. Kean Johnston <jkj@sco.com>
-
- * Makefile.in.in: Set value of moduledir
- - Changed DUMPENV to include $(MODULEPATH)
- - Added install rule to install header files for use by ellcc.
-
- * config.h.in: Added INHIBIT_SITE_MODULES
- - Added HAVE__DLERROR
- - Added HAVE_DLFCN_H
- - Added DLSYM_NEEDS_UNDERSCORE
-
- * dll.c: Removed.
-
- * emodules.c: New file containing dynamic loading code.
-
- * emodules.h: New file.
-
- * emacs.c: Added variables Vmodule_directory,
- Vsite_module_directory, Vconfigure_module_directory and
- Vconfigure_site_module_directory.
- - (main_1): Added new variable inhibit_site_modules and command
- line options `-no-site-modules' and `--no-site-modules'.
- - (main_1): Call syms_of_module() instead of syms_of_dll().
- - (main_1): Call vars_of_module().
- - (vars_of_emacs): Introduce inhibit-site-modules,
- module-directory, configure-module-directory,
- site-module-directory, and configure-site-module-directory to the
- Lisp reader.
-
- * lisp.h: Declare load_module and list_modules, as well as
- Vmodule_directory, Vsite_module_directory,
- Vconfigure_module_directory and Vconfigure_site_module_directory.
-
- * paths.h.in: Added PATH_MODULESEARCH and PATH_SITE_MODULES.
- - Added correct support for site-lisp directory.
-
- * symbols.c (defsubr): Modified to allow modules to add new subrs
- after dump time.
- - (defsubr_macro): Same.
- - (defvar_magick): Only use purespace when not initialized, so
- that loaded modules can still add symbols.
-
- * symsinit.h: Add definitions for syms_of_module(),
- vars_of_module(). Removed syms_of_dll().
-
- * sysdll.c: Include dlfcn.h if HAVE_DLFCN_H is defined.
- - (dll_variable): Take DLSYM_NEEDS_UNDERSCORE into account.
- - (dll_error): use _dlerror() if HAVE__DLERROR is defined.
-
- * s/sco5-shr.h (C_SWITCH_SYSTEM): Correct for modern gcc and
- explicitly pass -belf for native cc.
-
- * s/sco5.h (LIB_GCC): Use -print-libgcc-file-name instead of
- hard-coding the library name.
-
-1999-01-01 <martin@xemacs.org>
-
- * device-x.c (Fx_set_font_path):
- Add proper cast to permit compilation under C++.
-
- * buffer.c (directory_is_current_directory):
- Add proper casts to permit compilation under C++.
-
-1998-12-30 Damon Lipparelli <lipp@primus.com>
-
- * event-msw.c (mswindows_wnd_proc):
- Fixed failure when building with MSVC 5.
-
-1998-12-29 Martin Buchholz <martin@xemacs.org>
-
- * file-coding.c (decode_coding_iso2022):
- - Prevent crash when decoding ISO7/Lock detected files
- - the usual martin fiddling
-
-1998-12-29 Jonathan Harris <jhar@tardis.ed.ac.uk>
-
- * event-msw.c:
- glyphs-msw.c:
- Fixed failures when building with MSVC.
- * unexnt.c (dump_bss_and_heap):
- Removed compiler warning by removing bss_data variable.
-
-1998-12-18 Jim Radford <radford@robby.caltech.edu>
-
- * device-x.c (Fx_set_font_path, Fx_get_font_path): New functions
- so that packages that distribute their own fonts can access them.
-
-1998-12-28 Andy Piper <andy@xemacs.org>
-
- * glyphs-msw.c (mswindows_button_instantiate): cope with buttons
- that have an image provided.
-
- * glyphs.h: add Q_image decl.
-
- * glyphs-widget.c new functionality allowing images in
- widgets.
- (check_valid_glyph_or_image): new function to validate
- glyphs passed in through :image.
- (widget_normalize): new function. convert :image parameters into
- real glyphs if not already so.
- (widget_instantiate_1): mess with size parameters to be similar to
- :image if provided.
- (syms_of_glyphs_widget): new keyword :image.
- (image_instantiator_format_create_glyphs_widget): normalize
- buttons and allow :image.
-
-1998-12-27 Andy Piper <andy@xemacs.org>
-
- * frame-msw.c (mswindows_init_frame_1): warning elimination.
-
- * glyphs-widget.c (check_valid_anything): no-op function.
- (check_valid_callback): check callbacks in gui_items.
- (check_valid_symbol): as it sounds.
- (check_valid_string_or_vector): ditto.
- (widget_validate): modified for descriptors that are vectors or
- sequences of keyword/val pairs.
- (widget_instantiate_1): ditto.
- (image_instantiator_format_create_glyphs_widget): allow gui_item
- keywords in the instantiator.
-
- * gui.c (gui_parse_item_keywords_internal): renamed from
- gui_parse_item_keywords but taking error behaviour.
- (gui_parse_item_keywords): use it.
- (gui_parse_item_keywords_no_errors): ditto.
- (gui_item_add_keyval_pair): add Error_behavior flag and only
- signal invalid keywords if required.
-
- * gui.h: new gui signatures.
-
- * menubar.c (menu_parse_submenu_keywords): use new
- gui_item_add_keyval_pair signature.
-
- * s/cygwin32.h: modify PTY_ITERATION to eliminate warnings.
-
-1998-12-28 Martin Buchholz <martin@xemacs.org>
-
- * XEmacs 21.2.8 is released.
-
-1998-12-28 Martin Buchholz <martin@xemacs.org>
-
- * editfns.c (get_home_directory):
- (user-home-directory): Simplify.
-
-
- * callproc.c (child_setup):
- - Environment variables were being passed to inferior processes
- using internal encoding.
- - Convert to external encoding.
- - Rename local var `tem' to better name `tail'.
- - Use Flength instead of `manual' calculation.
-
- * buffer.c (kill-buffer):
- (record-buffer):
- (set-buffer-major-mode):
- (current-buffer):
- - Fix up parameter names to correspond to docstrings.
- - Don't use `bufname' when a buffer will do as well.
- - Remove one unneeded GCPRO.
-
- * buffer.h (initial_directory):
- * buffer.c (init_initial_directory):
- - use correct conversions between internal and external format.
- (directory_is_current_directory): new function
- (init_buffer): convert initial_directory to internal format.
- - solve crashes when current working directory is non-ASCII.
-
- * alloc.c (xmalloc):
- (xcalloc):
- (xrealloc):
- - remove stupid casts, since XEmacs requires an ANSI C system.
- (lrecord_type_index): replace abort() with more readable assert().
-
- (reset_lcrecord_stats): remove.
- (sweep_lcrecords_1):
- - replace call to reset_lcrecord_stats() with call to xzero().
-
-1998-12-27 Martin Buchholz <martin@xemacs.org>
-
- * process-unix.c (unix_create_process):
- - Fix crash invoking program with non-ASCII name.
- Try invoking xemacs with SHELL=/bin/sh, then M-x shell.
- - Remove unused variable `env'.
- - Rename `temp' to better name `save_errno'.
- - Reorganize code for clarity. But still too chicken to nuke the
- BSD 4.2 support.
-
-1998-12-24 Martin Buchholz <martin@xemacs.org>
-
- * XEmacs 21.2.7 is released.
-
-1998-12-23 Martin Buchholz <martin@xemacs.org>
-
- * glyphs.c (decode_device_ii_format):
- - Fix indentation.
- - Use GET_C_STRING_FILENAME_DATA_ALLOCA with char *, not Extbyte *.
-
- * glyphs-x.c (x_subwindow_instantiate):
- - A image instance mask was being assigned to a image instance type!
- - X_SUBWINDOW_INSTANCE_DATA (ii) is not an lvalue in C++.
-
- * glyphs-msw.c (mswindows_initialize_dibitmap_image_instance):
- Fix indentation.
- * glyphs-x.h: Make indentation consistent.
-
- * emacs.c (Fdump_emacs): Remove Steve Martin merge artifacts.
-
- * glyphs-widget.c (check_valid_glyph): Warning suppression.
- - Make it static
- - #ifdef it out, since it's not actually used yet (FIX THIS!)
-
- * glyphs-widget.c:
- * glyphs.h:
- Move declarations of decode_device_ii_format and
- decode_image_instantiator_format into glyphs.h where they belong.
-
-1998-12-22 Martin Buchholz <martin@xemacs.org>
-
- * frame-x.c (x_delete_frame): Revert part of my changes at the
- suggestion of Gunnar Evermann - unfortunately no one really
- understands this code.
-
- * callproc.c (init_callproc): code cleanup.
-
- * free-hook.c (malloc):
- (check_malloc):
- (__free_hook):
- (__malloc_hook):
- (__realloc_hook):
- (block_input_malloc):
- (block_input_realloc):
- * device-x.c (x_delete_device):
- * emacs.c (voodoo_free_hook):
- * events.c (print_event):
- (CHECK_EVENT_TYPE):
- (CHECK_EVENT_TYPE2):
- (CHECK_EVENT_TYPE3):
- Use proper prototypes.
- Make C_E_T macros a little faster.
- Pedantic fiddly little changes. You really don't care.
-
-1998-12-22 Andy Piper <andy@xemacs.org>
-
- * redisplay-output.c (redisplay_clear_region): make sure that
- fg/bg colors get set even when we are in the border area.
-
-1998-12-13 Martin Buchholz <martin@xemacs.org>
-
- * console-msw.c: Function definitions follow coding standards
- - This prevents e.g. find-tag on Lisp_Event finding DEVENT
-
-1998-12-11 Martin Buchholz <martin@xemacs.org>
-
- * events.h (struct timeout_data):
- * event-tty.c (tty_timeout_to_emacs_event):
- * event-msw.c (mswindows_wm_timer_callback):
- * event-Xt.c (Xt_timeout_to_emacs_event):
- * event-msw.c (mswindows_cancel_dispatch_event):
- Make sure Lisp_Objects inside events are initialized to Qnil, not
- Qnull_pointer, which is now illegal.
-
-1998-12-10 Martin Buchholz <martin@xemacs.org>
-
- * lisp.h: Fix up prototypes to match alloc.c
-
-1998-12-08 Martin Buchholz <martin@xemacs.org>
-
- * windowsnt.h: Remove `support' for using index and rindex
-
- * filelock.c (current_lock_owner):
- - Change uses of index -> strchr, rindex -> strrchr
-
-1998-12-07 Martin Buchholz <martin@xemacs.org>
-
- * sysdep.c (set_descriptor_non_blocking):
- Since O_NONBLOCK is now always #defined, make use of fcntl
- conditional on F_SETFL being defined.
-
- * console-msw.c (DHEADgER):
- (DOPAQUE_DATA):
- (DEVENT):
- (DCONS):
- (DCONSCDR):
- (DSTRING):
- (DVECTOR):
- (DSYMBOL):
- (DSYMNAME):
- - max_align_t should not be visible to the user of the
- XOPAQUE_DATA macro.
- - use Bufbyte instead of char
- - parens around (FOOP (obj)) are always redundant.
- If they were necessary, we should fix the macro instead.
- - Always use string_data(foo) instead of foo->data.
-
-
-1998-12-06 Martin Buchholz <martin@xemacs.org>
-
- * frame-msw.c (mswindows_init_frame_1):
- - use make_lisp_hash_table, not Fmake_hash_table
- - include elhash.h
-
- * lisp.h:
- * alloc.c (make_vector): remove travesty
- (Fmake_vector):
- (make_pure_vector):
- (pure_cons):
- (make_bit_vector_internal):
- (make_bit_vector):
- (make_bit_vector_from_byte_vector):
- (Fmake_bit_vector):
- - make vector_equal a little faster.
- - Don't use variable name `new'.
- - Use size_t instead of EMACS_INT.
- - usual Martin-style pointless bit-twiddling.
-
- * fns.c (mapcar1):
- (Fmapconcat):
- (Fmapcar):
- (Fmapvector):
- Make mapcar faster. In particular, make
- (mapc #'identity long-string)
- MUCH faster under Mule.
- * tests/automated/lisp-tests.el: Test 'em!
-
- * bytecode.c (Ffetch_bytecode): Fix crash when loading lazy-loaded
- bytecode.
-
-1998-12-01 Martin Buchholz <martin@xemacs.org>
-
- * menubar-x.c (menu_item_descriptor_to_widget_value_1): Always use
- Qnil, not NULL, to initialize `null' Lisp_Objects.
-
-1998-11-29 Hrvoje Niksic <hniksic@srce.hr>
-
- * specifier.c (display_table_validate): Update.
-
- * redisplay.c (create_text_block): Use them.
-
- * glyphs.c (display_table_entry): New function.
- (get_display_tables): Ditto.
-
-1998-12-15 Oscar Figueiredo <Oscar.Figueiredo@di.epfl.ch>
-
- * eldap.c (toplevel): Mention that eldap.c compiles with
- OpenLDAP libs
- (Fldap_open): Use `GET_C_STRING_OS_DATA_ALLOCA'
- (Fldap_search_internal): Ditto
-
-1998-12-11 Martin Buchholz <martin@xemacs.org>
-
- * event-msw.c (mswindows_cancel_dispatch_event):
- Gratuitous code prettification
-
-
-1998-12-07 Hrvoje Niksic <hniksic@srce.hr>
-
- * fns.c (Fnconc): Fix use of wrong_type_argument().
-
- * floatfns.c (Ffloat): Fix docstring.
- (Ffloat): Fix use of wrong_type_argument().
- (Fabs): Ditto.
- (extract_float): Ditto.
- (Fceiling): Ditto.
- (Fround): Ditto.
- (Ftruncate): Ditto.
-
-1998-12-06 Martin Buchholz <martin@xemacs.org>
-
- * frame-msw.c (mswindows_init_frame_1):
- - use make_lisp_hash_table, not Fmake_hash_table
- - include elhash.h
-
- * lisp.h:
- * alloc.c (make_vector): remove travesty
- (Fmake_vector):
- (make_pure_vector):
- (pure_cons):
- (make_bit_vector_internal):
- (make_bit_vector):
- (make_bit_vector_from_byte_vector):
- (Fmake_bit_vector):
- - make vector_equal a little faster.
- - Don't use variable name `new'.
- - Use size_t instead of EMACS_INT.
- - usual Martin-style pointless bit-twiddling.
-
- * fns.c (mapcar1):
- (Fmapconcat):
- (Fmapcar):
- (Fmapvector):
- Make mapcar faster. In particular, make
- (mapc #'identity long-string)
- MUCH faster under Mule.
- * tests/automated/lisp-tests.el: Test 'em!
-
- * bytecode.c (Ffetch_bytecode): Fix crash when loading lazy-loaded
- bytecode.
-
-1998-12-02 Didier Verna <verna@inf.enst.fr>
-
- * menubar-x.c (menu_item_descriptor_to_widget_value_1): set the
- accelerator field to nil for labels.
-
-1998-12-16 Jonathan Harris <jhar@tardis.ed.ac.uk>
-
- * menubar-msw.c (displayable_menu_item):
- Escape occurrences of '&' and support occurrences of the
- '%_' accelerator indicator in menus.
-
-1998-11-26 Didier Verna <verna@inf.enst.fr>
-
- * dired.c (Fdirectory_files): use make_string instead of
- make_ext_string on the filename. The conversion external->internal
- format is already done in sys_readdir.
-
-1998-12-15 Gunnar Evermann <ge204@eng.cam.ac.uk>
-
- * glyphs.c (normalize_image_instantiator): GCPRO instantiator
-
-1998-12-16 Jonathan Harris <jhar@tardis.ed.ac.uk>
-
- * event-msw.c
- (Belatedly) added Kirill to list of file's authors.
- emacs_mswindows_quit_p: Don't process WM_PAINT messages in
- quit checking. WM_PAINT messages cause redisplay, but
- windows' states are not necessarily stable when this function
- gets called.
-
-1998-12-17 Andy Piper <andy@xemacs.org>
-
- * strftime.c (zone_name): CONSTify.
-
-1998-12-15 Andy Piper <andy@xemacs.org>
-
- * glyphs-msw.c (mswindows_combo_instantiate): ditto.
- (mswindows_widget_property): return Qunbound when no property available.
- (mswindows_button_property): ditto.
- (mswindows_combo_property): ditto.
- (mswindows_widget_set_property): ditto.
-
- * glyphs-widget.c (check_valid_item_list): use properties.
-
- * glyphs.h (struct Lisp_Image_Instance): we have properties now.
-
- * glyphs.c (Fset_image_instance_property): allow setting of arbitrary properties.
- (Fimage_instance_property): ditto.
- * glyphs-widget.c (widget_property): ditto.
- (widget_set_property): ditto.
-
- * frame-msw.c (mswindows_set_frame_pointer): SetCursor() as well
- as setting the class cursor so that GC actually changes the
- cursor.
-
- * config.h: don't undef MAIL_USE_POP.
-
-1998-12-13 Andy Piper <andy@xemacs.org>
-
- * glyphs-msw.c
- (image_instantiator_format_create_glyphs_mswindows): line ->
- label.
- (mswindows_label_instantiate): ditto. Play with window flags.
- (image_instantiator_format_create_glyphs_mswindows): ditto.
- (vars_of_glyphs_mswindows): provide Qlabel as we support it now.
-
- * glyphs-widget.c (widget_instantiate_1): re-jig autosizing to
- cope with lines and labels.
- (static_instantiate): use widget_instantiate_1.
- line -> label.
- (image_instantiator_format_create_glyphs_widget): ditto.
-
-1998-12-10 Andy Piper <andy@xemacs.org>
-
- * Makefile.in.in (objs): add gui.o
-
-1998-12-10 Andy Piper <andy@xemacs.org>
-
- * gui.c: adjust defines of HAVE_POPUPS so that we can build with
- no window system.
-
-1998-12-09 Andy Piper <andy@xemacs.org>
-
- * glyphs.c (finalize_image_instance): mark glyphs changed when an
- image instance is removed so that the subwindow cache gets reset
- and thus destroyed images get GC'd.
-
-1998-12-08 Andy Piper <andy@xemacs.org>
-
- * gui-msw.c (mswindows_handle_gui_wm_command): call
- MARK_SUBWINDOWS_CHANGED.
-
- * glyphs-msw.c (mswindows_finalize_image_instance): make sure
- subwindows really get deleted.
-
- * redisplay.c: new variable subwindows_changed[_set].
- (redisplay_window): use it.
- (redisplay_frame): ditto.
- (redisplay_device): ditto.
- (redisplay_without_hooks): ditto.
-
- * device.h (MARK_DEVICE_SUBWINDOWS_CHANGED): new macro for
- subwindows redisplay as per glyphs equivalent.
- * redisplay.h: ditto.
- (MARK_SUBWINDOWS_CHANGED): ditto.
- (RESET_CHANGED_SET_FLAGS): ditto.
- * frame.h (MARK_FRAME_SUBWINDOWS_CHANGED): ditto.
-
-1998-12-07 Andy Piper <andy@xemacs.org>
-
- * frame.c (Fmake_frame): reset subwindow cachels on non-stream
- frames.
-
- * redisplay.c (redisplay_frame): invalidate subwindow cachels.
-
- * event-msw.c (mswindows_wnd_proc): catch the various WM_CTLCOLOR*
- messages and paint widget glyphs as appropriate with their face fg
- & bg.
-
-1998-12-06 Andy Piper <andy@xemacs.org>
-
- * glyphs-msw.c (vars_of_glyphs_mswindows): provide widget types
- here rather than in glyphs-widget - do this because we only want
- to provide what is really available.
-
- * glyphs.c (Fimage_instance_property): new function to get the
- properties of image instances. wires through to console specific
- methods and then to widget specific methods.
- (Fset_image_instance_property): ditto but for setting widget properties.
- (check_valid_face): make extern so that it can be used elsewhere.
-
- * glyphs-widget.c (widget_property): new function. gets the
- properties of widgets in general and wires the function through to
- widget specific ones.
- (widget_set_property): ditto but for setting widget properties.
-
- * glyphs-msw.c (mswindows_combo_instantiate): Add functionality to
- add items to the list. Play with window styles a bit to get the
- desired effect.
- (mswindows_widget_property): break out specific widget properties.
- (mswindows_button_property): new function. gets the checked state
- of a button.
- (mswindows_combo_property): new function. gets the current
- selection in the combo box.
- (mswindows_widget_set_property): new function. sets specific
- properties of specific widgets.
-
- * glyphs-widget.c (check_valid_item_list): new function. check
- that items for a combo-box are just a list of strings.
- (combo_validate): new function. check there is an item list.
- (widget_instantiate_1): new function. renamed from
- widget_instantiate so that we can do slightly different things for
- other widgets.
- (widget_instantiate): call widget_instantiate_1.
- (combo_instantiate): new function to instantiate combo boxes,
- defaults height to the pixel height of the number of items in the
- box.
- (syms_of_glyphs_widget): move widget keywords here.
- (image_instantiator_format_create_glyphs_widget): use new combo
- functions.
-
-1998-12-04 Andy Piper <andy@xemacs.org>
-
- * event-msw.c (mswindows_wnd_proc): mule-ize.
-
- * glyphs.c (pixmap_to_lisp_data): mule-ize.
-
- * glyphs-msw.c (extract_xpm_color_names): mule-ize.
- (resource_name_to_resource): ditto.
- (mswindows_resource_instantiate): ditto.
- (mswindows_widget_instantiate): ditto.
- (mswindows_widget_set_property): ditto.
-
- * redisplay-output.c (redisplay_output_subwindow): don't show
- subwindows if they are obscured at the edge of the frame, emacs
- gets into some sort of redisplay loop otherwise.
-
- * gui.h: prototype gui_item_selected_p.
-
- * gui.c (gui_item_selected_p): new function to determine the
- selected state of a gui_item.
-
- * frame.h (struct frame): add subwindows_changed flag.
-
- * redisplay.c (redisplay_frame): call update_frame_subwindows ().
-
- * glyphs.c (update_subwindow): new function to update a
- subwindow's state.
- (update_frame_subwindows): new function to update all the
- subwindows on a frame.
-
- * console.h (struct console_methods): add update_subwindow.
-
- * glyphs-msw.c (mswindows_widget_property): return selected state
- for selected property.
- (mswindows_update_subwindow): new function. updates widget glyphs
- in redisplay as per menubars or toolbars e.g. selected state.
- (console_type_create_glyphs_mswindows): add update_subwindow.
-
-1998-12-03 Andy Piper <andy@xemacs.org>
-
- * console-tty.c (syms_of_console_tty): MULE -> FILE_CODING since
- tty coding system things are such.
-
- * glyphs-widget.c (widget_face_font_info): new function for
- pulling out height and width metrics for a widget's face.
- (widget_text_to_pixel_conversion): calculate pixel sizes of text
- for widgets.
-
- * event-msw.c (mswindows_drain_windows_queue): translate messages
- that are destined for subwindows. This makes edit fields interact
- with the keyboard correctly.
- nuke warnings by #ifndef'ing out stuff not required by msg select().
-
- * glyphs.h (INITIALIZE_IMAGE_INSTANTIATOR_FORMAT_NO_SYM): new
- macro defining the iiforma without the symbol required by widget.
- (INITIALIZE_IMAGE_INSTANTIATOR_FORMAT): use it.
-
- * general.c (syms_of_general): add Qwidget, Qselected.
-
- * faces.c (complex_vars_of_faces): add widget face inheriting from
- gui-element face.
-
-1998-11-09 Andy Piper <andy@xemacs.org>
-
- * window.h (struct window): add a cache of subwindows on a
- per-window basis.
-
- * window.c (mark_window): mark the subwindow_instance_cache.
- (allocate_window): initialise the subwindow instance_cache.
-
- * toolbar-x.c (x_output_toolbar): call redisplay_clear_region
- instead of the devmeth.
- (x_clear_toolbar): ditto.
-
- * redisplay-x.c (x_output_display_block): call
- redisplay_output_subwindow for subwindows and widgets.
-
- * redisplay-tty.c (tty_output_display_block): add IMAGE_WIDGET to
- types to do nothing for.
-
- * lisp.h: declare new widget/subwindow symbols.
-
- * glyphs.c (image_instantiate): cache subwindows on a per-window
- basis.
- (subwindow_possible_dest_types): new function for subwindow dest
- types.
- (subwindow_instantiate): generic instantiation of a
- subwindow. specialised by device multi-methods.
- (Fsubwindowp): moved from glyphs-x.c. adapted for glyph-based
- subwindows.
- (Fimage_instance_subwindow_id): ditto.
- (Fresize_subwindow): ditto.
- (Fforce_subwindow_map): ditto.
-
- * glyphs-x.c (x_print_image_instance): remove subwindow
- stuff. Handled genrically in glyphs.c.
- (x_image_instance_equal): ditto.
- (x_image_instance_hash): ditto.
- (x_finalize_image_instance): delete subwindows when required.
- (mark_subwindow) (print_subwindow) (finalize_subwindow)
- (subwindow_hash) (Fmake_subwindow): deleted because of new,
- glyph-based, subwindow implementation.
- (Fsubwindow_height) (Fsubwindow_width) (Fsubwindow_xid): aliased
- in glyphs.el
- (Fsubwindowp) (Fresize_subwindow) (Fforce_subwindow_map): moved to
- glyphs.c.
- (x_unmap_subwindow): new function to unmap X subwindows.
- (x_map_subwindow): new function to map X subwindows.
- (x_subwindow_instantiate): new function to instantiate X
- subwindows.
- (x_resize_subwindow): new function to resize X subwindows.
- (console_type_create_glyphs_x): add subwindow functions.
- (image_instantiator_format_create_glyphs_x): add device
- multi-methods for xpm, xbm and subwindow.
-
- * glyphs.el (subwindow-xid): old alias for new subwindow functions.
- (subwindow-width): ditto.
- (subwindow-height): ditto.
-
- * glyphs-msw.c (mswindows_widget_instantiate): new function for
- generally instantiating ms subwindows. Used by
- mswindows_*_instantiate.
- (mswindows_edit_instantiate): instantiate an edit field on a
- mswindows frame.
-
-1998-11-04 Andy Piper <andy@xemacs.org>
-
- * symsinit.h: declare new functions.
-
- * redisplay.h: declare new functions.
-
- * redisplay-x.c (x_output_display_block): call
- redisplay_clear_region rather than x_clear_region.
- (x_output_string): ditto.
- (x_output_pixmap): ditto.
- (x_clear_to_window_end): ditto.
- (x_output_eol_cursor): ditto.
- (x_clear_region): only do X specific things. other duties handled
- in redisplay_clear_region.
-
- * redisplay-tty.c (tty_clear_region): do tty specific things - some
- duties moved to redisplay_clear_region.
-
- * redisplay-output.c (clear_left_border): use
- redisplay_clear_region instead of device method.
- (clear_right_border): ditto.
- (output_display_line): ditto.
- (redisplay_output_subwindow): ditto.
- (redisplay_clear_top_of_window): ditto.
- (redisplay_clear_region): perform duties previously handled by
- device methods. call the appropriate device method at the
- end. unmap subwindows if necessary.
-
- * redisplay-msw.c (mswindows_output_string): use
- redisplay_clear_region instead of mswindows_clear_region.
- (mswindows_clear_to_window_end): ditto.
- (mswindows_output_display_block): output subwindows when required.
- (mswindows_clear_region): only do mswindows specific things,
- everything else is now handled in redisplay_clear_region.
-
- * gui.h: add item id hash defines and declare function prototypes.
-
- * gui.c (mark_gui_item): new function for marking gui_items.
- (gui_item_hash): generic hash function for generating command ids
- for gui_items.
-
- * gui-msw.c: new file.
- (mswindows_handle_gui_wm_command): new function to handle widget
- callbacks.
-
- * glyphs.h (MAYBE_IIFORMAT_DEVMETH): new function for device
- multi-methods.
- (IIFORMAT_HAS_SHARED_METHOD): ditto.
- (DEFINE_DEVICE_IIFORMAT): ditto.
- (INITIALIZE_DEVICE_IIFORMAT): ditto.
- (struct Lisp_Image_Instance): add widget and subwindow data plus
- appropriate access functions.
-
- * glyphs.c (decode_device_ii_format): new function for decoding
- image instantiator functions based on a device type as well as an
- image format.
- (decode_image_instantiator_format): just call
- decode_device_ii_format with nil device.
- (add_entry_to_device_ii_format_list): new function for per device
- method instances.
- (add_entry_to_image_instantiator_format_list): just call
- add_entry_to_device_ii_format_list with nil device.
- (check_valid_vector): new function.
- (instantiate_image_instantiator): instantiate using per-format
- method and then per-format-per-device method (device
- multi-methods). signal an error if neither is possible.
- (mark_image_instance): cope with subwindows and widgets.
- (print_image_instance): ditto.
- (image_instance_equal): ditto.
- (image_instance_hash): ditto.
- (allocate_glyph): ditto.
- (glyph_width): ditto.
- (glyph_height_internal): ditto.
- (xpm_instantiate): removed because of device multi-methods.
- (mark_subwindow_cachels): new cachel functions for caching
- instantiated subwindows on a per-frame basis. mostly copied from
- glyph cachel functions.
- (update_subwindow_cachel_data): ditto.
- (add_subwindow_cachel): ditto.
- (get_subwindow_cachel_index): ditto.
- (reset_subwindow_cachels): ditto.
- (mark_subwindow_cachels_as_not_updated): ditto.
- (unmap_subwindow): generic unmapping of subwindows based on cachel
- data.
- (map_subwindow): ditto.
- (initialize_subwindow_image_instance): generic initialisation of
- subwindow data.
- (syms_of_glyphs): add widget keywords.
-
- * glyphs-x.h (struct x_subwindow_data): convert Lisp_Subwindow to
- x_subwindow_data.
-
-1998-11-04 Andy Piper <andy@xemacs.org>
-
- * glyphs-widget.c: new file for instantiating widget type glyphs.
- (widget_possible_dest_types): new general dest type function for
- widgets.
- (widget_validate): ditto.
- (initialize_widget_image_instance): ditto
- (widget_instantiate): ditto. Sets up fg/bg, gui_item parsing
- before handing on control to device multi-methods.
- (syms_of_glyphs_widget): new function.
- (image_instantiator_format_create_glyphs_widget): new function,
- added placeholders for button, edit, combo, scrollbar
- (vars_of_glyphs_widget): new function.
-
- * glyphs-msw.h (WIDGET_INSTANCE_MSWINDOWS_HANDLE): new define for
- storing window ids of widgets.
-
- * glyphs-msw.c (mswindows_finalize_image_instance): cope with
- deletion of widget and subwindow glyphs.
- (mswindows_unmap_subwindow): new device function for unmapping
- subwindows on a msw frame.
- (mswindows_map_subwindow): ditto.
- (mswindows_register_image_instance): register instantiated widgets
- with the widget hastable.
- (mswindows_button_instantiate): instantiate a button type widget
- on an msw frame.
- (mswindows_subwindow_instantiate): instanttiate a subwindow on a
- mswindows frame.
- (image_instantiator_format_create_glyphs_mswindows): add device
- multi-methods for xbm, xpm, subwindow, edit and button.
-
- * frame.h (struct frame): add subwindow_cachels dynarr for caching
- information about subwindows visible on the current frame. used by
- redisplay_clear_region to unmap subwindows as required.
-
- * frame.c (mark_frame): mark subwindow_cachels.
- (allocate_frame_core): instantiate subwindow_cachels.
-
- * frame-msw.c (mswindows_init_frame_1): instntiate and mark the
- widget hashtable.
-
- * event-msw.c (mswindows_wnd_proc): add call to
- mswindows_handle_gui_wm_command to handle widget callbacks.
-
- * emacs.c (main_1): add calls to glyphs-widget initialisation
- routines.
-
- * console.h (struct console_methods): add
- unmap/map_subwindow_method for use be redisplay_clear_region to
- map and unmap subwindows. Remove xpm and xbm stuff - now dealt
- with by image instantiator multi-methods. Add
- resize_subwindow_method.
-
- * console-stream.c (stream_clear_region): change signature to
- match new generic clear region function.
-
- * Makefile.in.in: add glyphs-widget.o to list of objects.
-
- * console-msw.h (struct mswindows_frame): add widget hashtable for
- wiring command ids to callbacks.
-
-1998-12-16 Andy Piper <andy@xemacs.org>
-
- * XEmacs 21.2.6 is released
-
-1998-12-08 Hrvoje Niksic <hniksic@srce.hr>
-
- * md5.c (Fmd5): Correctly initiate string input stream.
-
- * Makefile.in.in (tests): Add md5-tests.el.
-
-1998-12-06 Martin Buchholz <martin@xemacs.org>
-
- * lisp.h:
- * alloc.c (make_vector): remove travesty
- (Fmake_vector):
- (make_pure_vector):
- (pure_cons):
- (make_bit_vector_internal):
- (make_bit_vector):
- (make_bit_vector_from_byte_vector):
- (Fmake_bit_vector):
- - make vector_equal a little faster.
- - Don't use variable name `new'.
- - Use size_t instead of EMACS_INT.
- - usual Martin-style pointless bit-twiddling.
-
- * fns.c (mapcar1):
- (Fmapconcat):
- (Fmapcar):
- (Fmapvector):
- Make mapcar faster. In particular, make
- (mapc #'identity long-string)
- MUCH faster under Mule.
- * tests/automated/lisp-tests.el: Test 'em!
-
-1998-12-06 Martin Buchholz <martin@xemacs.org>
-
- * bytecode.c (Ffetch_bytecode): Fix crash when loading lazy-loaded
- bytecode.
-
-1998-12-13 Martin Buchholz <martin@xemacs.org>
-
- * console-msw.c: Function definitions follow coding standards
- - This prevents e.g. find-tag on Lisp_Event finding DEVENT
-
-1998-12-11 Martin Buchholz <martin@xemacs.org>
-
- * events.h (struct timeout_data):
- * event-tty.c (tty_timeout_to_emacs_event):
- * event-msw.c (mswindows_wm_timer_callback):
- * event-Xt.c (Xt_timeout_to_emacs_event):
- * event-msw.c (mswindows_cancel_dispatch_event):
- Make sure Lisp_Objects inside events are initialized to Qnil, not
- Qnull_pointer, which is now illegal.
-
-1998-12-10 Martin Buchholz <martin@xemacs.org>
-
- * lisp.h: Fix up prototypes to match alloc.c
-
-1998-12-09 Andy Piper <andy@xemacs.org>
-
- * glyphs-msw.c (init_image_instance_from_xbm_inline): don't use
- XSETINT for assigning lisp objects.
-
-1998-12-07 Martin Buchholz <martin@xemacs.org>
-
- * opaque.h:
- * console-msw.c (DHEADER):
- (DOPAQUE_DATA):
- (DEVENT):
- (DCONS):
- (DCONSCDR):
- (DSTRING):
- (DVECTOR):
- (DSYMBOL):
- (DSYMNAME):
- - max_align_t should not be visible to the user of the
- XOPAQUE_DATA macro.
- - use Bufbyte instead of char
- - parens around (FOOP (obj)) are always redundant.
- If they were necessary, we should fix the macro instead.
- - Always use string_data(foo) instead of foo->data.
-
-1998-12-07 Martin Buchholz <martin@xemacs.org>
-
- * sysdep.c (set_descriptor_non_blocking):
- Since O_NONBLOCK is now always #defined, make use of fcntl
- conditional on F_SETFL being defined.
-
-1998-12-09 Andy Piper <andy@xemacs.org>
-
- * menubar-msw.c (mswindows_handle_wm_command): add back in checks
- that got removed in the merge
-
-1998-11-30 Greg Klanderman <greg@alphatech.com>
-
- * dired.c (vars_of_dired): bugfix for previous conditionalization
- of user-name-completion on non- Windows NT.
-
-1998-12-08 Martin Buchholz <martin@xemacs.org>
-
- * windowsnt.h: Remove `support' for using index and rindex
-
- * filelock.c (current_lock_owner):
- - Change uses of index -> strchr, rindex -> strrchr
-
-1998-12-06 Martin Buchholz <martin@xemacs.org>
-
- * frame-msw.c (mswindows_init_frame_1):
- - use make_lisp_hash_table, not Fmake_hash_table
- - include elhash.h
-
-1998-12-05 XEmacs Build Bot <builds@cvs.xemacs.org>
-
- * XEmacs 21.2.5 is released
-
-1998-11-30 Martin Buchholz <martin@xemacs.org>
-
- * xselect.c (receive_incremental_selection):
- * xselect.c (x_get_window_property):
- * xmu.c (XmuReadBitmapDataFromFile):
- * xmu.c (XmuCursorNameToIndex):
- * xgccache.c (describe_gc_cache):
- * xgccache.c (gc_cache_lookup):
- * xgccache.c (free_gc_cache):
- * xgccache.c (make_gc_cache):
- * window.h:
- * window.c (map_windows_1):
- * window.c (Fother_window_for_scrolling):
- * window.c (window_scroll):
- * window.c (change_window_height):
- * window.c (Fsplit_window):
- * window.c (window_left_gutter_width):
- * window.c (window_modeline_height):
- * window.c (invalidate_vertical_divider_cache_in_window):
- * window.c (window_needs_vertical_divider_1):
- * window.c (update_mirror_internal):
- * window.c (SET_LAST_FACECHANGE):
- * widget.c (Fwidget_plist_member):
- * unexec.c (copy_text_and_data):
- * unexcw.c (copy_executable_and_dump_data_section):
- * tooltalk.doc:
- * tooltalk.c (struct Lisp_Tooltalk_Pattern):
- * tooltalk.c (struct Lisp_Tooltalk_Message):
- * toolbar.h (struct toolbar_button):
- * toolbar.c (default_toolbar_visible_p_changed_in_window):
- * toolbar.c (recompute_overlaying_specifier):
- * toolbar.c (toolbar_validate):
- * toolbar.c (toolbar_button_at_pixpos):
- * toolbar.c (get_toolbar_coords):
- * toolbar.c (update_frame_toolbars):
- * toolbar-x.c:
- * toolbar-msw.c (mswindows_handle_toolbar_wm_command):
- * toolbar-msw.c (mswindows_find_toolbar_pos):
- * toolbar-msw.c (mswindows_output_toolbar):
- * toolbar-msw.c (mswindows_clear_toolbar):
- * toolbar-msw.c:
- * systty.h:
- * syssignal.h:
- * sysproc.h:
- * sysfile.h:
- * sysdll.c:
- * sysdep.h:
- * sysdep.c (rmdir):
- * sysdep.c (sys_fopen):
- * sysdep.c (sys_open):
- * sysdep.c (tty_init_sys_modes_on_device):
- * sysdep.c (get_eof_char):
- * sysdep.c (child_setup_tty):
- * sysdep.c (set_descriptor_non_blocking):
- * syntax.h:
- * syntax.c (scan_words):
- * syntax.c:
- * symsinit.h:
- * symeval.h (struct symbol_value_varalias):
- * symeval.h (struct symbol_value_forward):
- * symbols.c (syms_of_symbols):
- * symbols.c (init_symbols_once_early):
- * symbols.c (Fbuilt_in_variable_type):
- * symbols.c (Fsymbol_value_in_buffer):
- * symbols.c (default_value):
- * symbols.c (Fset):
- * symbols.c (find_symbol_value_quickly):
- * symbols.c (store_symval_forwarding):
- * symbols.c (set_default_console_slot_variable):
- * symbols.c (set_default_buffer_slot_variable):
- * symbols.c (verify_ok_for_buffer_local):
- * symbols.c (symbol_is_constant):
- * symbols.c (oblookup):
- * symbols.c (Funintern):
- * symbols.c (Fintern):
- * symbols.c (check_obarray):
- * sunplay.c:
- * specifier.h (struct specifier_methods):
- * specifier.h:
- * specifier.c (specifier_instance):
- * specifier.c (specifier_instance_from_inst_list):
- * specifier.c (decode_locale_type):
- * specifier.c (specifier_equal):
- * specifier.c (finalize_specifier):
- * specifier.c (prune_specifiers):
- * specifier.c (kill_specifier_buffer_locals):
- * sound.c (init_native_sound):
- * sound.c:
- * signal.c (alarm):
- * search.c (Fmatch_data):
- * search.c (match_limit):
- * search.c (Freplace_match):
- * search.c (skip_chars):
- * search.c (scan_buffer):
- * search.c:
- * scrollbar.c (specifier_vars_of_scrollbar):
- * scrollbar.c (Fscrollbar_set_hscroll):
- * scrollbar.c (vertical_scrollbar_changed_in_window):
- * scrollbar.c (release_window_mirror_scrollbars):
- * scrollbar.c (free_scrollbar_instance):
- * scrollbar-x.c:
- * scrollbar-msw.c:
- * s/msdos.h (O_BINARY):
- * s/linux.h:
- * s/freebsd.h (LIBS_TERMCAP):
- * regex.c (re_match_2_internal):
- * regex.c (compile_extended_range):
- * regex.c (POP_FAILURE_POINT):
- * regex.c (PUSH_FAILURE_POINT):
- * redisplay.h (RESET_CHANGED_SET_FLAGS):
- * redisplay.h:
- * redisplay.h (struct display_line):
- * redisplay.h (struct rune):
- * redisplay.c (vars_of_redisplay):
- * redisplay.c (redisplay_variable_changed):
- * redisplay.c (UPDATE_CACHE_RETURN):
- * redisplay.c (validate_line_start_cache):
- * redisplay.c (mark_redisplay_structs):
- * redisplay.c (mark_glyph_block_dynarr):
- * redisplay.c (window_line_number):
- * redisplay.c (redisplay_frame):
- * redisplay.c (redisplay_window):
- * redisplay.c (generate_modeline):
- * redisplay.c (create_right_glyph_block):
- * redisplay.c (create_left_glyph_block):
- * redisplay.c (create_text_block):
- * redisplay.c:
- * redisplay-x.c (x_output_hline):
- * redisplay-x.c (x_output_vertical_divider):
- * redisplay-tty.c (tty_output_display_block):
- * redisplay-output.c (output_display_line):
- * redisplay-output.c:
- * redisplay-msw.c (mswindows_output_vertical_divider):
- * redisplay-msw.c (mswindows_ring_bell):
- * redisplay-msw.c (mswindows_output_cursor):
- * redisplay-msw.c:
- * rangetab.c:
- * ralloc.c:
- * puresize.h (RAW_PURESIZE):
- * profile.c (syms_of_profile):
- * profile.c (Fstart_profiling):
- * profile.c (sigprof_handler):
- * profile.c:
- * procimpl.h:
- * process.c (vars_of_process):
- * process.c (read_process_output):
- * process.c (get_process):
- * process.c:
- * process-unix.c (unix_open_multicast_group):
- * process-unix.c (unix_get_tty_name):
- * process-unix.c (unix_send_process):
- * process-unix.c (unix_reap_exited_processes):
- * process-unix.c (unix_create_process):
- * process-unix.c (unix_init_process_io_handles):
- * process-unix.c (allocate_pty):
- * process-unix.c:
- * process-nt.c (nt_open_network_stream):
- * process-nt.c (nt_update_status_if_terminated):
- * process-nt.c (nt_finalize_process_data):
- * process-nt.c:
- * print.c (debug_short_backtrace):
- * print.c (debug_backtrace):
- * print.c (print_symbol):
- * print.c (print_internal):
- * print.c (print_cons):
- * print.c (Fwrite_char):
- * print.c (print_prepare):
- * print.c (canonicalize_printcharfun):
- * print.c (output_string):
- * print.c:
- * opaque.h:
- * opaque.c (allocate_managed_opaque):
- * opaque.c:
- * offix.c (DndSetData):
- * objects.c (face_boolean_create):
- * objects.c (font_instantiate):
- * objects.c (font_create):
- * objects.c (color_create):
- * objects.c (finalize_font_instance):
- * objects.c (finalize_color_instance):
- * objects.c:
- * objects-x.c (x_font_instance_truename):
- * objects-x.c:
- * objects-x.c (x_initialize_font_instance):
- * objects-x.c (allocate_nearest_color):
- * objects-tty.c (tty_initialize_font_instance):
- * objects-tty.c (tty_initialize_color_instance):
- * objects-msw.c (mswindows_initialize_color_instance):
- * ntproc.c (syms_of_ntproc):
- * ntproc.c (Fwin32_set_process_priority):
- * ntproc.c (sys_spawnve):
- * ntproc.c:
- * ntheap.c (get_data_end):
- * nt.c (period):
- * nt.c:
- * nt.c (stat):
- * nt.c (generate_inode_val):
- * nt.c (sys_rename):
- * nas.c:
- * mule-wnnfns.c (Fwnn_hinsi_number):
- * mule-wnnfns.c (Fwnn_yuragi):
- * mule-wnnfns.c (Fwnn_common_learn):
- * mule-wnnfns.c (Fwnn_suffix_learn):
- * mule-wnnfns.c (Fwnn_prefix_learn):
- * mule-wnnfns.c (Fwnn_okuri_learn):
- * mule-wnnfns.c (Fwnn_complex_conv):
- * mule-wnnfns.c (Fwnn_last_is_first):
- * mule-wnnfns.c (Fwnn_bmodify_dict_add):
- * mule-wnnfns.c (Fwnn_notrans_dict_add):
- * mule-wnnfns.c (Fwnn_fiusr_dict_add):
- * mule-wnnfns.c (Fwnn_fisys_dict_add):
- * mule-wnnfns.c (Fwnn_hinsi_list):
- * mule-wnnfns.c (Fwnn_fuzokugo_set):
- * mule-wnnfns.c (Fwnn_dict_search):
- * mule-wnnfns.c (Fwnn_word_toroku):
- * mule-wnnfns.c (Fwnn_hindo_update):
- * mule-wnnfns.c (Fwnn_bunsetu_henkou):
- * mule-wnnfns.c (Fwnn_kakutei):
- * mule-wnnfns.c (Fwnn_begin_henkan):
- * mule-wnnfns.c (Fwnn_dict_comment):
- * mule-wnnfns.c (Fwnn_dict_add):
- * mule-wnnfns.c (Fwnn_open):
- * mule-mcpath.c (mc_getcwd):
- * mule-coding.c (vars_of_mule_coding):
- * mule-coding.c (convert_to_external_format):
- * mule-coding.c (encoding_marker):
- * mule-coding.c (decoding_marker):
- * mule-coding.c (Fcopy_coding_system):
- * mule-coding.c (Fmake_coding_system):
- * mule-coding.c (Fcoding_system_list):
- * mule-coding.c (Ffind_coding_system):
- * mule-coding.c (symbol_to_eol_type):
- * mule-coding.c:
- * mule-charset.c (complex_vars_of_mule_charset):
- * mule-charset.c (vars_of_mule_charset):
- * mule-charset.c (Fset_charset_ccl_program):
- * mule-charset.c (struct charset_list_closure):
- * mule-charset.c (Ffind_charset):
- * mule-charset.c (make_charset):
- * mule-charset.c (non_ascii_valid_char_p):
- * mule-charset.c:
- * mule-ccl.c (ccl_driver):
- * mule-canna.c (c2mu):
- * mule-canna.c (Fcanna_henkan_begin):
- * mule-canna.c (Fcanna_parse):
- * mule-canna.c (Fcanna_store_yomi):
- * mule-canna.c (Fcanna_touroku_string):
- * mule-canna.c (Fcanna_initialize):
- * minibuf.c:
- * menubar.c (menu_parse_submenu_keywords):
- * menubar-x.c (make_dummy_xbutton_event):
- * menubar-x.c (set_frame_menubar):
- * menubar-x.c (menu_item_descriptor_to_widget_value_1):
- * menubar-x.c:
- * menubar-msw.h:
- * menubar-msw.c (mswindows_popup_menu):
- * menubar-msw.c (mswindows_update_frame_menubars):
- * menubar-msw.c (mswindows_handle_wm_command):
- * menubar-msw.c (unsafe_handle_wm_initmenu_1):
- * menubar-msw.c (unsafe_handle_wm_initmenupopup_1):
- * menubar-msw.c (update_frame_menubar_maybe):
- * menubar-msw.c (populate_or_checksum_helper):
- * menubar-msw.c (empty_menu):
- * menubar-msw.c:
- * md5.c:
- * marker.c (set_marker_internal):
- * marker.c (print_marker):
- * malloc.c:
- * make-src-depend:
- * lstream.c (lisp_buffer_rewinder):
- * lstream.c (mark_lstream):
- * lrecord.h:
- * lrecord.h (struct lrecord_header):
- * lread.c (readevalloop):
- * lread.c (locate_file):
- * lread.c (locate_file_in_directory):
- * lread.c (Flocate_file):
- * lread.c (load_force_doc_string_unwind):
- * lread.c (ebolify_bytecode_constants):
- * lread.c:
- * lisp.h:
- * lisp-union.h:
- * lisp-disunion.h:
- * linuxplay.c (linux_play_data_or_file):
- * linuxplay.c (audio_init):
- * line-number.c:
- * keymap.h:
- * keymap.c (describe_map):
- * keymap.c (describe_map_mapper):
- * keymap.c (Fdescribe_bindings_internal):
- * keymap.c (Fsingle_key_description):
- * keymap.c (map_keymap_sorted):
- * keymap.c (get_relevant_keymaps):
- * keymap.c (Flookup_key):
- * keymap.c (raw_lookup_key_mapper):
- * keymap.c (Fdefine_key):
- * keymap.c (Fevent_matches_key_specifier_p):
- * keymap.c (key_desc_list_to_event):
- * keymap.c (define_key_parser):
- * keymap.c (define_key_check_and_coerce_keysym):
- * keymap.c (keymap_submaps):
- * keymap.c (keymap_store_internal):
- * keymap.c (keymap_delete_inverse_internal):
- * keymap.c (keymap_store_inverse_internal):
- * keymap.c (print_keymap):
- * keymap.c (Lisp_Keymap):
- * keymap.c:
- * intl.c:
- * insdel.c (convert_bufbyte_string_into_emchar_dynarr):
- * insdel.c (make_gap):
- * input-method-xlib.c (get_XIM_input):
- * input-method-xlib.c (XIM_init_frame):
- * imgproc.c:
- * hash.h:
- * hash.c:
- * gui.c:
- * gui-x.c (button_item_to_widget_value):
- * gui-x.c (popup_selection_callback):
- * glyphs.h (struct image_instantiator_methods):
- * glyphs.c (mark_glyph_cachels):
- * glyphs.c (Fglyph_type):
- * glyphs.c (image_instantiate):
- * glyphs.c (image_create):
- * glyphs.c (make_image_instance_1):
- * glyphs.c (finalize_image_instance):
- * glyphs.c:
- * glyphs-x.c (finalize_subwindow):
- * glyphs-x.c (xface_validate):
- * glyphs-x.c (x_locate_pixmap_file):
- * glyphs-x.c (convert_EImage_to_XImage):
- * glyphs-msw.c:
- * glyphs-msw.c (mswindows_resource_instantiate):
- * glyphs-msw.c (xpm_to_eimage):
- * glyphs-msw.c (convert_EImage_to_DIBitmap):
- * glyphs-eimage.c (tiff_instantiate):
- * glyphs-eimage.c (png_instantiate):
- * glyphs-eimage.c (struct png_error_struct):
- * glyphs-eimage.c (gif_memory_storage):
- * glyphs-eimage.c:
- * gifrlib.h:
- * getloadavg.c (getloadavg):
- * getloadavg.c:
- * gdbinit:
- * free-hook.c (log_gcpro):
- * free-hook.c (check_malloc):
- * free-hook.c (check_free):
- * free-hook.c (ROUND_UP_TO_PAGE):
- * free-hook.c:
- * frame.h (struct frame):
- * frame.h:
- * frame.c (change_frame_size_1):
- * frame.c (allocate_frame_core):
- * frame.c:
- * frame-x.c (x_focus_on_frame):
- * frame-x.c (x_init_frame_2):
- * frame-x.c (x_popup_frame):
- * frame-x.c (xemacs_XtPopup):
- * frame-x.c:
- * frame-x.c (Foffix_start_drag_internal):
- * frame-x.c (x_cde_destroy_callback):
- * frame-x.c (x_wm_hack_wm_protocols):
- * frame-tty.c (tty_frame_visible_p):
- * frame-msw.c (mswindows_make_frame_invisible):
- * frame-msw.c (mswindows_after_init_frame):
- * frame-msw.c (mswindows_init_frame_1):
- * fns.c (syms_of_fns):
- * fns.c (Fbase64_decode_string):
- * fns.c (Fnconc):
- * fns.c (Ffillarray):
- * fns.c (Fobject_plist):
- * fns.c (Fget):
- * fns.c (Fcanonicalize_lax_plist):
- * fns.c (Fcanonicalize_plist):
- * fns.c (Fplist_remprop):
- * fns.c (Fplist_get):
- * fns.c (advance_plist_pointers):
- * fns.c (internal_plist_put):
- * fns.c (Fnreverse):
- * fns.c (Fremassq):
- * fns.c (Felt):
- * fns.c (Fsubstring):
- * fns.c (Fbvconcat):
- * fns.c (Flength):
- * fns.c (length_with_bytecode_hack):
- * fns.c (print_bit_vector):
- * fns.c:
- * floatfns.c (Ffloor):
- * floatfns.c:
- * floatfns.c (in_float_error):
- * fileio.c (Ffile_modes):
- * fileio.c (Fexpand_file_name):
- * fileio.c (Fmake_temp_name):
- * fileio.c (Ffile_name_nondirectory):
- * fileio.c (Ffile_name_directory):
- * file-coding.h:
- * file-coding.c (vars_of_mule_coding):
- * file-coding.c (convert_to_external_format):
- * file-coding.c (encoding_marker):
- * file-coding.c (decoding_marker):
- * file-coding.c (Fcopy_coding_system):
- * file-coding.c (Fmake_coding_system):
- * file-coding.c (struct coding_system_list_closure):
- * file-coding.c (Ffind_coding_system):
- * file-coding.c (symbol_to_eol_type):
- * file-coding.c:
- * faces.h (struct face_cachel):
- * faces.c (vars_of_faces):
- * faces.c (face_property_was_changed):
- * faces.c (mark_face_cachels):
- * faces.c (temporary_faces_list):
- * faces.c (struct face_list_closure):
- * faces.c:
- * extents.h (struct extent):
- * extents.c (vars_of_extents):
- * extents.c (struct copy_string_extents_1_arg):
- * extents.c (add_string_extents_mapper):
- * extents.c (Fextent_property):
- * extents.c (Fset_extent_property):
- * extents.c (symbol_to_glyph_layout):
- * extents.c (properties_equal):
- * extents.c (print_extent):
- * extents.c (print_extent_1):
- * extents.c (extent_in_region_p):
- * extents.c (gap_array_make_gap):
- * extents.c:
- * events.h (struct Lisp_Event):
- * events.h:
- * events.c (Fevent_properties):
- * events.c (format_event_object):
- * events.c (Fmake_event):
- * events.c (event_equal):
- * events.c (print_event):
- * events.c (mark_event):
- * event-stream.c ((read-char)
- * event-stream.c (vars_of_event_stream):
- * event-stream.c (syms_of_event_stream):
- * event-stream.c (Fset_recent_keys_ring_size):
- * event-stream.c (Fsit_for):
- * event-stream.c (Fnext_event):
- * event-stream.c (execute_help_form):
- * event-stream.c (maybe_kbd_translate):
- * event-stream.c:
- * event-msw.c (vars_of_event_mswindows):
- * event-msw.c (mswindows_wnd_proc):
- * event-msw.c (mswindows_need_event):
- * event-msw.c (mswindows_drain_windows_queue):
- * event-msw.c (mswindows_pump_outstanding_events):
- * event-msw.c:
- * event-msw.c (slurp_thread):
- * event-msw.c (struct ntpipe_slurp_stream):
- * event-msw.c (HANDLE_TO_USID):
- * event-Xt.c (emacs_Xt_handle_magic_event):
- * event-Xt.c (x_event_to_emacs_event):
- * event-Xt.c (x_reset_modifier_mapping):
- * event-Xt.c (x_reset_key_mapping):
- * event-Xt.c:
- * eval.c (syms_of_eval):
- * eval.c (warn_when_safe):
- * eval.c (warn_when_safe_lispobj):
- * eval.c (Fbacktrace_frame):
- * eval.c (Fbacktrace):
- * eval.c (top_level_set):
- * eval.c (unbind_to_hairy):
- * eval.c (specbind_magic):
- * eval.c (specbind_unwind_wasnt_local):
- * eval.c (call2_trapping_errors):
- * eval.c (call1_trapping_errors):
- * eval.c (catch_them_squirmers_call2):
- * eval.c (call0_trapping_errors):
- * eval.c (run_hook_trapping_errors):
- * eval.c (catch_them_squirmers_eval_in_buffer):
- * eval.c (call4_in_buffer):
- * eval.c (call3_in_buffer):
- * eval.c (call2_in_buffer):
- * eval.c (call1_in_buffer):
- * eval.c (call0_in_buffer):
- * eval.c (run_hook):
- * eval.c (run_hook_with_args_in_buffer):
- * eval.c (Fapply):
- * eval.c (Feval):
- * eval.c (do_autoload):
- * eval.c (un_autoload):
- * eval.c (Fautoload):
- * eval.c (Finteractive_p):
- * eval.c (Fcommand_execute):
- * eval.c (signal_quit):
- * eval.c (call_with_suspended_errors):
- * eval.c (signal_error):
- * eval.c (return_from_signal):
- * eval.c (Fcall_with_condition_handler):
- * eval.c (run_condition_case_handlers):
- * eval.c (condition_case_1):
- * eval.c (Funwind_protect):
- * eval.c (unwind_to_catch):
- * eval.c (internal_catch):
- * eval.c (Fmacroexpand_internal):
- * eval.c (Fuser_variable_p):
- * eval.c (Fdefconst):
- * eval.c (Fdefvar):
- * eval.c (Ffunction):
- * eval.c (signal_call_debugger):
- * eval.c (call_debugger):
- * eval.c:
- * emacs.c (main):
- * emacs.c (sort_args):
- * emacs.c (main_1):
- * elhash.h:
- * elhash.c:
- * editfns.c (Fencode_time):
- * editfns.c (Fdecode_time):
- * editfns.c (Fuser_full_name):
- * editfns.c:
- * editfns.c (save_excursion_restore):
- * ecrt0.c:
- * dynarr.c:
- * doprnt.c (emacs_doprnt_1):
- * doc.c (verify_doc_mapper):
- * doc.c (Fsnarf_documentation):
- * doc.c (Fdocumentation):
- * dll.c:
- * dired.c (user_name_completion):
- * dired.c (Fdirectory_files):
- * dialog-x.c:
- * dialog-msw.c:
- * dgif_lib.c (FreeSavedImages):
- * dgif_lib.c (DGifGetImageDesc):
- * device.h:
- * device.h (struct device):
- * device.c (Fselect_device):
- * device.c (allocate_device):
- * device.c:
- * device-x.c (Fx_keysym_on_keyboard_p):
- * device-x.c (Fx_valid_keysym_name_p):
- * device-x.c (x_IO_error_handler):
- * device-x.c (x_delete_device):
- * device-x.c (x_finish_init_device):
- * device-x.c (x_init_device):
- * device-x.c:
- * device-msw.c (mswindows_init_device):
- * dbxrc:
- * database.c (vars_of_database):
- * database.c (Fput_database):
- * database.c (Fopen_database):
- * database.c (berkdb_remove):
- * database.c (berkdb_put):
- * database.c (Fdatabasep):
- * database.c (print_database):
- * database.c:
- * data.c (vars_of_data):
- * data.c (syms_of_data):
- * data.c (init_errors_once_early):
- * data.c (prune_weak_lists):
- * data.c (finish_marking_weak_lists):
- * data.c (print_weak_list):
- * data.c (Fmod):
- * data.c (Fstring_to_number):
- * data.c (Fnumber_to_string):
- * data.c (Findirect_function):
- * data.c (Fsetcdr):
- * data.c (Ffloatp):
- * data.c (Fsubr_interactive):
- * data.c (Farrayp):
- * data.c (Fkeywordp):
- * data.c (Fnull):
- * data.c:
- * console.h (CONSOLE_NAME):
- * console.h:
- * console.c (vars_of_console):
- * console.c (Fselect_console):
- * console.c:
- * console-x.h (DEVICE_X_COLORMAP):
- * console-x.h (struct x_device):
- * console-x.c (x_device_to_console_connection):
- * console-tty.h (CONSOLE_TTY_FINAL_CURSOR_Y):
- * console-tty.c (tty_init_console):
- * console-tty.c:
- * console-msw.h (struct mswindows_frame):
- * conslots.h:
- * config.h.in:
- * cmds.c (internal_self_insert):
- * cmds.c (Fforward_line):
- * cmds.c (Fforward_char):
- * cmds.c:
- * cmdloop.c:
- * chartab.c (mark_char_table_entry):
- * chartab.c:
- * casefiddle.c (casify_word):
- * callproc.c (child_setup):
- * callproc.c (Fcall_process_internal):
- * callproc.c:
- * callint.c (Fcall_interactively):
- * bytecode.h:
- * bytecode.c (execute_rare_opcode):
- * bytecode.c (execute_optimized_program):
- * bytecode.c:
- * bufslots.h:
- * buffer.h (BUFFER_REALLOC):
- * buffer.h (GET_CHARPTR_INT_DATA_ALLOCA):
- * buffer.h (GET_CHARPTR_EXT_DATA_ALLOCA):
- * buffer.h:
- * buffer.h (MAP_INDIRECT_BUFFERS):
- * buffer.h (CHECK_LIVE_BUFFER):
- * buffer.c (init_initial_directory):
- * buffer.c (complex_vars_of_buffer):
- * buffer.c (vars_of_buffer):
- * buffer.c (finish_init_buffer):
- * buffer.c (Fget_file_buffer):
- * buffer.c (Fbuffer_list):
- * buffer.c (mark_buffer):
- * balloon_help.c (balloon_help_move_to_pointer):
- * balloon_help.c (show_help):
- * balloon_help.c:
- * backtrace.h:
- * alloc.c (garbage_collect_1):
- * alloc.c (sweep_strings):
- * alloc.c (sweep_compiled_functions):
- * alloc.c (sweep_bit_vectors_1):
- * alloc.c (sweep_vectors_1):
- * alloc.c (sweep_lcrecords_1):
- * alloc.c (tick_lcrecord_stats):
- * alloc.c (pure_string_sizeof):
- * alloc.c (mark_conses_in_list):
- * alloc.c (mark_object):
- * alloc.c (report_pure_usage):
- * alloc.c (make_pure_float):
- * alloc.c (make_pure_string):
- * alloc.c (free_managed_lcrecord):
- * alloc.c (mark_string):
- * alloc.c (noseeum_make_marker):
- * alloc.c (allocate_event):
- * alloc.c (Fbit_vector):
- * alloc.c (Fvector):
- * alloc.c (make_float):
- * alloc.c (Fmake_list):
- * alloc.c (Flist):
- * alloc.c (FREE_FIXED_TYPE_WHEN_NOT_IN_GC):
- * alloc.c (PUT_FIXED_TYPE_ON_FREE_LIST):
- * alloc.c (DECLARE_FIXED_TYPE_ALLOC):
- * alloc.c (dbg_constants):
- * alloc.c (gc_record_type_p):
- * alloc.c (free_lcrecord):
- * alloc.c (xmalloc):
- * alloc.c (NOSEEUM_INCREMENT_CONS_COUNTER):
- * abbrev.c:
- * Makefile.in.in (mostlyclean):
- * Makefile.in.in (external_client_xlib_objs_nonshared):
- * Makefile.in.in (temacs_link_args):
- * Makefile.in.in (release):
- * Makefile.in.in (dnd_objs):
- * Makefile.in.in (objs):
- * Makefile.in.in (PROGNAME):
- * EmacsShell.c: cast strings to (XtPointer)
- * EmacsFrame.c: cast strings to (XtPointer)
- - mega patch
- - rewrite basic lisp functions for speed
- - rewrite bytecode interpreter for speed
- - rewrite list looping constructs for speed and safety using
- tortoise/hare.
- - use size_t where appropriate.
- - new hashtable implementation
- - cleanup implementation of opaques
- - opaques can now be purecopy'ed
- - move some cl functionality into C for speed.
- - remove last remaining VMS support
- - spelling fixes
- - improve gdb/dbx debugger support
- - move pure.c back into alloc.c for performance
- - enable report_pure_usage() if --memory-usage-stats
- - remove remnants of Energize support (EMACS_BTL, cadillac...)
- - don't use symbols with leading `_' or embedded `__'
- - globally cleanup duplicated semicolons `;;'
- - I give in on %p vs %lx - we use printf("%lx",(long) p)
- globally.
- - globally replace O_NDELAY with O_NONBLOCK.
- - globally replace CDISABLE with _POSIX_VDISABLE.
- - use O_RDONLY and O_RDWR instead of magic `0' and `2'.
- - define (and maybe use!) STDERR_FILENO and friends.
- - add support for macros defined in C
- - `when', `unless', `not' and `defalias' now defined in C,
- so that they are universally available.
- - rename defvar_mumble to defvar_magic
- - rename RETURN__ to RETURN_SANS_WARNINGS
- - use consistent style of initial caps in error messages
- - implement last, butlast, nbutlast, copy-list in C.
- - provide typedefs for all struct Lisp_foo types
- - Lisp_Objects must be initialized to Qnil rather than 0.
- - make sure XEmacs runs (slowly) with always_gc == 1;
- - fast and safe LOOP_* macros
- - change calls to XSETOBJ to XSETFOO
- - replace calls to XSETINT by make_int()
- - plug up memory leaks
- - use style markobj (foo), not silly ((markobj) (foo))
- - use XFLOAT_DATA (obj) instead of float_data (XFLOAT (obj))
-
-1998-12-02 P. E. Jareth Hein <jareth@camelot.co.jp>
-
- * unexec.c: Changed a #ifndef statement to fix XEmacs on BSDI 3.0
-
-1998-11-28 SL Baur <steve@altair.xemacs.org>
-
- * XEmacs 21.2-beta4 is released.
-
-1998-11-27 SL Baur <steve@altair.xemacs.org>
-
- * mule-charset.c (complex_vars_of_mule_charset): Fix graphic
- property in control-1 charset.
- From Julian Bradfield <jcb@daimi.au.dk>
-
-1998-11-26 Jan Vroonhof <vroonhof@math.ethz.ch>
-
- * gui-x.c (button_item_to_widget_value): Ignore :key-sequence
- keyword.
- Add stub for :label.
-
- * gui.c (gui_item_add_keyval_pair): ditto.
-
- * menubar-x.c (menu_item_descriptor_to_widget_value_1): Ignore
- :key-sequence keyword.
- Add stub for:label.
- Support :active for submenus like the Windows code and FSF Emacs.
-
-1998-11-27 Hrvoje Niksic <hniksic@srce.hr>
-
- * dired.c (make_directory_hash_table): make_string() is OK because
- readdir() Mule-encapsulates.
-
-1998-11-26 Hrvoje Niksic <hniksic@srce.hr>
-
- * fns.c (Fbase64_encode_string): Fix docstring.
- (Fbase64_decode_string): Ditto.
-
-1998-11-26 Hrvoje Niksic <hniksic@srce.hr>
-
- * editfns.c (Ftranslate_region): Use
- convert_bufbyte_string_into_emchar_string().
-
-1998-11-25 Hrvoje Niksic <hniksic@srce.hr>
-
- * editfns.c (Ftranslate_region): Accept vectors and char-tables as
- well as strings.
- (Ftranslate_region): Turn table into an array of Emchars for
- larger regions.
-
-1998-11-25 Hrvoje Niksic <hniksic@srce.hr>
-
- * chartab.c (Freset_char_table): Fix wrong placement of #endif.
-
-1998-11-24 Hrvoje Niksic <hniksic@srce.hr>
-
- * chartab.c (Freset_char_table): Don't blindly fill chartables of
- type `char' with nils.
-
- * chartab.c (canonicalize_char_table_value): Coerce ints to chars
- for tables of type `char'.
-
-1998-11-26 Didier Verna <verna@inf.enst.fr>
-
- * input-method-xlib.c (Initialize_Locale): don't call
- XtSetLanguageProc. We've done the whole work here.
- * input-method-xfs.c (Initialize_Locale): ditto.
- * input-method-motif.c (Initialize_Locale): ditto.
-
-1998-11-26 Didier Verna <verna@inf.enst.fr>
-
- * process-unix.c (unix_create_process): handle properly
- Vfile_name_coding_system for converting the program and directory
- names.
-
-1998-11-27 SL Baur <steve@altair.xemacs.org>
-
- * m/arm.h: New file.
- From James LewisMoss <dres@ioa.com>
-
-1998-11-27 Takeshi Hagiwara <hagiwara@ie.niigata-u.ac.jp>
-
- * m/mips-nec.h:
- Fix the realpath() problem of UnixWare2.1.3.
- Patches for NEC's sysv4.2 machine.
-
-1998-11-25 Hrvoje Niksic <hniksic@srce.hr>
-
- * dired.c (Fdirectory_files): Remove redundant code.
-
-1998-11-25 Hrvoje Niksic <hniksic@srce.hr>
-
- * fns.c (free_malloced_ptr): New function.
- (XMALLOC_OR_ALLOCA): New macro.
- (XMALLOC_UNBIND): Ditto.
- (Fbase64_encode_region): Use malloc() for large blocks; arrange it
- to be freed in case of non-local exit.
- (Fbase64_encode_string): Ditto.
- (Fbase64_decode_region): Ditto.
- (Fbase64_decode_string): Ditto.
- (STORE_BYTE): New macro.
- (base64_decode_1): Use it.
-
-1998-11-25 Hrvoje Niksic <hniksic@srce.hr>
-
- * fns.c (base64_value_to_char): Base64 stuff.
-
-1998-11-24 Hrvoje Niksic <hniksic@srce.hr>
-
- * editfns.c (Fbuffer_substring): New function.
-
- * lisp.h: Declare make_string_from_buffer_no_extents().
-
- * insdel.c (make_string_from_buffer_1): New function.
- (make_string_from_buffer_no_extents): Ditto.
-
-1998-11-15 Michael Sperber [Mr. Preprocessor] <sperber@informatik.uni-tuebingen.de>
-
- * linuxplay.c: Including <fcntl.h> instead of <sys/fcntl.h> makes
- sound work on AIX with OSS installed. Linux should still work.
-
-1998-11-03 Andy Piper <andyp@parallax.co.uk>
-
- * config.h.in: name change for cygwin/version.h
-
- * configure.in: check for cygwin/version.h now.
-
- * cygwin32.h: track CYGWIN_DLL_VERSION_MAJOR ->
- CYGWIN_VERSION_DLL_MAJOR name change in cygwin b20.
- move cygwin32/version.h to cygwin/version.h
-
-1998-11-03 Olivier Galibert <galibert@pobox.com>
-
- * lisp.h (struct Lisp_Bit_Vector): Fix declaration of bits from
- int to long.
-
-1998-10-22 Andy Piper <andyp@parallax.co.uk>
-
- * cygwin32.h: track CYGWIN_DLL_VERSION_MAJOR ->
- CYGWIN_VERSION_DLL_MAJOR name change in cygwin b20.
- enable BROKEN_SIGIO under b20 to make QUIT work.
-
-1998-10-22 Andy Piper <andyp@parallax.co.uk>
-
- * frame-msw.c (mswindows_size_frame_internal): force frame sizing
- to fit within the constraints of the screen size. I.e. make the
- frame small enough to fit and move it if some of it will be
- off-screen.
-
-1998-10-19 Greg Klanderman <greg@alphatech.com>
-
- * dired.c: conditionalize inclusion of user-name-completion
- primitives on non-Windows NT. The needed functions don't exist on NT.
-
-1998-11-24 SL Baur <steve@altair.xemacs.org>
-
- * gifrlib.h: Clean up types for 64 bit compile.
- * dgif_lib.c (DGifInitRead): Ditto.
- (MakeSavedImage): Ditto.
- * emacs.c (decode_path): Ditto.
- From Steve Carney <carney@pa.dec.com>
-
-1998-10-16 William M. Perry <wmperry@aventail.com>
-
- * glyphs-msw.c (bitmap_table): Fixed typo in builtin bitmaps
- (cehckboxes instead of checkboxes).
-
-1998-10-15 SL Baur <steve@altair.xemacs.org>
-
- * XEmacs 21.2-beta3 is released.
-
-1998-10-13 Raymond Toy <toy@rtp.ericsson.se>
-
- * runemacs.c (WinMain): If the basename is "rungnuclient.exe", run
- gnuclient. Otherwise, we run xemacs as we always did. This gets
- rid of the annoying DOS window when running gnuclient.
-
-1998-10-13 Andy Piper <andyp@parallax.co.uk>
-
- * dragdrop.c (vars_of_dragdrop): rename HAVE_MSWINDOWS ->
- HAVE_MS_WINDOWS typo.
-
-1998-10-13 SL Baur <steve@altair.xemacs.org>
-
- * process-unix.c (unix_send_process): Set closed flag on writable
- pipe after SIGPIPE is received and before we call deactivate_process.
-
-1998-10-03 Gunnar Evermann <ge204@eng.cam.ac.uk>
-
- * window.c (Fset_window_start): respect narrowing when
- checking wheter start is at the beginning of a line.
- (Fset_window_buffer): Ditto
- Fixes repeatable crash in VM.
-
-1998-10-09 SL Baur <steve@altair.xemacs.org>
-
- * window.c (specifier_vars_of_window): Set default vertical
- divider width to 1 on ttys.
-
-1998-10-08 Martin Buchholz <martin@xemacs.org>
-
- * alloc.c:
- * unexec.c:
- * malloc.c:
- Add <stddef.h> to get ptrdiff_t declaration
-
-1998-10-07 Jonathan Harris <jhar@tardis.ed.ac.uk>
-
- * scrollbar-msw.c: Use the same vertical scrollbar drag hack as
- is used for Motif or Lucid scrollbars under X.
-
-1998-10-08 Pierre Wendling <pw@ebc.vbe.dec.com>
-
- * m/alpha.h (UNEXEC): quoted to avoid bad expansion when running
- `configure'
-
-1998-10-06 Takeshi Hagiwara <hagiwara@ie.niigata-u.ac.jp>
-
- * frame-x.c (x_delete_frame): Fix an argument of XtDestroyWidget.
-
-1998-10-05 Andy Piper <andyp@parallax.co.uk>
-
- * s/cygwin32.h: more cygwin b20 reorganisation.
-
-1998-10-01 Raymond Toy <toy@rtp.ericsson.se>
-
- * nas.c: Added necessary support functions to be able to handle
- WAVE files in memory, just like the support for SND files in
- memory.
-
-1998-09-30 SL Baur <steve@altair.xemacs.org>
-
- * callproc.c (child_setup): Fix spelling typo.
-
-1998-09-29 SL Baur <steve@altair.xemacs.org>
-
- * XEmacs 21.2-beta2 is released.
-
-1998-09-27 P. E. Jareth Hein <jareth@camelot.co.jp>
-
- * regex.c (re_match_2_internal): Add in code to reset lowest_active_reg
- to prevent memory corruption in the case of jumping out of a series of
- nested match patterns. This is a rather brute force approach, though.
-
-1998-09-02 Andy Piper <andyp@parallax.co.uk>
-
- * config.h.in: ditto.
-
- * s/cygwin32.h: rearrange declarations to cope with cygwin
- b20. Include cygwin32/version.h if it exists.
-
-1998-09-20 Jonathan Harris <jhar@tardis.ed.ac.uk>
-
- * device-msw.c (mswindows_init_device): Call new
- mswindows_enumerate_fonts() function in objects-msw.c instead
- of font_enum_callback_1() to enumerate fonts.
-
- font_enum_callback_1() and _2() moved to objects-msw.c.
-
- * faces.c (complex_vars_of_faces): Make the mswindows default
- face font fully specified and provide some fallbacks.
-
- * objects-msw.c: font_enum_callback_1() and _2() moved here
- from objects-msw.c. Obtain the enumerated font's character
- sets by table lookup instead of using the locale-specific
- string provided by Windows.
-
- New public non-method mswindows_enumerate_fonts() that fills
- in the supplied mswindows device's font list.
-
- mswindows_initialize_font_instance: Use the supplied name
- variable instead of f->name when signalling errors. Match font
- weights and character sets using lookup tables which handle
- spaces instead of by frobbing.
-
-1998-09-20 Jonathan Harris <jhar@tardis.ed.ac.uk>
-
- * process-nt.c: Define an arbitrary limit, FRAGMENT_CODE_SIZE,
- on the size of code fragments passed to run_in_other_process.
-
- run_in_other_process(): Use FRAGMENT_CODE_SIZE to determine
- the amount of memory to allocate in the other process.
-
- Removed sigkill_code_end(), sigint_code_end() and
- sig_enable_code_end() since they are now redundant.
-
- send_signal() and enable_child_signals(): Don't try to work
- out the end of the code fragments passed to
- run_in_other_process()
-
-1998-09-10 Kazuyuki IENAGA <ienaga@jsys.co.jp>
-
- * src/s/freebsd.h: Added __ELF__ and compiler/liker flags for
- FreeBSD-current.
-
- * src/unexelf.c: Partially synched with FSF's 20.3.
-
-1998-09-10 Hrvoje Niksic <hniksic@srce.hr>
-
- * insdel.c (signal_after_change): Map across indirect buffers
- here, and not in the upper-level functions.
- (signal_first_change): Don't check for Armageddon.
- (signal_before_change): Map across indirect buffers here.
- (prepare_to_modify_buffer): ...and here.
-
-1998-09-09 Hrvoje Niksic <hniksic@srce.hr>
-
- * insdel.c (signal_after_change): Add return value.
- (buffer_insert_string_1): Use it.
- (buffer_delete_range): Ditto.
- (buffer_replace_char): Ditto.
- (cancel_multiple_change): Map the indirect buffers.
-
-1998-09-06 Hrvoje Niksic <hniksic@srce.hr>
-
- * insdel.c (init_buffer_text): Remove INDIRECT_P parameter.
- (uninit_buffer_text): Ditto.
-
- * buffer.c (Fmake_indirect_buffer): Implement stricter
- error-checking.
-
-1998-09-04 Hrvoje Niksic <hniksic@srce.hr>
-
- * insdel.c (change_function_restore): Reverse order of
- function-call and assignment.
- (first_change_hook_restore): Ditto.
-
- * extents.c (mark_extent_auxiliary): Mark them.
- (Fset_extent_property): Set them.
- (Fextent_property): Get them.
- (Fextent_properties): Ditto.
- (vars_of_extents): Set their default.
-
- * extents.h (struct extent_auxiliary): Add before_change_functions
- and after_change_functions.
-
- * insdel.c (signal_before_change): Use it.
- (signal_after_change): Ditto.
-
- * extents.c (report_extent_modification): New function.
-
- * insdel.c (signal_before_change): Don't check for Armageddon.
- (signal_after_change): Ditto.
-
-1998-09-11 Gunnar Evermann <Gunnar.Evermann@nats.informatik.uni-hamburg.de>
-
- * redisplay.c (redisplay_window): make sure a new starting point
- is chosen if it somehow got moved from the beginning of the line
- -- this can happen because Fwiden was called recently.
-
- * window.c (Fset_window_start): set start_at_line_beg correctly
- (Fset_window_buffer): Ditto
-
-1998-09-06 Hrvoje Niksic <hniksic@srce.hr>
-
- * insdel.c (init_buffer_text): Remove INDIRECT_P parameter.
- (uninit_buffer_text): Ditto.
-
- * buffer.c (Fmake_indirect_buffer): Implement stricter
- error-checking.
-
-1998-05-14 Jan Vroonhof <vroonhof@math.ethz.ch>
-
- * emacs.c (main_1): Removed references to *vars_of_filelock.
-
- * lisp.h: Added Fsystem_name.
-
- * filelock.c: Replaced by version from FSF 20.2. Now implements
- locking by using symlinks which is NFS safe. However keep the
- GCPRO's in lock_file and the calls to callx_in_buffer like our old
- version (and of course use ansi C, acessor macros, etc).
-
-1998-09-06 Jan Vroonhof <vroonhof@math.ethz.ch>
-
- * process-unix.c (unix_create_process): Reset SIGHUP handler to
- SIG_DFL. We now try to conserve any inherted SIG_IGN settings
- in init_signals_very_early. However these should not be passed
- on to children attached to the new pty.
-
-1998-08-28 Andy Piper <andyp@parallax.co.uk>
-
- * glyphs-eimage.c (png_instantiate_unwind): clean up eimage after use.
-
-1998-09-07 Jonathan Harris <jhar@tardis.ed.ac.uk>
-
- * fileio.c (file-name-directory, file_name_as_directory):
- Don't call CORRECT_DIR_SEPS, even when #defined WINDOWSNT.
-
-1998-09-02 Andy Piper <andyp@parallax.co.uk>
-
- * emacs.c (main_1): init_ralloc() if initialised and we have REL_ALLOC
-
- * ralloc.c: uncomment __morecore.
-
-1998-09-92 Jonathan Harris <jhar@tardis.ed.ac.uk>
-
- * event-msw.c(winsock_writer): Supply a dummy 4th argument to
- WriteFile() to fix a winsock 1.x bug on Win95.
-
-1998-08-28 Hrvoje Niksic <hniksic@srce.hr>
-
- * event-Xt.c (emacs_Xt_mapping_action): Check for device being
- deleted.
- (x_event_to_emacs_event): Ditto.
- (emacs_Xt_handle_focus_event): Ditto.
- (emacs_Xt_handle_magic_event): Ditto.
-
- * console-x.h (struct x_device): New flag being_deleted.
- (DEVICE_X_BEING_DELETED): New macro.
-
- * device-x.c (x_IO_error_handler): Throw to top-level instead of
- returning. Before doing that, set the being_deleted flag on the
- device.
-
-1998-08-27 Hrvoje Niksic <hniksic@srce.hr>
-
- * device-x.c (x-seppuku-on-epipe): Removed.
-
-1998-08-26 Gunnar Evermann <Gunnar.Evermann@nats.informatik.uni-hamburg.de>
-
- * frame-x.c (x_delete_frame): Flush the X output buffer after
- calling XtDestroyWidget to ensure that the windows are really
- killed right now.
-
-1998-08-26 Hrvoje Niksic <hniksic@srce.hr>
-
- * menubar-x.c (my_run_hook): New unused function.
- (pre_activate_callback): Use run_hook for Qactivate_menubar_hook,
- since we ignore the results of the contained functions anyway.
-
-1998-08-26 P. E. Jareth Hein <jareth@camelot.co.jp>
-
- * glyphs-eimage.c (gif_instantiate): Fix a crash in handling
- interlaced GIF files that are smaller than 4 lines high...
-
-1998-08-31 Hrvoje Niksic <hniksic@srce.hr>
-
- * buffer.c (map_over_sharing_buffers): Deleted.
-
- * insdel.c (MAP_INDIRECT_BUFFERS): Move to buffer.h.
-
- * buffer.c (Fkill_buffer): Keep indirect_children updated while
- killing them.
-
-1998-08-31 Hrvoje Niksic <hniksic@srce.hr>
-
- * insdel.c (buffer_insert_string_1): Advance the point bytind in
- all the buffers.
- (buffer_delete_range): Ditto.
-
- * marker.c (init_buffer_markers): Set point-marker to the value of
- point in an indirect buffer.
-
-1998-08-30 Hrvoje Niksic <hniksic@srce.hr>
-
- * undo.c (undo_prelude): Test last-undo-buffer against base
- buffer.
-
- * insdel.c (MAP_INDIRECT_BUFFERS): Use it.
-
- * buffer.h (BUFFER_BASE_BUFFER): New macro.
-
-1998-08-30 Hrvoje Niksic <hniksic@srce.hr>
-
- * insdel.c (init_buffer_text): Initialize it here.
-
- * line-number.c: Address line_number_cache through buffer->text.
-
- * buffer.c (mark_buffer): Mark line number cache.
-
- * bufslots.h (line_number_cache): Move to struct buffer_text.
-
- * insdel.c (buffer_insert_string_1): Propagate signals and changes
- across the children buffers.
- (buffer_delete_range): Ditto.
- (buffer_replace_char): Ditto.
- (gap_left): Ditto.
- (gap_right): Ditto.
-
- * insdel.c (MAP_INDIRECT_BUFFERS): New macro.
-
- * buffer.c (Fmake_indirect_buffer): Uncomment.
-
-1998-08-31 Hrvoje Niksic <hniksic@srce.hr>
-
- * macros.c (Fend_kbd_macro): Remove trailing period from error
- message.
- (Fexecute_kbd_macro): Ditto.
-
-1998-08-21 Greg Klanderman <greg@alphatech.com>
-
- * dired.c (Fuser_name_completion): remove optional 2nd argument.
- (Fuser_name_completion_1): new function to return uniqueness
- indication in addition to the user name completion.
- (user_name_completion): change type of `uniq' argument.
-
-1998-08-19 Michael Sperber [Mr. Preprocessor] <sperber@informatik.uni-tuebingen.de>
-
- * lread.c (vars_of_lread): Removed `source-directory' variable.
-
-1998-08-22 Hrvoje Niksic <hniksic@srce.hr>
-
- * fileio.c (Ffile_readable_p): Apply the DOS/Windows logic to
- Cygwin.
-
-1998-08-19 SL Baur <steve@altair.xemacs.org>
-
- * dired.c (vars_of_dired): Fix misapplied patch.
-
-1998-08-16 Martin Buchholz <martin@xemacs.org>
-
- * fns.c (Fremrassq, remrassq_no_quit):
- A XCAR that should have been an XCDR turned Fremrassq into Fremassq
-
-1998-07-17 Didier Verna <verna@inf.enst.fr>
-
- * redisplay-x.c (x_get_gc): returns a GC with a FillStipple fill
- style as foreground GC for faces that have the `dim' property.
- (x_output_string): when the `dim' face property is set,
- ensure the gray pixmap has been created, and get a proper
- foreground GC to draw the text.
-
-1998-08-09 Jonathan Harris <jhar@tardis.ed.ac.uk>
-
- * event-msw.c (mswindows_wnd_proc): Workaround for a Win95 bug:
- Manually track the state of the left and right Ctrl and Alt
- modifiers.
-
-1998-08-07 Matt Stupple <matts@tibco.com>
-
- * ntproc.c: don't wait on char_consumed at thread entry.
- Additionally, to get the 'process' marked as finished, ensure
- that the CHILD_ACTIVE macro returns false, so before exiting
- close char_avail and set it to NULL, and close other handles
- to reduce handle leak problems.
-
-1998-08-09 Jonathan Harris <jhar@tardis.ed.ac.uk>
-
- * menubar-msw.c (displayable_menu_item): take account of menu
- depth when deciding whether to try to display accelerators.
-
-1998-08-04 Andy Piper <andyp@parallax.co.uk>
-
- * event-msw.c: use MsgWaitForMultipleObjects if there are no
- subprocesses.
-
- * glyphs-msw.c: fix a couple of potential handle leaks.
-
-1998-08-04 P. E. Jareth Hein <jareth@camelot.co.jp>
-
- * dgif_lib.c gif_io.c gifrlib.h: New files to put GIF
- *decoding ONLY* back into the core.
- * glyphs-eimage.c: Change referenced header file for GIF
- reading to point to the incore version.
-
-1998-07-20 Martin Buchholz <martin@xemacs.org>
-
- * casefiddle.c (casify_object):
- Change algorithm from O(N**2) to O(N).
- Code cleanup.
- Doc string cleanup.
-
-1998-07-22 Greg Klanderman <greg@alphatech.com>
-
- * dired.c (file_name_completion_unwind): don't leak the cons.
-
-1998-07-20 Greg Klanderman <greg@alphatech.com>
-
- * dired.c (Fuser_name_completion): new function.
- (Fuser_name_all_completions): new function.
- (user_name_completion): new function.
- (syms_of_dired): 2 new DEFSUBRs.
- (vars_of_dired): initialize user name cache vars.
-
-1998-07-29 P. E. Jareth Hein <jareth@camelot.co.jp>
-
- * glyphs-eimage.c (png_instantiate): Add proper handling for background
- colors taken from the default face. Also correct a thinko in
- transparency (not alpha) handling.
-
-1998-07-23 Martin Buchholz <martin@xemacs.org>
-
- * s/decosf4-0.h: Use a perfectly ordinary link. Nuke BSD crap.
- * unexalpha.c: ANSI C-ize. Clean compiler warnings.
- * lread.c (Fload_internal): Be very careful with printfs of
- size_t's
- * gui-x.c (menu_name_to_accelerator): tolower wants an `int'
- argument.
-
-1998-07-27 Gunnar Evermann <Gunnar.Evermann@nats.informatik.uni-hamburg.de>
-
- * callint.c (Fcall_interactively): GCPRO prompt string before
- passing it to Fread_key_sequence
-
-1998-07-27 SL Baur <steve@altair.xemacs.org>
-
- * keymap.c (vars_of_keymap): Initialize Vkey_translation_map and
- Vvertical_divider_map.
-
- * mule-canna.c (vars_of_mule_canna): Initialize every symbol to
- Qnil or 0, none were initialized prior to this change.
-
- Rename misnamed `V' prefixed integer variables:
- Vcanna_empty_info, Vcanna_through_info, Vcanna_underline,
- Vcanna_inhibit_hankakukana, Vcanna_henkan_length, Vcanna_henkan_revPos,
- Vcanna_henkan_revLen, Vcanna_ichiran_length, Vcanna_ichiran_revPos,
- Vcanna_ichiran_revLen.
-
- Rename misnamed `V' prefixed integer variables and initialize
- properly in the vars_of routine.
- Vcanna_mode_AlphaMode, Vcanna_mode_EmptyMode, Vcanna_mode_KigoMode,
- Vcanna_mode_YomiMode, Vcanna_mode_JishuMode, Vcanna_mode_TankouhoMode,
- Vcanna_mode_IchiranMode, Vcanna_mode_YesNoMode, Vcanna_mode_OnOffMode,
- Vcanna_mode_AdjustBunsetsuMode, Vcanna_mode_ChikujiYomiMode,
- Vcanna_mode_ChikujiTanMode, Vcanna_mode_HenkanMode,
- Vcanna_mode_HenkanNyuryokuMode, Vcanna_mode_ZenHiraHenkanMode,
- Vcanna_mode_HanHiraHenkanMode, Vcanna_mode_ZenKataHenkanMode,
- Vcanna_mode_HanKataHenkanMode, Vcanna_mode_HanKataHenkanMode,
- Vcanna_mode_ZenAlphaHenkanMode, Vcanna_mode_HanAlphaHenkanMode,
- Vcanna_mode_ZenHiraKakuteiMode, Vcanna_mode_HanHiraKakuteiMode,
- Vcanna_mode_ZenKataKakuteiMode, Vcanna_mode_HanKataKakuteiMode,
- Vcanna_mode_ZenAlphaKakuteiMode, Vcanna_mode_HanAlphaKakuteiMode,
- Vcanna_mode_HexMode, Vcanna_mode_BushuMode, Vcanna_mode_ExtendMode,
- Vcanna_mode_RussianMode, Vcanna_mode_GreekMode, Vcanna_mode_LineMode,
- Vcanna_mode_ChangingServerMode, Vcanna_mode_HenkanMethodMode,
- Vcanna_mode_DeleteDicMode, Vcanna_mode_TourokuMode,
- Vcanna_mode_TourokuEmptyMode, Vcanna_mode_TourokuHinshiMode,
- Vcanna_mode_TourokuDicMode, Vcanna_mode_QuotedInsertMode,
- Vcanna_mode_BubunMuhenkanMode, Vcanna_mode_MountDicMode,
- Vcanna_fn_SelfInsert, Vcanna_fn_FunctionalInsert,
- Vcanna_fn_QuotedInsert, Vcanna_fn_JapaneseMode, Vcanna_fn_AlphaMode,
- Vcanna_fn_HenkanNyuryokuMode, Vcanna_fn_Forward, Vcanna_fn_Backward,
- Vcanna_fn_Next, Vcanna_fn_Prev, Vcanna_fn_BeginningOfLine,
- Vcanna_fn_EndOfLine, Vcanna_fn_DeleteNext, Vcanna_fn_DeletePrevious,
- Vcanna_fn_KillToEndOfLine, Vcanna_fn_Henkan, Vcanna_fn_Kakutei,
- Vcanna_fn_Extend, Vcanna_fn_Shrink, Vcanna_fn_AdjustBunsetsu,
- Vcanna_fn_Quit, Vcanna_fn_ConvertAsHex, Vcanna_fn_ConvertAsBushu,
- Vcanna_fn_KouhoIchiran, Vcanna_fn_BubunMuhenkan, Vcanna_fn_Zenkaku,
- Vcanna_fn_Hankaku, Vcanna_fn_ExtendMode, Vcanna_fn_ToUpper,
- Vcanna_fn_Capitalize, Vcanna_fn_ToLower, Vcanna_fn_Hiragana,
- Vcanna_fn_Katakana, Vcanna_fn_Romaji, Vcanna_fn_BaseHiragana,
- Vcanna_fn_BaseKatakana, Vcanna_fn_BaseEisu, Vcanna_fn_BaseZenkaku,
- Vcanna_fn_BaseHankaku, Vcanna_fn_BaseKana, Vcanna_fn_BaseKakutei,
- Vcanna_fn_BaseHenkan, Vcanna_fn_BaseHiraKataToggle,
- Vcanna_fn_BaseZenHanToggle, Vcanna_fn_BaseKanaEisuToggle,
- Vcanna_fn_BaseKakuteiHenkanToggle, Vcanna_fn_BaseRotateForward,
- Vcanna_fn_BaseRotateBackward, Vcanna_fn_Touroku, Vcanna_fn_HexMode,
- Vcanna_fn_BushuMode, Vcanna_fn_KigouMode, Vcanna_fn_Mark,
- Vcanna_fn_TemporalMode, Vcanna_key_Nfer, Vcanna_key_Xfer,
- Vcanna_key_Up, Vcanna_key_Left, Vcanna_key_Right, Vcanna_key_Down,
- Vcanna_key_Insert, Vcanna_key_Rollup, Vcanna_key_Rolldown,
- Vcanna_key_Home, Vcanna_key_Help, Vcanna_key_KP_Key,
- Vcanna_key_Shift_Nfer, Vcanna_key_Shift_Xfer, Vcanna_key_Shift_Up,
- Vcanna_key_Shift_Left, Vcanna_key_Shift_Right, Vcanna_key_Shift_Down,
- Vcanna_key_Cntrl_Nfer, Vcanna_key_Cntrl_Xfer, Vcanna_key_Cntrl_Up,
- Vcanna_key_Cntrl_Left, Vcanna_key_Cntrl_Right, Vcanna_key_Cntrl_Down
-
-1998-07-16 Jan Vroonhof <vroonhof@math.ethz.ch>
-
- * event-Xt.c (x_to_emacs_keysym): Return nil for modifier keysyms.
- (x_event_to_emacs_event): Let x_to_emacs_keysym check for modifier
- keys thus no longer considering all keysyms on a key.
-
1998-07-19 SL Baur <steve@altair.xemacs.org>
* XEmacs 21.2-beta1 is released.
* eval.c (run_hook_with_args_in_buffer): Check
default (non-buffer-local) value of hook for
- nil before treating it as a function. Don't initialize
+ nil before treating it as a function. Don't initialize
the `globals' variable twice.
1998-06-24 Jonathan Harris <jhar@tardis.ed.ac.uk>
* eval.c (run_hook_with_args_in_buffer): Don't treat
the default value of a buffer local hook as a list of
- hooks unless it is both a cons and the car of that cons
+ hooks unless it is both a cons and the car of that cons
is not Qlambda.
1998-06-29 SL Baur <steve@altair.xemacs.org>
* winslots.h: Rename.
* window.c (specifier_vars_of_window): Renamed
- vertical-divider-draggable-p to vertical-divider-always-visible-p,
+ vertical-divider-draggable-p to vertical-divider-always-visible-p,
as suggested by Ben Wing.
(specifier_vars_of_window): Fix docstrings.
Set last_known_column_point to the buffer position for
which the column was requested, not buffer's point.
- * redisplay.c (decode_mode_spec): for current-column, show
+ * redisplay.c (decode_mode_spec): for current-column, show
window's point's column, not buffer's point's column.
1998-06-23 Andy Piper <andyp@parallax.co.uk>
mswindows_size_frame_internal function and size frame if frame
parameters not just if init is finished - WM_SIZE happens too
early for some specs. (mswindows_size_frame_internal): new
- function abstracted from mswindows_set_frame_properties.
+ function abstracted from mswindows_set_frame_properties.
(Vmswindows_use_system_frame_size_defaults):
new variable controls whether to allow the system to pick frame
size defaults, defaults to nil.
1998-06-05 Hrvoje Niksic <hniksic@srce.hr>
- * eldap.c (Fldap_search_internal): Use build_ext_string instead of
+ * eldap.c (Fldap_search_internal): Use build_ext_string instead of
build_string to avoid crashes under Mule.
1998-06-13 Andy Piper <andyp@parallax.co.uk>
* glyphs-msw.c (read_bitmap_data) (NextInt)
(read_bitmap_data_from_file): new functions copied from Xmu
- sources.
+ sources.
(xbm_create_bitmap_from_data) from Ben <ben@666.com> convert
inline data to an mswindows bitmap.
(init_image_instance_from_xbm_inline) (xbm_instantiate_1)
Added prototype for mswindows_enqueue_misc_user_event().
* menubar-msw.c (mswindows_handle_wm_command): Use
- mswindows_enqueue_misc_user_event().
+ mswindows_enqueue_misc_user_event().
* toolbar-msw.c (mswindows_handle_toolbar_wm_command): Ditto.
1998-05-29 Greg Klanderman <greg@alphatech.com>
* window.c (Fwindow_displayed_text_pixel_height): was relying on
- incorrect semantics of vmotion_pixels which has been fixed. don't
+ incorrect semantics of vmotion_pixels which has been fixed. don't
use it anymore as it can't easily be used.
* indent.c (vmotion_pixels): fix off by one bug moving up. also
- the motion was reported incorrectly if you tried to go past end of
+ the motion was reported incorrectly if you tried to go past end of
buffer.
1998-05-30 Kirill M. Katsnelson <kkm@kis.ru>
1998-05-28 Martin Buchholz <martin@xemacs.org>
- * alloc.c (dbg_constants):
+ * alloc.c (dbg_constants):
* dbxrc:
* gdbinit:
Remove toolbar_data debugging code, since that lrecord has
- also been removed.
+ also been removed.
Wed May 27, 1998 Darryl Okahata <darrylo@sr.hp.com>
* fileio.c: replaced egetenv("HOME") with calls to the new
get_home_directory().
- * lisp.h: Added function prototypes for uncache_home_directory()
+ * lisp.h: Added function prototypes for uncache_home_directory()
and get_home_directory(), along with lisp prototypes for
Fuser_home_directory() and friends.
* event-msw.c (mswindows_wnd_proc, WM_KEYDOWN): Unconditionally
remove MOD_SHIFT from ASCII characters.
- (mswindows_wnd_proc, WM_KEYDOWN): Do not activate the menubar when
+ (mswindows_wnd_proc, WM_KEYDOWN): Do not activate the menubar when
F10 is pressed.
1998-05-24 Oliver Graf <ograf@fga.de>
(syms_of_indent): DEFSUBR.
* lisp.h: declaration for vmotion_pixels().
- * indent.c (Fvertical_motion): Add optional third argument PIXELS,
+ * indent.c (Fvertical_motion): Add optional third argument PIXELS,
to request returning motion in pixels.
(Fvertical_motion_pixels): Remove, functionality merged into
- Fvertical_motion.
+ Fvertical_motion.
* window.c (window_scroll): call Fvertical_motion with 3 arguments.
(Fmove_to_window_line): ditto.
* lisp.h: Change declaration for Fvertical_motion.
Tooltalk_Message_plist_str and Tooltalk_Pattern_plist_str
1998-05-27 Andy Piper <andyp@parallax.co.uk>
-
+
* faces.c: create a new 3d_object_face, make modeline and
vertical_divider faces fallback to this rather than the default.
* This patch is to fix compilation warnings under Windows.
* s/windowsnt.h: Encapsulate getpid with sys_getpid.
- Added prototypes for FSF inherited functions, with which XEmacs is
+ Added prototypes for FSF inherited functions, with which XEmacs is
sprinkled thoroughly.
- Removed some #if 0 code. Bracketed some more definitions, probably
+ Removed some #if 0 code. Bracketed some more definitions, probably
related to Visual C versions prior to 4 (we do not support them).
* sysfloat.h (logb): Finally, get logb() prototyped.
vars_of_dired_mswindows and init_ntproc (Grrr).
* realpath.c: Added Windows specific include files.
- (xrealpath): Conditionalized declaration of some auto variables on
+ (xrealpath): Conditionalized declaration of some auto variables on
S_IFLNK, to avoid warnings.
- * ntproc.c: Disabled some compiler warnings. This file is going to
+ * ntproc.c: Disabled some compiler warnings. This file is going to
die, so I have not cleaned it up much.
(set_process_dir): Const parameter.
(Fwin32_short_file_name): Down CHECK_* macros to one argument.
* symsinit.h: Prototyped the above functions.
- * dialog-x.c (x_popup_dialog_box): Moved dialog descriptor consistency
+ * dialog-x.c (x_popup_dialog_box): Moved dialog descriptor consistency
checks to dialog.c...
* dialog.c (Fpopup_dialog_box): ...right here. Added more checks: a
* EmacsFrame.c (Xt_StringToScrollBarPlacement): Added support for
{top,bottom}-{left,right} values in addition to
- {top,bottom}_{left,right}.
+ {top,bottom}_{left,right}.
1998-05-18 Hrvoje Niksic <hniksic@srce.hr>
1998-05-19 Martin Buchholz <martin@xemacs.org>
- * unexhp9k800.c:
- * sound.c (vars_of_sound):
- * sysdep.c (reset_sigio_on_device):
- * window.c (window_bottom_gutter_height):
+ * unexhp9k800.c:
+ * sound.c (vars_of_sound):
+ * sysdep.c (reset_sigio_on_device):
+ * window.c (window_bottom_gutter_height):
unexhp9k800.c:258: warning: implicit declaration of function
`calculate_checksum'
sound.c:604: warning: implicit declaration of function `vars_of_hpplay'
* frame-x.c (x_update_frame_external_traits): Start preprocessor
directives in column 1.
- * search.c (skip_chars): Avoid using xzero with arrays, since some
+ * search.c (skip_chars): Avoid using xzero with arrays, since some
compilers get confused by the construct &array.
1998-05-18 Kirill M. Katsnelson <kkm@kis.ru>
1998-05-18 Kirill M. Katsnelson <kkm@kis.ru>
* objects-msw.c (mswindows_initialize_font_instance): Use ANSI
- charset when creating font.
+ charset when creating font.
(mswindows_initialize_color_instance): Do not create brush along
with a color.
(mswindows_finalize_color_instance): Do not delete it then.
(compute_frame_toolbars_data): Removed unused second parameter;
Adjusted callers of this static function throughout the file.
(init_frame_toolbars): Initialize current_toolbar_size.
- (update_frame_toolbars): Use DEVICE_SUPPORTS_TOOLBARS_P instead of
+ (update_frame_toolbars): Use DEVICE_SUPPORTS_TOOLBARS_P instead of
what is its current expansion, for clarity.
(init_frame_toolbars): Ditto.
(init_device_toolbars): Ditto.
* emacs.c (main_1): Call syms_of_process_nt()
- * process-nt.c: Quote process arguments by a call to Lisp function
+ * process-nt.c: Quote process arguments by a call to Lisp function
`nt-quote-process-args'.
(syms_of_process_nt): New function.
(nt_send_process): Flush data stream after each write, to avoid
1998-05-17 Michael Sperber [Mr. Preprocessor] <sperber@informatik.uni-tuebingen.de>
- * s/aix4-2.h (ALIGN_DATA_RELOC): Undefined to support new unexaix.c.
+ * s/aix4-2.h (ALIGN_DATA_RELOC): Undefined to support new unexaix.c.
* s/aix3-1.h (ALIGN_DATA_RELOC): Defined to support new unexaix.c.
* bufslots.h: Removed buffer_file_type slot.
- * buffer.c (complex_vars_of_buffer): Removed buffer_file_type from
+ * buffer.c (complex_vars_of_buffer): Removed buffer_file_type from
buffer local flags.
(complex_vars_of_buffer): Removed buffer-file-type variable and
its default reference.
(x_divider_width): ditto.
* window.c (specifier_vars_of_window): new specifiers:
- vertical-divier -line-width and -spacing.
+ vertical-divier -line-width and -spacing.
(vertical_divider_global_width_changed): formerly known as
- vertical_divider_shadow_thickness_changed.
+ vertical_divider_shadow_thickness_changed.
* winslots.h: new slots: vertical_specifier _line_width and
_spacing. Plus corrected a comment typo.
(console_type_create_stream): And declaration for it.
* redisplay.c (pixel_to_glyph_translation): Use
- window_divider_width() instead of divider_width redisplay method.
+ window_divider_width() instead of divider_width redisplay method.
(pixel_to_glyph_translation): Fix top divider edge calculation
when scrollbar is on top.
(specifier_vars_of_window): For vertical-divider-{spacing,line-width}
specifiers, set fallback values differently on TTYs, and document
the behavior of these on TTYs in the docstrings.
-
+
* scrollbar.c (update_scrollbar_instance): Use
window_divider_width() instead of divider_width redisplay method.
* emacs.c (main_1): Call console_type_create_dialog_x().
- * dialog-x.c (x_popup_dialog_box): Old Fpopup_dialog_box converted
+ * dialog-x.c (x_popup_dialog_box): Old Fpopup_dialog_box converted
into this device method.
(console_type_create_dialog_x): New function.
(syms_of_dialog): Defsubr it.
* console.h (struct console_methods): Declared
- popup_dialog_box_method().
+ popup_dialog_box_method().
* symsinit.h: Defined console_type_create_dialog_{x,mswindows}
** Renamed window-divider-map => vertical-divider-map
and event-over-divider-p => event-over-vertical-divider-p,
in the following files/functions:
- * events.h:
- * events.c (Fevent_over_divider_p):
- * keymap.c (get_relevant_keymaps):
- (vars_of_keymap):
+ * events.h:
+ * events.c (Fevent_over_divider_p):
+ * keymap.c (get_relevant_keymaps):
+ (vars_of_keymap):
* redisplay.h (OVER_V_DIVIDER): Renamed so from OVER_DIVIDER.
* window.h: Prototype invalidate_vertical_divider_cache_in_window.
(struct window): Added need_vertical_divider_p and
- need_vertical_divider_valid_p.
+ need_vertical_divider_valid_p.
* winslots.h: Added vertical_divider_draggable_p slot.
thickness is negative.
* console-stream.c (stream_divider_width): pass a struct window *
- argument.
+ argument.
* redisplay-tty.c (tty_divider_width): ditto.
* redisplay.c (generate_modeline): ittod.
* scrollbar.c (update_scrollbar_instance): ttido.
-
- * redisplay-msw.c (mswindows_divider_width): ottid.
+
+ * redisplay-msw.c (mswindows_divider_width): ottid.
WARNING: this enables to compile, but the feature is not functional.
* window.h (struct window): new field
- vertical_divider_shadow_thickness.
+ vertical_divider_shadow_thickness.
* window.c (specifier_vars_of_window): new specifier
vertical-divider-shadow-thickness.
1998-05-10 Andy Piper <andyp@parallax.co.uk>
* redisplay-msw.c (mswindows_output_dibitmap_region): make sure
- multiple bitmaps are output vertically as well as horizontally.
+ multiple bitmaps are output vertically as well as horizontally.
* (mswindows_output_dibitmap): don't cope with bitmap boundaries
crossing lines this is handled by
mswindows_output_dibitmap_region.
* inline.c: Include eldap.h
- * menubar-x.c (x_update_frame_menubar_internal):
+ * menubar-x.c (x_update_frame_menubar_internal):
Remove: unused variable `container'
1998-05-11 Martin Buchholz <martin@xemacs.org>
* s/aix4.h: Allow AIX 4.3 XEmacs to compile cleanly.
Unfortunately, the resulting temacs still cannot dump.
- * symbols.c (symbol_is_constant):
- (verify_ok_for_buffer_local):
+ * symbols.c (symbol_is_constant):
+ (verify_ok_for_buffer_local):
-Wswitch Warning suppression - add default case to switches.
* redisplay.c (decode_mode_spec): Remove unused variables,
1998-05-12 Didier Verna <verna@inf.enst.fr>
* redisplay.c: removed the scrolling modeline code that didn't
- make it for 21.0. To be continued ...
+ make it for 21.0. To be continued ...
1998-05-13 Michael Sperber [Mr. Preprocessor] <sperber@informatik.uni-tuebingen.de>
(mswindows_output_vertical_divider): Always output the divider on
the right side of a window, down to bottom.
- * keymap.c (get_relevant_keymaps): Route mouse button events which
+ * keymap.c (get_relevant_keymaps): Route mouse button events which
happened over a window divider through window-divider-map.
(Fkey_binding): Documented that in the docstring.
Defined the variable Vwindow_divider_map.
(metrics); Changed parameters order and added DEFAULT parameter;
Unabbreviated some metric constants; Fixed and untabified doc string.
(Fdevice_system_metrics): Added. Returns a plist of all provided
- metrics.
+ metrics.
* device-msw.c (mswindows_device_system_metrics): Renamed
device_metrics enum constants.
It is an order of magnitude faster than the proper abbrev_match(),
but then again, vi is an order of magnitude faster than Emacs.
- This speed difference should be unnoticeable, though. I have tested
+ This speed difference should be unnoticable, though. I have tested
the degenerated cases of thousands of abbrevs being defined, and
abbrev_match() was still fast enough for normal operation. */
static struct Lisp_Symbol *
--- /dev/null
+/* This file is part of XEmacs.
+
+XEmacs is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+XEmacs is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with XEmacs; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/* Synched up with: FSF 19.30. */
+
+/* Authorship:
+
+ FSF: Original version; a long time ago.
+ No changes for XEmacs.
+ */
+
+#define ACL$K_LENGTH 12
+#define ACL$C_LENGTH 12
+#define ACL$C_FILE 1
+#define ACL$C_DEVICE 2
+#define ACL$C_JOBCTL_QUEUE 3
+#define ACL$C_COMMON_EF_CLUSTER 4
+#define ACL$C_LOGICAL_NAME_TABLE 5
+#define ACL$C_PROCESS 6
+#define ACL$C_GROUP_GLOBAL_SECTION 7
+#define ACL$C_SYSTEM_GLOBAL_SECTION 8
+#define ACL$C_ADDACLENT 1
+#define ACL$C_DELACLENT 2
+#define ACL$C_MODACLENT 3
+#define ACL$C_FNDACLENT 4
+#define ACL$C_FNDACETYP 5
+#define ACL$C_DELETEACL 6
+#define ACL$C_READACL 7
+#define ACL$C_ACLLENGTH 8
+#define ACL$C_READACE 9
+#define ACL$C_RLOCK_ACL 10
+#define ACL$C_WLOCK_ACL 11
+#define ACL$C_UNLOCK_ACL 12
+#define ACL$S_ADDACLENT 255
+#define ACL$S_DELACLENT 255
+#define ACL$S_MODACLENT 255
+#define ACL$S_FNDACLENT 255
+#define ACL$S_FNDACETYP 255
+#define ACL$S_DELETEACL 255
+#define ACL$S_READACL 512
+#define ACL$S_ACLLENGTH 4
+#define ACL$S_READACE 255
+#define ACL$S_RLOCK_ACL 4
+#define ACL$S_WLOCK_ACL 4
+#define ACL$S_UNLOCK_ACL 4
+#define ACL$S_ACLDEF 16
+#define ACL$L_FLINK 0
+#define ACL$L_BLINK 4
+#define ACL$W_SIZE 8
+#define ACL$B_TYPE 10
+#define ACL$L_LIST 12
Added lcrecord lists for 19.14.
slb: Lots of work on the purification and dump time code.
Synched Doug Lea malloc support from Emacs 20.2.
- og: Killed the purespace.
*/
#include <config.h>
#include "extents.h"
#include "frame.h"
#include "glyphs.h"
-#include "opaque.h"
#include "redisplay.h"
#include "specifier.h"
#include "sysfile.h"
EXFUN (Fgarbage_collect, 0);
-/* Return the true size of a struct with a variable-length array field. */
-#define STRETCHY_STRUCT_SIZEOF(stretchy_struct_type, \
- stretchy_array_field, \
- stretchy_array_length) \
- (offsetof (stretchy_struct_type, stretchy_array_field) + \
- (offsetof (stretchy_struct_type, stretchy_array_field[1]) - \
- offsetof (stretchy_struct_type, stretchy_array_field[0])) * \
- (stretchy_array_length))
+/* #define GDB_SUCKS */
#if 0 /* this is _way_ too slow to be part of the standard debug options */
#if defined(DEBUG_XEMACS) && defined(MULE)
#endif
#endif
+/* Define this to see where all that space is going... */
+/* But the length of the printout is obnoxious, so limit it to testers */
+/* If somebody wants to see this they can ask for it.
+#ifdef DEBUG_XEMACS
+#define PURESTAT
+#endif
+*/
+
/* Define this to use malloc/free with no freelist for all datatypes,
the hope being that some debugging tools may help detect
freed memory references */
#define ALLOC_NO_POOLS
#endif
+#include "puresize.h"
+
#ifdef DEBUG_XEMACS
-static int debug_allocation;
-static int debug_allocation_backtrace_length;
+int debug_allocation;
+
+int debug_allocation_backtrace_length;
#endif
/* Number of bytes of consing done since the last gc */
EMACS_INT consing_since_gc;
+#ifdef EMACS_BTL
+extern void cadillac_record_backtrace ();
+#define INCREMENT_CONS_COUNTER_1(size) \
+ do { \
+ EMACS_INT __sz__ = ((EMACS_INT) (size)); \
+ consing_since_gc += __sz__; \
+ cadillac_record_backtrace (2, __sz__); \
+ } while (0)
+#else
#define INCREMENT_CONS_COUNTER_1(size) (consing_since_gc += (size))
+#endif /* EMACS_BTL */
#define debug_allocation_backtrace() \
do { \
INCREMENT_CONS_COUNTER_1 (size)
#endif
-#define DECREMENT_CONS_COUNTER(size) do { \
- consing_since_gc -= (size); \
- if (consing_since_gc < 0) \
- consing_since_gc = 0; \
-} while (0)
+#define DECREMENT_CONS_COUNTER(size) \
+ do { \
+ EMACS_INT __sz__ = ((EMACS_INT) (size)); \
+ if (consing_since_gc >= __sz__) \
+ consing_since_gc -= __sz__; \
+ else \
+ consing_since_gc = 0; \
+ } while (0)
/* Number of bytes of consing since gc before another gc should be done. */
EMACS_INT gc_cons_threshold;
#endif /* VIRT_ADDR_VARIES */
EMACS_INT malloc_sbrk_unused;
-/* Non-zero means we're in the process of doing the dump */
+/* Non-zero means defun should do purecopy on the function definition */
int purify_flag;
+#ifdef HEAP_IN_DATA
+extern void sheap_adjust_h();
+#endif
+
+#define PUREBEG ((char *) pure)
+
+#if 0 /* This is breathing_space in XEmacs */
+/* Points to memory space allocated as "spare",
+ to be freed if we run out of memory. */
+static char *spare_memory;
+
+/* Amount of spare memory to keep in reserve. */
+#define SPARE_MEMORY (1 << 14)
+#endif
+
+/* Index in pure at which next pure object will be allocated. */
+static size_t pure_bytes_used;
+
+#define PURIFIED(ptr) \
+((char *) (ptr) >= PUREBEG && \
+ (char *) (ptr) < PUREBEG + get_PURESIZE())
+
+/* Non-zero if pure_bytes_used > get_PURESIZE(); accounts for excess purespace needs. */
+static size_t pure_lossage;
+
#ifdef ERROR_CHECK_TYPECHECK
Error_behavior ERROR_ME, ERROR_ME_NOT, ERROR_ME_WARN;
#endif
int
-c_readonly (Lisp_Object obj)
+purified (Lisp_Object obj)
{
- return POINTER_TYPE_P (XGCTYPE (obj)) && C_READONLY (obj);
+ return POINTER_TYPE_P (XGCTYPE (obj)) && PURIFIED (XPNTR (obj));
}
-int
-lisp_readonly (Lisp_Object obj)
+size_t
+purespace_usage (void)
+{
+ return pure_bytes_used;
+}
+
+static int
+check_purespace (size_t size)
+{
+ if (pure_lossage)
+ {
+ pure_lossage += size;
+ return 0;
+ }
+ else if (pure_bytes_used + size > get_PURESIZE())
+ {
+ /* This can cause recursive bad behavior, we'll yell at the end */
+ /* when we're done. */
+ /* message ("\nERROR: Pure Lisp storage exhausted!\n"); */
+ pure_lossage = size;
+ return 0;
+ }
+ else
+ return 1;
+}
+
+
+\f
+#ifndef PURESTAT
+
+#define bump_purestat(p,b) DO_NOTHING
+
+#else /* PURESTAT */
+
+static int purecopying_for_bytecode;
+
+static size_t pure_sizeof (Lisp_Object /*, int recurse */);
+
+/* Keep statistics on how much of what is in purespace */
+static struct purestat
+{
+ int nobjects;
+ int nbytes;
+ CONST char *name;
+}
+ purestat_cons = {0, 0, "cons cells"},
+ purestat_float = {0, 0, "float objects"},
+ purestat_string_pname = {0, 0, "symbol-name strings"},
+ purestat_bytecode = {0, 0, "compiled-function objects"},
+ purestat_string_bytecodes = {0, 0, "byte-code strings"},
+ purestat_vector_bytecode_constants = {0, 0, "byte-constant vectors"},
+ purestat_string_interactive = {0, 0, "interactive strings"},
+#ifdef I18N3
+ purestat_string_domain = {0, 0, "domain strings"},
+#endif
+ purestat_string_documentation = {0, 0, "documentation strings"},
+ purestat_string_other_function = {0, 0, "other function strings"},
+ purestat_vector_other = {0, 0, "other vectors"},
+ purestat_string_other = {0, 0, "other strings"},
+ purestat_string_all = {0, 0, "all strings"},
+ purestat_vector_all = {0, 0, "all vectors"};
+
+static struct purestat *purestats[] =
+{
+ &purestat_cons,
+ &purestat_float,
+ &purestat_string_pname,
+ &purestat_bytecode,
+ &purestat_string_bytecodes,
+ &purestat_vector_bytecode_constants,
+ &purestat_string_interactive,
+#ifdef I18N3
+ &purestat_string_domain,
+#endif
+ &purestat_string_documentation,
+ &purestat_string_other_function,
+ &purestat_vector_other,
+ &purestat_string_other,
+ 0,
+ &purestat_string_all,
+ &purestat_vector_all
+};
+
+static void
+bump_purestat (struct purestat *purestat, size_t nbytes)
{
- return POINTER_TYPE_P (XGCTYPE (obj)) && LISP_READONLY (obj);
+ if (pure_lossage) return;
+ purestat->nobjects += 1;
+ purestat->nbytes += nbytes;
}
+#endif /* PURESTAT */
\f
/* Maximum amount of C stack to save when a GC happens. */
#ifndef MAX_SAVE_STACK
-#define MAX_SAVE_STACK 0 /* 16000 */
+#define MAX_SAVE_STACK 16000
#endif
/* Non-zero means ignore malloc warnings. Set during initialization. */
void *
xmalloc (size_t size)
{
- void *val = malloc (size);
+ void *val = (void *) malloc (size);
if (!val && (size != 0)) memory_full ();
return val;
}
-#ifdef xcalloc
-#undef xcalloc
-#endif
-
-static void *
-xcalloc (size_t nelem, size_t elsize)
-{
- void *val = calloc (nelem, elsize);
-
- if (!val && (nelem != 0)) memory_full ();
- return val;
-}
-
void *
xmalloc_and_zero (size_t size)
{
- return xcalloc (size, sizeof (char));
+ void *val = xmalloc (size);
+ memset (val, 0, size);
+ return val;
}
#ifdef xrealloc
{
/* We must call malloc explicitly when BLOCK is 0, since some
reallocs don't do this. */
- void *val = block ? realloc (block, size) : malloc (size);
+ void *val = (void *) (block ? realloc (block, size) : malloc (size));
if (!val && (size != 0)) memory_full ();
return val;
allocate_lisp_storage (size_t size)
{
void *p = xmalloc (size);
+#ifndef USE_MINIMAL_TAGBITS
+ char *lim = ((char *) p) + size;
+ Lisp_Object val;
+
+ XSETOBJ (val, Lisp_Type_Record, lim);
+ if ((char *) XPNTR (val) != lim)
+ {
+ xfree (p);
+ memory_full ();
+ }
+#endif /* ! USE_MINIMAL_TAGBITS */
return p;
}
{
struct lcrecord_header *lcheader;
-#ifdef ERROR_CHECK_GC
+ if (size <= 0) abort ();
if (implementation->static_size == 0)
- assert (implementation->size_in_bytes_method);
- else
- assert (implementation->static_size == size);
-#endif
+ {
+ if (!implementation->size_in_bytes_method)
+ abort ();
+ }
+ else if (implementation->static_size != size)
+ abort ();
lcheader = (struct lcrecord_header *) allocate_lisp_storage (size);
- set_lheader_implementation (&(lcheader->lheader), implementation);
+ set_lheader_implementation(&(lcheader->lheader), implementation);
lcheader->next = all_lcrecords;
#if 1 /* mly prefers to see small ID numbers */
lcheader->uid = lrecord_uid_counter++;
}
}
if (lrecord->implementation->finalizer)
- lrecord->implementation->finalizer (lrecord, 0);
+ ((lrecord->implementation->finalizer) (lrecord, 0));
xfree (lrecord);
return;
}
return 0;
imp = XRECORD_LHEADER_IMPLEMENTATION (frob);
+#ifdef USE_INDEXED_LRECORD_IMPLEMENTATION
return imp == type;
+#else
+ return imp == type || imp == type + 1;
+#endif
}
\f
-/************************************************************************/
-/* Debugger support */
-/************************************************************************/
-/* Give gdb/dbx enough information to decode Lisp Objects. We make
- sure certain symbols are always defined, so gdb doesn't complain
- about expressions in src/gdbinit. See src/gdbinit or src/dbxrc to
- see how this is used. */
-
-EMACS_UINT dbg_valmask = ((1UL << VALBITS) - 1) << GCBITS;
-EMACS_UINT dbg_typemask = (1UL << GCTYPEBITS) - 1;
-
-#ifdef USE_UNION_TYPE
-unsigned char dbg_USE_UNION_TYPE = 1;
+/**********************************************************************/
+/* Debugger support */
+/**********************************************************************/
+/* Give gdb/dbx enough information to decode Lisp Objects.
+ We make sure certain symbols are defined, so gdb doesn't complain
+ about expressions in src/gdbinit. Values are randomly chosen.
+ See src/gdbinit or src/dbxrc to see how this is used. */
+
+enum dbg_constants
+{
+#ifdef USE_MINIMAL_TAGBITS
+ dbg_valmask = (EMACS_INT) (((1UL << VALBITS) - 1) << GCBITS),
+ dbg_typemask = (EMACS_INT) ((1UL << GCTYPEBITS) - 1),
+ dbg_USE_MINIMAL_TAGBITS = 1,
+ dbg_Lisp_Type_Int = 100,
+#else /* ! USE_MIMIMAL_TAGBITS */
+ dbg_valmask = (EMACS_INT) ((1UL << VALBITS) - 1),
+ dbg_typemask = (EMACS_INT) (((1UL << GCTYPEBITS) - 1) << (VALBITS + GCMARKBITS)),
+ dbg_USE_MINIMAL_TAGBITS = 0,
+ dbg_Lisp_Type_Int = Lisp_Type_Int,
+#endif /* ! USE_MIMIMAL_TAGBITS */
+#ifdef USE_INDEXED_LRECORD_IMPLEMENTATION
+ dbg_USE_INDEXED_LRECORD_IMPLEMENTATION = 1,
#else
-unsigned char dbg_USE_UNION_TYPE = 0;
+ dbg_USE_INDEXED_LRECORD_IMPLEMENTATION = 0,
#endif
-
-unsigned char Lisp_Type_Int = 100;
-unsigned char Lisp_Type_Cons = 101;
-unsigned char Lisp_Type_String = 102;
-unsigned char Lisp_Type_Vector = 103;
-unsigned char Lisp_Type_Symbol = 104;
-
-#ifndef MULE
-unsigned char lrecord_char_table_entry;
-unsigned char lrecord_charset;
-#ifndef FILE_CODING
-unsigned char lrecord_coding_system;
+ dbg_Lisp_Type_Char = Lisp_Type_Char,
+ dbg_Lisp_Type_Record = Lisp_Type_Record,
+#ifdef LRECORD_CONS
+ dbg_Lisp_Type_Cons = 101,
+#else
+ dbg_Lisp_Type_Cons = Lisp_Type_Cons,
+ lrecord_cons = 201,
#endif
+#ifdef LRECORD_STRING
+ dbg_Lisp_Type_String = 102,
+#else
+ dbg_Lisp_Type_String = Lisp_Type_String,
+ lrecord_string = 202,
+#endif
+#ifdef LRECORD_VECTOR
+ dbg_Lisp_Type_Vector = 103,
+#else
+ dbg_Lisp_Type_Vector = Lisp_Type_Vector,
+ lrecord_vector = 203,
+#endif
+#ifdef LRECORD_SYMBOL
+ dbg_Lisp_Type_Symbol = 104,
+#else
+ dbg_Lisp_Type_Symbol = Lisp_Type_Symbol,
+ lrecord_symbol = 204,
+#endif
+#ifndef MULE
+ lrecord_char_table_entry = 205,
+ lrecord_charset = 206,
+ lrecord_coding_system = 207,
#endif
-
#ifndef HAVE_TOOLBARS
-unsigned char lrecord_toolbar_button;
+ lrecord_toolbar_button = 208,
#endif
-
-#ifndef TOOLTALK
-unsigned char lrecord_tooltalk_message;
-unsigned char lrecord_tooltalk_pattern;
+#ifndef HAVE_TOOLTALK
+ lrecord_tooltalk_message = 210,
+ lrecord_tooltalk_pattern = 211,
#endif
-
#ifndef HAVE_DATABASE
-unsigned char lrecord_database;
+ lrecord_database = 212,
#endif
-
-unsigned char dbg_valbits = VALBITS;
-unsigned char dbg_gctypebits = GCTYPEBITS;
-
-/* Macros turned into functions for ease of debugging.
- Debuggers don't know about macros! */
-int dbg_eq (Lisp_Object obj1, Lisp_Object obj2);
-int
-dbg_eq (Lisp_Object obj1, Lisp_Object obj2)
-{
- return EQ (obj1, obj2);
-}
+ dbg_valbits = VALBITS,
+ dbg_gctypebits = GCTYPEBITS
+ /* If we don't have an actual object of this enum, pgcc (and perhaps
+ other compilers) might optimize away the entire type declaration :-( */
+} dbg_dummy;
\f
-/************************************************************************/
-/* Fixed-size type macros */
-/************************************************************************/
+/**********************************************************************/
+/* Fixed-size type macros */
+/**********************************************************************/
/* For fixed-size types that are commonly used, we malloc() large blocks
of memory at a time and subdivide them into chunks of the correct
/ sizeof (structtype))
#endif /* ALLOC_NO_POOLS */
-#define DECLARE_FIXED_TYPE_ALLOC(type, structtype) \
- \
-struct type##_block \
-{ \
- struct type##_block *prev; \
- structtype block[TYPE_ALLOC_SIZE (type, structtype)]; \
-}; \
- \
-static struct type##_block *current_##type##_block; \
-static int current_##type##_block_index; \
- \
-static structtype *type##_free_list; \
-static structtype *type##_free_list_tail; \
- \
-static void \
-init_##type##_alloc (void) \
-{ \
- current_##type##_block = 0; \
- current_##type##_block_index = \
- countof (current_##type##_block->block); \
- type##_free_list = 0; \
- type##_free_list_tail = 0; \
-} \
- \
-static int gc_count_num_##type##_in_use; \
-static int gc_count_num_##type##_freelist
-
-#define ALLOCATE_FIXED_TYPE_FROM_BLOCK(type, result) do { \
- if (current_##type##_block_index \
- == countof (current_##type##_block->block)) \
+#define DECLARE_FIXED_TYPE_ALLOC(type, structtype) \
+ \
+struct type##_block \
+{ \
+ struct type##_block *prev; \
+ structtype block[TYPE_ALLOC_SIZE (type, structtype)]; \
+}; \
+ \
+static struct type##_block *current_##type##_block; \
+static int current_##type##_block_index; \
+ \
+static structtype *type##_free_list; \
+static structtype *type##_free_list_tail; \
+ \
+static void \
+init_##type##_alloc (void) \
+{ \
+ current_##type##_block = 0; \
+ current_##type##_block_index = countof (current_##type##_block->block); \
+ type##_free_list = 0; \
+ type##_free_list_tail = 0; \
+} \
+ \
+static int gc_count_num_##type##_in_use, gc_count_num_##type##_freelist
+
+#define ALLOCATE_FIXED_TYPE_FROM_BLOCK(type, result) \
+ do { \
+ if (current_##type##_block_index \
+ == countof (current_##type##_block->block)) \
{ \
- struct type##_block *AFTFB_new = (struct type##_block *) \
- allocate_lisp_storage (sizeof (struct type##_block)); \
- AFTFB_new->prev = current_##type##_block; \
- current_##type##_block = AFTFB_new; \
+ struct type##_block *__new__ = (struct type##_block *) \
+ allocate_lisp_storage (sizeof (struct type##_block)); \
+ __new__->prev = current_##type##_block; \
+ current_##type##_block = __new__; \
current_##type##_block_index = 0; \
} \
- (result) = \
- &(current_##type##_block->block[current_##type##_block_index++]); \
-} while (0)
+ (result) = \
+ &(current_##type##_block->block[current_##type##_block_index++]); \
+ } while (0)
/* Allocate an instance of a type that is stored in blocks.
TYPE is the "name" of the type, STRUCTTYPE is the corresponding
#else /* !ERROR_CHECK_GC */
#define PUT_FIXED_TYPE_ON_FREE_LIST(type, structtype, ptr) \
-do { * (structtype **) ((char *) (ptr) + sizeof (void *)) = \
+do { * (structtype **) ((char *) ptr + sizeof (void *)) = \
type##_free_list; \
- type##_free_list = (ptr); \
+ type##_free_list = ptr; \
} while (0)
#endif /* !ERROR_CHECK_GC */
/* TYPE and STRUCTTYPE are the same as in ALLOCATE_FIXED_TYPE(). */
-#define FREE_FIXED_TYPE(type, structtype, ptr) do { \
- structtype *FFT_ptr = (ptr); \
- ADDITIONAL_FREE_##type (FFT_ptr); \
- deadbeef_memory (FFT_ptr, sizeof (structtype)); \
- PUT_FIXED_TYPE_ON_FREE_LIST (type, structtype, FFT_ptr); \
- MARK_STRUCT_AS_FREE (FFT_ptr); \
-} while (0)
+#define FREE_FIXED_TYPE(type, structtype, ptr) \
+do { structtype *_weird_ = (ptr); \
+ ADDITIONAL_FREE_##type (_weird_); \
+ deadbeef_memory (ptr, sizeof (structtype)); \
+ PUT_FIXED_TYPE_ON_FREE_LIST (type, structtype, ptr); \
+ MARK_STRUCT_AS_FREE (_weird_); \
+ } while (0)
/* Like FREE_FIXED_TYPE() but used when we are explicitly
freeing a structure through free_cons(), free_marker(), etc.
\f
-/************************************************************************/
-/* Cons allocation */
-/************************************************************************/
+/**********************************************************************/
+/* Cons allocation */
+/**********************************************************************/
DECLARE_FIXED_TYPE_ALLOC (cons, struct Lisp_Cons);
/* conses are used and freed so often that we set this really high */
/* #define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_cons 20000 */
#define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_cons 2000
+#ifdef LRECORD_CONS
static Lisp_Object
mark_cons (Lisp_Object obj, void (*markobj) (Lisp_Object))
{
- if (GC_NILP (XCDR (obj)))
+ if (NILP (XCDR (obj)))
return XCAR (obj);
- markobj (XCAR (obj));
+ (markobj) (XCAR (obj));
return XCDR (obj);
}
return 0;
}
-static const struct lrecord_description cons_description[] = {
- { XD_LISP_OBJECT, offsetof(struct Lisp_Cons, car), 2 },
- { XD_END }
-};
-
DEFINE_BASIC_LRECORD_IMPLEMENTATION ("cons", cons,
mark_cons, print_cons, 0,
cons_equal,
* handle conses.
*/
0,
- cons_description,
struct Lisp_Cons);
+#endif /* LRECORD_CONS */
DEFUN ("cons", Fcons, 2, 2, 0, /*
Create a new cons, give it CAR and CDR as components, and return it.
struct Lisp_Cons *c;
ALLOCATE_FIXED_TYPE (cons, struct Lisp_Cons, c);
- set_lheader_implementation (&(c->lheader), &lrecord_cons);
+#ifdef LRECORD_CONS
+ set_lheader_implementation (&(c->lheader), lrecord_cons);
+#endif
XSETCONS (val, c);
c->car = car;
c->cdr = cdr;
struct Lisp_Cons *c;
NOSEEUM_ALLOCATE_FIXED_TYPE (cons, struct Lisp_Cons, c);
- set_lheader_implementation (&(c->lheader), &lrecord_cons);
+#ifdef LRECORD_CONS
+ set_lheader_implementation (&(c->lheader), lrecord_cons);
+#endif
XSETCONS (val, c);
XCAR (val) = car;
XCDR (val) = cdr;
Lisp_Object val = Qnil;
Lisp_Object *argp = args + nargs;
- while (argp > args)
+ while (nargs-- > 0)
val = Fcons (*--argp, val);
return val;
}
}
\f
-/************************************************************************/
-/* Float allocation */
-/************************************************************************/
+/**********************************************************************/
+/* Float allocation */
+/**********************************************************************/
#ifdef LISP_FLOAT_TYPE
struct Lisp_Float *f;
ALLOCATE_FIXED_TYPE (float, struct Lisp_Float, f);
- set_lheader_implementation (&(f->lheader), &lrecord_float);
+ set_lheader_implementation (&(f->lheader), lrecord_float);
float_data (f) = float_value;
XSETFLOAT (val, f);
return val;
#endif /* LISP_FLOAT_TYPE */
\f
-/************************************************************************/
-/* Vector allocation */
-/************************************************************************/
+/**********************************************************************/
+/* Vector allocation */
+/**********************************************************************/
+#ifdef LRECORD_VECTOR
static Lisp_Object
mark_vector (Lisp_Object obj, void (*markobj) (Lisp_Object))
{
- Lisp_Vector *ptr = XVECTOR (obj);
+ struct Lisp_Vector *ptr = XVECTOR (obj);
int len = vector_length (ptr);
int i;
for (i = 0; i < len - 1; i++)
- markobj (ptr->contents[i]);
+ (markobj) (ptr->contents[i]);
return (len > 0) ? ptr->contents[len - 1] : Qnil;
}
static size_t
size_vector (CONST void *lheader)
{
- return STRETCHY_STRUCT_SIZEOF (Lisp_Vector, contents,
- ((Lisp_Vector *) lheader)->size);
+ /* * -1 because struct Lisp_Vector includes 1 slot */
+ return sizeof (struct Lisp_Vector) +
+ ((((struct Lisp_Vector *) lheader)->size - 1) * sizeof (Lisp_Object));
}
static int
-vector_equal (Lisp_Object obj1, Lisp_Object obj2, int depth)
+vector_equal (Lisp_Object o1, Lisp_Object o2, int depth)
{
- int len = XVECTOR_LENGTH (obj1);
- if (len != XVECTOR_LENGTH (obj2))
+ int indice;
+ int len = XVECTOR_LENGTH (o1);
+ if (len != XVECTOR_LENGTH (o2))
return 0;
-
- {
- Lisp_Object *ptr1 = XVECTOR_DATA (obj1);
- Lisp_Object *ptr2 = XVECTOR_DATA (obj2);
- while (len--)
- if (!internal_equal (*ptr1++, *ptr2++, depth + 1))
+ for (indice = 0; indice < len; indice++)
+ {
+ if (!internal_equal (XVECTOR_DATA (o1) [indice],
+ XVECTOR_DATA (o2) [indice],
+ depth + 1))
return 0;
- }
+ }
return 1;
}
-static const struct lrecord_description vector_description[] = {
- { XD_LONG, offsetof(struct Lisp_Vector, size) },
- { XD_LISP_OBJECT, offsetof(struct Lisp_Vector, contents), XD_INDIRECT(0) }
-};
-
DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION("vector", vector,
mark_vector, print_vector, 0,
vector_equal,
* knows how to handle vectors.
*/
0,
- vector_description,
- size_vector, Lisp_Vector);
+ size_vector, struct Lisp_Vector);
+
+/* #### should allocate `small' vectors from a frob-block */
+static struct Lisp_Vector *
+make_vector_internal (size_t sizei)
+{
+ size_t sizem = (sizeof (struct Lisp_Vector)
+ /* -1 because struct Lisp_Vector includes 1 slot */
+ + (sizei - 1) * sizeof (Lisp_Object));
+ struct Lisp_Vector *p =
+ (struct Lisp_Vector *) alloc_lcrecord (sizem, lrecord_vector);
+
+ p->size = sizei;
+ return p;
+}
+
+#else /* ! LRECORD_VECTOR */
+
+static Lisp_Object all_vectors;
/* #### should allocate `small' vectors from a frob-block */
-static Lisp_Vector *
+static struct Lisp_Vector *
make_vector_internal (size_t sizei)
{
- /* no vector_next */
- size_t sizem = STRETCHY_STRUCT_SIZEOF (Lisp_Vector, contents, sizei);
- Lisp_Vector *p = (Lisp_Vector *) alloc_lcrecord (sizem, &lrecord_vector);
+ size_t sizem = (sizeof (struct Lisp_Vector)
+ /* -1 because struct Lisp_Vector includes 1 slot,
+ * +1 to account for vector_next */
+ + (sizei - 1 + 1) * sizeof (Lisp_Object));
+ struct Lisp_Vector *p = (struct Lisp_Vector *) allocate_lisp_storage (sizem);
+
+ INCREMENT_CONS_COUNTER (sizem, "vector");
p->size = sizei;
+ vector_next (p) = all_vectors;
+ XSETVECTOR (all_vectors, p);
return p;
}
+#endif /* ! LRECORD_VECTOR */
+
Lisp_Object
-make_vector (size_t length, Lisp_Object init)
+make_vector (EMACS_INT length, Lisp_Object init)
{
- Lisp_Vector *vecp = make_vector_internal (length);
- Lisp_Object *p = vector_data (vecp);
+ int elt;
+ Lisp_Object vector;
+ struct Lisp_Vector *p;
- while (length--)
- *p++ = init;
+ if (length < 0)
+ length = XINT (wrong_type_argument (Qnatnump, make_int (length)));
+ p = make_vector_internal (length);
+ XSETVECTOR (vector, p);
+
+#if 0
+ /* Initialize big arrays full of 0's quickly, for what that's worth */
{
- Lisp_Object vector;
- XSETVECTOR (vector, vecp);
+ char *travesty = (char *) &init;
+ for (i = 1; i < sizeof (Lisp_Object); i++)
+ {
+ if (travesty[i] != travesty[0])
+ goto fill;
+ }
+ memset (vector_data (p), travesty[0], length * sizeof (Lisp_Object));
return vector;
}
+ fill:
+#endif
+ for (elt = 0; elt < length; elt++)
+ vector_data(p)[elt] = init;
+
+ return vector;
}
DEFUN ("make-vector", Fmake_vector, 2, 2, 0, /*
*/
(length, init))
{
- CONCHECK_NATNUM (length);
+ CHECK_NATNUM (length);
return make_vector (XINT (length), init);
}
*/
(int nargs, Lisp_Object *args))
{
- Lisp_Vector *vecp = make_vector_internal (nargs);
- Lisp_Object *p = vector_data (vecp);
+ Lisp_Object vector;
+ int elt;
+ struct Lisp_Vector *p = make_vector_internal (nargs);
- while (nargs--)
- *p++ = *args++;
+ for (elt = 0; elt < nargs; elt++)
+ vector_data(p)[elt] = args[elt];
- {
- Lisp_Object vector;
- XSETVECTOR (vector, vecp);
- return vector;
- }
+ XSETVECTOR (vector, p);
+ return vector;
}
Lisp_Object
}
#endif /* unused */
-/************************************************************************/
-/* Bit Vector allocation */
-/************************************************************************/
+/**********************************************************************/
+/* Bit Vector allocation */
+/**********************************************************************/
static Lisp_Object all_bit_vectors;
static struct Lisp_Bit_Vector *
make_bit_vector_internal (size_t sizei)
{
- size_t num_longs = BIT_VECTOR_LONG_STORAGE (sizei);
- size_t sizem = STRETCHY_STRUCT_SIZEOF (Lisp_Bit_Vector, bits, num_longs);
- Lisp_Bit_Vector *p = (Lisp_Bit_Vector *) allocate_lisp_storage (sizem);
- set_lheader_implementation (&(p->lheader), &lrecord_bit_vector);
+ size_t sizem = sizeof (struct Lisp_Bit_Vector) +
+ /* -1 because struct Lisp_Bit_Vector includes 1 slot */
+ sizeof (long) * (BIT_VECTOR_LONG_STORAGE (sizei) - 1);
+ struct Lisp_Bit_Vector *p =
+ (struct Lisp_Bit_Vector *) allocate_lisp_storage (sizem);
+ set_lheader_implementation (&(p->lheader), lrecord_bit_vector);
INCREMENT_CONS_COUNTER (sizem, "bit-vector");
bit_vector_length (p) = sizei;
- bit_vector_next (p) = all_bit_vectors;
+ bit_vector_next (p) = all_bit_vectors;
/* make sure the extra bits in the last long are 0; the calling
functions might not set them. */
- p->bits[num_longs - 1] = 0;
+ p->bits[BIT_VECTOR_LONG_STORAGE (sizei) - 1] = 0;
XSETBIT_VECTOR (all_bit_vectors, p);
return p;
}
Lisp_Object
-make_bit_vector (size_t length, Lisp_Object init)
+make_bit_vector (EMACS_INT length, Lisp_Object init)
{
- struct Lisp_Bit_Vector *p = make_bit_vector_internal (length);
- size_t num_longs = BIT_VECTOR_LONG_STORAGE (length);
+ Lisp_Object bit_vector;
+ struct Lisp_Bit_Vector *p;
+ EMACS_INT num_longs;
CHECK_BIT (init);
+ num_longs = BIT_VECTOR_LONG_STORAGE (length);
+ p = make_bit_vector_internal (length);
+ XSETBIT_VECTOR (bit_vector, p);
+
if (ZEROP (init))
memset (p->bits, 0, num_longs * sizeof (long));
else
{
- size_t bits_in_last = length & (LONGBITS_POWER_OF_2 - 1);
+ EMACS_INT bits_in_last = length & (LONGBITS_POWER_OF_2 - 1);
memset (p->bits, ~0, num_longs * sizeof (long));
/* But we have to make sure that the unused bits in the
- last long are 0, so that equal/hash is easy. */
+ last integer are 0, so that equal/hash is easy. */
if (bits_in_last)
p->bits[num_longs - 1] &= (1 << bits_in_last) - 1;
}
- {
- Lisp_Object bit_vector;
- XSETBIT_VECTOR (bit_vector, p);
- return bit_vector;
- }
+ return bit_vector;
}
Lisp_Object
-make_bit_vector_from_byte_vector (unsigned char *bytevec, size_t length)
+make_bit_vector_from_byte_vector (unsigned char *bytevec, EMACS_INT length)
{
+ Lisp_Object bit_vector;
+ struct Lisp_Bit_Vector *p;
int i;
- Lisp_Bit_Vector *p = make_bit_vector_internal (length);
+
+ if (length < 0)
+ length = XINT (wrong_type_argument (Qnatnump, make_int (length)));
+
+ p = make_bit_vector_internal (length);
+ XSETBIT_VECTOR (bit_vector, p);
for (i = 0; i < length; i++)
set_bit_vector_bit (p, i, bytevec[i]);
- {
- Lisp_Object bit_vector;
- XSETBIT_VECTOR (bit_vector, p);
- return bit_vector;
- }
+ return bit_vector;
}
DEFUN ("make-bit-vector", Fmake_bit_vector, 2, 2, 0, /*
*/
(int nargs, Lisp_Object *args))
{
- int i;
- Lisp_Bit_Vector *p = make_bit_vector_internal (nargs);
+ Lisp_Object bit_vector;
+ int elt;
+ struct Lisp_Bit_Vector *p;
- for (i = 0; i < nargs; i++)
- {
- CHECK_BIT (args[i]);
- set_bit_vector_bit (p, i, !ZEROP (args[i]));
- }
+ for (elt = 0; elt < nargs; elt++)
+ CHECK_BIT (args[elt]);
- {
- Lisp_Object bit_vector;
- XSETBIT_VECTOR (bit_vector, p);
- return bit_vector;
- }
+ p = make_bit_vector_internal (nargs);
+
+ for (elt = 0; elt < nargs; elt++)
+ set_bit_vector_bit (p, elt, !ZEROP (args[elt]));
+
+ XSETBIT_VECTOR (bit_vector, p);
+ return bit_vector;
}
\f
-/************************************************************************/
-/* Compiled-function allocation */
-/************************************************************************/
+/**********************************************************************/
+/* Compiled-function allocation */
+/**********************************************************************/
-DECLARE_FIXED_TYPE_ALLOC (compiled_function, Lisp_Compiled_Function);
+DECLARE_FIXED_TYPE_ALLOC (compiled_function, struct Lisp_Compiled_Function);
#define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_compiled_function 1000
static Lisp_Object
-make_compiled_function (void)
-{
- Lisp_Compiled_Function *f;
- Lisp_Object fun;
-
- ALLOCATE_FIXED_TYPE (compiled_function, Lisp_Compiled_Function, f);
- set_lheader_implementation (&(f->lheader), &lrecord_compiled_function);
-
- f->stack_depth = 0;
- f->specpdl_depth = 0;
- f->flags.documentationp = 0;
- f->flags.interactivep = 0;
- f->flags.domainp = 0; /* I18N3 */
- f->instructions = Qzero;
- f->constants = Qzero;
- f->arglist = Qnil;
- f->doc_and_interactive = Qnil;
+make_compiled_function (int make_pure)
+{
+ struct Lisp_Compiled_Function *b;
+ Lisp_Object new;
+ size_t size = sizeof (struct Lisp_Compiled_Function);
+
+ if (make_pure && check_purespace (size))
+ {
+ b = (struct Lisp_Compiled_Function *) (PUREBEG + pure_bytes_used);
+ set_lheader_implementation (&(b->lheader), lrecord_compiled_function);
+#ifdef USE_INDEXED_LRECORD_IMPLEMENTATION
+ b->lheader.pure = 1;
+#endif
+ pure_bytes_used += size;
+ bump_purestat (&purestat_bytecode, size);
+ }
+ else
+ {
+ ALLOCATE_FIXED_TYPE (compiled_function, struct Lisp_Compiled_Function,
+ b);
+ set_lheader_implementation (&(b->lheader), lrecord_compiled_function);
+ }
+ b->maxdepth = 0;
+ b->flags.documentationp = 0;
+ b->flags.interactivep = 0;
+ b->flags.domainp = 0; /* I18N3 */
+ b->bytecodes = Qzero;
+ b->constants = Qzero;
+ b->arglist = Qnil;
+ b->doc_and_interactive = Qnil;
#ifdef COMPILED_FUNCTION_ANNOTATION_HACK
- f->annotated = Qnil;
+ b->annotated = Qnil;
#endif
- XSETCOMPILED_FUNCTION (fun, f);
- return fun;
+ XSETCOMPILED_FUNCTION (new, b);
+ return new;
}
DEFUN ("make-byte-code", Fmake_byte_code, 4, MANY, 0, /*
Return a new compiled-function object.
-Usage: (arglist instructions constants stack-depth
- &optional doc-string interactive)
+Usage: (arglist instructions constants stack-size
+ &optional doc-string interactive-spec)
Note that, unlike all other emacs-lisp functions, calling this with five
arguments is NOT the same as calling it with six arguments, the last of
which is nil. If the INTERACTIVE arg is specified as nil, then that means
that this function was defined with `(interactive)'. If the arg is not
specified, then that means the function is not interactive.
This is terrible behavior which is retained for compatibility with old
-`.elc' files which expect these semantics.
+`.elc' files which expected these semantics.
*/
(int nargs, Lisp_Object *args))
{
-/* In a non-insane world this function would have this arglist...
- (arglist instructions constants stack_depth &optional doc_string interactive)
+/* In a non-insane world this function would have this arglist...
+ (arglist, instructions, constants, stack_size, doc_string, interactive)
+ Lisp_Object arglist, instructions, constants, stack_size, doc_string,
+ interactive;
*/
- Lisp_Object fun = make_compiled_function ();
- Lisp_Compiled_Function *f = XCOMPILED_FUNCTION (fun);
-
Lisp_Object arglist = args[0];
Lisp_Object instructions = args[1];
Lisp_Object constants = args[2];
- Lisp_Object stack_depth = args[3];
+ Lisp_Object stack_size = args[3];
Lisp_Object doc_string = (nargs > 4) ? args[4] : Qnil;
Lisp_Object interactive = (nargs > 5) ? args[5] : Qunbound;
-
- if (nargs < 4 || nargs > 6)
+ /* Don't purecopy the doc references in instructions because it's
+ wasteful; they will get fixed up later.
+
+ #### If something goes wrong and they don't get fixed up,
+ we're screwed, because pure stuff isn't marked and thus the
+ cons references won't be marked and will get reused.
+
+ Note: there will be a window after the byte code is created and
+ before the doc references are fixed up in which there will be
+ impure objects inside a pure object, which apparently won't
+ get marked, leading the trouble. But during that entire window,
+ the objects are sitting on Vload_force_doc_string_list, which
+ is staticpro'd, so we're OK. */
+ int purecopy_instructions = 1;
+
+ if (nargs > 6)
return Fsignal (Qwrong_number_of_arguments,
list2 (intern ("make-byte-code"), make_int (nargs)));
- /* Check for valid formal parameter list now, to allow us to use
- SPECBIND_FAST_UNSAFE() later in funcall_compiled_function(). */
- {
- Lisp_Object symbol, tail;
- EXTERNAL_LIST_LOOP_3 (symbol, arglist, tail)
- {
- CHECK_SYMBOL (symbol);
- if (EQ (symbol, Qt) ||
- EQ (symbol, Qnil) ||
- SYMBOL_IS_KEYWORD (symbol))
- signal_simple_error_2
- ("Invalid constant symbol in formal parameter list",
- symbol, arglist);
- }
- }
- f->arglist = arglist;
-
- /* `instructions' is a string or a cons (string . int) for a
+ CHECK_LIST (arglist);
+ /* instructions is a string or a cons (string . int) for a
lazy-loaded function. */
if (CONSP (instructions))
{
CHECK_STRING (XCAR (instructions));
CHECK_INT (XCDR (instructions));
+ if (!NILP (constants))
+ CHECK_VECTOR (constants);
+ purecopy_instructions = 0;
}
else
{
CHECK_STRING (instructions);
+ CHECK_VECTOR (constants);
}
- f->instructions = instructions;
-
- if (!NILP (constants))
- CHECK_VECTOR (constants);
- f->constants = constants;
+ CHECK_NATNUM (stack_size);
+ /* doc_string may be nil, string, int, or a cons (string . int). */
- CHECK_NATNUM (stack_depth);
- f->stack_depth = XINT (stack_depth);
+ /* interactive may be list or string (or unbound). */
-#ifdef COMPILED_FUNCTION_ANNOTATION_HACK
- if (!NILP (Vcurrent_compiled_function_annotation))
- f->annotated = Fcopy (Vcurrent_compiled_function_annotation);
- else if (!NILP (Vload_file_name_internal_the_purecopy))
- f->annotated = Vload_file_name_internal_the_purecopy;
- else if (!NILP (Vload_file_name_internal))
+ if (purify_flag)
{
- struct gcpro gcpro1;
- GCPRO1 (fun); /* don't let fun get reaped */
- Vload_file_name_internal_the_purecopy =
- Fpurecopy (Ffile_name_nondirectory (Vload_file_name_internal));
- f->annotated = Vload_file_name_internal_the_purecopy;
- UNGCPRO;
+ if (!purified (arglist))
+ arglist = Fpurecopy (arglist);
+ if (purecopy_instructions && !purified (instructions))
+ instructions = Fpurecopy (instructions);
+ if (!purified (doc_string))
+ doc_string = Fpurecopy (doc_string);
+ if (!purified (interactive) && !UNBOUNDP (interactive))
+ interactive = Fpurecopy (interactive);
+
+ /* Statistics are kept differently for the constants */
+ if (!purified (constants))
+#ifdef PURESTAT
+ {
+ int old = purecopying_for_bytecode;
+ purecopying_for_bytecode = 1;
+ constants = Fpurecopy (constants);
+ purecopying_for_bytecode = old;
+ }
+#else
+ constants = Fpurecopy (constants);
+#endif /* PURESTAT */
+
+#ifdef PURESTAT
+ if (STRINGP (instructions))
+ bump_purestat (&purestat_string_bytecodes, pure_sizeof (instructions));
+ if (VECTORP (constants))
+ bump_purestat (&purestat_vector_bytecode_constants,
+ pure_sizeof (constants));
+ if (STRINGP (doc_string))
+ /* These should be have been snagged by make-docfile... */
+ bump_purestat (&purestat_string_documentation,
+ pure_sizeof (doc_string));
+ if (STRINGP (interactive))
+ bump_purestat (&purestat_string_interactive,
+ pure_sizeof (interactive));
+#endif /* PURESTAT */
}
+
+ {
+ int docp = !NILP (doc_string);
+ int intp = !UNBOUNDP (interactive);
+#ifdef I18N3
+ int domp = !NILP (Vfile_domain);
+#endif
+ Lisp_Object val = make_compiled_function (purify_flag);
+ struct Lisp_Compiled_Function *b = XCOMPILED_FUNCTION (val);
+ b->flags.documentationp = docp;
+ b->flags.interactivep = intp;
+#ifdef I18N3
+ b->flags.domainp = domp;
+#endif
+ b->maxdepth = XINT (stack_size);
+ b->bytecodes = instructions;
+ b->constants = constants;
+ b->arglist = arglist;
+#ifdef COMPILED_FUNCTION_ANNOTATION_HACK
+ if (!NILP (Vcurrent_compiled_function_annotation))
+ b->annotated = Fpurecopy (Vcurrent_compiled_function_annotation);
+ else if (!NILP (Vload_file_name_internal_the_purecopy))
+ b->annotated = Vload_file_name_internal_the_purecopy;
+ else if (!NILP (Vload_file_name_internal))
+ {
+ struct gcpro gcpro1;
+ GCPRO1(val); /* don't let val or b get reaped */
+ Vload_file_name_internal_the_purecopy =
+ Fpurecopy (Ffile_name_nondirectory (Vload_file_name_internal));
+ b->annotated = Vload_file_name_internal_the_purecopy;
+ UNGCPRO;
+ }
#endif /* COMPILED_FUNCTION_ANNOTATION_HACK */
- /* doc_string may be nil, string, int, or a cons (string . int).
- interactive may be list or string (or unbound). */
- f->doc_and_interactive = Qunbound;
#ifdef I18N3
- if ((f->flags.domainp = !NILP (Vfile_domain)) != 0)
- f->doc_and_interactive = Vfile_domain;
+ if (docp && intp && domp)
+ b->doc_and_interactive = (((purify_flag) ? pure_cons : Fcons)
+ (doc_string,
+ (((purify_flag) ? pure_cons : Fcons)
+ (interactive, Vfile_domain))));
+ else if (docp && domp)
+ b->doc_and_interactive = (((purify_flag) ? pure_cons : Fcons)
+ (doc_string, Vfile_domain));
+ else if (intp && domp)
+ b->doc_and_interactive = (((purify_flag) ? pure_cons : Fcons)
+ (interactive, Vfile_domain));
+ else
#endif
- if ((f->flags.interactivep = !UNBOUNDP (interactive)) != 0)
- {
- f->doc_and_interactive
- = (UNBOUNDP (f->doc_and_interactive) ? interactive :
- Fcons (interactive, f->doc_and_interactive));
- }
- if ((f->flags.documentationp = !NILP (doc_string)) != 0)
- {
- f->doc_and_interactive
- = (UNBOUNDP (f->doc_and_interactive) ? doc_string :
- Fcons (doc_string, f->doc_and_interactive));
- }
- if (UNBOUNDP (f->doc_and_interactive))
- f->doc_and_interactive = Qnil;
+ if (docp && intp)
+ b->doc_and_interactive = (((purify_flag) ? pure_cons : Fcons)
+ (doc_string, interactive));
+ else if (intp)
+ b->doc_and_interactive = interactive;
+#ifdef I18N3
+ else if (domp)
+ b->doc_and_interactive = Vfile_domain;
+#endif
+ else
+ b->doc_and_interactive = doc_string;
- return fun;
+ return val;
+ }
}
\f
-/************************************************************************/
-/* Symbol allocation */
-/************************************************************************/
+/**********************************************************************/
+/* Symbol allocation */
+/**********************************************************************/
DECLARE_FIXED_TYPE_ALLOC (symbol, struct Lisp_Symbol);
#define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_symbol 1000
Return a newly allocated uninterned symbol whose name is NAME.
Its value and function definition are void, and its property list is nil.
*/
- (name))
+ (str))
{
Lisp_Object val;
struct Lisp_Symbol *p;
- CHECK_STRING (name);
+ CHECK_STRING (str);
ALLOCATE_FIXED_TYPE (symbol, struct Lisp_Symbol, p);
- set_lheader_implementation (&(p->lheader), &lrecord_symbol);
- p->name = XSTRING (name);
- p->plist = Qnil;
- p->value = Qunbound;
+#ifdef LRECORD_SYMBOL
+ set_lheader_implementation (&(p->lheader), lrecord_symbol);
+#endif
+ p->name = XSTRING (str);
+ p->plist = Qnil;
+ p->value = Qunbound;
p->function = Qunbound;
+ p->obarray = Qnil;
symbol_next (p) = 0;
XSETSYMBOL (val, p);
return val;
}
\f
-/************************************************************************/
-/* Extent allocation */
-/************************************************************************/
+/**********************************************************************/
+/* Extent allocation */
+/**********************************************************************/
DECLARE_FIXED_TYPE_ALLOC (extent, struct extent);
#define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_extent 1000
struct extent *e;
ALLOCATE_FIXED_TYPE (extent, struct extent, e);
- set_lheader_implementation (&(e->lheader), &lrecord_extent);
+ /* xzero (*e); */
+ set_lheader_implementation (&(e->lheader), lrecord_extent);
extent_object (e) = Qnil;
set_extent_start (e, -1);
set_extent_end (e, -1);
}
\f
-/************************************************************************/
-/* Event allocation */
-/************************************************************************/
+/**********************************************************************/
+/* Event allocation */
+/**********************************************************************/
DECLARE_FIXED_TYPE_ALLOC (event, struct Lisp_Event);
#define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_event 1000
struct Lisp_Event *e;
ALLOCATE_FIXED_TYPE (event, struct Lisp_Event, e);
- set_lheader_implementation (&(e->lheader), &lrecord_event);
+ set_lheader_implementation (&(e->lheader), lrecord_event);
XSETEVENT (val, e);
return val;
}
\f
-/************************************************************************/
-/* Marker allocation */
-/************************************************************************/
+/**********************************************************************/
+/* Marker allocation */
+/**********************************************************************/
DECLARE_FIXED_TYPE_ALLOC (marker, struct Lisp_Marker);
#define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_marker 1000
struct Lisp_Marker *p;
ALLOCATE_FIXED_TYPE (marker, struct Lisp_Marker, p);
- set_lheader_implementation (&(p->lheader), &lrecord_marker);
+ set_lheader_implementation (&(p->lheader), lrecord_marker);
p->buffer = 0;
p->memind = 0;
marker_next (p) = 0;
struct Lisp_Marker *p;
NOSEEUM_ALLOCATE_FIXED_TYPE (marker, struct Lisp_Marker, p);
- set_lheader_implementation (&(p->lheader), &lrecord_marker);
+ set_lheader_implementation (&(p->lheader), lrecord_marker);
p->buffer = 0;
p->memind = 0;
marker_next (p) = 0;
}
\f
-/************************************************************************/
-/* String allocation */
-/************************************************************************/
+/**********************************************************************/
+/* String allocation */
+/**********************************************************************/
/* The data for "short" strings generally resides inside of structs of type
string_chars_block. The Lisp_String structure is allocated just like any
/* #define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_string 10000 */
#define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_string 1000
+#ifdef LRECORD_STRING
static Lisp_Object
mark_string (Lisp_Object obj, void (*markobj) (Lisp_Object))
{
}
static int
-string_equal (Lisp_Object obj1, Lisp_Object obj2, int depth)
+string_equal (Lisp_Object o1, Lisp_Object o2, int depth)
{
Bytecount len;
- return (((len = XSTRING_LENGTH (obj1)) == XSTRING_LENGTH (obj2)) &&
- !memcmp (XSTRING_DATA (obj1), XSTRING_DATA (obj2), len));
+ return (((len = XSTRING_LENGTH (o1)) == XSTRING_LENGTH (o2)) &&
+ !memcmp (XSTRING_DATA (o1), XSTRING_DATA (o2), len));
}
-static const struct lrecord_description string_description[] = {
- { XD_STRING_DATA, offsetof(Lisp_String, data) },
- { XD_LISP_OBJECT, offsetof(Lisp_String, plist), 1 },
- { XD_END }
-};
-
DEFINE_BASIC_LRECORD_IMPLEMENTATION ("string", string,
mark_string, print_string,
/*
* SWEEP_FIXED_TYPE_BLOCK().
*/
0, string_equal, 0,
- string_description,
struct Lisp_String);
+#endif /* LRECORD_STRING */
/* String blocks contain this many useful bytes. */
#define STRING_CHARS_BLOCK_SIZE \
else
{
/* Make a new current string chars block */
- struct string_chars_block *new_scb = xnew (struct string_chars_block);
+ struct string_chars_block *new = xnew (struct string_chars_block);
- current_string_chars_block->next = new_scb;
- new_scb->prev = current_string_chars_block;
- new_scb->next = 0;
- current_string_chars_block = new_scb;
- new_scb->pos = fullsize;
+ current_string_chars_block->next = new;
+ new->prev = current_string_chars_block;
+ new->next = 0;
+ current_string_chars_block = new;
+ new->pos = fullsize;
s_chars = (struct string_chars *)
current_string_chars_block->string_chars;
}
/* Allocate the string header */
ALLOCATE_FIXED_TYPE (string, struct Lisp_String, s);
- set_lheader_implementation (&(s->lheader), &lrecord_string);
+#ifdef LRECORD_STRING
+ set_lheader_implementation (&(s->lheader), lrecord_string);
+#endif
s_chars = allocate_string_chars_struct (s, fullsize);
void
set_string_char (struct Lisp_String *s, Charcount i, Emchar c)
{
+ Bytecount oldlen, newlen;
Bufbyte newstr[MAX_EMCHAR_LEN];
Bytecount bytoff = charcount_to_bytecount (string_data (s), i);
- Bytecount oldlen = charcount_to_bytecount (string_data (s) + bytoff, 1);
- Bytecount newlen = set_charptr_emchar (newstr, c);
+
+ oldlen = charcount_to_bytecount (string_data (s) + bytoff, 1);
+ newlen = set_charptr_emchar (newstr, c);
if (oldlen != newlen)
resize_string (s, bytoff, newlen - oldlen);
*/
(length, init))
{
+ Lisp_Object val;
+
CHECK_NATNUM (length);
CHECK_CHAR_COERCE_INT (init);
{
- Bufbyte init_str[MAX_EMCHAR_LEN];
- int len = set_charptr_emchar (init_str, XCHAR (init));
- Lisp_Object val = make_uninit_string (len * XINT (length));
+ Bufbyte str[MAX_EMCHAR_LEN];
+ int len = set_charptr_emchar (str, XCHAR (init));
+ val = make_uninit_string (len * XINT (length));
if (len == 1)
/* Optimize the single-byte case */
memset (XSTRING_DATA (val), XCHAR (init), XSTRING_LENGTH (val));
else
{
- int i;
+ int i, j, k;
Bufbyte *ptr = XSTRING_DATA (val);
- for (i = XINT (length); i; i--)
- {
- Bufbyte *init_ptr = init_str;
- switch (len)
- {
- case 4: *ptr++ = *init_ptr++;
- case 3: *ptr++ = *init_ptr++;
- case 2: *ptr++ = *init_ptr++;
- case 1: *ptr++ = *init_ptr++;
- }
- }
+ k = 0;
+ for (i = 0; i < XINT (length); i++)
+ for (j = 0; j < len; j++)
+ ptr[k++] = str[j];
}
- return val;
}
+ return val;
}
DEFUN ("string", Fstring, 0, MANY, 0, /*
return make_string (storage, p - storage);
}
-
/* Take some raw memory, which MUST already be in internal format,
and package it up into a Lisp string. */
Lisp_Object
return build_string (GETTEXT (str));
}
-Lisp_Object
-make_string_nocopy (CONST Bufbyte *contents, Bytecount length)
-{
- struct Lisp_String *s;
- Lisp_Object val;
-
- /* Make sure we find out about bad make_string_nocopy's when they happen */
-#if defined (ERROR_CHECK_BUFPOS) && defined (MULE)
- bytecount_to_charcount (contents, length); /* Just for the assertions */
-#endif
-
- /* Allocate the string header */
- ALLOCATE_FIXED_TYPE (string, struct Lisp_String, s);
- set_lheader_implementation (&(s->lheader), &lrecord_string);
- SET_C_READONLY_RECORD_HEADER (&s->lheader);
- s->plist = Qnil;
- set_string_data (s, (Bufbyte *)contents);
- set_string_length (s, length);
-
- XSETSTRING (val, s);
- return val;
-}
-
\f
/************************************************************************/
/* lcrecord lists */
DEFINE_LRECORD_IMPLEMENTATION ("lcrecord-list", lcrecord_list,
mark_lcrecord_list, internal_object_printer,
- 0, 0, 0, 0, struct lcrecord_list);
+ 0, 0, 0, struct lcrecord_list);
Lisp_Object
make_lcrecord_list (size_t size,
CONST struct lrecord_implementation *implementation)
{
struct lcrecord_list *p = alloc_lcrecord_type (struct lcrecord_list,
- &lrecord_lcrecord_list);
+ lrecord_lcrecord_list);
Lisp_Object val;
p->implementation = implementation;
/* Make sure the size is correct. This will catch, for example,
putting a window configuration on the wrong free list. */
if (implementation->size_in_bytes_method)
- assert (implementation->size_in_bytes_method (lheader) == list->size);
+ assert (((implementation->size_in_bytes_method) (lheader))
+ == list->size);
else
assert (implementation->static_size == list->size);
#endif /* ERROR_CHECK_GC */
if (implementation->finalizer)
- implementation->finalizer (lheader, 0);
+ ((implementation->finalizer) (lheader, 0));
free_header->chain = list->free;
free_header->lcheader.free = 1;
list->free = lcrecord;
}
\f
+/**********************************************************************/
+/* Purity of essence, peace on earth */
+/**********************************************************************/
-\f
-DEFUN ("purecopy", Fpurecopy, 1, 1, 0, /*
-Kept for compatibility, returns its argument.
-Old:
-Make a copy of OBJECT in pure storage.
-Recursively copies contents of vectors and cons cells.
-Does not copy symbols.
-*/
- (obj))
-{
+static int symbols_initialized;
+
+Lisp_Object
+make_pure_string (CONST Bufbyte *data, Bytecount length,
+ Lisp_Object plist, int no_need_to_copy_data)
+{
+ Lisp_Object new;
+ struct Lisp_String *s;
+ size_t size = sizeof (struct Lisp_String) +
+ (no_need_to_copy_data ? 0 : (length + 1)); /* + 1 for terminating 0 */
+ size = ALIGN_SIZE (size, ALIGNOF (Lisp_Object));
+
+ if (symbols_initialized && !pure_lossage)
+ {
+ /* Try to share some names. Saves a few kbytes. */
+ Lisp_Object tem = oblookup (Vobarray, data, length);
+ if (SYMBOLP (tem))
+ {
+ s = XSYMBOL (tem)->name;
+ if (!PURIFIED (s)) abort ();
+ XSETSTRING (new, s);
+ return new;
+ }
+ }
+
+ if (!check_purespace (size))
+ return make_string (data, length);
+
+ s = (struct Lisp_String *) (PUREBEG + pure_bytes_used);
+#ifdef LRECORD_STRING
+ set_lheader_implementation (&(s->lheader), lrecord_string);
+#ifdef USE_INDEXED_LRECORD_IMPLEMENTATION
+ s->lheader.pure = 1;
+#endif
+#endif
+ set_string_length (s, length);
+ if (no_need_to_copy_data)
+ {
+ set_string_data (s, (Bufbyte *) data);
+ }
+ else
+ {
+ set_string_data (s, (Bufbyte *) s + sizeof (struct Lisp_String));
+ memcpy (string_data (s), data, length);
+ set_string_byte (s, length, 0);
+ }
+ s->plist = Qnil;
+ pure_bytes_used += size;
+
+#ifdef PURESTAT
+ bump_purestat (&purestat_string_all, size);
+ if (purecopying_for_bytecode)
+ bump_purestat (&purestat_string_other_function, size);
+#endif /* PURESTAT */
+
+ /* Do this after the official "completion" of the purecopying. */
+ s->plist = Fpurecopy (plist);
+
+ XSETSTRING (new, s);
+ return new;
+}
+
+
+Lisp_Object
+make_pure_pname (CONST Bufbyte *data, Bytecount length,
+ int no_need_to_copy_data)
+{
+ Lisp_Object name = make_pure_string (data, length, Qnil,
+ no_need_to_copy_data);
+ bump_purestat (&purestat_string_pname, pure_sizeof (name));
+
+ /* We've made (at least) Qnil now, and Vobarray will soon be set up. */
+ symbols_initialized = 1;
+
+ return name;
+}
+
+
+Lisp_Object
+pure_cons (Lisp_Object car, Lisp_Object cdr)
+{
+ Lisp_Object new;
+ struct Lisp_Cons *c;
+
+ if (!check_purespace (sizeof (struct Lisp_Cons)))
+ return Fcons (Fpurecopy (car), Fpurecopy (cdr));
+
+ c = (struct Lisp_Cons *) (PUREBEG + pure_bytes_used);
+#ifdef LRECORD_CONS
+ set_lheader_implementation (&(c->lheader), lrecord_cons);
+#ifdef USE_INDEXED_LRECORD_IMPLEMENTATION
+ c->lheader.pure = 1;
+#endif
+#endif
+ pure_bytes_used += sizeof (struct Lisp_Cons);
+ bump_purestat (&purestat_cons, sizeof (struct Lisp_Cons));
+
+ c->car = Fpurecopy (car);
+ c->cdr = Fpurecopy (cdr);
+ XSETCONS (new, c);
+ return new;
+}
+
+Lisp_Object
+pure_list (int nargs, Lisp_Object *args)
+{
+ Lisp_Object val = Qnil;
+
+ for (--nargs; nargs >= 0; nargs--)
+ val = pure_cons (args[nargs], val);
+
+ return val;
+}
+
+#ifdef LISP_FLOAT_TYPE
+
+static Lisp_Object
+make_pure_float (double num)
+{
+ struct Lisp_Float *f;
+ Lisp_Object val;
+
+ /* Make sure that PUREBEG + pure_bytes_used is aligned on at least a sizeof
+ (double) boundary. Some architectures (like the sparc) require
+ this, and I suspect that floats are rare enough that it's no
+ tragedy for those that don't. */
+ {
+#if defined (__GNUC__) && (__GNUC__ >= 2)
+ /* In gcc, we can directly ask what the alignment constraints of a
+ structure are, but in general, that's not possible... Arrgh!!
+ */
+ int alignment = __alignof (struct Lisp_Float);
+#else /* !GNUC */
+ /* Best guess is to make the `double' slot be aligned to the size
+ of double (which is probably 8 bytes). This assumes that it's
+ ok to align the beginning of the structure to the same boundary
+ that the `double' slot in it is supposed to be aligned to; this
+ should be ok because presumably there is padding in the layout
+ of the struct to account for this.
+ */
+ int alignment = sizeof (float_data (f));
+#endif /* !GNUC */
+ char *p = ((char *) PUREBEG + pure_bytes_used);
+
+ p = (char *) (((EMACS_UINT) p + alignment - 1) & - alignment);
+ pure_bytes_used = p - (char *) PUREBEG;
+ }
+
+ if (!check_purespace (sizeof (struct Lisp_Float)))
+ return make_float (num);
+
+ f = (struct Lisp_Float *) (PUREBEG + pure_bytes_used);
+ set_lheader_implementation (&(f->lheader), lrecord_float);
+#ifdef USE_INDEXED_LRECORD_IMPLEMENTATION
+ f->lheader.pure = 1;
+#endif
+ pure_bytes_used += sizeof (struct Lisp_Float);
+ bump_purestat (&purestat_float, sizeof (struct Lisp_Float));
+
+ float_data (f) = num;
+ XSETFLOAT (val, f);
+ return val;
+}
+
+#endif /* LISP_FLOAT_TYPE */
+
+Lisp_Object
+make_pure_vector (size_t len, Lisp_Object init)
+{
+ Lisp_Object new;
+ struct Lisp_Vector *v;
+ size_t size = (sizeof (struct Lisp_Vector)
+ + (len - 1) * sizeof (Lisp_Object));
+
+ init = Fpurecopy (init);
+
+ if (!check_purespace (size))
+ return make_vector (len, init);
+
+ v = (struct Lisp_Vector *) (PUREBEG + pure_bytes_used);
+#ifdef LRECORD_VECTOR
+ set_lheader_implementation (&(v->header.lheader), lrecord_vector);
+#ifdef USE_INDEXED_LRECORD_IMPLEMENTATION
+ v->header.lheader.pure = 1;
+#endif
+#endif
+ pure_bytes_used += size;
+ bump_purestat (&purestat_vector_all, size);
+
+ v->size = len;
+
+ for (size = 0; size < len; size++)
+ v->contents[size] = init;
+
+ XSETVECTOR (new, v);
+ return new;
+}
+
+#if 0
+/* Presently unused */
+void *
+alloc_pure_lrecord (int size, struct lrecord_implementation *implementation)
+{
+ struct lrecord_header *header = (void *) (PUREBEG + pure_bytes_used);
+
+ if (pure_bytes_used + size > get_PURESIZE())
+ pure_storage_exhausted ();
+
+ set_lheader_implementation (header, implementation);
+ header->next = 0;
+ return header;
+}
+#endif /* unused */
+
+
+\f
+DEFUN ("purecopy", Fpurecopy, 1, 1, 0, /*
+Make a copy of OBJECT in pure storage.
+Recursively copies contents of vectors and cons cells.
+Does not copy symbols.
+*/
+ (obj))
+{
+ int i;
+ if (!purify_flag)
+ return obj;
+
+ if (!POINTER_TYPE_P (XTYPE (obj))
+ || PURIFIED (XPNTR (obj))
+ /* happens when bootstrapping Qnil */
+ || EQ (obj, Qnull_pointer))
+ return obj;
+
+ switch (XTYPE (obj))
+ {
+#ifndef LRECORD_CONS
+ case Lisp_Type_Cons:
+ return pure_cons (XCAR (obj), XCDR (obj));
+#endif
+
+#ifndef LRECORD_STRING
+ case Lisp_Type_String:
+ return make_pure_string (XSTRING_DATA (obj),
+ XSTRING_LENGTH (obj),
+ XSTRING (obj)->plist,
+ 0);
+#endif /* ! LRECORD_STRING */
+
+#ifndef LRECORD_VECTOR
+ case Lisp_Type_Vector:
+ {
+ struct Lisp_Vector *o = XVECTOR (obj);
+ Lisp_Object new = make_pure_vector (vector_length (o), Qnil);
+ for (i = 0; i < vector_length (o); i++)
+ XVECTOR_DATA (new)[i] = Fpurecopy (o->contents[i]);
+ return new;
+ }
+#endif /* !LRECORD_VECTOR */
+
+ default:
+ {
+ if (COMPILED_FUNCTIONP (obj))
+ {
+ struct Lisp_Compiled_Function *o = XCOMPILED_FUNCTION (obj);
+ Lisp_Object new = make_compiled_function (1);
+ /* How on earth could this code have worked before? -sb */
+ struct Lisp_Compiled_Function *n = XCOMPILED_FUNCTION (new);
+ n->flags = o->flags;
+ n->bytecodes = Fpurecopy (o->bytecodes);
+ n->constants = Fpurecopy (o->constants);
+ n->arglist = Fpurecopy (o->arglist);
+ n->doc_and_interactive = Fpurecopy (o->doc_and_interactive);
+ n->maxdepth = o->maxdepth;
+ return new;
+ }
+#ifdef LRECORD_CONS
+ else if (CONSP (obj))
+ return pure_cons (XCAR (obj), XCDR (obj));
+#endif /* LRECORD_CONS */
+#ifdef LRECORD_VECTOR
+ else if (VECTORP (obj))
+ {
+ struct Lisp_Vector *o = XVECTOR (obj);
+ Lisp_Object new = make_pure_vector (vector_length (o), Qnil);
+ for (i = 0; i < vector_length (o); i++)
+ XVECTOR_DATA (new)[i] = Fpurecopy (o->contents[i]);
+ return new;
+ }
+#endif /* LRECORD_VECTOR */
+#ifdef LRECORD_STRING
+ else if (STRINGP (obj))
+ {
+ return make_pure_string (XSTRING_DATA (obj),
+ XSTRING_LENGTH (obj),
+ XSTRING (obj)->plist,
+ 0);
+ }
+#endif /* LRECORD_STRING */
+#ifdef LISP_FLOAT_TYPE
+ else if (FLOATP (obj))
+ return make_pure_float (float_data (XFLOAT (obj)));
+#endif /* LISP_FLOAT_TYPE */
+ else if (SYMBOLP (obj))
+ {
+ /*
+ * Symbols can't be made pure (and thus read-only),
+ * because assigning to their function, value or plist
+ * slots would produced a SEGV in the dumped XEmacs. So
+ * we previously would just return the symbol unchanged.
+ *
+ * But purified aggregate objects like lists and vectors
+ * can contain uninterned symbols. If there are no
+ * other non-pure references to the symbol, then the
+ * symbol is not protected from garbage collection
+ * because the collector does not mark the contents of
+ * purified objects. So to protect the symbols, an impure
+ * reference has to be kept for each uninterned symbol
+ * that is referenced by a pure object. All such
+ * symbols are stored in the hashtable pointed to by
+ * Vpure_uninterned_symbol_table, which is itself
+ * staticpro'd.
+ */
+ if (!NILP (XSYMBOL (obj)->obarray))
+ return obj;
+ Fputhash (obj, Qnil, Vpure_uninterned_symbol_table);
+ return obj;
+ }
+ else
+ signal_simple_error ("Can't purecopy %S", obj);
+ }
+ }
return obj;
}
\f
-/************************************************************************/
-/* Garbage Collection */
-/************************************************************************/
+static void
+puresize_adjust_h (size_t puresize)
+{
+ FILE *stream = fopen ("puresize-adjust.h", "w");
+
+ if (stream == NULL)
+ report_file_error ("Opening puresize adjustment file",
+ Fcons (build_string ("puresize-adjust.h"), Qnil));
+
+ fprintf (stream,
+ "/*\tDo not edit this file!\n"
+ "\tAutomatically generated by XEmacs */\n"
+ "# define PURESIZE_ADJUSTMENT (%ld)\n",
+ (long) (puresize - RAW_PURESIZE));
+ fclose (stream);
+}
-/* This will be used more extensively In The Future */
-static int last_lrecord_type_index_assigned;
+void
+report_pure_usage (int report_impurities,
+ int die_if_pure_storage_exceeded)
+{
+ int rc = 0;
-CONST struct lrecord_implementation *lrecord_implementations_table[128];
-#define max_lrecord_type (countof (lrecord_implementations_table) - 1)
+ if (pure_lossage)
+ {
+ message ("\n****\tPure Lisp storage exhausted!\n"
+ "\tPurespace usage: %ld of %ld\n"
+ "****",
+ (long) get_PURESIZE() + pure_lossage,
+ (long) get_PURESIZE());
+ if (die_if_pure_storage_exceeded)
+ {
+ puresize_adjust_h (get_PURESIZE() + pure_lossage);
+#ifdef HEAP_IN_DATA
+ sheap_adjust_h();
+#endif
+ rc = -1;
+ }
+ }
+ else
+ {
+ size_t lost = (get_PURESIZE() - pure_bytes_used) / 1024;
+ char buf[200];
+ /* extern Lisp_Object Vemacs_beta_version; */
+ /* This used to be NILP(Vemacs_beta_version) ? 512 : 4; */
+#ifndef PURESIZE_SLOP
+#define PURESIZE_SLOP 0
+#endif
+ size_t slop = PURESIZE_SLOP;
+
+ sprintf (buf, "Purespace usage: %ld of %ld (%d%%",
+ (long) pure_bytes_used,
+ (long) get_PURESIZE(),
+ (int) (pure_bytes_used / (get_PURESIZE() / 100.0) + 0.5));
+ if (lost > ((slop ? slop : 1) / 1024)) {
+ sprintf (buf + strlen (buf), " -- %ldk wasted", (long)lost);
+ if (die_if_pure_storage_exceeded) {
+ puresize_adjust_h (pure_bytes_used + slop);
+#ifdef HEAP_IN_DATA
+ sheap_adjust_h();
+#endif
+ rc = -1;
+ }
+ }
+
+ strcat (buf, ").");
+ message ("%s", buf);
+ }
+
+#ifdef PURESTAT
+
+ purestat_vector_other.nbytes =
+ purestat_vector_all.nbytes -
+ purestat_vector_bytecode_constants.nbytes;
+ purestat_vector_other.nobjects =
+ purestat_vector_all.nobjects -
+ purestat_vector_bytecode_constants.nobjects;
+
+ purestat_string_other.nbytes =
+ purestat_string_all.nbytes -
+ (purestat_string_pname.nbytes +
+ purestat_string_bytecodes.nbytes +
+ purestat_string_interactive.nbytes +
+ purestat_string_documentation.nbytes +
+#ifdef I18N3
+ purestat_string_domain.nbytes +
+#endif
+ purestat_string_other_function.nbytes);
+
+ purestat_string_other.nobjects =
+ purestat_string_all.nobjects -
+ (purestat_string_pname.nobjects +
+ purestat_string_bytecodes.nobjects +
+ purestat_string_interactive.nobjects +
+ purestat_string_documentation.nobjects +
+#ifdef I18N3
+ purestat_string_domain.nobjects +
+#endif
+ purestat_string_other_function.nobjects);
+
+ message (" %-26s Total Bytes", "");
+
+ {
+ int j;
+
+ for (j = 0; j < countof (purestats); j++)
+ if (!purestats[j])
+ clear_message ();
+ else
+ {
+ char buf [100];
+ sprintf(buf, "%s:", purestats[j]->name);
+ message (" %-26s %5d %7d %2d%%",
+ buf,
+ purestats[j]->nobjects,
+ purestats[j]->nbytes,
+ (int) (purestats[j]->nbytes / (pure_bytes_used / 100.0) + 0.5));
+ }
+ }
+#endif /* PURESTAT */
+
+
+ if (report_impurities)
+ {
+ Lisp_Object tem = Felt (Fgarbage_collect (), make_int (5));
+ struct gcpro gcpro1;
+ GCPRO1 (tem);
+ message ("\nImpurities:");
+ while (!NILP (tem))
+ {
+ if (CONSP (tem) && SYMBOLP (Fcar (tem)) && CONSP (Fcdr (tem)))
+ {
+ int total = XINT (Fcar (Fcdr (tem)));
+ if (total > 0)
+ {
+ char buf [100];
+ char *s = buf;
+ memcpy (buf, string_data (XSYMBOL (Fcar (tem))->name),
+ string_length (XSYMBOL (Fcar (tem))->name) + 1);
+ while (*s++) if (*s == '-') *s = ' ';
+ s--; *s++ = ':'; *s = 0;
+ message (" %-33s %6d", buf, total);
+ }
+ tem = Fcdr (Fcdr (tem));
+ }
+ else /* WTF?! */
+ {
+ Fprin1 (tem, Qexternal_debugging_output);
+ tem = Qnil;
+ }
+ }
+ UNGCPRO;
+ garbage_collect_1 (); /* GC garbage_collect's garbage */
+ }
+ clear_message ();
+
+ if (rc < 0) {
+ unlink("SATISFIED");
+ fatal ("Pure size adjusted, Don't Panic! I will restart the `make'");
+ } else if (pure_lossage && die_if_pure_storage_exceeded) {
+ fatal ("Pure storage exhausted");
+ }
+}
+
+\f
+/**********************************************************************/
+/* staticpro */
+/**********************************************************************/
struct gcpro *gcprolist;
{
tail_recurse:
-#ifdef ERROR_CHECK_GC
- assert (! (GC_EQ (obj, Qnull_pointer)));
-#endif
- /* Checks we used to perform */
- /* if (EQ (obj, Qnull_pointer)) return; */
- /* if (!POINTER_TYPE_P (XGCTYPE (obj))) return; */
- /* if (PURIFIED (XPNTR (obj))) return; */
-
- if (XGCTYPE (obj) == Lisp_Type_Record)
+ if (EQ (obj, Qnull_pointer))
+ return;
+ if (!POINTER_TYPE_P (XGCTYPE (obj)))
+ return;
+ if (PURIFIED (XPNTR (obj)))
+ return;
+ switch (XGCTYPE (obj))
{
- struct lrecord_header *lheader = XRECORD_LHEADER (obj);
-#if defined (ERROR_CHECK_GC)
- assert (lheader->type <= last_lrecord_type_index_assigned);
+#ifndef LRECORD_CONS
+ case Lisp_Type_Cons:
+ {
+ struct Lisp_Cons *ptr = XCONS (obj);
+ if (CONS_MARKED_P (ptr))
+ break;
+ MARK_CONS (ptr);
+ /* If the cdr is nil, tail-recurse on the car. */
+ if (NILP (ptr->cdr))
+ {
+ obj = ptr->car;
+ }
+ else
+ {
+ mark_object (ptr->car);
+ obj = ptr->cdr;
+ }
+ goto tail_recurse;
+ }
#endif
- if (C_READONLY_RECORD_HEADER_P (lheader))
- return;
- if (! MARKED_RECORD_HEADER_P (lheader) &&
- ! UNMARKABLE_RECORD_HEADER_P (lheader))
- {
- CONST struct lrecord_implementation *implementation =
- LHEADER_IMPLEMENTATION (lheader);
- MARK_RECORD_HEADER (lheader);
+ case Lisp_Type_Record:
+ /* case Lisp_Symbol_Value_Magic: */
+ {
+ struct lrecord_header *lheader = XRECORD_LHEADER (obj);
+ CONST struct lrecord_implementation *implementation
+ = LHEADER_IMPLEMENTATION (lheader);
+
+ if (! MARKED_RECORD_HEADER_P (lheader) &&
+ ! UNMARKABLE_RECORD_HEADER_P (lheader))
+ {
+ MARK_RECORD_HEADER (lheader);
#ifdef ERROR_CHECK_GC
- if (!implementation->basic_p)
- assert (! ((struct lcrecord_header *) lheader)->free);
+ if (!implementation->basic_p)
+ assert (! ((struct lcrecord_header *) lheader)->free);
#endif
- if (implementation->marker)
+ if (implementation->marker != 0)
+ {
+ obj = ((implementation->marker) (obj, mark_object));
+ if (!NILP (obj)) goto tail_recurse;
+ }
+ }
+ }
+ break;
+
+#ifndef LRECORD_STRING
+ case Lisp_Type_String:
+ {
+ struct Lisp_String *ptr = XSTRING (obj);
+
+ if (!XMARKBIT (ptr->plist))
+ {
+ if (CONSP (ptr->plist) &&
+ EXTENT_INFOP (XCAR (ptr->plist)))
+ flush_cached_extent_info (XCAR (ptr->plist));
+ XMARK (ptr->plist);
+ obj = ptr->plist;
+ goto tail_recurse;
+ }
+ }
+ break;
+#endif /* ! LRECORD_STRING */
+
+#ifndef LRECORD_VECTOR
+ case Lisp_Type_Vector:
+ {
+ struct Lisp_Vector *ptr = XVECTOR (obj);
+ int len = vector_length (ptr);
+ int i;
+
+ if (len < 0)
+ break; /* Already marked */
+ ptr->size = -1 - len; /* Else mark it */
+ for (i = 0; i < len - 1; i++) /* and then mark its elements */
+ mark_object (ptr->contents[i]);
+ if (len > 0)
+ {
+ obj = ptr->contents[len - 1];
+ goto tail_recurse;
+ }
+ }
+ break;
+#endif /* !LRECORD_VECTOR */
+
+#ifndef LRECORD_SYMBOL
+ case Lisp_Type_Symbol:
+ {
+ struct Lisp_Symbol *sym = XSYMBOL (obj);
+
+ while (!XMARKBIT (sym->plist))
+ {
+ XMARK (sym->plist);
+ mark_object (sym->value);
+ mark_object (sym->function);
{
- obj = implementation->marker (obj, mark_object);
- if (!GC_NILP (obj)) goto tail_recurse;
+ /*
+ * symbol->name is a struct Lisp_String *, not a
+ * Lisp_Object. Fix it up and pass to mark_object.
+ */
+ Lisp_Object symname;
+ XSETSTRING(symname, sym->name);
+ mark_object(symname);
}
- }
+ if (!symbol_next (sym))
+ {
+ obj = sym->plist;
+ goto tail_recurse;
+ }
+ mark_object (sym->plist);
+ /* Mark the rest of the symbols in the hash-chain */
+ sym = symbol_next (sym);
+ }
+ }
+ break;
+#endif /* !LRECORD_SYMBOL */
+
+ default:
+ abort ();
}
}
}
\f
+#ifdef PURESTAT
+/* Simpler than mark-object, because pure structure can't
+ have any circularities */
+
+#if 0 /* unused */
+static int idiot_c_doesnt_have_closures;
+static void
+idiot_c (Lisp_Object obj)
+{
+ idiot_c_doesnt_have_closures += pure_sizeof (obj, 1);
+}
+#endif /* unused */
+
+static size_t
+pure_string_sizeof (Lisp_Object obj)
+{
+ struct Lisp_String *ptr = XSTRING (obj);
+
+ if (string_data (ptr) != (Bufbyte *) ptr + sizeof (*ptr))
+ {
+ /* string-data not allocated contiguously.
+ Probably (better be!!) a pointer constant "C" data. */
+ return sizeof (*ptr);
+ }
+ else
+ {
+ size_t size = sizeof (*ptr) + string_length (ptr) + 1;
+ size = ALIGN_SIZE (size, sizeof (Lisp_Object));
+ return size;
+ }
+}
+
+/* recurse arg isn't actually used */
+static size_t
+pure_sizeof (Lisp_Object obj /*, int recurse */)
+{
+ size_t total = 0;
+
+ /*tail_recurse: */
+ if (!POINTER_TYPE_P (XTYPE (obj))
+ || !PURIFIED (XPNTR (obj)))
+ return total;
+
+ /* symbol's sizes are accounted for separately */
+ if (SYMBOLP (obj))
+ return total;
+
+ switch (XTYPE (obj))
+ {
+
+#ifndef LRECORD_STRING
+ case Lisp_Type_String:
+ total += pure_string_sizeof (obj);
+ break;
+#endif /* ! LRECORD_STRING */
+
+#ifndef LRECORD_VECTOR
+ case Lisp_Type_Vector:
+ {
+ struct Lisp_Vector *ptr = XVECTOR (obj);
+ int len = vector_length (ptr);
+
+ total += (sizeof (struct Lisp_Vector)
+ + (len - 1) * sizeof (Lisp_Object));
+#if 0 /* unused */
+ if (!recurse)
+ break;
+ {
+ int i;
+ for (i = 0; i < len - 1; i++)
+ total += pure_sizeof (ptr->contents[i], 1);
+ }
+ if (len > 0)
+ {
+ obj = ptr->contents[len - 1];
+ goto tail_recurse;
+ }
+#endif /* unused */
+ }
+ break;
+#endif /* !LRECORD_VECTOR */
+
+ case Lisp_Type_Record:
+ {
+ struct lrecord_header *lheader = XRECORD_LHEADER (obj);
+ CONST struct lrecord_implementation *implementation
+ = LHEADER_IMPLEMENTATION (lheader);
+
+#ifdef LRECORD_STRING
+ if (STRINGP (obj))
+ total += pure_string_sizeof (obj);
+ else
+#endif
+ if (implementation->size_in_bytes_method)
+ total += ((implementation->size_in_bytes_method) (lheader));
+ else
+ total += implementation->static_size;
+
+#if 0 /* unused */
+ if (!recurse)
+ break;
+
+ if (implementation->marker != 0)
+ {
+ int old = idiot_c_doesnt_have_closures;
+
+ idiot_c_doesnt_have_closures = 0;
+ obj = ((implementation->marker) (obj, idiot_c));
+ total += idiot_c_doesnt_have_closures;
+ idiot_c_doesnt_have_closures = old;
+
+ if (!NILP (obj)) goto tail_recurse;
+ }
+#endif /* unused */
+ }
+ break;
+
+#ifndef LRECORD_CONS
+ case Lisp_Type_Cons:
+ {
+ struct Lisp_Cons *ptr = XCONS (obj);
+ total += sizeof (*ptr);
+#if 0 /* unused */
+ if (!recurse)
+ break;
+ /* If the cdr is nil, tail-recurse on the car. */
+ if (NILP (ptr->cdr))
+ {
+ obj = ptr->car;
+ }
+ else
+ {
+ total += pure_sizeof (ptr->car, 1);
+ obj = ptr->cdr;
+ }
+ goto tail_recurse;
+#endif /* unused */
+ }
+ break;
+#endif
+
+ /* Others can't be purified */
+ default:
+ abort ();
+ }
+ return total;
+}
+#endif /* PURESTAT */
+
+
+
+\f
/* Find all structures not marked, and free them. */
+#ifndef LRECORD_VECTOR
+static int gc_count_num_vector_used, gc_count_vector_total_size;
+static int gc_count_vector_storage;
+#endif
static int gc_count_num_bit_vector_used, gc_count_bit_vector_total_size;
static int gc_count_bit_vector_storage;
static int gc_count_num_short_string_in_use;
/* static int gc_count_total_records_used, gc_count_records_total_size; */
\f
+/* This will be used more extensively In The Future */
+static int last_lrecord_type_index_assigned;
+
+CONST struct lrecord_implementation *lrecord_implementations_table[128];
+#define max_lrecord_type (countof (lrecord_implementations_table) - 1)
+
int
lrecord_type_index (CONST struct lrecord_implementation *implementation)
{
if (type_index < 0 || type_index > max_lrecord_type
|| lrecord_implementations_table[type_index] != implementation)
{
- assert (last_lrecord_type_index_assigned < max_lrecord_type);
+ if (last_lrecord_type_index_assigned == max_lrecord_type)
+ abort ();
type_index = ++last_lrecord_type_index_assigned;
lrecord_implementations_table[type_index] = implementation;
*(implementation->lrecord_type_index) = type_index;
int instances_on_free_list;
} lcrecord_stats [countof (lrecord_implementations_table)];
+
+static void
+reset_lcrecord_stats (void)
+{
+ int i;
+ for (i = 0; i < countof (lcrecord_stats); i++)
+ {
+ lcrecord_stats[i].instances_in_use = 0;
+ lcrecord_stats[i].bytes_in_use = 0;
+ lcrecord_stats[i].instances_freed = 0;
+ lcrecord_stats[i].bytes_freed = 0;
+ lcrecord_stats[i].instances_on_free_list = 0;
+ }
+}
+
static void
tick_lcrecord_stats (CONST struct lrecord_header *h, int free_p)
{
else
{
size_t sz = (implementation->size_in_bytes_method
- ? implementation->size_in_bytes_method (h)
+ ? ((implementation->size_in_bytes_method) (h))
: implementation->static_size);
if (free_p)
struct lcrecord_header *header;
int num_used = 0;
/* int total_size = 0; */
-
- xzero (lcrecord_stats); /* Reset all statistics to 0. */
+ reset_lcrecord_stats ();
/* First go through and call all the finalize methods.
Then go through and free the objects. There used to
for (header = *prev; header; header = header->next)
{
struct lrecord_header *h = &(header->lheader);
- if (!C_READONLY_RECORD_HEADER_P(h)
- && !MARKED_RECORD_HEADER_P (h)
- && ! (header->free))
+ if (!MARKED_RECORD_HEADER_P (h) && ! (header->free))
{
if (LHEADER_IMPLEMENTATION (h)->finalizer)
- LHEADER_IMPLEMENTATION (h)->finalizer (h, 0);
+ ((LHEADER_IMPLEMENTATION (h)->finalizer) (h, 0));
}
}
for (header = *prev; header; )
{
struct lrecord_header *h = &(header->lheader);
- if (C_READONLY_RECORD_HEADER_P(h) || MARKED_RECORD_HEADER_P (h))
+ if (MARKED_RECORD_HEADER_P (h))
{
- if (MARKED_RECORD_HEADER_P (h))
- UNMARK_RECORD_HEADER (h);
+ UNMARK_RECORD_HEADER (h);
num_used++;
- /* total_size += n->implementation->size_in_bytes (h);*/
- /* ### May modify header->next on a C_READONLY lcrecord */
+ /* total_size += ((n->implementation->size_in_bytes) (h));*/
prev = &(header->next);
header = *prev;
tick_lcrecord_stats (h, 0);
/* *total = total_size; */
}
+#ifndef LRECORD_VECTOR
+
+static void
+sweep_vectors_1 (Lisp_Object *prev,
+ int *used, int *total, int *storage)
+{
+ Lisp_Object vector;
+ int num_used = 0;
+ int total_size = 0;
+ int total_storage = 0;
+
+ for (vector = *prev; VECTORP (vector); )
+ {
+ struct Lisp_Vector *v = XVECTOR (vector);
+ int len = v->size;
+ if (len < 0) /* marked */
+ {
+ len = - (len + 1);
+ v->size = len;
+ total_size += len;
+ total_storage += (MALLOC_OVERHEAD
+ + sizeof (struct Lisp_Vector)
+ + (len - 1 + 1) * sizeof (Lisp_Object));
+ num_used++;
+ prev = &(vector_next (v));
+ vector = *prev;
+ }
+ else
+ {
+ Lisp_Object next = vector_next (v);
+ *prev = next;
+ xfree (v);
+ vector = next;
+ }
+ }
+ *used = num_used;
+ *total = total_size;
+ *storage = total_storage;
+}
+
+#endif /* ! LRECORD_VECTOR */
static void
sweep_bit_vectors_1 (Lisp_Object *prev,
their implementation */
for (bit_vector = *prev; !EQ (bit_vector, Qzero); )
{
- Lisp_Bit_Vector *v = XBIT_VECTOR (bit_vector);
+ struct Lisp_Bit_Vector *v = XBIT_VECTOR (bit_vector);
int len = v->size;
- if (C_READONLY_RECORD_HEADER_P(&(v->lheader)) || MARKED_RECORD_P (bit_vector))
+ if (MARKED_RECORD_P (bit_vector))
{
- if (MARKED_RECORD_P (bit_vector))
- UNMARK_RECORD_HEADER (&(v->lheader));
+ UNMARK_RECORD_HEADER (&(v->lheader));
total_size += len;
- total_storage +=
- MALLOC_OVERHEAD +
- STRETCHY_STRUCT_SIZEOF (Lisp_Bit_Vector, bits,
- BIT_VECTOR_LONG_STORAGE (len));
+ total_storage += (MALLOC_OVERHEAD
+ + sizeof (struct Lisp_Bit_Vector)
+ + (BIT_VECTOR_LONG_STORAGE (len) - 1)
+ * sizeof (long));
num_used++;
- /* ### May modify next on a C_READONLY bitvector */
prev = &(bit_vector_next (v));
bit_vector = *prev;
}
#define SWEEP_FIXED_TYPE_BLOCK(typename, obj_type) \
do { \
- struct typename##_block *SFTB_current; \
- struct typename##_block **SFTB_prev; \
- int SFTB_limit; \
+ struct typename##_block *_frob_current; \
+ struct typename##_block **_frob_prev; \
+ int _frob_limit; \
int num_free = 0, num_used = 0; \
\
- for (SFTB_prev = ¤t_##typename##_block, \
- SFTB_current = current_##typename##_block, \
- SFTB_limit = current_##typename##_block_index; \
- SFTB_current; \
+ for (_frob_prev = ¤t_##typename##_block, \
+ _frob_current = current_##typename##_block, \
+ _frob_limit = current_##typename##_block_index; \
+ _frob_current; \
) \
{ \
- int SFTB_iii; \
+ int _frob_iii; \
\
- for (SFTB_iii = 0; SFTB_iii < SFTB_limit; SFTB_iii++) \
+ for (_frob_iii = 0; _frob_iii < _frob_limit; _frob_iii++) \
{ \
- obj_type *SFTB_victim = &(SFTB_current->block[SFTB_iii]); \
+ obj_type *_frob_victim = &(_frob_current->block[_frob_iii]); \
\
- if (FREE_STRUCT_P (SFTB_victim)) \
+ if (FREE_STRUCT_P (_frob_victim)) \
{ \
num_free++; \
} \
- else if (C_READONLY_RECORD_HEADER_P (&SFTB_victim->lheader)) \
- { \
- num_used++; \
- } \
- else if (!MARKED_RECORD_HEADER_P (&SFTB_victim->lheader)) \
+ else if (!MARKED_##typename##_P (_frob_victim)) \
{ \
num_free++; \
- FREE_FIXED_TYPE (typename, obj_type, SFTB_victim); \
+ FREE_FIXED_TYPE (typename, obj_type, _frob_victim); \
} \
else \
{ \
num_used++; \
- UNMARK_##typename (SFTB_victim); \
+ UNMARK_##typename (_frob_victim); \
} \
} \
- SFTB_prev = &(SFTB_current->prev); \
- SFTB_current = SFTB_current->prev; \
- SFTB_limit = countof (current_##typename##_block->block); \
+ _frob_prev = &(_frob_current->prev); \
+ _frob_current = _frob_current->prev; \
+ _frob_limit = countof (current_##typename##_block->block); \
} \
\
gc_count_num_##typename##_in_use = num_used; \
#else /* !ERROR_CHECK_GC */
-#define SWEEP_FIXED_TYPE_BLOCK(typename, obj_type) \
-do { \
- struct typename##_block *SFTB_current; \
- struct typename##_block **SFTB_prev; \
- int SFTB_limit; \
- int num_free = 0, num_used = 0; \
- \
- typename##_free_list = 0; \
- \
- for (SFTB_prev = ¤t_##typename##_block, \
- SFTB_current = current_##typename##_block, \
- SFTB_limit = current_##typename##_block_index; \
- SFTB_current; \
- ) \
- { \
- int SFTB_iii; \
- int SFTB_empty = 1; \
- obj_type *SFTB_old_free_list = typename##_free_list; \
- \
- for (SFTB_iii = 0; SFTB_iii < SFTB_limit; SFTB_iii++) \
- { \
- obj_type *SFTB_victim = &(SFTB_current->block[SFTB_iii]); \
- \
- if (FREE_STRUCT_P (SFTB_victim)) \
- { \
- num_free++; \
- PUT_FIXED_TYPE_ON_FREE_LIST (typename, obj_type, SFTB_victim); \
- } \
- else if (C_READONLY_RECORD_HEADER_P (&SFTB_victim->lheader)) \
- { \
- SFTB_empty = 0; \
- num_used++; \
- } \
- else if (!MARKED_RECORD_HEADER_P (&SFTB_victim->lheader)) \
- { \
- num_free++; \
- FREE_FIXED_TYPE (typename, obj_type, SFTB_victim); \
- } \
- else \
- { \
- SFTB_empty = 0; \
- num_used++; \
- UNMARK_##typename (SFTB_victim); \
- } \
- } \
- if (!SFTB_empty) \
- { \
- SFTB_prev = &(SFTB_current->prev); \
- SFTB_current = SFTB_current->prev; \
- } \
- else if (SFTB_current == current_##typename##_block \
- && !SFTB_current->prev) \
- { \
- /* No real point in freeing sole allocation block */ \
- break; \
- } \
- else \
- { \
- struct typename##_block *SFTB_victim_block = SFTB_current; \
- if (SFTB_victim_block == current_##typename##_block) \
- current_##typename##_block_index \
- = countof (current_##typename##_block->block); \
- SFTB_current = SFTB_current->prev; \
- { \
- *SFTB_prev = SFTB_current; \
- xfree (SFTB_victim_block); \
- /* Restore free list to what it was before victim was swept */ \
- typename##_free_list = SFTB_old_free_list; \
- num_free -= SFTB_limit; \
- } \
- } \
- SFTB_limit = countof (current_##typename##_block->block); \
- } \
- \
- gc_count_num_##typename##_in_use = num_used; \
- gc_count_num_##typename##_freelist = num_free; \
+#define SWEEP_FIXED_TYPE_BLOCK(typename, obj_type) \
+do { \
+ struct typename##_block *_frob_current; \
+ struct typename##_block **_frob_prev; \
+ int _frob_limit; \
+ int num_free = 0, num_used = 0; \
+ \
+ typename##_free_list = 0; \
+ \
+ for (_frob_prev = ¤t_##typename##_block, \
+ _frob_current = current_##typename##_block, \
+ _frob_limit = current_##typename##_block_index; \
+ _frob_current; \
+ ) \
+ { \
+ int _frob_iii; \
+ int _frob_empty = 1; \
+ obj_type *_frob_old_free_list = typename##_free_list; \
+ \
+ for (_frob_iii = 0; _frob_iii < _frob_limit; _frob_iii++) \
+ { \
+ obj_type *_frob_victim = &(_frob_current->block[_frob_iii]); \
+ \
+ if (FREE_STRUCT_P (_frob_victim)) \
+ { \
+ num_free++; \
+ PUT_FIXED_TYPE_ON_FREE_LIST (typename, obj_type, _frob_victim); \
+ } \
+ else if (!MARKED_##typename##_P (_frob_victim)) \
+ { \
+ num_free++; \
+ FREE_FIXED_TYPE (typename, obj_type, _frob_victim); \
+ } \
+ else \
+ { \
+ _frob_empty = 0; \
+ num_used++; \
+ UNMARK_##typename (_frob_victim); \
+ } \
+ } \
+ if (!_frob_empty) \
+ { \
+ _frob_prev = &(_frob_current->prev); \
+ _frob_current = _frob_current->prev; \
+ } \
+ else if (_frob_current == current_##typename##_block \
+ && !_frob_current->prev) \
+ { \
+ /* No real point in freeing sole allocation block */ \
+ break; \
+ } \
+ else \
+ { \
+ struct typename##_block *_frob_victim_block = _frob_current; \
+ if (_frob_victim_block == current_##typename##_block) \
+ current_##typename##_block_index \
+ = countof (current_##typename##_block->block); \
+ _frob_current = _frob_current->prev; \
+ { \
+ *_frob_prev = _frob_current; \
+ xfree (_frob_victim_block); \
+ /* Restore free list to what it was before victim was swept */ \
+ typename##_free_list = _frob_old_free_list; \
+ num_free -= _frob_limit; \
+ } \
+ } \
+ _frob_limit = countof (current_##typename##_block->block); \
+ } \
+ \
+ gc_count_num_##typename##_in_use = num_used; \
+ gc_count_num_##typename##_freelist = num_free; \
} while (0)
#endif /* !ERROR_CHECK_GC */
static void
sweep_conses (void)
{
-#define UNMARK_cons(ptr) UNMARK_RECORD_HEADER (&((ptr)->lheader))
+#ifndef LRECORD_CONS
+# define MARKED_cons_P(ptr) XMARKBIT ((ptr)->car)
+# define UNMARK_cons(ptr) do { XUNMARK ((ptr)->car); } while (0)
+#else /* LRECORD_CONS */
+# define MARKED_cons_P(ptr) MARKED_RECORD_HEADER_P (&((ptr)->lheader))
+# define UNMARK_cons(ptr) UNMARK_RECORD_HEADER (&((ptr)->lheader))
+#endif /* LRECORD_CONS */
#define ADDITIONAL_FREE_cons(ptr)
SWEEP_FIXED_TYPE_BLOCK (cons, struct Lisp_Cons);
static void
sweep_compiled_functions (void)
{
+#define MARKED_compiled_function_P(ptr) \
+ MARKED_RECORD_HEADER_P (&((ptr)->lheader))
#define UNMARK_compiled_function(ptr) UNMARK_RECORD_HEADER (&((ptr)->lheader))
#define ADDITIONAL_FREE_compiled_function(ptr)
- SWEEP_FIXED_TYPE_BLOCK (compiled_function, Lisp_Compiled_Function);
+ SWEEP_FIXED_TYPE_BLOCK (compiled_function, struct Lisp_Compiled_Function);
}
static void
sweep_floats (void)
{
+#define MARKED_float_P(ptr) MARKED_RECORD_HEADER_P (&((ptr)->lheader))
#define UNMARK_float(ptr) UNMARK_RECORD_HEADER (&((ptr)->lheader))
#define ADDITIONAL_FREE_float(ptr)
static void
sweep_symbols (void)
{
-#define UNMARK_symbol(ptr) UNMARK_RECORD_HEADER (&((ptr)->lheader))
+#ifndef LRECORD_SYMBOL
+# define MARKED_symbol_P(ptr) XMARKBIT ((ptr)->plist)
+# define UNMARK_symbol(ptr) do { XUNMARK ((ptr)->plist); } while (0)
+#else
+# define MARKED_symbol_P(ptr) MARKED_RECORD_HEADER_P (&((ptr)->lheader))
+# define UNMARK_symbol(ptr) UNMARK_RECORD_HEADER (&((ptr)->lheader))
+#endif /* !LRECORD_SYMBOL */
#define ADDITIONAL_FREE_symbol(ptr)
SWEEP_FIXED_TYPE_BLOCK (symbol, struct Lisp_Symbol);
static void
sweep_extents (void)
{
+#define MARKED_extent_P(ptr) MARKED_RECORD_HEADER_P (&((ptr)->lheader))
#define UNMARK_extent(ptr) UNMARK_RECORD_HEADER (&((ptr)->lheader))
#define ADDITIONAL_FREE_extent(ptr)
static void
sweep_events (void)
{
+#define MARKED_event_P(ptr) MARKED_RECORD_HEADER_P (&((ptr)->lheader))
#define UNMARK_event(ptr) UNMARK_RECORD_HEADER (&((ptr)->lheader))
#define ADDITIONAL_FREE_event(ptr)
static void
sweep_markers (void)
{
+#define MARKED_marker_P(ptr) MARKED_RECORD_HEADER_P (&((ptr)->lheader))
#define UNMARK_marker(ptr) UNMARK_RECORD_HEADER (&((ptr)->lheader))
#define ADDITIONAL_FREE_marker(ptr) \
do { Lisp_Object tem; \
abort ();
/* Just skip it if it isn't marked. */
+#ifdef LRECORD_STRING
if (! MARKED_RECORD_HEADER_P (&(string->lheader)))
+#else
+ if (!XMARKBIT (string->plist))
+#endif
{
from_pos += fullsize;
continue;
int num_small_used = 0, num_small_bytes = 0, num_bytes = 0;
int debug = debug_string_purity;
-#define UNMARK_string(ptr) \
+#ifdef LRECORD_STRING
+
+# define MARKED_string_P(ptr) MARKED_RECORD_HEADER_P (&((ptr)->lheader))
+# define UNMARK_string(ptr) \
do { struct Lisp_String *p = (ptr); \
int size = string_length (p); \
UNMARK_RECORD_HEADER (&(p->lheader)); \
} \
if (debug) debug_string_purity_print (p); \
} while (0)
-#define ADDITIONAL_FREE_string(p) \
+# define ADDITIONAL_FREE_string(p) \
do { int size = string_length (p); \
if (BIG_STRING_SIZE_P (size)) \
xfree_1 (CHARS_TO_STRING_CHAR (string_data (p))); \
} while (0)
+#else
+
+# define MARKED_string_P(ptr) XMARKBIT ((ptr)->plist)
+# define UNMARK_string(ptr) \
+ do { struct Lisp_String *p = (ptr); \
+ int size = string_length (p); \
+ XUNMARK (p->plist); \
+ num_bytes += size; \
+ if (!BIG_STRING_SIZE_P (size)) \
+ { num_small_bytes += size; \
+ num_small_used++; \
+ } \
+ if (debug) debug_string_purity_print (p); \
+ } while (0)
+# define ADDITIONAL_FREE_string(p) \
+ do { int size = string_length (p); \
+ if (BIG_STRING_SIZE_P (size)) \
+ xfree_1 (CHARS_TO_STRING_CHAR (string_data (p))); \
+ } while (0)
+
+#endif /* ! LRECORD_STRING */
+
SWEEP_FIXED_TYPE_BLOCK (string, struct Lisp_String);
gc_count_num_short_string_in_use = num_small_used;
static int
marked_p (Lisp_Object obj)
{
-#ifdef ERROR_CHECK_GC
- assert (! (GC_EQ (obj, Qnull_pointer)));
-#endif
- /* Checks we used to perform. */
- /* if (EQ (obj, Qnull_pointer)) return 1; */
- /* if (!POINTER_TYPE_P (XGCTYPE (obj))) return 1; */
- /* if (PURIFIED (XPNTR (obj))) return 1; */
-
- if (XGCTYPE (obj) == Lisp_Type_Record)
+ if (EQ (obj, Qnull_pointer)) return 1;
+ if (!POINTER_TYPE_P (XGCTYPE (obj))) return 1;
+ if (PURIFIED (XPNTR (obj))) return 1;
+ switch (XGCTYPE (obj))
{
- struct lrecord_header *lheader = XRECORD_LHEADER (obj);
-#if defined (ERROR_CHECK_GC)
- assert (lheader->type <= last_lrecord_type_index_assigned);
+#ifndef LRECORD_CONS
+ case Lisp_Type_Cons:
+ return XMARKBIT (XCAR (obj));
#endif
- return C_READONLY_RECORD_HEADER_P (lheader) || MARKED_RECORD_HEADER_P (lheader);
+ case Lisp_Type_Record:
+ return MARKED_RECORD_HEADER_P (XRECORD_LHEADER (obj));
+#ifndef LRECORD_STRING
+ case Lisp_Type_String:
+ return XMARKBIT (XSTRING (obj)->plist);
+#endif /* ! LRECORD_STRING */
+#ifndef LRECORD_VECTOR
+ case Lisp_Type_Vector:
+ return XVECTOR_LENGTH (obj) < 0;
+#endif /* !LRECORD_VECTOR */
+#ifndef LRECORD_SYMBOL
+ case Lisp_Type_Symbol:
+ return XMARKBIT (XSYMBOL (obj)->plist);
+#endif
+ default:
+ abort ();
}
- return 1;
+ return 0; /* suppress compiler warning */
}
static void
/* Put all unmarked conses on free list */
sweep_conses ();
+#ifndef LRECORD_VECTOR
+ /* Free all unmarked vectors */
+ sweep_vectors_1 (&all_vectors,
+ &gc_count_num_vector_used, &gc_count_vector_total_size,
+ &gc_count_vector_storage);
+#endif
+
/* Free all unmarked bit vectors */
sweep_bit_vectors_1 (&all_bit_vectors,
&gc_count_num_bit_vector_used,
{
/* It's important that certain information from the environment not get
dumped with the executable (pathnames, environment variables, etc.).
- To make it easier to tell when this has happened with strings(1) we
+ To make it easier to tell when this has happend with strings(1) we
clear some known-to-be-garbage blocks of memory, so that leftover
results of old evaluation don't look like potential problems.
But first we set some notable variables to nil and do one more GC,
Vexec_path = Qnil;
Vload_path = Qnil;
/* Vdump_load_path = Qnil; */
- /* Release hash tables for locate_file */
- Flocate_file_clear_hashing (Qt);
uncache_home_directory();
#if defined(LOADHIST) && !(defined(LOADHIST_DUMPED) || \
/* Run the disksave finalization methods of all live objects. */
disksave_object_finalization_1 ();
+#if 0 /* I don't see any point in this. The purespace starts out all 0's */
+ /* Zero out the unused portion of purespace */
+ if (!pure_lossage)
+ memset ( (char *) (PUREBEG + pure_bytes_used), 0,
+ (((char *) (PUREBEG + get_PURESIZE())) -
+ ((char *) (PUREBEG + pure_bytes_used))));
+#endif
+
/* Zero out the uninitialized (really, unused) part of the containers
for the live strings. */
{
void
garbage_collect_1 (void)
{
-#if MAX_SAVE_STACK > 0
char stack_top_variable;
extern char *stack_bottom;
-#endif
+ int i;
struct frame *f;
int speccount;
int cursor_changed;
|| preparing_for_armageddon)
return;
- /* We used to call selected_frame() here.
-
- The following functions cannot be called inside GC
- so we move to after the above tests. */
- {
- Lisp_Object frame;
- Lisp_Object device = Fselected_device (Qnil);
- if (NILP (device)) /* Could happen during startup, eg. if always_gc */
- return;
- frame = DEVICE_SELECTED_FRAME (XDEVICE (device));
- if (NILP (frame))
- signal_simple_error ("No frames exist on device", device);
- f = XFRAME (frame);
- }
-
pre_gc_cursor = Qnil;
cursor_changed = 0;
+ /* This function cannot be called inside GC so we move to after the */
+ /* above tests */
+ f = selected_frame ();
+
GCPRO1 (pre_gc_cursor);
/* Very important to prevent GC during any of the following
cleanup_specifiers ();
/* Mark all the special slots that serve as the roots of accessibility. */
+ {
+ struct gcpro *tail;
+ struct catchtag *catch;
+ struct backtrace *backlist;
+ struct specbinding *bind;
- { /* staticpro() */
- int i;
for (i = 0; i < staticidx; i++)
- mark_object (*(staticvec[i]));
- }
+ {
+#ifdef GDB_SUCKS
+ printf ("%d\n", i);
+ debug_print (*staticvec[i]);
+#endif
+ mark_object (*(staticvec[i]));
+ }
- { /* GCPRO() */
- struct gcpro *tail;
- int i;
for (tail = gcprolist; tail; tail = tail->next)
- for (i = 0; i < tail->nvars; i++)
- mark_object (tail->var[i]);
- }
+ {
+ for (i = 0; i < tail->nvars; i++)
+ mark_object (tail->var[i]);
+ }
- { /* specbind() */
- struct specbinding *bind;
for (bind = specpdl; bind != specpdl_ptr; bind++)
{
mark_object (bind->symbol);
mark_object (bind->old_value);
}
- }
- {
- struct catchtag *catch;
for (catch = catchlist; catch; catch = catch->next)
{
mark_object (catch->tag);
mark_object (catch->val);
}
- }
- {
- struct backtrace *backlist;
for (backlist = backtrace_list; backlist; backlist = backlist->next)
{
int nargs = backlist->nargs;
- int i;
mark_object (*backlist->function);
if (nargs == UNEVALLED || nargs == MANY)
for (i = 0; i < nargs; i++)
mark_object (backlist->args[i]);
}
- }
- mark_redisplay (mark_object);
- mark_profiling_info (mark_object);
+ mark_redisplay (mark_object);
+ mark_profiling_info (mark_object);
+ }
/* OK, now do the after-mark stuff. This is for things that
- are only marked when something else is marked (e.g. weak hash tables).
+ are only marked when something else is marked (e.g. weak hashtables).
There may be complex dependencies between such objects -- e.g.
- a weak hash table might be unmarked, but after processing a later
- weak hash table, the former one might get marked. So we have to
+ a weak hashtable might be unmarked, but after processing a later
+ weak hashtable, the former one might get marked. So we have to
iterate until nothing more gets marked. */
-
- while (finish_marking_weak_hash_tables (marked_p, mark_object) > 0 ||
- finish_marking_weak_lists (marked_p, mark_object) > 0)
- ;
+ {
+ int did_mark;
+ /* Need to iterate until there's nothing more to mark, in case
+ of chains of mark dependencies. */
+ do
+ {
+ did_mark = 0;
+ did_mark += !!finish_marking_weak_hashtables (marked_p, mark_object);
+ did_mark += !!finish_marking_weak_lists (marked_p, mark_object);
+ }
+ while (did_mark);
+ }
/* And prune (this needs to be called after everything else has been
marked and before we do any sweeping). */
/* #### this is somewhat ad-hoc and should probably be an object
method */
- prune_weak_hash_tables (marked_p);
+ prune_weak_hashtables (marked_p);
prune_weak_lists (marked_p);
prune_specifiers (marked_p);
prune_syntax_tables (marked_p);
return;
}
+#ifdef EMACS_BTL
+ /* This isn't actually called. BTL recognizes the stack frame of the top
+ of the garbage collector by noting that PC is between &garbage_collect_1
+ and &BTL_after_garbage_collect_1_stub. So this fn must be right here.
+ There's not any other way to know the address of the end of a function.
+ */
+void BTL_after_garbage_collect_1_stub () { abort (); }
+#endif /* EMACS_BTL */
+
/* Debugging aids. */
static Lisp_Object
return cons3 (intern (name), make_int (value), tail);
}
-#define HACK_O_MATIC(type, name, pl) do { \
- int s = 0; \
- struct type##_block *x = current_##type##_block; \
- while (x) { s += sizeof (*x) + MALLOC_OVERHEAD; x = x->prev; } \
- (pl) = gc_plist_hack ((name), s, (pl)); \
-} while (0)
+#define HACK_O_MATIC(type, name, pl) \
+ { \
+ int s = 0; \
+ struct type##_block *x = current_##type##_block; \
+ while (x) { s += sizeof (*x) + MALLOC_OVERHEAD; x = x->prev; } \
+ (pl) = gc_plist_hack ((name), s, (pl)); \
+ }
DEFUN ("garbage-collect", Fgarbage_collect, 0, 0, "", /*
Reclaim storage for Lisp objects no longer needed.
{
Lisp_Object pl = Qnil;
int i;
+#ifdef LRECORD_VECTOR
int gc_count_vector_total_size = 0;
+#endif
+
+ if (purify_flag && pure_lossage)
+ return Qnil;
garbage_collect_1 ();
char buf [255];
CONST char *name = lrecord_implementations_table[i]->name;
int len = strlen (name);
+#ifdef LRECORD_VECTOR
/* save this for the FSFmacs-compatible part of the summary */
- if (i == *lrecord_vector.lrecord_type_index)
+ if (i == *lrecord_vector[0].lrecord_type_index)
gc_count_vector_total_size =
lcrecord_stats[i].bytes_in_use + lcrecord_stats[i].bytes_freed;
-
+#endif
sprintf (buf, "%s-storage", name);
pl = gc_plist_hack (buf, lcrecord_stats[i].bytes_in_use, pl);
/* Okay, simple pluralization check for `symbol-value-varalias' */
pl = gc_plist_hack ("compiled-functions-used",
gc_count_num_compiled_function_in_use, pl);
+#ifndef LRECORD_VECTOR
+ pl = gc_plist_hack ("vector-storage", gc_count_vector_storage, pl);
+ pl = gc_plist_hack ("vectors-total-length",
+ gc_count_vector_total_size, pl);
+ pl = gc_plist_hack ("vectors-used", gc_count_num_vector_used, pl);
+#endif
+
pl = gc_plist_hack ("bit-vector-storage", gc_count_bit_vector_storage, pl);
pl = gc_plist_hack ("bit-vectors-total-length",
gc_count_bit_vector_total_size, pl);
{
int iii;
+#ifdef PURESTAT
+ for (iii = 0; iii < countof (purestats); iii++)
+ {
+ if (! purestats[iii]) continue;
+ purestats[iii]->nobjects = 0;
+ purestats[iii]->nbytes = 0;
+ }
+ purecopying_for_bytecode = 0;
+#endif /* PURESTAT */
+
last_lrecord_type_index_assigned = -1;
for (iii = 0; iii < countof (lrecord_implementations_table); iii++)
{
lrecord_implementations_table[iii] = 0;
}
+#ifdef USE_INDEXED_LRECORD_IMPLEMENTATION
/*
- * All the staticly
+ * If USE_INDEXED_LRECORD_IMPLEMENTATION is defined, all the staticly
* defined subr lrecords were initialized with lheader->type == 0.
* See subr_lheader_initializer in lisp.h. Force type index 0 to be
* assigned to lrecord_subr so that those predefined indexes match
* reality.
*/
- lrecord_type_index (&lrecord_subr);
- assert (*(lrecord_subr.lrecord_type_index) == 0);
+ lrecord_type_index (lrecord_subr);
+ assert (*(lrecord_subr[0].lrecord_type_index) == 0);
/*
* The same is true for symbol_value_forward objects, except the
* type is 1.
*/
- lrecord_type_index (&lrecord_symbol_value_forward);
- assert (*(lrecord_symbol_value_forward.lrecord_type_index) == 1);
+ lrecord_type_index (lrecord_symbol_value_forward);
+ assert (*(lrecord_symbol_value_forward[0].lrecord_type_index) == 1);
+#endif /* USE_INDEXED_LRECORD_IMPLEMENTATION */
+
+ symbols_initialized = 0;
gc_generation_number[0] = 0;
/* purify_flag 1 is correct even if CANNOT_DUMP.
* loadup.el will set to nil at end. */
purify_flag = 1;
+ pure_bytes_used = 0;
+ pure_lossage = 0;
breathing_space = 0;
+#ifndef LRECORD_VECTOR
+ XSETINT (all_vectors, 0); /* Qzero may not be set yet. */
+#endif
XSETINT (all_bit_vectors, 0); /* Qzero may not be set yet. */
XSETINT (Vgc_message, 0);
all_lcrecords = 0;
#endif /* ERROR_CHECK_TYPECHECK */
}
-int pure_bytes_used = 0;
-
void
reinit_alloc (void)
{
DEFVAR_BOOL ("purify-flag", &purify_flag /*
Non-nil means loading Lisp code in order to dump an executable.
-This means that certain objects should be allocated in readonly space.
+This means that certain objects should be allocated in shared (pure) space.
*/ );
DEFVAR_LISP ("pre-gc-hook", &Vpre_gc_hook /*
image instance) in the domain of the selected frame, the mouse pointer
will change instead of this message being printed.
*/ );
- Vgc_message = make_string_nocopy ((CONST Bufbyte *) gc_default_message,
- countof (gc_default_message) - 1);
+ Vgc_message = make_pure_string ((CONST Bufbyte *) gc_default_message,
+ countof (gc_default_message) - 1,
+ Qnil, 1);
DEFVAR_LISP ("gc-pointer-glyph", &Vgc_pointer_glyph /*
Pointer glyph used to indicate that a garbage collection is in progress.
#ifdef REGION_CACHE_NEEDS_WORK
#include "region-cache.h"
#endif
-#include "specifier.h"
#include "syntax.h"
#include "sysdep.h" /* for getwd */
#include "window.h"
/* This is the initial (startup) directory, as used for the *scratch* buffer.
We're making this a global to make others aware of the startup directory.
- `initial_directory' is stored in external format.
*/
char initial_directory[MAXPATHLEN+1];
undo_threshold,
undo_high_threshold);
-#define MARKED_SLOT(x) ((void) (markobj (buf->x)));
+#define MARKED_SLOT(x) ((markobj) (buf->x));
#include "bufslots.h"
#undef MARKED_SLOT
- markobj (buf->extent_info);
- if (buf->text)
- markobj (buf->text->line_number_cache);
+ ((markobj) (buf->extent_info));
/* Don't mark normally through the children slot.
(Actually, in this case, it doesn't matter.) */
because all buffers have `kill-buffer' applied to them before
they disappear, and the children removal happens then. */
DEFINE_LRECORD_IMPLEMENTATION ("buffer", buffer,
- mark_buffer, print_buffer, 0, 0, 0, 0,
+ mark_buffer, print_buffer, 0, 0, 0,
struct buffer);
\f
DEFUN ("bufferp", Fbufferp, 1, 1, 0, /*
*/
(frame))
{
- return Fmapcar (Qcdr,
- EQ (frame, Qt) ? Vbuffer_alist :
- decode_frame (frame)->buffer_alist);
+ Lisp_Object list;
+ if (EQ (frame, Qt))
+ list = Vbuffer_alist;
+ else
+ list = decode_frame (frame)->buffer_alist;
+ return Fmapcar (Qcdr, list);
}
Lisp_Object
(filename))
{
/* This function can GC. GC checked 1997.04.06. */
- REGISTER Lisp_Object buf;
+ REGISTER Lisp_Object tail, buf, tem;
struct gcpro gcpro1;
#ifdef I18N3
NUNGCPRO;
}
- {
- Lisp_Object elt;
- LIST_LOOP_2 (elt, Vbuffer_alist)
- {
- buf = Fcdr (elt);
- if (!BUFFERP (buf)) continue;
- if (!STRINGP (XBUFFER (buf)->filename)) continue;
- if (!NILP (Fstring_equal (filename,
- (find_file_compare_truenames
- ? XBUFFER (buf)->file_truename
- : XBUFFER (buf)->filename))))
- return buf;
- }
- }
+ LIST_LOOP (tail, Vbuffer_alist)
+ {
+ buf = Fcdr (XCAR (tail));
+ if (!BUFFERP (buf)) continue;
+ if (!STRINGP (XBUFFER (buf)->filename)) continue;
+ tem = Fstring_equal (filename,
+ (find_file_compare_truenames
+ ? XBUFFER (buf)->file_truename
+ : XBUFFER (buf)->filename));
+ if (!NILP (tem))
+ return buf;
+ }
return Qnil;
}
static struct buffer *
allocate_buffer (void)
{
- struct buffer *b = alloc_lcrecord_type (struct buffer, &lrecord_buffer);
+ struct buffer *b = alloc_lcrecord_type (struct buffer, lrecord_buffer);
copy_lcrecord (b, XBUFFER (Vbuffer_defaults));
init_buffer_markers (b);
b->generated_modeline_string = Fmake_string (make_int (84), make_int (' '));
- b->modeline_extent_table = make_lisp_hash_table (20, HASH_TABLE_KEY_WEAK,
- HASH_TABLE_EQ);
+ b->modeline_extent_table = make_lisp_hashtable (20, HASHTABLE_KEY_WEAK,
+ HASHTABLE_EQ);
return buf;
}
b->text = &b->own_text;
b->base_buffer = 0;
b->indirect_children = Qnil;
- init_buffer_text (b);
+ init_buffer_text (b, 0);
return finish_init_buffer (b, name);
}
+#if 0 /* #### implement this! Need various changes in insdel.c */
DEFUN ("make-indirect-buffer", Fmake_indirect_buffer, 2, 2,
"bMake indirect buffer (to buffer): \nBName of indirect buffer: ", /*
Create and return an indirect buffer for buffer BASE, named NAME.
*/
(base_buffer, name))
{
- /* This function can GC */
-
- /* #### The above interactive specification is totally bogus,
- because it offers an existing buffer as default answer to the
- second question. However, the second argument may not BE an
- existing buffer! */
- struct buffer *b;
-
- base_buffer = get_buffer (base_buffer, 1);
+ Lisp_Object buf;
+ REGISTER struct buffer *b;
#ifdef I18N3
/* #### Doc string should indicate that the buffer name will get
translated. */
#endif
- CHECK_STRING (name);
+
name = LISP_GETTEXT (name);
- if (!NILP (Fget_buffer (name)))
- signal_simple_error ("Buffer name already in use", name);
+ buf = Fget_buffer (name);
+ if (!NILP (buf))
+ error ("Buffer name `%s' is in use", XSTRING_DATA (name));
+
+ base_buffer = Fget_buffer (base_buffer);
+ if (NILP (base_buffer))
+ error ("No such buffer: `%s'", XSTRING_DATA (XBUFFER (base_buffer)->name));
+
if (XSTRING_LENGTH (name) == 0)
error ("Empty string for buffer name is not allowed");
b = allocate_buffer ();
- b->base_buffer = BUFFER_BASE_BUFFER (XBUFFER (base_buffer));
+ if (XBUFFER (base_buffer)->base_buffer)
+ b->base_buffer = XBUFFER (base_buffer)->base_buffer;
+ else
+ b->base_buffer = XBUFFER (base_buffer);
/* Use the base buffer's text object. */
b->text = b->base_buffer->text;
b->indirect_children = Qnil;
+ XSETBUFFER (buf, b);
b->base_buffer->indirect_children =
- Fcons (make_buffer (b), b->base_buffer->indirect_children);
- init_buffer_text (b);
+ Fcons (buf, b->base_buffer->indirect_children);
+ init_buffer_text (b, 1);
return finish_init_buffer (b, name);
}
+#endif /* 0 */
\f
return Fcopy_sequence (buf->indirect_children);
}
+/* Map MAPFUN over all buffers that share the same text as BUF
+ (this includes BUF). Pass two arguments to MAPFUN: a buffer,
+ and CLOSURE. If any invocation of MAPFUN returns non-zero,
+ halt immediately and return that value. Otherwise, continue
+ the mapping to the end and return 0. */
+
+int
+map_over_sharing_buffers (struct buffer *buf,
+ int (*mapfun) (struct buffer *buf, void *closure),
+ void *closure)
+{
+ int result;
+ Lisp_Object tail;
+
+ if (buf->base_buffer)
+ {
+ buf = buf->base_buffer;
+ assert (!buf->base_buffer);
+ }
+
+ result = (mapfun) (buf, closure);
+ if (result)
+ return result;
+
+ LIST_LOOP (tail, buf->indirect_children)
+ {
+ Lisp_Object buffer = XCAR (tail);
+ result = (mapfun) (XBUFFER (buffer), closure);
+ if (result)
+ return result;
+ }
+
+ return 0;
+}
+
DEFUN ("buffer-local-variables", Fbuffer_local_variables, 0, 1, 0, /*
Return an alist of variables that are buffer-local in BUFFER.
Most elements look like (SYMBOL . VALUE), describing one variable.
}
DEFUN ("kill-buffer", Fkill_buffer, 1, 1, "bKill buffer: ", /*
-Kill the buffer BUFFER.
+Kill the buffer BUFNAME.
The argument may be a buffer or may be the name of a buffer.
An argument of nil means kill the current buffer.
Any processes that have this buffer as the `process-buffer' are killed
with `delete-process'.
*/
- (buffer))
+ (bufname))
{
/* This function can call lisp */
Lisp_Object buf;
REGISTER struct buffer *b;
struct gcpro gcpro1, gcpro2;
- if (NILP (buffer))
+ if (NILP (bufname))
buf = Fcurrent_buffer ();
- else if (BUFFERP (buffer))
- buf = buffer;
+ else if (BUFFERP (bufname))
+ buf = bufname;
else
{
- buf = get_buffer (buffer, 0);
- if (NILP (buf)) nsberror (buffer);
+ buf = get_buffer (bufname, 0);
+ if (NILP (buf)) nsberror (bufname);
}
b = XBUFFER (buf);
&& BUF_MODIFF (b) > BUF_SAVE_MODIFF (b))
{
Lisp_Object killp;
- GCPRO1 (buf);
+ GCPRO2 (buf, bufname);
killp = call1
(Qyes_or_no_p,
(emacs_doprnt_string_c
GCPRO1 (buf);
LIST_LOOP (rest, b->indirect_children)
- {
- Fkill_buffer (XCAR (rest));
- /* Keep indirect_children updated in case a
- query-function/hook throws. */
- b->indirect_children = XCDR (rest);
- }
+ Fkill_buffer (XCAR (rest));
UNGCPRO;
}
kill_buffer_local_variables (b);
b->name = Qnil;
- uninit_buffer_text (b);
+ uninit_buffer_text (b, !!b->base_buffer);
b->undo_list = Qnil;
uninit_buffer_extents (b);
if (b->base_buffer)
}
\f
DEFUN ("record-buffer", Frecord_buffer, 1, 1, 0, /*
-Place buffer BUFFER first in the buffer order.
+Place buffer BUF first in the buffer order.
Call this function when a buffer is selected "visibly".
This function changes the global buffer order and the per-frame buffer
of selection so that `other-buffer' will return a recently selected
buffer. See `other-buffer' for more information.
*/
- (buffer))
+ (buf))
{
REGISTER Lisp_Object lynk, prev;
struct frame *f = selected_frame ();
prev = Qnil;
for (lynk = Vbuffer_alist; CONSP (lynk); lynk = XCDR (lynk))
{
- if (EQ (XCDR (XCAR (lynk)), buffer))
+ if (EQ (XCDR (XCAR (lynk)), buf))
break;
prev = lynk;
}
prev = Qnil;
for (lynk = f->buffer_alist; CONSP (lynk); lynk = XCDR (lynk))
{
- if (EQ (XCDR (XCAR (lynk)), buffer))
+ if (EQ (XCDR (XCAR (lynk)), buf))
break;
prev = lynk;
}
Use this function before selecting the buffer, since it may need to inspect
the current buffer's major mode.
*/
- (buffer))
+ (buf))
{
int speccount = specpdl_depth ();
- Lisp_Object function = XBUFFER (Vbuffer_defaults)->major_mode;
+ REGISTER Lisp_Object function, tem;
+ function = XBUFFER (Vbuffer_defaults)->major_mode;
if (NILP (function))
{
- Lisp_Object tem = Fget (current_buffer->major_mode, Qmode_class, Qnil);
+ tem = Fget (current_buffer->major_mode, Qmode_class, Qnil);
if (NILP (tem))
function = current_buffer->major_mode;
}
record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
- Fset_buffer (buffer);
+ Fset_buffer (buf);
call0 (function);
return unbind_to (speccount, Qnil);
*/
())
{
- Lisp_Object buffer;
- XSETBUFFER (buffer, current_buffer);
- return buffer;
+ Lisp_Object buf;
+ XSETBUFFER (buf, current_buffer);
+ return buf;
}
\f
/* Set the current buffer to B. */
DEFSUBR (Fget_buffer);
DEFSUBR (Fget_file_buffer);
DEFSUBR (Fget_buffer_create);
+#if 0
DEFSUBR (Fmake_indirect_buffer);
+#endif
DEFSUBR (Fgenerate_new_buffer_name);
DEFSUBR (Fbuffer_name);
delete_auto_save_files = 1;
}
-/* The docstrings for DEFVAR_* are recorded externally by make-docfile. */
-
+/* DOC is ignored because it is snagged and recorded externally
+ * by make-docfile */
/* Renamed from DEFVAR_PER_BUFFER because FSFmacs D_P_B takes
- a bogus extra arg, which confuses an otherwise identical make-docfile.c */
-
+ * a bogus extra arg, which confuses an otherwise identical make-docfile.c */
/* Declaring this stuff as const produces 'Cannot reinitialize' messages
from SunPro C's fix-and-continue feature (a way neato feature that
makes debugging unbelievably more bearable) */
-#define DEFVAR_BUFFER_LOCAL_1(lname, field_name, forward_type, magicfun) do { \
- static CONST_IF_NOT_DEBUG struct symbol_value_forward I_hate_C \
- = { { { symbol_value_forward_lheader_initializer, \
- (struct lcrecord_header *) &(buffer_local_flags.field_name), 69 }, \
- forward_type }, magicfun }; \
- { \
- int offset = ((char *)symbol_value_forward_forward (&I_hate_C) - \
- (char *)&buffer_local_flags); \
- defvar_magic (lname, &I_hate_C); \
- \
- *((Lisp_Object *)(offset + (char *)XBUFFER (Vbuffer_local_symbols))) \
- = intern (lname); \
- } \
-} while (0)
-
-#define DEFVAR_BUFFER_LOCAL_MAGIC(lname, field_name, magicfun) \
- DEFVAR_BUFFER_LOCAL_1 (lname, field_name, \
- SYMVAL_CURRENT_BUFFER_FORWARD, magicfun)
-#define DEFVAR_BUFFER_LOCAL(lname, field_name) \
- DEFVAR_BUFFER_LOCAL_MAGIC (lname, field_name, 0)
-#define DEFVAR_CONST_BUFFER_LOCAL_MAGIC(lname, field_name, magicfun) \
- DEFVAR_BUFFER_LOCAL_1 (lname, field_name, \
- SYMVAL_CONST_CURRENT_BUFFER_FORWARD, magicfun)
-#define DEFVAR_CONST_BUFFER_LOCAL(lname, field_name) \
- DEFVAR_CONST_BUFFER_LOCAL_MAGIC (lname, field_name, 0)
-
-#define DEFVAR_BUFFER_DEFAULTS_MAGIC(lname, field_name, magicfun) \
- DEFVAR_SYMVAL_FWD (lname, &(buffer_local_flags.field_name), \
- SYMVAL_DEFAULT_BUFFER_FORWARD, magicfun)
-#define DEFVAR_BUFFER_DEFAULTS(lname, field_name) \
- DEFVAR_BUFFER_DEFAULTS_MAGIC (lname, field_name, 0)
+#define DEFVAR_BUFFER_LOCAL(lname, field_name) do { \
+static CONST_IF_NOT_DEBUG struct symbol_value_forward I_hate_C \
+ = { { { symbol_value_forward_lheader_initializer, \
+ (struct lcrecord_header *) &(buffer_local_flags.field_name), 69 }, \
+ SYMVAL_CURRENT_BUFFER_FORWARD }, 0 }; \
+ defvar_buffer_local ((lname), &I_hate_C); \
+ } while (0)
+
+#define DEFVAR_BUFFER_LOCAL_MAGIC(lname, field_name, magicfun) do { \
+static CONST_IF_NOT_DEBUG struct symbol_value_forward I_hate_C \
+ = { { { symbol_value_forward_lheader_initializer, \
+ (struct lcrecord_header *) &(buffer_local_flags.field_name), 69 }, \
+ SYMVAL_CURRENT_BUFFER_FORWARD }, magicfun }; \
+ defvar_buffer_local ((lname), &I_hate_C); \
+ } while (0)
+
+#define DEFVAR_CONST_BUFFER_LOCAL(lname, field_name) do { \
+static CONST_IF_NOT_DEBUG struct symbol_value_forward I_hate_C \
+ = { { { symbol_value_forward_lheader_initializer, \
+ (struct lcrecord_header *) &(buffer_local_flags.field_name), 69 }, \
+ SYMVAL_CONST_CURRENT_BUFFER_FORWARD }, 0 }; \
+ defvar_buffer_local ((lname), &I_hate_C); \
+ } while (0)
+
+#define DEFVAR_CONST_BUFFER_LOCAL_MAGIC(lname, field_name, magicfun) do{\
+static CONST_IF_NOT_DEBUG struct symbol_value_forward I_hate_C \
+ = { { { symbol_value_forward_lheader_initializer, \
+ (struct lcrecord_header *) &(buffer_local_flags.field_name), 69 }, \
+ SYMVAL_CONST_CURRENT_BUFFER_FORWARD }, magicfun }; \
+ defvar_buffer_local ((lname), &I_hate_C); \
+ } while (0)
+
+static void
+defvar_buffer_local (CONST char *namestring,
+ CONST struct symbol_value_forward *m)
+{
+ int offset = ((char *)symbol_value_forward_forward (m)
+ - (char *)&buffer_local_flags);
+
+ defvar_mumble (namestring, m, sizeof (*m));
+
+ *((Lisp_Object *)(offset + (char *)XBUFFER (Vbuffer_local_symbols)))
+ = intern (namestring);
+}
+
+/* DOC is ignored because it is snagged and recorded externally
+ * by make-docfile */
+#define DEFVAR_BUFFER_DEFAULTS(lname, field_name) do { \
+static CONST_IF_NOT_DEBUG struct symbol_value_forward I_hate_C \
+ = { { { symbol_value_forward_lheader_initializer, \
+ (struct lcrecord_header *) &(buffer_local_flags.field_name), 69 }, \
+ SYMVAL_DEFAULT_BUFFER_FORWARD }, 0 }; \
+ defvar_mumble ((lname), &I_hate_C, sizeof (I_hate_C)); \
+ } while (0)
+
+#define DEFVAR_BUFFER_DEFAULTS_MAGIC(lname, field_name, magicfun) do { \
+static CONST_IF_NOT_DEBUG struct symbol_value_forward I_hate_C \
+ = { { { symbol_value_forward_lheader_initializer, \
+ (struct lcrecord_header *) &(buffer_local_flags.field_name), 69 }, \
+ SYMVAL_DEFAULT_BUFFER_FORWARD }, magicfun }; \
+ defvar_mumble ((lname), &I_hate_C, sizeof (I_hate_C)); \
+ } while (0)
static void
nuke_all_buffer_slots (struct buffer *b, Lisp_Object zap)
{
zero_lcrecord (b);
- b->extent_info = Qnil;
- b->indirect_children = Qnil;
- b->own_text.line_number_cache = Qnil;
-
#define MARKED_SLOT(x) b->x = (zap);
#include "bufslots.h"
#undef MARKED_SLOT
{
/* Make sure all markable slots in buffer_defaults
are initialized reasonably, so mark_buffer won't choke. */
- struct buffer *defs = alloc_lcrecord_type (struct buffer, &lrecord_buffer);
- struct buffer *syms = alloc_lcrecord_type (struct buffer, &lrecord_buffer);
+ struct buffer *defs = alloc_lcrecord_type (struct buffer, lrecord_buffer);
+ struct buffer *syms = alloc_lcrecord_type (struct buffer, lrecord_buffer);
staticpro (&Vbuffer_defaults);
staticpro (&Vbuffer_local_symbols);
defs->major_mode = Qfundamental_mode;
defs->mode_name = QSFundamental;
defs->abbrev_table = Qnil; /* real default setup by Lisp code */
-
- defs->downcase_table = Vascii_downcase_table;
- defs->upcase_table = Vascii_upcase_table;
+ defs->downcase_table = Vascii_downcase_table;
+ defs->upcase_table = Vascii_upcase_table;
defs->case_canon_table = Vascii_canon_table;
- defs->case_eqv_table = Vascii_eqv_table;
+ defs->case_eqv_table = Vascii_eqv_table;
#ifdef MULE
- defs->mirror_downcase_table = Vmirror_ascii_downcase_table;
- defs->mirror_upcase_table = Vmirror_ascii_upcase_table;
+ defs->mirror_downcase_table = Vmirror_ascii_downcase_table;
+ defs->mirror_upcase_table = Vmirror_ascii_upcase_table;
defs->mirror_case_canon_table = Vmirror_ascii_canon_table;
- defs->mirror_case_eqv_table = Vmirror_ascii_eqv_table;
-
+ defs->mirror_case_eqv_table = Vmirror_ascii_eqv_table;
defs->category_table = Vstandard_category_table;
#endif /* MULE */
defs->syntax_table = Vstandard_syntax_table;
*/
Lisp_Object always_local_no_default = make_int (0);
Lisp_Object always_local_resettable = make_int (-1);
- Lisp_Object resettable = make_int (-3);
+ Lisp_Object resettable = make_int (-3);
/* Assign the local-flags to the slots that have default values.
The local flag is a bit that is used in the buffer
buffer. */
nuke_all_buffer_slots (&buffer_local_flags, make_int (-2));
- buffer_local_flags.filename = always_local_no_default;
- buffer_local_flags.directory = always_local_no_default;
- buffer_local_flags.backed_up = always_local_no_default;
- buffer_local_flags.saved_size = always_local_no_default;
+ buffer_local_flags.filename = always_local_no_default;
+ buffer_local_flags.directory = always_local_no_default;
+ buffer_local_flags.backed_up = always_local_no_default;
+ buffer_local_flags.saved_size = always_local_no_default;
buffer_local_flags.auto_save_file_name = always_local_no_default;
- buffer_local_flags.read_only = always_local_no_default;
+ buffer_local_flags.read_only = always_local_no_default;
- buffer_local_flags.major_mode = always_local_resettable;
- buffer_local_flags.mode_name = always_local_resettable;
- buffer_local_flags.undo_list = always_local_no_default;
+ buffer_local_flags.major_mode = always_local_resettable;
+ buffer_local_flags.mode_name = always_local_resettable;
+ buffer_local_flags.undo_list = always_local_no_default;
#if 0 /* FSFmacs */
- buffer_local_flags.mark_active = always_local_resettable;
+ buffer_local_flags.mark_active = always_local_resettable;
#endif
buffer_local_flags.point_before_scroll = always_local_resettable;
- buffer_local_flags.file_truename = always_local_no_default;
- buffer_local_flags.invisibility_spec = always_local_resettable;
- buffer_local_flags.file_format = always_local_resettable;
+ buffer_local_flags.file_truename = always_local_no_default;
+ buffer_local_flags.invisibility_spec = always_local_resettable;
+ buffer_local_flags.file_format = always_local_resettable;
buffer_local_flags.generated_modeline_string = always_local_no_default;
- buffer_local_flags.keymap = resettable;
- buffer_local_flags.downcase_table = resettable;
- buffer_local_flags.upcase_table = resettable;
+ buffer_local_flags.keymap = resettable;
+ buffer_local_flags.downcase_table = resettable;
+ buffer_local_flags.upcase_table = resettable;
buffer_local_flags.case_canon_table = resettable;
- buffer_local_flags.case_eqv_table = resettable;
- buffer_local_flags.syntax_table = resettable;
+ buffer_local_flags.case_eqv_table = resettable;
+ buffer_local_flags.syntax_table = resettable;
#ifdef MULE
- buffer_local_flags.category_table = resettable;
+ buffer_local_flags.category_table = resettable;
#endif
- buffer_local_flags.modeline_format = make_int (1<<0);
- buffer_local_flags.abbrev_mode = make_int (1<<1);
- buffer_local_flags.overwrite_mode = make_int (1<<2);
- buffer_local_flags.case_fold_search = make_int (1<<3);
- buffer_local_flags.auto_fill_function = make_int (1<<4);
- buffer_local_flags.selective_display = make_int (1<<5);
- buffer_local_flags.selective_display_ellipses = make_int (1<<6);
- buffer_local_flags.tab_width = make_int (1<<7);
- buffer_local_flags.truncate_lines = make_int (1<<8);
- buffer_local_flags.ctl_arrow = make_int (1<<9);
- buffer_local_flags.fill_column = make_int (1<<10);
- buffer_local_flags.left_margin = make_int (1<<11);
- buffer_local_flags.abbrev_table = make_int (1<<12);
+ buffer_local_flags.modeline_format = make_int (1);
+ buffer_local_flags.abbrev_mode = make_int (2);
+ buffer_local_flags.overwrite_mode = make_int (4);
+ buffer_local_flags.case_fold_search = make_int (8);
+ buffer_local_flags.auto_fill_function = make_int (0x10);
+ buffer_local_flags.selective_display = make_int (0x20);
+ buffer_local_flags.selective_display_ellipses = make_int (0x40);
+ buffer_local_flags.tab_width = make_int (0x80);
+ buffer_local_flags.truncate_lines = make_int (0x100);
+ buffer_local_flags.ctl_arrow = make_int (0x200);
+ buffer_local_flags.fill_column = make_int (0x400);
+ buffer_local_flags.left_margin = make_int (0x800);
+ buffer_local_flags.abbrev_table = make_int (0x1000);
#ifdef REGION_CACHE_NEEDS_WORK
- buffer_local_flags.cache_long_line_scans = make_int (1<<13);
+ buffer_local_flags.cache_long_line_scans = make_int (0x2000);
#endif
#ifdef FILE_CODING
- buffer_local_flags.buffer_file_coding_system = make_int (1<<14);
+ buffer_local_flags.buffer_file_coding_system = make_int (0x4000);
#endif
- /* #### Warning: 1<<28 is the largest number currently allowable
- due to the XINT() handling of this value. With some
- rearrangement you can get 3 more bits. */
+ /* #### Warning, 0x4000000 (that's six zeroes) is the largest number
+ currently allowable due to the XINT() handling of this value.
+ With some rearrangement you can get 4 more bits. */
}
DEFVAR_BUFFER_DEFAULTS ("default-modeline-format", modeline_format /*
The default value for this variable (which is normally used for
buffers without associated files) is also used when automatic
detection of a file's encoding is called for and there was no
-discernible encoding in the file (i.e. it was entirely or almost
+discernable encoding in the file (i.e. it was entirely or almost
entirely ASCII). The default value should generally *not* be set to
nil (equivalent to `no-conversion'), because if extended characters
are ever inserted into the buffer, they will be lost when the file is
variables just mentioned, which are intended to be used for
global environment specification.
*/ );
-#endif /* FILE_CODING */
+#endif
DEFVAR_BUFFER_LOCAL ("auto-fill-function", auto_fill_function /*
Function called (if non-nil) to perform auto-fill.
}
}
-/* Is PWD another name for `.' ? */
-static int
-directory_is_current_directory (char *pwd)
-{
- Bufbyte *pwd_internal;
- struct stat dotstat, pwdstat;
-
- GET_C_CHARPTR_INT_FILENAME_DATA_ALLOCA (pwd, pwd_internal);
-
- return (IS_DIRECTORY_SEP (*pwd_internal)
- && stat ((char *) pwd_internal, &pwdstat) == 0
- && stat (".", &dotstat) == 0
- && dotstat.st_ino == pwdstat.st_ino
- && dotstat.st_dev == pwdstat.st_dev
- && (int) strlen ((char *) pwd_internal) < MAXPATHLEN);
-}
-
void
init_initial_directory (void)
{
/* This function can GC */
char *pwd;
+ struct stat dotstat, pwdstat;
+ int rc;
initial_directory[0] = 0;
/* If PWD is accurate, use it instead of calling getcwd. This is faster
when PWD is right, and may avoid a fatal error. */
- if ((pwd = getenv ("PWD")) != NULL
- && directory_is_current_directory (pwd))
+ if ((pwd = getenv ("PWD")) != 0 && IS_DIRECTORY_SEP (*pwd)
+ && stat (pwd, &pwdstat) == 0
+ && stat (".", &dotstat) == 0
+ && dotstat.st_ino == pwdstat.st_ino
+ && dotstat.st_dev == pwdstat.st_dev
+ && (int) strlen (pwd) < MAXPATHLEN)
strcpy (initial_directory, pwd);
else if (getcwd (initial_directory, MAXPATHLEN) == NULL)
fatal ("`getcwd' failed: %s\n", strerror (errno));
- /* Make sure pwd is DIRECTORY_SEP-terminated.
- Maybe this should really use some standard subroutine
+ /* Maybe this should really use some standard subroutine
whose definition is filename syntax dependent. */
- {
- int len = strlen (initial_directory);
-
- if (! IS_DIRECTORY_SEP (initial_directory[len - 1]))
- {
- initial_directory[len] = DIRECTORY_SEP;
- initial_directory[len + 1] = '\0';
- }
- }
-
+ rc = strlen (initial_directory);
+ if (!(IS_DIRECTORY_SEP (initial_directory[rc - 1])))
+ {
+ initial_directory[rc] = DIRECTORY_SEP;
+ initial_directory[rc + 1] = '\0';
+ }
/* XEmacs change: store buffer's default directory
- using preferred (i.e. as defined at compile-time)
+ using prefered (i.e. as defined at compile-time)
directory separator. --marcpa */
#ifdef DOS_NT
#define CORRECT_DIR_SEPS(s) \
Fset_buffer (Fget_buffer_create (QSscratch));
- current_buffer->directory =
- build_ext_string (initial_directory, FORMAT_FILENAME);
+ current_buffer->directory = build_string (initial_directory);
#if 0 /* FSFmacs */
/* #### is this correct? */
Bytind mule_bytind_cache[16];
#endif
- /* Similar to the above, we keep track of positions for which line
- number has last been calculated. See line-number.c. */
- Lisp_Object line_number_cache;
-
/* Change data that goes with the text. */
struct buffer_text_change_data *changes;
} while (0)
\f
-#define BUFFER_BASE_BUFFER(b) ((b)->base_buffer ? (b)->base_buffer : (b))
-
-/* Map over buffers sharing the same text as MPS_BUF. MPS_BUFVAR is a
- variable that gets the buffer values (beginning with the base
- buffer, then the children), and MPS_BUFCONS should be a temporary
- Lisp_Object variable. */
-#define MAP_INDIRECT_BUFFERS(mps_buf, mps_bufvar, mps_bufcons) \
-for (mps_bufcons = Qunbound, \
- mps_bufvar = BUFFER_BASE_BUFFER (mps_buf); \
- UNBOUNDP (mps_bufcons) ? \
- (mps_bufcons = mps_bufvar->indirect_children, \
- 1) \
- : (!NILP (mps_bufcons) \
- && (mps_bufvar = XBUFFER (XCAR (mps_bufcons)), 1) \
- && (mps_bufcons = XCDR (mps_bufcons), 1)); \
- )
-
-\f
-
-/************************************************************************/
-/* */
-/* working with raw internal-format data */
-/* */
-/************************************************************************/
-
/* NOTE: In all the following macros, we follow these rules concerning
multiple evaluation of the arguments:
denoted with the word "unsafe" in their name and are generally
meant to be called only by other macros that have already
stored the calling values in temporary variables.
+ */
+
+/************************************************************************/
+/* */
+/* working with raw internal-format data */
+/* */
+/************************************************************************/
+/* Use these on contiguous strings of data. If the text you're
+ operating on is known to come from a buffer, use the buffer-level
+ functions below -- they know about the gap and may be more
+ efficient. */
- Use the following functions/macros on contiguous strings of data.
- If the text you're operating on is known to come from a buffer, use
- the buffer-level functions below -- they know about the gap and may
- be more efficient.
+/* Functions are as follows:
- (A) For working with charptr's (pointers to internally-formatted text):
- -----------------------------------------------------------------------
+ (A) For working with charptr's (pointers to internally-formatted text):
+ -----------------------------------------------------------------------
- VALID_CHARPTR_P (ptr):
+ VALID_CHARPTR_P(ptr):
Given a charptr, does it point to the beginning of a character?
- ASSERT_VALID_CHARPTR (ptr):
+ ASSERT_VALID_CHARPTR(ptr):
If error-checking is enabled, assert that the given charptr
- points to the beginning of a character. Otherwise, do nothing.
+ points to the beginning of a character. Otherwise, do nothing.
- INC_CHARPTR (ptr):
+ INC_CHARPTR(ptr):
Given a charptr (assumed to point at the beginning of a character),
modify that pointer so it points to the beginning of the next
character.
- DEC_CHARPTR (ptr):
+ DEC_CHARPTR(ptr):
Given a charptr (assumed to point at the beginning of a
character or at the very end of the text), modify that pointer
so it points to the beginning of the previous character.
- VALIDATE_CHARPTR_BACKWARD (ptr):
+ VALIDATE_CHARPTR_BACKWARD(ptr):
Make sure that PTR is pointing to the beginning of a character.
- If not, back up until this is the case. Note that there are not
+ If not, back up until this is the case. Note that there are not
too many places where it is legitimate to do this sort of thing.
It's an error if you're passed an "invalid" char * pointer.
NOTE: PTR *must* be pointing to a valid part of the string (i.e.
not the very end, unless the string is zero-terminated or
something) in order for this function to not cause crashes.
- VALIDATE_CHARPTR_FORWARD (ptr):
+ VALIDATE_CHARPTR_FORWARD(ptr):
Make sure that PTR is pointing to the beginning of a character.
If not, move forward until this is the case. Note that there
are not too many places where it is legitimate to do this sort
section of internally-formatted text:
--------------------------------------------------------------
- bytecount_to_charcount (ptr, nbi):
+ bytecount_to_charcount(ptr, nbi):
Given a pointer to a text string and a length in bytes,
return the equivalent length in characters.
- charcount_to_bytecount (ptr, nch):
+ charcount_to_bytecount(ptr, nch):
Given a pointer to a text string and a length in characters,
return the equivalent length in bytes.
- charptr_n_addr (ptr, n):
+ charptr_n_addr(ptr, n):
Return a pointer to the beginning of the character offset N
(in characters) from PTR.
+ charptr_length(ptr):
+ Given a zero-terminated pointer to Emacs characters,
+ return the number of Emacs characters contained within.
+
(C) For retrieving or changing the character pointed to by a charptr:
---------------------------------------------------------------------
- charptr_emchar (ptr):
+ charptr_emchar(ptr):
Retrieve the character pointed to by PTR as an Emchar.
- charptr_emchar_n (ptr, n):
+ charptr_emchar_n(ptr, n):
Retrieve the character at offset N (in characters) from PTR,
as an Emchar.
- set_charptr_emchar (ptr, ch):
+ set_charptr_emchar(ptr, ch):
Store the character CH (an Emchar) as internally-formatted
text starting at PTR. Return the number of bytes stored.
- charptr_copy_char (ptr, ptr2):
+ charptr_copy_char(ptr, ptr2):
Retrieve the character pointed to by PTR and store it as
internally-formatted text in PTR2.
in mule-charset.h, for retrieving the charset of an Emchar
and such. These are only valid when MULE is defined.]
- valid_char_p (ch):
+ valid_char_p(ch):
Return whether the given Emchar is valid.
- CHARP (ch):
- Return whether the given Lisp_Object is a character.
+ CHARP(ch):
+ Return whether the given Lisp_Object is a valid character.
+ This is approximately the same as saying the Lisp_Object is
+ an int whose value is a valid Emchar. (But not exactly
+ because when MULE is not defined, we allow arbitrary values
+ in all but the lowest 8 bits and mask them off, for backward
+ compatibility.)
- CHECK_CHAR_COERCE_INT (ch):
- Signal an error if CH is not a valid character or integer Lisp_Object.
- If CH is an integer Lisp_Object, convert it to a character Lisp_Object,
- but merely by repackaging, without performing tests for char validity.
+ CHECK_CHAR_COERCE_INT(ch):
+ Signal an error if CH is not a valid character as per CHARP().
+ Also canonicalize the value into a valid Emchar, as necessary.
+ (This only means anything when MULE is not defined.)
+
+ COERCE_CHAR(ch):
+ Coerce an object that is known to satisfy CHARP() into a
+ valid Emchar.
MAX_EMCHAR_LEN:
Maximum number of buffer bytes per Emacs character.
method because it doesn't have easy access to the first byte of
the character it's moving over. */
-#define REAL_INC_CHARPTR(ptr) \
- ((void) ((ptr) += REP_BYTES_BY_FIRST_BYTE (* (unsigned char *) (ptr))))
+#define real_inc_charptr_fun(ptr) \
+ ((ptr) += REP_BYTES_BY_FIRST_BYTE (* (unsigned char *) (ptr)))
+#ifdef ERROR_CHECK_BUFPOS
+#define inc_charptr_fun(ptr) (ASSERT_VALID_CHARPTR (ptr), \
+ real_inc_charptr_fun (ptr))
+#else
+#define inc_charptr_fun(ptr) real_inc_charptr_fun (ptr)
+#endif
-#define REAL_DEC_CHARPTR(ptr) do { \
- (ptr)--; \
-} while (!VALID_CHARPTR_P (ptr))
+#define REAL_INC_CHARPTR(ptr) ((void) (real_inc_charptr_fun (ptr)))
-#ifdef ERROR_CHECK_BUFPOS
#define INC_CHARPTR(ptr) do { \
ASSERT_VALID_CHARPTR (ptr); \
REAL_INC_CHARPTR (ptr); \
} while (0)
-#define DEC_CHARPTR(ptr) do { \
- CONST Bufbyte *dc_ptr1 = (ptr); \
- CONST Bufbyte *dc_ptr2 = dc_ptr1; \
- REAL_DEC_CHARPTR (dc_ptr2); \
- assert (dc_ptr1 - dc_ptr2 == \
- REP_BYTES_BY_FIRST_BYTE (*dc_ptr2)); \
- (ptr) = dc_ptr2; \
-} while (0)
+#define REAL_DEC_CHARPTR(ptr) do { \
+ (ptr)--; \
+} while (!VALID_CHARPTR_P (ptr))
-#else /* ! ERROR_CHECK_BUFPOS */
-#define INC_CHARPTR(ptr) REAL_INC_CHARPTR (ptr)
+#ifdef ERROR_CHECK_BUFPOS
+#define DEC_CHARPTR(ptr) do { \
+ CONST Bufbyte *__dcptr__ = (ptr); \
+ CONST Bufbyte *__dcptr2__ = __dcptr__; \
+ REAL_DEC_CHARPTR (__dcptr2__); \
+ assert (__dcptr__ - __dcptr2__ == \
+ REP_BYTES_BY_FIRST_BYTE (*__dcptr2__)); \
+ (ptr) = __dcptr2__; \
+} while (0)
+#else
#define DEC_CHARPTR(ptr) REAL_DEC_CHARPTR (ptr)
-#endif /* ! ERROR_CHECK_BUFPOS */
+#endif
#ifdef MULE
the end of the string. */
#define VALIDATE_CHARPTR_FORWARD(ptr) do { \
- Bufbyte *vcf_ptr = (ptr); \
- VALIDATE_CHARPTR_BACKWARD (vcf_ptr); \
- if (vcf_ptr != (ptr)) \
+ Bufbyte *__vcfptr__ = (ptr); \
+ VALIDATE_CHARPTR_BACKWARD (__vcfptr__); \
+ if (__vcfptr__ != (ptr)) \
{ \
- (ptr) = vcf_ptr; \
+ (ptr) = __vcfptr__; \
INC_CHARPTR (ptr); \
} \
} while (0)
return ptr + charcount_to_bytecount (ptr, offset);
}
+INLINE Charcount charptr_length (CONST Bufbyte *ptr);
+INLINE Charcount
+charptr_length (CONST Bufbyte *ptr)
+{
+ return bytecount_to_charcount (ptr, strlen ((CONST char *) ptr));
+}
+
+
/* -------------------------------------------------------------------- */
/* (C) For retrieving or changing the character pointed to by a charptr */
/* -------------------------------------------------------------------- */
INLINE int
valid_char_p (Emchar ch)
{
- return ((unsigned int) (ch) <= 0xff) || non_ascii_valid_char_p (ch);
+ return (ch >= 0 && ch <= 255) || non_ascii_valid_char_p (ch);
}
#else /* not MULE */
-#define valid_char_p(ch) ((unsigned int) (ch) <= 0xff)
+#define valid_char_p(ch) ((unsigned int) (ch) <= 255)
#endif /* not MULE */
results with stupid compilers. */
#ifdef MULE
-# define VALIDATE_BYTIND_BACKWARD(buf, x) do { \
- Bufbyte *VBB_ptr = BI_BUF_BYTE_ADDRESS (buf, x); \
- while (!BUFBYTE_FIRST_BYTE_P (*VBB_ptr)) \
- VBB_ptr--, (x)--; \
+# define VALIDATE_BYTIND_BACKWARD(buf, x) do \
+{ \
+ Bufbyte *__ibptr = BI_BUF_BYTE_ADDRESS (buf, x); \
+ while (!BUFBYTE_FIRST_BYTE_P (*__ibptr)) \
+ __ibptr--, (x)--; \
} while (0)
#else
# define VALIDATE_BYTIND_BACKWARD(buf, x)
results with stupid compilers. */
#ifdef MULE
-# define VALIDATE_BYTIND_FORWARD(buf, x) do { \
- Bufbyte *VBF_ptr = BI_BUF_BYTE_ADDRESS (buf, x); \
- while (!BUFBYTE_FIRST_BYTE_P (*VBF_ptr)) \
- VBF_ptr++, (x)++; \
+# define VALIDATE_BYTIND_FORWARD(buf, x) do \
+{ \
+ Bufbyte *__ibptr = BI_BUF_BYTE_ADDRESS (buf, x); \
+ while (!BUFBYTE_FIRST_BYTE_P (*__ibptr)) \
+ __ibptr++, (x)++; \
} while (0)
#else
# define VALIDATE_BYTIND_FORWARD(buf, x)
Extcount gceda_len_out; \
CONST Bufbyte *gceda_ptr_in = (ptr); \
Extbyte *gceda_ptr_out = \
- convert_to_external_format (gceda_ptr_in, gceda_len_in, \
+ convert_to_external_format (gceda_ptr_in, gceda_len_in, \
&gceda_len_out, fmt); \
/* If the new string is identical to the old (will be the case most \
of the time), just return the same string back. This saves \
!memcmp (gceda_ptr_in, gceda_ptr_out, gceda_len_out)) \
{ \
(ptr_out) = (Extbyte *) gceda_ptr_in; \
+ (len_out) = (Extcount) gceda_len_in; \
} \
else \
{ \
(ptr_out) = (Extbyte *) alloca (1 + gceda_len_out); \
memcpy ((void *) ptr_out, gceda_ptr_out, 1 + gceda_len_out); \
+ (len_out) = (Extcount) gceda_len_out; \
} \
- (len_out) = gceda_len_out; \
} while (0)
#else /* ! MULE */
{ \
Extcount gcida_len_in = (Extcount) (len); \
Bytecount gcida_len_out; \
- CONST Extbyte *gcida_ptr_in = (ptr); \
+ CONST Extbyte *gcida_ptr_in = (ptr); \
Bufbyte *gcida_ptr_out = \
- convert_from_external_format (gcida_ptr_in, gcida_len_in, \
+ convert_from_external_format (gcida_ptr_in, gcida_len_in, \
&gcida_len_out, fmt); \
/* If the new string is identical to the old (will be the case most \
of the time), just return the same string back. This saves \
!memcmp (gcida_ptr_in, gcida_ptr_out, gcida_len_out)) \
{ \
(ptr_out) = (Bufbyte *) gcida_ptr_in; \
+ (len_out) = (Bytecount) gcida_len_in; \
} \
else \
{ \
(ptr_out) = (Extbyte *) alloca (1 + gcida_len_out); \
memcpy ((void *) ptr_out, gcida_ptr_out, 1 + gcida_len_out); \
+ (len_out) = gcida_len_out; \
} \
- (len_out) = gcida_len_out; \
} while (0)
#else /* ! MULE */
/* This is the initial (startup) directory, as used for the *scratch* buffer.
We're making this a global to make others aware of the startup directory.
- `initial_directory' is stored in external format.
*/
extern char initial_directory[];
extern void init_initial_directory (void); /* initialize initial_directory */
#else /* !REL_ALLOC */
#define BUFFER_ALLOC(data,size)\
- (data = xnew_array (Bufbyte, size))
+ ((void) (data = xnew_array (Bufbyte, size)))
#define BUFFER_REALLOC(data,size)\
((Bufbyte *) xrealloc (data, (size) * sizeof(Bufbyte)))
/* Avoid excess parentheses, or syntax errors may rear their heads. */
void convert_bufbyte_string_into_emchar_dynarr (CONST Bufbyte *str,
Bytecount len,
Emchar_dynarr *dyn);
-Charcount convert_bufbyte_string_into_emchar_string (CONST Bufbyte *str,
- Bytecount len,
- Emchar *arr);
+int convert_bufbyte_string_into_emchar_string (CONST Bufbyte *str,
+ Bytecount len,
+ Emchar *arr);
void convert_emchar_string_into_bufbyte_dynarr (Emchar *arr, int nels,
Bufbyte_dynarr *dyn);
Bufbyte *convert_emchar_string_into_malloced_string (Emchar *arr, int nels,
typically used to convert between uppercase and lowercase. For
compatibility reasons, trt tables are currently in the form of
a Lisp string of 256 characters, specifying the conversion for each
- of the first 256 Emacs characters (i.e. the 256 Latin-1 characters).
- This should be generalized at some point to support conversions for
- all of the allowable Mule characters.
+ of the first 256 Emacs characters (i.e. the 256 extended-ASCII
+ characters). This should be generalized at some point to support
+ conversions for all of the allowable Mule characters.
*/
/* The _1 macros are named as such because they assume that you have
return (DOWNCASE_TABLE_OF (buf, ch) == ch) ? UPCASE_TABLE_OF (buf, ch) : ch;
}
-/* Upcase a character known to be not upper case. Unused. */
+/* Upcase a character known to be not upper case. */
#define UPCASE1(buf, ch) UPCASE_TABLE_OF (buf, ch)
Specifically, this lists those variables that have
a buffer-local value in this buffer: i.e. those
whose value does not shadow the default value.
- (Remember that for any particular variable created
+ (Remember that for any particlar variable created
with `make-local-variable' or `make-variable-buffer-local',
it will have a per-buffer value in some buffers and a
default value in others.)
the next few times we add a new slot. */
MARKED_SLOT (extra1, extra2, extra3);
#endif
+ /* The cache of positions for whilch line number has last been
+ calculated. See line-number.c. */
+ MARKED_SLOT (line_number_cache);
+
/* XEmacs case conversion functions.
- Copyright (C) 1985, 1992, 1993, 1994, 1997, 1998 Free Software Foundation, Inc.
+ Copyright (C) 1985, 1992, 1993, 1994 Free Software Foundation, Inc.
This file is part of XEmacs.
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
-/* Synched up with: FSF 19.34, but substantially rewritten by Martin. */
+/* Synched up with: FSF 19.34. */
#include <config.h>
#include "lisp.h"
#include "buffer.h"
+#include "commands.h"
#include "insdel.h"
#include "syntax.h"
casify_object (enum case_action flag, Lisp_Object obj, Lisp_Object buffer)
{
struct buffer *buf = decode_buffer (buffer, 0);
+ REGISTER int inword = (flag == CASE_DOWN);
+ struct Lisp_Char_Table *syntax_table = XCHAR_TABLE (buf->mirror_syntax_table);
- retry:
-
- if (CHAR_OR_CHAR_INTP (obj))
- {
- Emchar c;
- CHECK_CHAR_COERCE_INT (obj);
- c = XCHAR (obj);
- c = (flag == CASE_DOWN) ? DOWNCASE (buf, c) : UPCASE (buf, c);
- return make_char (c);
- }
-
- if (STRINGP (obj))
+ while (1)
{
- struct Lisp_Char_Table *syntax_table =
- XCHAR_TABLE (buf->mirror_syntax_table);
- Bufbyte *storage =
- alloca_array (Bufbyte, XSTRING_LENGTH (obj) * MAX_EMCHAR_LEN);
- Bufbyte *newp = storage;
- Bufbyte *oldp = XSTRING_DATA (obj);
- int wordp = 0, wordp_prev;
-
- while (*oldp)
+ if (CHAR_OR_CHAR_INTP (obj))
{
- Emchar c = charptr_emchar (oldp);
- switch (flag)
+ Emchar c;
+ CHECK_CHAR_COERCE_INT (obj);
+ c = XCHAR (obj);
+ if (IN_TRT_TABLE_DOMAIN (c))
{
- case CASE_UP:
- c = UPCASE (buf, c);
- break;
- case CASE_DOWN:
- c = DOWNCASE (buf, c);
- break;
- case CASE_CAPITALIZE:
- case CASE_CAPITALIZE_UP:
- wordp_prev = wordp;
- wordp = WORD_SYNTAX_P (syntax_table, c);
- if (!wordp) break;
- if (wordp_prev)
- {
- if (flag == CASE_CAPITALIZE)
- c = DOWNCASE (buf, c);
- }
- else
- c = UPCASE (buf, c);
- break;
+ if (inword)
+ obj = make_char (DOWNCASE (buf, c));
+ else if (!UPPERCASEP (buf, c))
+ obj = make_char (UPCASE1 (buf, c));
}
-
- newp += set_charptr_emchar (newp, c);
- INC_CHARPTR (oldp);
+ return obj;
}
-
- return make_string (storage, newp - storage);
+ if (STRINGP (obj))
+ {
+ Charcount i;
+ Charcount len = XSTRING_CHAR_LENGTH (obj);
+ obj = Fcopy_sequence (obj);
+ for (i = 0; i < len; i++)
+ {
+ Emchar c = string_char (XSTRING (obj), i);
+ if (inword && flag != CASE_CAPITALIZE_UP)
+ c = DOWNCASE (buf, c);
+ else if (!UPPERCASEP (buf, c)
+ && (!inword || flag != CASE_CAPITALIZE_UP))
+ c = UPCASE1 (buf, c);
+ set_string_char (XSTRING (obj), i, c);
+ if ((int) flag >= (int) CASE_CAPITALIZE)
+ inword = WORD_SYNTAX_P (syntax_table, c);
+ }
+ return obj;
+ }
+ obj = wrong_type_argument (Qchar_or_string_p, obj);
}
-
- obj = wrong_type_argument (Qchar_or_string_p, obj);
- goto retry;
}
DEFUN ("upcase", Fupcase, 1, 2, 0, /*
-Convert OBJECT to upper case and return that.
-OBJECT may be a character or string. The result has the same type.
-OBJECT is not altered--the value is a copy.
+Convert argument to upper case and return that.
+The argument may be a character or string. The result has the same type.
+The argument object is not altered--the value is a copy.
See also `capitalize', `downcase' and `upcase-initials'.
Optional second arg BUFFER specifies which buffer's case tables to use,
and defaults to the current buffer.
*/
- (object, buffer))
+ (obj, buffer))
{
- return casify_object (CASE_UP, object, buffer);
+ return casify_object (CASE_UP, obj, buffer);
}
DEFUN ("downcase", Fdowncase, 1, 2, 0, /*
-Convert OBJECT to lower case and return that.
-OBJECT may be a character or string. The result has the same type.
-OBJECT is not altered--the value is a copy.
+Convert argument to lower case and return that.
+The argument may be a character or string. The result has the same type.
+The argument object is not altered--the value is a copy.
Optional second arg BUFFER specifies which buffer's case tables to use,
and defaults to the current buffer.
*/
- (object, buffer))
+ (obj, buffer))
{
- return casify_object (CASE_DOWN, object, buffer);
+ return casify_object (CASE_DOWN, obj, buffer);
}
DEFUN ("capitalize", Fcapitalize, 1, 2, 0, /*
-Convert OBJECT to capitalized form and return that.
+Convert argument to capitalized form and return that.
This means that each word's first character is upper case
and the rest is lower case.
-OBJECT may be a character or string. The result has the same type.
-OBJECT is not altered--the value is a copy.
+The argument may be a character or string. The result has the same type.
+The argument object is not altered--the value is a copy.
Optional second arg BUFFER specifies which buffer's case tables to use,
and defaults to the current buffer.
*/
- (object, buffer))
+ (obj, buffer))
{
- return casify_object (CASE_CAPITALIZE, object, buffer);
+ return casify_object (CASE_CAPITALIZE, obj, buffer);
}
-/* Like Fcapitalize but change only the initial characters. */
+/* Like Fcapitalize but change only the initials. */
DEFUN ("upcase-initials", Fupcase_initials, 1, 2, 0, /*
-Convert the initial of each word in OBJECT to upper case.
+Convert the initial of each word in the argument to upper case.
Do not change the other letters of each word.
-OBJECT may be a character or string. The result has the same type.
-OBJECT is not altered--the value is a copy.
+The argument may be a character or string. The result has the same type.
+The argument object is not altered--the value is a copy.
Optional second arg BUFFER specifies which buffer's case tables to use,
and defaults to the current buffer.
*/
- (object, buffer))
+ (obj, buffer))
{
- return casify_object (CASE_CAPITALIZE_UP, object, buffer);
+ return casify_object (CASE_CAPITALIZE_UP, obj, buffer);
}
\f
/* flag is CASE_UP, CASE_DOWN or CASE_CAPITALIZE or CASE_CAPITALIZE_UP.
/* This function can GC */
REGISTER Bufpos i;
Bufpos start, end;
+ REGISTER int inword = (flag == CASE_DOWN);
struct Lisp_Char_Table *syntax_table = XCHAR_TABLE (buf->mirror_syntax_table);
int mccount;
- Emchar oldc, c;
- int wordp = 0, wordp_prev;
if (EQ (b, e))
/* Not modifying because nothing marked */
for (i = start; i < end; i++)
{
- c = oldc = BUF_FETCH_CHAR (buf, i);
+ Emchar c = BUF_FETCH_CHAR (buf, i);
+ Emchar oldc = c;
- switch (flag)
+ if (inword && flag != CASE_CAPITALIZE_UP)
+ c = DOWNCASE (buf, c);
+ else if (!UPPERCASEP (buf, c)
+ && (!inword || flag != CASE_CAPITALIZE_UP))
+ c = UPCASE1 (buf, c);
+
+ if (oldc != c)
{
- case CASE_UP:
- c = UPCASE (buf, oldc);
- break;
- case CASE_DOWN:
- c = DOWNCASE (buf, oldc);
- break;
- case CASE_CAPITALIZE:
- case CASE_CAPITALIZE_UP:
- /* !!#### need to revalidate the start and end pointers in case
- the buffer was changed */
- wordp_prev = wordp;
- wordp = WORD_SYNTAX_P (syntax_table, c);
- if (!wordp) continue;
- if (wordp_prev)
- {
- if (flag == CASE_CAPITALIZE)
- c = DOWNCASE (buf, c);
- }
- else
- c = UPCASE (buf, c);
- break;
+ buffer_replace_char (buf, i, c, 1, (i == start));
+ BUF_MODIFF (buf)++;
}
-
- if (oldc == c) continue;
- buffer_replace_char (buf, i, c, 1, (i == start));
- BUF_MODIFF (buf)++;
+ /* !!#### need to revalidate the start and end pointers in case
+ the buffer was changed */
+ if ((int) flag >= (int) CASE_CAPITALIZE)
+ inword = WORD_SYNTAX_P (syntax_table, c);
}
-
end_multiple_change (buf, mccount);
}
}
DEFUN ("upcase-word", Fupcase_word, 1, 2, "p", /*
-Convert following word (or N words) to upper case, moving over.
+Convert following word (or ARG words) to upper case, moving over.
With negative argument, convert previous words but do not move.
See also `capitalize-word'.
Optional second arg BUFFER defaults to the current buffer.
*/
- (n, buffer))
+ (arg, buffer))
{
/* This function can GC */
- return casify_word (CASE_UP, n, buffer);
+ return casify_word (CASE_UP, arg, buffer);
}
DEFUN ("downcase-word", Fdowncase_word, 1, 2, "p", /*
-Convert following word (or N words) to lower case, moving over.
+Convert following word (or ARG words) to lower case, moving over.
With negative argument, convert previous words but do not move.
Optional second arg BUFFER defaults to the current buffer.
*/
- (n, buffer))
+ (arg, buffer))
{
/* This function can GC */
- return casify_word (CASE_DOWN, n, buffer);
+ return casify_word (CASE_DOWN, arg, buffer);
}
DEFUN ("capitalize-word", Fcapitalize_word, 1, 2, "p", /*
-Capitalize the following word (or N words), moving over.
+Capitalize the following word (or ARG words), moving over.
This gives the word(s) a first character in upper case
and the rest lower case.
With negative argument, capitalize previous words but do not move.
Optional second arg BUFFER defaults to the current buffer.
*/
- (n, buffer))
+ (arg, buffer))
{
/* This function can GC */
- return casify_word (CASE_CAPITALIZE, n, buffer);
+ return casify_word (CASE_CAPITALIZE, arg, buffer);
}
\f
Copyright (C) 1992, 1995 Free Software Foundation, Inc.
Copyright (C) 1995 Sun Microsystems, Inc.
Copyright (C) 1995, 1996 Ben Wing.
- Copyright (C) 1995, 1997, 1999 Electrotechnical Laboratory, JAPAN.
- Licensed to the Free Software Foundation.
This file is part of XEmacs.
#include "buffer.h"
#include "chartab.h"
+#include "commands.h"
#include "syntax.h"
Lisp_Object Qchar_tablep, Qchar_table;
Lisp_Object Qcategory_table_value_p;
Lisp_Object Vstandard_category_table;
-
-/* Variables to determine word boundary. */
-Lisp_Object Vword_combining_categories, Vword_separating_categories;
#endif /* MULE */
\f
for (i = 0; i < 96; i++)
{
- markobj (cte->level2[i]);
+ (markobj) (cte->level2[i]);
}
return Qnil;
}
return internal_array_hash (cte->level2, 96, depth);
}
-static const struct lrecord_description char_table_entry_description[] = {
- { XD_LISP_OBJECT, offsetof(struct Lisp_Char_Table_Entry, level2), 96 },
- { XD_END }
-};
-
DEFINE_LRECORD_IMPLEMENTATION ("char-table-entry", char_table_entry,
mark_char_table_entry, internal_object_printer,
0, char_table_entry_equal,
char_table_entry_hash,
- char_table_entry_description,
struct Lisp_Char_Table_Entry);
#endif /* MULE */
int i;
for (i = 0; i < NUM_ASCII_CHARS; i++)
- markobj (ct->ascii[i]);
+ (markobj) (ct->ascii[i]);
#ifdef MULE
for (i = 0; i < NUM_LEADING_BYTES; i++)
- markobj (ct->level1[i]);
+ (markobj) (ct->level1[i]);
#endif
return ct->mirror_table;
}
/* WARNING: All functions of this nature need to be written extremely
carefully to avoid crashes during GC. Cf. prune_specifiers()
- and prune_weak_hash_tables(). */
+ and prune_weak_hashtables(). */
void
prune_syntax_tables (int (*obj_marked_p) (Lisp_Object))
!GC_NILP (rest);
rest = XCHAR_TABLE (rest)->next_table)
{
- if (! obj_marked_p (rest))
+ if (! ((*obj_marked_p) (rest)))
{
/* This table is garbage. Remove it from the list. */
if (GC_NILP (prev))
{
switch (type)
{
- default: abort();
case CHAR_TABLE_TYPE_GENERIC: return Qgeneric;
case CHAR_TABLE_TYPE_SYNTAX: return Qsyntax;
case CHAR_TABLE_TYPE_DISPLAY: return Qdisplay;
case CHAR_TABLE_TYPE_CATEGORY: return Qcategory;
#endif
}
+
+ abort ();
+ return Qnil; /* not reached */
}
static enum char_table_type
return hashval;
}
-static const struct lrecord_description char_table_description[] = {
- { XD_LISP_OBJECT, offsetof(struct Lisp_Char_Table, ascii), NUM_ASCII_CHARS },
-#ifdef MULE
- { XD_LISP_OBJECT, offsetof(struct Lisp_Char_Table, level1), NUM_LEADING_BYTES },
-#endif
- { XD_END }
-};
-
DEFINE_LRECORD_IMPLEMENTATION ("char-table", char_table,
mark_char_table, print_char_table, 0,
char_table_equal, char_table_hash,
- char_table_description,
struct Lisp_Char_Table);
DEFUN ("char-table-p", Fchar_table_p, 1, 1, 0, /*
switch (ct->type)
{
case CHAR_TABLE_TYPE_CHAR:
- fill_char_table (ct, make_char (0));
- break;
case CHAR_TABLE_TYPE_DISPLAY:
case CHAR_TABLE_TYPE_GENERIC:
#ifdef MULE
case CHAR_TABLE_TYPE_CATEGORY:
-#endif /* MULE */
fill_char_table (ct, Qnil);
break;
+#endif /* MULE */
case CHAR_TABLE_TYPE_SYNTAX:
fill_char_table (ct, make_int (Sinherit));
Lisp_Object obj;
enum char_table_type ty = symbol_to_char_table_type (type);
- ct = alloc_lcrecord_type (struct Lisp_Char_Table, &lrecord_char_table);
+ ct = alloc_lcrecord_type (struct Lisp_Char_Table, lrecord_char_table);
ct->type = ty;
if (ty == CHAR_TABLE_TYPE_SYNTAX)
{
int i;
struct Lisp_Char_Table_Entry *cte =
alloc_lcrecord_type (struct Lisp_Char_Table_Entry,
- &lrecord_char_table_entry);
+ lrecord_char_table_entry);
for (i = 0; i < 96; i++)
cte->level2[i] = initval;
int i;
struct Lisp_Char_Table_Entry *ctenew =
alloc_lcrecord_type (struct Lisp_Char_Table_Entry,
- &lrecord_char_table_entry);
+ lrecord_char_table_entry);
for (i = 0; i < 96; i++)
{
CHECK_CHAR_TABLE (old_table);
ct = XCHAR_TABLE (old_table);
- ctnew = alloc_lcrecord_type (struct Lisp_Char_Table, &lrecord_char_table);
+ ctnew = alloc_lcrecord_type (struct Lisp_Char_Table, lrecord_char_table);
ctnew->type = ct->type;
for (i = 0; i < NUM_ASCII_CHARS; i++)
#endif /* MULE */
-Lisp_Object
+static Lisp_Object
get_char_table (Emchar ch, struct Lisp_Char_Table *ct)
{
#ifdef MULE
CHECK_CHAR_COERCE_INT (cdr);
return Fcons (car, cdr);
}
- break;
- case CHAR_TABLE_TYPE_CHAR:
- CHECK_CHAR_COERCE_INT (value);
- break;
default:
break;
}
return CATEGORY_TABLE_VALUEP (obj) ? Qt : Qnil;
}
-
-#define CATEGORYP(x) \
- (CHARP ((x)) && XCHAR ((x)) >= 0x20 && XCHAR ((x)) <= 0x7E)
-
-#define CATEGORY_SET(c) \
- (get_char_table(c, XCHAR_TABLE(current_buffer->category_table)))
-
-/* Return 1 if CATEGORY_SET contains CATEGORY, else return 0.
- The faster version of `!NILP (Faref (category_set, category))'. */
-#define CATEGORY_MEMBER(category, category_set) \
- (bit_vector_bit(XBIT_VECTOR (category_set), category - 32))
-
-/* Return 1 if there is a word boundary between two word-constituent
- characters C1 and C2 if they appear in this order, else return 0.
- Use the macro WORD_BOUNDARY_P instead of calling this function
- directly. */
-
-int
-word_boundary_p (Emchar c1, Emchar c2)
-{
- Lisp_Object category_set1, category_set2;
- Lisp_Object tail;
- int default_result;
-
-#if 0
- if (COMPOSITE_CHAR_P (c1))
- c1 = cmpchar_component (c1, 0, 1);
- if (COMPOSITE_CHAR_P (c2))
- c2 = cmpchar_component (c2, 0, 1);
-#endif
-
- if (EQ (CHAR_CHARSET (c1), CHAR_CHARSET (c2)))
- {
- tail = Vword_separating_categories;
- default_result = 0;
- }
- else
- {
- tail = Vword_combining_categories;
- default_result = 1;
- }
-
- category_set1 = CATEGORY_SET (c1);
- if (NILP (category_set1))
- return default_result;
- category_set2 = CATEGORY_SET (c2);
- if (NILP (category_set2))
- return default_result;
-
- for (; CONSP (tail); tail = XCONS (tail)->cdr)
- {
- Lisp_Object elt = XCONS(tail)->car;
-
- if (CONSP (elt)
- && CATEGORYP (XCONS (elt)->car)
- && CATEGORYP (XCONS (elt)->cdr)
- && CATEGORY_MEMBER (XCHAR (XCONS (elt)->car), category_set1)
- && CATEGORY_MEMBER (XCHAR (XCONS (elt)->cdr), category_set2))
- return !default_result;
- }
- return default_result;
-}
#endif /* MULE */
\f
DEFSUBR (Fcategory_table_value_p);
#endif /* MULE */
-}
-
-void
-vars_of_chartab (void)
-{
/* DO NOT staticpro this. It works just like Vweak_hash_tables. */
Vall_syntax_tables = Qnil;
}
Vstandard_category_table = Qnil;
Vstandard_category_table = Fcopy_category_table (Qnil);
staticpro (&Vstandard_category_table);
-
- DEFVAR_LISP ("word-combining-categories", &Vword_combining_categories /*
-List of pair (cons) of categories to determine word boundary.
-
-Emacs treats a sequence of word constituent characters as a single
-word (i.e. finds no word boundary between them) iff they belongs to
-the same charset. But, exceptions are allowed in the following cases.
-
-(1) The case that characters are in different charsets is controlled
-by the variable `word-combining-categories'.
-
-Emacs finds no word boundary between characters of different charsets
-if they have categories matching some element of this list.
-
-More precisely, if an element of this list is a cons of category CAT1
-and CAT2, and a multibyte character C1 which has CAT1 is followed by
-C2 which has CAT2, there's no word boundary between C1 and C2.
-
-For instance, to tell that ASCII characters and Latin-1 characters can
-form a single word, the element `(?l . ?l)' should be in this list
-because both characters have the category `l' (Latin characters).
-
-(2) The case that character are in the same charset is controlled by
-the variable `word-separating-categories'.
-
-Emacs find a word boundary between characters of the same charset
-if they have categories matching some element of this list.
-
-More precisely, if an element of this list is a cons of category CAT1
-and CAT2, and a multibyte character C1 which has CAT1 is followed by
-C2 which has CAT2, there's a word boundary between C1 and C2.
-
-For instance, to tell that there's a word boundary between Japanese
-Hiragana and Japanese Kanji (both are in the same charset), the
-element `(?H . ?C) should be in this list.
-*/ );
-
- Vword_combining_categories = Qnil;
-
- DEFVAR_LISP ("word-separating-categories", &Vword_separating_categories /*
-List of pair (cons) of categories to determine word boundary.
-See the documentation of the variable `word-combining-categories'.
-*/ );
-
- Vword_separating_categories = Qnil;
#endif /* MULE */
}
void fill_char_table (struct Lisp_Char_Table *ct, Lisp_Object value);
void put_char_table (struct Lisp_Char_Table *ct, struct chartab_range *range,
Lisp_Object val);
-Lisp_Object get_char_table (Emchar, struct Lisp_Char_Table *);
int map_char_table (struct Lisp_Char_Table *ct,
struct chartab_range *range,
int (*fn) (struct chartab_range *range,
EXFUN (Fcopy_char_table, 1);
EXFUN (Fmake_char_table, 1);
EXFUN (Fput_char_table, 3);
-EXFUN (Fget_char_table, 2);
extern Lisp_Object Vall_syntax_tables;
--- /dev/null
+/* This file is part of XEmacs.
+
+XEmacs is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+XEmacs is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with XEmacs; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/* Synched up with: FSF 19.30. */
+
+#define CHP$_END 0
+#define CHP$_ACCESS 1
+#define CHP$_FLAGS 2
+#define CHP$_PRIV 3
+#define CHP$_ACMODE 4
+#define CHP$_ACCLASS 5
+#define CHP$_RIGHTS 6
+#define CHP$_ADDRIGHTS 7
+#define CHP$_MODE 8
+#define CHP$_MODES 9
+#define CHP$_MINCLASS 10
+#define CHP$_MAXCLASS 11
+#define CHP$_OWNER 12
+#define CHP$_PROT 13
+#define CHP$_ACL 14
+#define CHP$_AUDITNAME 15
+#define CHP$_ALARMNAME 16
+#define CHP$_MATCHEDACE 17
+#define CHP$_PRIVUSED 18
+#define CHP$_MAX_CODE 19
+#define CHP$M_SYSPRV 1
+#define CHP$M_BYPASS 2
+#define CHP$M_UPGRADE 4
+#define CHP$M_DOWNGRADE 8
+#define CHP$M_GRPPRV 16
+#define CHP$M_READALL 32
+#define CHP$V_SYSPRV 0
+#define CHP$V_BYPASS 1
+#define CHP$V_UPGRADE 2
+#define CHP$V_DOWNGRADE 3
+#define CHP$V_GRPPRV 4
+#define CHP$V_READALL 5
+#define CHP$M_READ 1
+#define CHP$M_WRITE 2
+#define CHP$M_USEREADALL 4
+#define CHP$V_READ 0
+#define CHP$V_WRITE 1
+#define CHP$V_USEREADALL 2
Lisp_Object Vself_insert_face_command;
\f
DEFUN ("forward-char", Fforward_char, 0, 2, "_p", /*
-Move point right N characters (left if N negative).
+Move point right ARG characters (left if ARG negative).
On attempt to pass end of buffer, stop and signal `end-of-buffer'.
On attempt to pass beginning of buffer, stop and signal `beginning-of-buffer'.
On reaching end of buffer, stop and signal error.
*/
- (n, buffer))
+ (arg, buffer))
{
struct buffer *buf = decode_buffer (buffer, 1);
- EMACS_INT count;
- if (NILP (n))
- count = 1;
+ if (NILP (arg))
+ arg = make_int (1);
else
- {
- CHECK_INT (n);
- count = XINT (n);
- }
+ CHECK_INT (arg);
- /* This used to just set point to point + XINT (n), and then check
+ /* This used to just set point to point + XINT (arg), and then check
to see if it was within boundaries. But now that SET_PT can
potentially do a lot of stuff (calling entering and exiting
hooks, etcetera), that's not a good approach. So we validate the
proposed position, then set point. */
{
- Bufpos new_point = BUF_PT (buf) + count;
+ Bufpos new_point = BUF_PT (buf) + XINT (arg);
if (new_point < BUF_BEGV (buf))
{
}
DEFUN ("backward-char", Fbackward_char, 0, 2, "_p", /*
-Move point left N characters (right if N negative).
+Move point left ARG characters (right if ARG negative).
On attempt to pass end of buffer, stop and signal `end-of-buffer'.
On attempt to pass beginning of buffer, stop and signal `beginning-of-buffer'.
*/
- (n, buffer))
+ (arg, buffer))
{
- if (NILP (n))
- n = make_int (-1);
+ if (NILP (arg))
+ arg = make_int (1);
else
- {
- CHECK_INT (n);
- XSETINT (n, - XINT (n));
- }
- return Fforward_char (n, buffer);
+ CHECK_INT (arg);
+
+ XSETINT (arg, - XINT (arg));
+ return Fforward_char (arg, buffer);
}
DEFUN ("forward-line", Fforward_line, 0, 2, "_p", /*
-Move N lines forward (backward if N is negative).
-Precisely, if point is on line I, move to the start of line I + N.
+Move ARG lines forward (backward if ARG is negative).
+Precisely, if point is on line I, move to the start of line I + ARG.
If there isn't room, go as far as possible (no error).
Returns the count of lines left to move. If moving forward,
-that is N - number of lines moved; if backward, N + number moved.
-With positive N, a non-empty line at the end counts as one line
+that is ARG - number of lines moved; if backward, ARG + number moved.
+With positive ARG, a non-empty line at the end counts as one line
successfully moved (for the return value).
If BUFFER is nil, the current buffer is assumed.
*/
- (n, buffer))
+ (arg, buffer))
{
struct buffer *buf = decode_buffer (buffer, 1);
Bufpos pos2 = BUF_PT (buf);
Bufpos pos;
EMACS_INT count, shortage, negp;
- if (NILP (n))
+ if (NILP (arg))
count = 1;
else
{
- CHECK_INT (n);
- count = XINT (n);
+ CHECK_INT (arg);
+ count = XINT (arg);
}
negp = count <= 0;
If scan reaches end of buffer, return that position.
This function does not move point.
*/
- (n, buffer))
+ (arg, buffer))
{
struct buffer *b = decode_buffer (buffer, 1);
REGISTER int orig, end;
XSETBUFFER (buffer, b);
- if (NILP (n))
- n = make_int (0);
+ if (NILP (arg))
+ arg = make_int (1);
else
- {
- CHECK_INT (n);
- n = make_int (XINT (n) - 1);
- }
+ CHECK_INT (arg);
- orig = BUF_PT (b);
- Fforward_line (n, buffer);
- end = BUF_PT (b);
- BUF_SET_PT (b, orig);
+ orig = BUF_PT(b);
+ Fforward_line (make_int (XINT (arg) - 1), buffer);
+ end = BUF_PT(b);
+ BUF_SET_PT(b, orig);
return make_int (end);
}
DEFUN ("beginning-of-line", Fbeginning_of_line, 0, 2, "_p", /*
Move point to beginning of current line.
-With argument N not nil or 1, move forward N - 1 lines first.
+With argument ARG not nil or 1, move forward ARG - 1 lines first.
If scan reaches end of buffer, stop there without error.
If BUFFER is nil, the current buffer is assumed.
*/
- (n, buffer))
+ (arg, buffer))
{
struct buffer *b = decode_buffer (buffer, 1);
- BUF_SET_PT (b, XINT (Fpoint_at_bol (n, buffer)));
+ BUF_SET_PT(b, XINT (Fpoint_at_bol(arg, buffer)));
return Qnil;
}
If scan reaches end of buffer, return that position.
This function does not move point.
*/
- (n, buffer))
+ (arg, buffer))
{
struct buffer *buf = decode_buffer (buffer, 1);
- int count;
- if (NILP (n))
- count = 1;
+ XSETBUFFER (buffer, buf);
+
+ if (NILP (arg))
+ arg = make_int (1);
else
- {
- CHECK_INT (n);
- count = XINT (n);
- }
+ CHECK_INT (arg);
return make_int (find_before_next_newline (buf, BUF_PT (buf), 0,
- count - (count <= 0)));
+ XINT (arg) - (XINT (arg) <= 0)));
}
DEFUN ("end-of-line", Fend_of_line, 0, 2, "_p", /*
Move point to end of current line.
-With argument N not nil or 1, move forward N - 1 lines first.
+With argument ARG not nil or 1, move forward ARG - 1 lines first.
If scan reaches end of buffer, stop there without error.
If BUFFER is nil, the current buffer is assumed.
*/
- (n, buffer))
+ (arg, buffer))
{
struct buffer *b = decode_buffer (buffer, 1);
- BUF_SET_PT (b, XINT (Fpoint_at_eol (n, buffer)));
+ BUF_SET_PT(b, XINT (Fpoint_at_eol (arg, buffer)));
return Qnil;
}
DEFUN ("delete-char", Fdelete_char, 1, 2, "*p\nP", /*
-Delete the following N characters (previous, with negative N).
+Delete the following ARG characters (previous, with negative arg).
Optional second arg KILLFLAG non-nil means kill instead (save in kill ring).
-Interactively, N is the prefix arg, and KILLFLAG is set if
-N was explicitly specified.
+Interactively, ARG is the prefix arg, and KILLFLAG is set if
+ARG was explicitly specified.
*/
- (n, killflag))
+ (arg, killflag))
{
/* This function can GC */
Bufpos pos;
struct buffer *buf = current_buffer;
- int count;
- CHECK_INT (n);
- count = XINT (n);
+ CHECK_INT (arg);
- pos = BUF_PT (buf) + count;
+ pos = BUF_PT (buf) + XINT (arg);
if (NILP (killflag))
{
- if (count < 0)
+ if (XINT (arg) < 0)
{
if (pos < BUF_BEGV (buf))
signal_error (Qbeginning_of_buffer, Qnil);
}
else
{
- call1 (Qkill_forward_chars, n);
+ call1 (Qkill_forward_chars, arg);
}
return Qnil;
}
DEFUN ("delete-backward-char", Fdelete_backward_char, 1, 2, "*p\nP", /*
-Delete the previous N characters (following, with negative N).
+Delete the previous ARG characters (following, with negative ARG).
Optional second arg KILLFLAG non-nil means kill instead (save in kill ring).
-Interactively, N is the prefix arg, and KILLFLAG is set if
-N was explicitly specified.
+Interactively, ARG is the prefix arg, and KILLFLAG is set if
+ARG was explicitly specified.
*/
- (n, killflag))
+ (arg, killflag))
{
/* This function can GC */
- CHECK_INT (n);
- return Fdelete_char (make_int (- XINT (n)), killflag);
+ CHECK_INT (arg);
+ return Fdelete_char (make_int (-XINT (arg)), killflag);
}
static void internal_self_insert (Emchar ch, int noautofill);
Insert the character you type.
Whichever character you type to run this command is inserted.
*/
- (n))
+ (arg))
{
/* This function can GC */
+ int n;
Emchar ch;
Lisp_Object c;
- int count;
-
- CHECK_NATNUM (n);
- count = XINT (n);
+ CHECK_INT (arg);
if (CHAR_OR_CHAR_INTP (Vlast_command_char))
c = Vlast_command_char;
c = Fevent_to_character (Vlast_command_event, Qnil, Qnil, Qt);
if (NILP (c))
- signal_simple_error ("Last typed character has no ASCII equivalent",
+ signal_simple_error ("last typed character has no ASCII equivalent",
Fcopy_event (Vlast_command_event, Qnil));
CHECK_CHAR_COERCE_INT (c);
+ n = XINT (arg);
ch = XCHAR (c);
-
- while (count--)
- internal_self_insert (ch, (count != 0));
-
+#if 0 /* FSFmacs */
+ /* #### This optimization won't work because of differences in
+ how the start-open and end-open properties default for text
+ properties. See internal_self_insert(). */
+ if (n >= 2 && NILP (current_buffer->overwrite_mode))
+ {
+ n -= 2;
+ /* The first one might want to expand an abbrev. */
+ internal_self_insert (c, 1);
+ /* The bulk of the copies of this char can be inserted simply.
+ We don't have to handle a user-specified face specially
+ because it will get inherited from the first char inserted. */
+ Finsert_char (make_char (c), make_int (n), Qt, Qnil);
+ /* The last one might want to auto-fill. */
+ internal_self_insert (c, 0);
+ }
+ else
+#endif /* 0 */
+ while (n > 0)
+ {
+ n--;
+ internal_self_insert (ch, (n != 0));
+ }
return Qnil;
}
Lisp_Object overwrite;
struct Lisp_Char_Table *syntax_table;
struct buffer *buf = current_buffer;
- int tab_width;
overwrite = buf->overwrite_mode;
syntax_table = XCHAR_TABLE (buf->mirror_syntax_table);
|| (c1 != '\n' && BUF_FETCH_CHAR (buf, BUF_PT (buf)) != '\n'))
&& (EQ (overwrite, Qoverwrite_mode_binary)
|| BUF_FETCH_CHAR (buf, BUF_PT (buf)) != '\t'
- || ((tab_width = XINT (buf->tab_width), tab_width <= 0)
- || tab_width > 20
- || !((current_column (buf) + 1) % tab_width))))
+ || XINT (buf->tab_width) <= 0
+ || XINT (buf->tab_width) > 20
+ || !((current_column (buf) + 1) % XINT (buf->tab_width))))
{
buffer_delete_range (buf, BUF_PT (buf), BUF_PT (buf) + 1, 0);
/* hairy = 2; */
/* XEmacs site configuration template file. -*- C -*-
- Copyright (C) 1986, 1991-1994, 1998, 1999 Free Software Foundation, Inc.
+ Copyright (C) 1986, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
This file is part of XEmacs.
/* The version info from version.sh. Used in #pragma ident in emacs.c */
#undef EMACS_MAJOR_VERSION
#undef EMACS_MINOR_VERSION
-#undef EMACS_PATCH_LEVEL
#undef EMACS_BETA_VERSION
#undef EMACS_VERSION
#undef XEMACS_CODENAME
/* Allow the configurer to specify if she wants site-lisp. */
#undef INHIBIT_SITE_LISP
-/* Allow the configurer to specify if she wants site-modules. */
-#undef INHIBIT_SITE_MODULES
-
/* This will be removed in 19.15. */
/* Hah! Try 20.3 ... */
/* Hah! Try never ... */
#undef HAVE_ULIMIT_H
#undef HAVE_X11_XLOCALE_H
#undef HAVE_LINUX_VERSION_H
-#undef HAVE_CYGWIN_VERSION_H
#undef HAVE_INTTYPES_H
#undef HAVE_SYS_UN_H
#undef HAVE_A_OUT_H
/* Have shared library support */
#undef HAVE_DLOPEN
#undef HAVE_DLERROR
-#undef HAVE__DLERROR
#undef HAVE_SHL_LOAD
#undef HAVE_DLD_INIT
#undef HAVE_SHLIB
-#undef HAVE_DLFCN_H
#undef HAVE_LIBKSTAT
#undef HAVE_LIBINTL
/* Do we have LDAP support? */
#undef HAVE_LDAP
-/* Does the library define ldap_set_option () ? */
-#undef HAVE_LDAP_SET_OPTION
-/* Does the library define ldap_get_lderrno () ? */
-#undef HAVE_LDAP_GET_LDERRNO
-/* Does the library define ldap_result2error () ? */
-#undef HAVE_LDAP_RESULT2ERROR
-/* Does the library define ldap_parse_result () ? */
-#undef HAVE_LDAP_PARSE_RESULT
+/* Do we have the LDAP library of the University of Michigan ? */
+#undef HAVE_UMICH_LDAP
+/* Do we have Netscape LDAP SDK library */
+#undef HAVE_NS_LDAP
/* Do you have the Xauth library present? This will add some extra
functionality to gnuserv. */
#undef ERROR_CHECK_GC
/* Attempt to catch freeing of a non-malloc()ed block, heap corruption, etc. */
#undef ERROR_CHECK_MALLOC
-/* Minor sanity checking of the bytecode interpreter. Useful for
- debugging the byte compiler. */
-#undef ERROR_CHECK_BYTE_CODE
/* Define DEBUG_XEMACS if you want extra debugging code compiled in.
This is mainly intended for use by developers. */
determine where XEmacs' memory is going. */
#undef MEMORY_USAGE_STATS
-/* Define QUANTIFY if using Quantify from Rational/Pure/Atria Software.
+/* Define QUANTIFY if using Quantify from Pure/Atria Software.
This adds some additional calls to control data collection.
It is only intended for use by the developers. */
#undef QUANTIFY
-/* Define QUANTIFY if using Purify from Rational/Pure/Atria Software.
- It is only intended for use by the developers. */
-#undef PURIFY
-
-#if (defined (QUANTIFY) || defined (PURIFY)) && !defined (XLIB_ILLEGAL_ACCESS)
-#define XLIB_ILLEGAL_ACCESS 1
-#endif
-
/* Define EXTERNAL_WIDGET to compile support for using the editor as a
widget within another program. */
#undef EXTERNAL_WIDGET
#undef USE_GCC
#undef USE_LCC
+/* Allow the user to override the default value of PURESIZE at configure
+ time. This must come before we include the sys files in order for
+ it to be able to override any changes in them. */
+#undef RAW_PURESIZE
+
/* Define this if you want level 2 internationalization compliance
(localized collation and formatting). Generally this should be
defined, unless your system doesn't have the strcoll() and
/* Compile in generic Drag'n'Drop API */
#undef HAVE_DRAGNDROP
-/* Compile in support for proper handling of WM_COMMAND. */
-#undef HAVE_WMCOMMAND
+/* Compile in support for proper session-management. */
+#undef HAVE_SESSION
/* Define this if you want Mule support (multi-byte character support).
There may be some performance penalty, although it should be small
definitions isn't right with 64-bit systems. */
#undef USE_UNION_TYPE
+/* If defined, use a minimal number of tagbits. This allows usage of more
+ advanced versions of malloc (like the Doug Lea new GNU malloc) and larger
+ integers. */
+/* --use-minimal-tagbits */
+#undef USE_MINIMAL_TAGBITS
+
+/* --use-indexed-lrecord-implementation */
+#undef USE_INDEXED_LRECORD_IMPLEMENTATION
+
/* The configuration script defines opsysfile to be the name of the
s/...h file that describes the system type you are using.
The file is chosen based on the configuration name you give.
/* If you turn this flag on, it forces encapsulation in all
circumstances; this can be used to make sure things compile OK
on various systems. */
-#undef DEBUG_ENCAPSULATION
+#define DEBUG_ENCAPSULATION
/* basic system calls */
#define MAIL_USE_LOCKF
#endif
-#undef PREFIX_USER_DEFINED
-#undef EXEC_PREFIX_USER_DEFINED
-#undef MODULEDIR_USER_DEFINED
-#undef SITEMODULEDIR_USER_DEFINED
-#undef DOCDIR_USER_DEFINED
#undef LISPDIR_USER_DEFINED
#undef PACKAGE_PATH_USER_DEFINED
#undef SITELISPDIR_USER_DEFINED
Lisp_Object Vstdio_str;
static void
+allocate_stream_console_struct (struct console *con)
+{
+ if (!CONSOLE_STREAM_DATA (con))
+ CONSOLE_STREAM_DATA (con) = xnew_and_zero (struct stream_console);
+ else
+ xzero (*CONSOLE_STREAM_DATA (con));
+}
+
+static void
stream_init_console (struct console *con, Lisp_Object params)
{
Lisp_Object tty = CONSOLE_CONNECTION (con);
- struct stream_console *stream_con;
-
- if (CONSOLE_STREAM_DATA (con) == NULL)
- CONSOLE_STREAM_DATA (con) = xnew (struct stream_console);
-
- stream_con = CONSOLE_STREAM_DATA (con);
-
- stream_con->needs_newline = 0;
+ FILE *infd, *outfd, *errfd;
/* Open the specified console */
+
if (NILP (tty) || internal_equal (tty, Vstdio_str, 0))
{
- stream_con->in = stdin;
- stream_con->out = stdout;
- stream_con->err = stderr;
+ infd = stdin;
+ outfd = stdout;
+ errfd = stderr;
}
else
{
CHECK_STRING (tty);
- stream_con->in = stream_con->out = stream_con->err =
+ infd = outfd = errfd =
fopen ((char *) XSTRING_DATA (tty), "r+");
- if (!stream_con->in)
+ if (!infd)
error ("Unable to open tty %s", XSTRING_DATA (tty));
}
+
+ allocate_stream_console_struct (con);
+ CONSOLE_STREAM_DATA (con)->infd = infd;
+ CONSOLE_STREAM_DATA (con)->outfd = outfd;
+ CONSOLE_STREAM_DATA (con)->errfd = errfd;
}
static void
{
struct console *con = XCONSOLE (DEVICE_CONSOLE (d));
- DEVICE_INFD (d) = fileno (CONSOLE_STREAM_DATA (con)->in);
- DEVICE_OUTFD (d) = fileno (CONSOLE_STREAM_DATA (con)->out);
+ DEVICE_INFD (d) = fileno (CONSOLE_STREAM_DATA (con)->infd);
+ DEVICE_OUTFD (d) = fileno (CONSOLE_STREAM_DATA (con)->outfd);
init_baud_rate (d);
init_one_device (d);
}
return noninteractive && initialized;
}
+static void
+free_stream_console_struct (struct console *con)
+{
+ if (CONSOLE_STREAM_DATA (con))
+ {
+ xfree (CONSOLE_STREAM_DATA (con));
+ CONSOLE_STREAM_DATA (con) = NULL;
+ }
+}
+
extern int stdout_needs_newline;
static void
stream_delete_console (struct console *con)
{
- struct stream_console *stream_con = CONSOLE_STREAM_DATA (con);
- if (stream_con)
+ if (/* CONSOLE_STREAM_DATA (con)->needs_newline */
+ stdout_needs_newline) /* #### clean this up */
{
- if (/* stream_con->needs_newline */
- stdout_needs_newline) /* #### clean this up */
- {
- fputc ('\n', stream_con->out);
- fflush (stream_con->out);
- }
- if (stream_con->in != stdin)
- fclose (stream_con->in);
-
- xfree (stream_con);
- CONSOLE_STREAM_DATA (con) = NULL;
+ fputc ('\n', CONSOLE_STREAM_DATA (con)->outfd);
+ fflush (CONSOLE_STREAM_DATA (con)->outfd);
}
+ if (CONSOLE_STREAM_DATA (con)->infd != stdin)
+ fclose (CONSOLE_STREAM_DATA (con)->infd);
+ free_stream_console_struct (con);
}
Lisp_Object
}
static void
-stream_clear_region (Lisp_Object window, struct device* d, struct frame * f,
- face_index findex, int x, int y,
- int width, int height, Lisp_Object fcolor, Lisp_Object bcolor,
- Lisp_Object background_pixmap)
+stream_clear_region (Lisp_Object locale, face_index findex, int x, int y,
+ int width, int height)
{
}
stream_ring_bell (struct device *d, int volume, int pitch, int duration)
{
struct console *c = XCONSOLE (DEVICE_CONSOLE (d));
- fputc (07, CONSOLE_STREAM_DATA (c)->out);
- fflush (CONSOLE_STREAM_DATA (c)->out);
+ fputc (07, CONSOLE_STREAM_DATA (c)->outfd);
+ fflush (CONSOLE_STREAM_DATA (c)->outfd);
}
\f
/* The X connection of this device. */
Display *display;
- /* Set by x_IO_error_handler(). */
- int being_deleted;
-
/* Xt application info. */
Widget Xt_app_shell;
int x_keysym_map_min_code;
int x_keysym_map_max_code;
int x_keysym_map_keysyms_per_code;
- Lisp_Object x_keysym_map_hash_table;
+ Lisp_Object x_keysym_map_hashtable;
/* frame that holds the WM_COMMAND property; there should be exactly
one of these per device. */
#define FRAME_X_DISPLAY(f) (DEVICE_X_DISPLAY (XDEVICE (f->device)))
#define DEVICE_X_DISPLAY(d) (DEVICE_X_DATA (d)->display)
-#define DEVICE_X_BEING_DELETED(d) (DEVICE_X_DATA (d)->being_deleted)
#define DEVICE_X_VISUAL(d) (DEVICE_X_DATA (d)->visual)
#define DEVICE_X_DEPTH(d) (DEVICE_X_DATA (d)->depth)
#define DEVICE_X_COLORMAP(d) (DEVICE_X_DATA (d)->device_cmap)
#define DEVICE_X_MOUSE_TIMESTAMP(d) (DEVICE_X_DATA (d)->mouse_timestamp)
#define DEVICE_X_GLOBAL_MOUSE_TIMESTAMP(d) (DEVICE_X_DATA (d)->global_mouse_timestamp)
#define DEVICE_X_LAST_SERVER_TIMESTAMP(d) (DEVICE_X_DATA (d)->last_server_timestamp)
-#define DEVICE_X_KEYSYM_MAP_HASH_TABLE(d) (DEVICE_X_DATA (d)->x_keysym_map_hash_table)
+#define DEVICE_X_KEYSYM_MAP_HASHTABLE(d) (DEVICE_X_DATA (d)->x_keysym_map_hashtable)
/* #define DEVICE_X_X_COMPOSE_STATUS(d) (DEVICE_X_DATA (d)->x_compose_status) */
#ifdef HAVE_XIM
#define DEVICE_X_XIM(d) (DEVICE_X_DATA (d)->xim)
always tagged to a particular X window (i.e. frame),
which exists on only one screen; therefore the event won't be
reported multiple times even if there are multiple devices on
- the same physical display. This is an implementation detail
+ the same physical display. This is an implementational detail
specific to X consoles (e.g. under NeXTstep or Windows, this
could be different, and input would come directly from the console).
*/
void (*mark_device_method) (struct device *, void (*)(Lisp_Object));
void (*asynch_device_change_method) (void);
Lisp_Object (*device_system_metrics_method) (struct device *, enum device_metrics);
- unsigned int (*device_implementation_flags_method) (void);
- Lisp_Object (*own_selection_method)(Lisp_Object selection_name, Lisp_Object selection_value);
- void (*disown_selection_method)(Lisp_Object selection_name, Lisp_Object timeval);
- Lisp_Object (*get_foreign_selection_method) (Lisp_Object selection_symbol,
- Lisp_Object target_type);
- Lisp_Object (*selection_exists_p_method)(Lisp_Object selection_name);
+ unsigned int (*device_implementation_flags_method) ();
/* frame methods */
Lisp_Object *device_specific_frame_props;
int (*eol_cursor_width_method) (void);
void (*output_vertical_divider_method) (struct window *, int);
void (*clear_to_window_end_method) (struct window *, int, int);
- void (*clear_region_method) (Lisp_Object, struct device*, struct frame*, face_index,
- int, int, int, int,
- Lisp_Object, Lisp_Object, Lisp_Object);
+ void (*clear_region_method) (Lisp_Object, face_index, int, int, int, int);
void (*clear_frame_method) (struct frame *);
void (*output_begin_method) (struct device *);
void (*output_end_method) (struct device *);
Lisp_Object printcharfun,
int escapeflag);
void (*finalize_image_instance_method) (struct Lisp_Image_Instance *);
- void (*unmap_subwindow_method) (struct Lisp_Image_Instance *);
- void (*map_subwindow_method) (struct Lisp_Image_Instance *, int x, int y);
- void (*resize_subwindow_method) (struct Lisp_Image_Instance *, int w, int h);
- void (*update_subwindow_method) (struct Lisp_Image_Instance *);
int (*image_instance_equal_method) (struct Lisp_Image_Instance *,
struct Lisp_Image_Instance *,
int depth);
int depth);
void (*init_image_instance_from_eimage_method) (struct Lisp_Image_Instance *ii,
int width, int height,
- unsigned char *eimage,
+ unsigned char *eimage,
int dest_mask,
Lisp_Object instantiator,
Lisp_Object domain);
Lisp_Object (*locate_pixmap_file_method) (Lisp_Object file_method);
int (*colorize_image_instance_method) (Lisp_Object image_instance,
Lisp_Object fg, Lisp_Object bg);
+#ifdef HAVE_XPM
+ /* which is more tacky - this or #defines in glyphs.c? */
+ void (*xpm_instantiate_method)(Lisp_Object image_instance,
+ Lisp_Object instantiator,
+ Lisp_Object pointer_fg,
+ Lisp_Object pointer_bg,
+ int dest_mask, Lisp_Object domain);
+#endif
+#ifdef HAVE_WINDOW_SYSTEM
+ /* which is more tacky - this or #defines in glyphs.c? */
+ void (*xbm_instantiate_method)(Lisp_Object image_instance,
+ Lisp_Object instantiator,
+ Lisp_Object pointer_fg,
+ Lisp_Object pointer_bg,
+ int dest_mask, Lisp_Object domain);
+#endif
Lisp_Object image_conversion_list;
#ifdef HAVE_TOOLBARS
/* Call a void-returning console method, if it exists */
#define MAYBE_CONTYPE_METH(meth, m, args) do { \
- struct console_methods *maybe_contype_meth_meth = (meth); \
- if (HAS_CONTYPE_METH_P (maybe_contype_meth_meth, m)) \
- CONTYPE_METH (maybe_contype_meth_meth, m, args); \
+ struct console_methods *_maybe_contype_meth_meth = (meth); \
+ if (HAS_CONTYPE_METH_P (_maybe_contype_meth_meth, m)) \
+ CONTYPE_METH (_maybe_contype_meth_meth, m, args); \
} while (0)
/* Call a console method, if it exists; otherwise return
#define CONSOLE_SELECTED_DEVICE(con) ((con)->selected_device)
#define CONSOLE_SELECTED_FRAME(con) \
DEVICE_SELECTED_FRAME (XDEVICE ((con)->selected_device))
-#define CONSOLE_LAST_NONMINIBUF_FRAME(con) NON_LVALUE ((con)->last_nonminibuf_frame)
+#define CONSOLE_LAST_NONMINIBUF_FRAME(con) NON_LVALUE ((con)->_last_nonminibuf_frame)
#define CONSOLE_QUIT_CHAR(con) ((con)->quit_char)
#define CDFW_CONSOLE(obj) \
Lisp_Object Qbeginning_of_buffer, Qend_of_buffer, Qbuffer_read_only;
Lisp_Object Qintegerp, Qnatnump, Qsymbolp, Qkeywordp;
Lisp_Object Qlistp, Qtrue_list_p, Qweak_listp;
-Lisp_Object Qconsp, Qsubrp;
+Lisp_Object Qconsp, Qsubrp, Qcompiled_functionp;
Lisp_Object Qcharacterp, Qstringp, Qarrayp, Qsequencep, Qvectorp;
Lisp_Object Qchar_or_string_p, Qmarkerp, Qinteger_or_marker_p, Qbufferp;
Lisp_Object Qinteger_or_char_p, Qinteger_char_or_marker_p;
Lisp_Object Qnumberp, Qnumber_or_marker_p, Qnumber_char_or_marker_p;
Lisp_Object Qbit_vectorp, Qbitp, Qcons, Qkeyword, Qcdr, Qignore;
+#ifdef LISP_FLOAT_TYPE
Lisp_Object Qfloatp;
+#endif
#ifdef DEBUG_XEMACS
int debug_ebola_backtrace_length;
+#if 0
+/*#ifndef LRECORD_SYMBOL*/
+#include "backtrace.h"
+#endif
+
int
eq_with_ebola_notice (Lisp_Object obj1, Lisp_Object obj2)
{
- if (debug_issue_ebola_notices
- && ((CHARP (obj1) && INTP (obj2)) || (CHARP (obj2) && INTP (obj1))))
+ if (((CHARP (obj1) && INTP (obj2)) || (CHARP (obj2) && INTP (obj1)))
+ && (debug_issue_ebola_notices >= 2
+ || XCHAR_OR_INT (obj1) == XCHAR_OR_INT (obj2)))
{
- /* #### It would be really nice if this were a proper warning
- instead of brain-dead print ro Qexternal_debugging_output. */
- write_c_string ("Comparison between integer and character is constant nil (",
- Qexternal_debugging_output);
+ stderr_out("Comparison between integer and character is constant nil (");
Fprinc (obj1, Qexternal_debugging_output);
- write_c_string (" and ", Qexternal_debugging_output);
+ stderr_out (" and ");
Fprinc (obj2, Qexternal_debugging_output);
- write_c_string (")\n", Qexternal_debugging_output);
+ stderr_out (")\n");
debug_short_backtrace (debug_ebola_backtrace_length);
}
return EQ (obj1, obj2);
}
DOESNT_RETURN
-c_write_error (Lisp_Object obj)
-{
- signal_simple_error ("Attempt to modify read-only object (c)", obj);
-}
-
-DOESNT_RETURN
-lisp_write_error (Lisp_Object obj)
+pure_write_error (Lisp_Object obj)
{
- signal_simple_error ("Attempt to modify read-only object (lisp)", obj);
+ signal_simple_error ("Attempt to modify read-only object", obj);
}
DOESNT_RETURN
}
DEFUN ("consp", Fconsp, 1, 1, 0, /*
-Return t if OBJECT is a cons cell. `nil' is not a cons cell.
+Return t if OBJECT is a cons cell.
*/
(object))
{
}
DEFUN ("atom", Fatom, 1, 1, 0, /*
-Return t if OBJECT is not a cons cell. `nil' is not a cons cell.
+Return t if OBJECT is not a cons cell. Atoms include nil.
*/
(object))
{
}
DEFUN ("listp", Flistp, 1, 1, 0, /*
-Return t if OBJECT is a list. `nil' is a list.
+Return t if OBJECT is a list. Lists includes nil.
*/
(object))
{
}
DEFUN ("nlistp", Fnlistp, 1, 1, 0, /*
-Return t if OBJECT is not a list. `nil' is a list.
+Return t if OBJECT is not a list. Lists include nil.
*/
(object))
{
}
DEFUN ("vectorp", Fvectorp, 1, 1, 0, /*
-Return t if OBJECT is a vector.
+REturn t if OBJECT is a vector.
*/
(object))
{
*/
(object))
{
- return (LISTP (object) ||
+ return (CONSP (object) ||
+ NILP (object) ||
VECTORP (object) ||
STRINGP (object) ||
BIT_VECTORP (object))
return prompt ? list2 (Qinteractive, build_string (prompt)) : Qnil;
}
+DEFUN ("compiled-function-p", Fcompiled_function_p, 1, 1, 0, /*
+Return t if OBJECT is a byte-compiled function object.
+*/
+ (object))
+{
+ return COMPILED_FUNCTIONP (object) ? Qt : Qnil;
+}
+
\f
DEFUN ("characterp", Fcharacterp, 1, 1, 0, /*
Return t if OBJECT is a character.
*/
(object))
{
- switch (XTYPE (object))
- {
- case Lisp_Type_Record:
- return intern (XRECORD_LHEADER_IMPLEMENTATION (object)->name);
-
- case Lisp_Type_Char: return Qcharacter;
+ if (CONSP (object)) return Qcons;
+ if (SYMBOLP (object)) return Qsymbol;
+ if (KEYWORDP (object)) return Qkeyword;
+ if (INTP (object)) return Qinteger;
+ if (CHARP (object)) return Qcharacter;
+ if (STRINGP (object)) return Qstring;
+ if (VECTORP (object)) return Qvector;
- default: return Qinteger;
- }
+ assert (LRECORDP (object));
+ return intern (XRECORD_LHEADER_IMPLEMENTATION (object)->name);
}
\f
if (!CONSP (conscell))
conscell = wrong_type_argument (Qconsp, conscell);
- CHECK_LISP_WRITEABLE (conscell);
+ CHECK_IMPURE (conscell);
XCAR (conscell) = newcar;
return newcar;
}
if (!CONSP (conscell))
conscell = wrong_type_argument (Qconsp, conscell);
- CHECK_LISP_WRITEABLE (conscell);
+ CHECK_IMPURE (conscell);
XCDR (conscell) = newcdr;
return newcdr;
}
\f
-/* Find the function at the end of a chain of symbol function indirections.
+/* Find the function at the end of a chain of symbol function indirections. */
- If OBJECT is a symbol, find the end of its function chain and
+/* If OBJECT is a symbol, find the end of its function chain and
return the value found there. If OBJECT is not a symbol, just
return it. If there is a cycle in the function chain, signal a
cyclic-function-indirection error.
Lisp_Object
indirect_function (Lisp_Object object, int errorp)
{
-#define FUNCTION_INDIRECTION_SUSPICION_LENGTH 16
- Lisp_Object tortoise, hare;
- int count;
+ Lisp_Object tortoise = object;
+ Lisp_Object hare = object;
- for (hare = tortoise = object, count = 0;
- SYMBOLP (hare);
- hare = XSYMBOL (hare)->function, count++)
+ for (;;)
{
- if (count < FUNCTION_INDIRECTION_SUSPICION_LENGTH) continue;
+ if (!SYMBOLP (hare) || UNBOUNDP (hare))
+ break;
+ hare = XSYMBOL (hare)->function;
+ if (!SYMBOLP (hare) || UNBOUNDP (hare))
+ break;
+ hare = XSYMBOL (hare)->function;
+
+ tortoise = XSYMBOL (tortoise)->function;
- if (count & 1)
- tortoise = XSYMBOL (tortoise)->function;
if (EQ (hare, tortoise))
return Fsignal (Qcyclic_function_indirection, list1 (object));
}
- if (errorp && UNBOUNDP (hare))
- signal_void_function_error (object);
-
+ if (UNBOUNDP (hare) && errorp)
+ return Fsignal (Qvoid_function, list1 (object));
return hare;
}
DEFUN ("aref", Faref, 2, 2, 0, /*
Return the element of ARRAY at index INDEX.
-ARRAY may be a vector, bit vector, or string. INDEX starts at 0.
+ARRAY may be a vector, bit vector, string, or byte-code object.
+IDX starts at 0.
*/
- (array, index_))
+ (array, idx))
{
- int idx;
+ int idxval;
retry:
-
- if (INTP (index_)) idx = XINT (index_);
- else if (CHARP (index_)) idx = XCHAR (index_); /* yuck! */
- else
+ CHECK_INT_COERCE_CHAR (idx); /* yuck! */
+ idxval = XINT (idx);
+ if (idxval < 0)
{
- index_ = wrong_type_argument (Qinteger_or_char_p, index_);
- goto retry;
+ lose:
+ args_out_of_range (array, idx);
}
-
- if (idx < 0) goto range_error;
-
if (VECTORP (array))
{
- if (idx >= XVECTOR_LENGTH (array)) goto range_error;
- return XVECTOR_DATA (array)[idx];
+ if (idxval >= XVECTOR_LENGTH (array)) goto lose;
+ return XVECTOR_DATA (array)[idxval];
}
else if (BIT_VECTORP (array))
{
- if (idx >= bit_vector_length (XBIT_VECTOR (array))) goto range_error;
- return make_int (bit_vector_bit (XBIT_VECTOR (array), idx));
+ if (idxval >= bit_vector_length (XBIT_VECTOR (array))) goto lose;
+ return make_int (bit_vector_bit (XBIT_VECTOR (array), idxval));
}
else if (STRINGP (array))
{
- if (idx >= XSTRING_CHAR_LENGTH (array)) goto range_error;
- return make_char (string_char (XSTRING (array), idx));
+ if (idxval >= XSTRING_CHAR_LENGTH (array)) goto lose;
+ return make_char (string_char (XSTRING (array), idxval));
}
#ifdef LOSING_BYTECODE
else if (COMPILED_FUNCTIONP (array))
{
/* Weird, gross compatibility kludge */
- return Felt (array, index_);
+ return Felt (array, idx);
}
#endif
else
array = wrong_type_argument (Qarrayp, array);
goto retry;
}
-
- range_error:
- args_out_of_range (array, index_);
- return Qnil; /* not reached */
}
DEFUN ("aset", Faset, 3, 3, 0, /*
-Store into the element of ARRAY at index INDEX the value NEWVAL.
-ARRAY may be a vector, bit vector, or string. INDEX starts at 0.
+Store into the element of ARRAY at index IDX the value NEWVAL.
+ARRAY may be a vector, bit vector, or string. IDX starts at 0.
*/
- (array, index_, newval))
+ (array, idx, newval))
{
- int idx;
+ int idxval;
- retry:
+ CHECK_INT_COERCE_CHAR (idx); /* yuck! */
+ if (!VECTORP (array) && !BIT_VECTORP (array) && !STRINGP (array))
+ array = wrong_type_argument (Qarrayp, array);
- if (INTP (index_)) idx = XINT (index_);
- else if (CHARP (index_)) idx = XCHAR (index_); /* yuck! */
- else
+ idxval = XINT (idx);
+ if (idxval < 0)
{
- index_ = wrong_type_argument (Qinteger_or_char_p, index_);
- goto retry;
+ lose:
+ args_out_of_range (array, idx);
}
-
- if (idx < 0) goto range_error;
-
- CHECK_LISP_WRITEABLE (array);
+ CHECK_IMPURE (array);
if (VECTORP (array))
{
- if (idx >= XVECTOR_LENGTH (array)) goto range_error;
- XVECTOR_DATA (array)[idx] = newval;
+ if (idxval >= XVECTOR_LENGTH (array)) goto lose;
+ XVECTOR_DATA (array)[idxval] = newval;
}
else if (BIT_VECTORP (array))
{
- if (idx >= bit_vector_length (XBIT_VECTOR (array))) goto range_error;
+ if (idxval >= bit_vector_length (XBIT_VECTOR (array))) goto lose;
CHECK_BIT (newval);
- set_bit_vector_bit (XBIT_VECTOR (array), idx, !ZEROP (newval));
+ set_bit_vector_bit (XBIT_VECTOR (array), idxval, !ZEROP (newval));
}
- else if (STRINGP (array))
+ else /* string */
{
CHECK_CHAR_COERCE_INT (newval);
- if (idx >= XSTRING_CHAR_LENGTH (array)) goto range_error;
- set_string_char (XSTRING (array), idx, XCHAR (newval));
+ if (idxval >= XSTRING_CHAR_LENGTH (array)) goto lose;
+ set_string_char (XSTRING (array), idxval, XCHAR (newval));
bump_string_modiff (array);
}
- else
- {
- array = wrong_type_argument (Qarrayp, array);
- goto retry;
- }
return newval;
-
- range_error:
- args_out_of_range (array, index_);
- return Qnil; /* not reached */
}
\f
/**********************************************************************/
-/* Arithmetic functions */
+/* Compiled-function objects */
/**********************************************************************/
-typedef struct
+
+/* The compiled_function->doc_and_interactive slot uses the minimal
+ number of conses, based on compiled_function->flags; it may take
+ any of the following forms:
+
+ doc
+ interactive
+ domain
+ (doc . interactive)
+ (doc . domain)
+ (interactive . domain)
+ (doc . (interactive . domain))
+ */
+
+/* Caller must check flags.interactivep first */
+Lisp_Object
+compiled_function_interactive (struct Lisp_Compiled_Function *b)
{
- int int_p;
- union
- {
- EMACS_INT ival;
- double dval;
- } c;
-} int_or_double;
+ assert (b->flags.interactivep);
+ if (b->flags.documentationp && b->flags.domainp)
+ return XCAR (XCDR (b->doc_and_interactive));
+ else if (b->flags.documentationp)
+ return XCDR (b->doc_and_interactive);
+ else if (b->flags.domainp)
+ return XCAR (b->doc_and_interactive);
-static void
-number_char_or_marker_to_int_or_double (Lisp_Object obj, int_or_double *p)
+ /* if all else fails... */
+ return b->doc_and_interactive;
+}
+
+/* Caller need not check flags.documentationp first */
+Lisp_Object
+compiled_function_documentation (struct Lisp_Compiled_Function *b)
{
- retry:
- p->int_p = 1;
- if (INTP (obj)) p->c.ival = XINT (obj);
- else if (CHARP (obj)) p->c.ival = XCHAR (obj);
- else if (MARKERP (obj)) p->c.ival = marker_position (obj);
-#ifdef LISP_FLOAT_TYPE
- else if (FLOATP (obj)) p->c.dval = XFLOAT_DATA (obj), p->int_p = 0;
-#endif
+ if (! b->flags.documentationp)
+ return Qnil;
+ else if (b->flags.interactivep && b->flags.domainp)
+ return XCAR (b->doc_and_interactive);
+ else if (b->flags.interactivep)
+ return XCAR (b->doc_and_interactive);
+ else if (b->flags.domainp)
+ return XCAR (b->doc_and_interactive);
else
- {
- obj = wrong_type_argument (Qnumber_char_or_marker_p, obj);
- goto retry;
- }
+ return b->doc_and_interactive;
}
-static double
-number_char_or_marker_to_double (Lisp_Object obj)
+/* Caller need not check flags.domainp first */
+Lisp_Object
+compiled_function_domain (struct Lisp_Compiled_Function *b)
{
- retry:
- if (INTP (obj)) return (double) XINT (obj);
- else if (CHARP (obj)) return (double) XCHAR (obj);
- else if (MARKERP (obj)) return (double) marker_position (obj);
-#ifdef LISP_FLOAT_TYPE
- else if (FLOATP (obj)) return XFLOAT_DATA (obj);
-#endif
+ if (! b->flags.domainp)
+ return Qnil;
+ else if (b->flags.documentationp && b->flags.interactivep)
+ return XCDR (XCDR (b->doc_and_interactive));
+ else if (b->flags.documentationp)
+ return XCDR (b->doc_and_interactive);
+ else if (b->flags.interactivep)
+ return XCDR (b->doc_and_interactive);
else
- {
- obj = wrong_type_argument (Qnumber_char_or_marker_p, obj);
- goto retry;
- }
+ return b->doc_and_interactive;
}
-static int
-integer_char_or_marker_to_int (Lisp_Object obj)
+#ifdef COMPILED_FUNCTION_ANNOTATION_HACK
+
+Lisp_Object
+compiled_function_annotation (struct Lisp_Compiled_Function *b)
{
- retry:
- if (INTP (obj)) return XINT (obj);
- else if (CHARP (obj)) return XCHAR (obj);
- else if (MARKERP (obj)) return marker_position (obj);
+ return b->annotated;
+}
+
+#endif
+
+/* used only by Snarf-documentation; there must be doc already. */
+void
+set_compiled_function_documentation (struct Lisp_Compiled_Function *b,
+ Lisp_Object new)
+{
+ assert (b->flags.documentationp);
+ assert (INTP (new) || STRINGP (new));
+
+ if (b->flags.interactivep && b->flags.domainp)
+ XCAR (b->doc_and_interactive) = new;
+ else if (b->flags.interactivep)
+ XCAR (b->doc_and_interactive) = new;
+ else if (b->flags.domainp)
+ XCAR (b->doc_and_interactive) = new;
else
+ b->doc_and_interactive = new;
+}
+
+DEFUN ("compiled-function-instructions", Fcompiled_function_instructions, 1, 1, 0, /*
+Return the byte-opcode string of the compiled-function object.
+*/
+ (function))
+{
+ CHECK_COMPILED_FUNCTION (function);
+ return XCOMPILED_FUNCTION (function)->bytecodes;
+}
+
+DEFUN ("compiled-function-constants", Fcompiled_function_constants, 1, 1, 0, /*
+Return the constants vector of the compiled-function object.
+*/
+ (function))
+{
+ CHECK_COMPILED_FUNCTION (function);
+ return XCOMPILED_FUNCTION (function)->constants;
+}
+
+DEFUN ("compiled-function-stack-depth", Fcompiled_function_stack_depth, 1, 1, 0, /*
+Return the max stack depth of the compiled-function object.
+*/
+ (function))
+{
+ CHECK_COMPILED_FUNCTION (function);
+ return make_int (XCOMPILED_FUNCTION (function)->maxdepth);
+}
+
+DEFUN ("compiled-function-arglist", Fcompiled_function_arglist, 1, 1, 0, /*
+Return the argument list of the compiled-function object.
+*/
+ (function))
+{
+ CHECK_COMPILED_FUNCTION (function);
+ return XCOMPILED_FUNCTION (function)->arglist;
+}
+
+DEFUN ("compiled-function-interactive", Fcompiled_function_interactive, 1, 1, 0, /*
+Return the interactive spec of the compiled-function object, or nil.
+If non-nil, the return value will be a list whose first element is
+`interactive' and whose second element is the interactive spec.
+*/
+ (function))
+{
+ CHECK_COMPILED_FUNCTION (function);
+ return XCOMPILED_FUNCTION (function)->flags.interactivep
+ ? list2 (Qinteractive,
+ compiled_function_interactive (XCOMPILED_FUNCTION (function)))
+ : Qnil;
+}
+
+DEFUN ("compiled-function-doc-string", Fcompiled_function_doc_string, 1, 1, 0, /*
+Return the doc string of the compiled-function object, if available.
+Functions that had their doc strings snarfed into the DOC file will have
+an integer returned instead of a string.
+*/
+ (function))
+{
+ CHECK_COMPILED_FUNCTION (function);
+ return compiled_function_documentation (XCOMPILED_FUNCTION (function));
+}
+
+#ifdef COMPILED_FUNCTION_ANNOTATION_HACK
+
+/* Remove the `xx' if you wish to restore this feature */
+xxDEFUN ("compiled-function-annotation", Fcompiled_function_annotation, 1, 1, 0, /*
+Return the annotation of the compiled-function object, or nil.
+The annotation is a piece of information indicating where this
+compiled-function object came from. Generally this will be
+a symbol naming a function; or a string naming a file, if the
+compiled-function object was not defined in a function; or nil,
+if the compiled-function object was not created as a result of
+a `load'.
+*/
+ (function))
+{
+ CHECK_COMPILED_FUNCTION (function);
+ return compiled_function_annotation (XCOMPILED_FUNCTION (function));
+}
+
+#endif /* COMPILED_FUNCTION_ANNOTATION_HACK */
+
+DEFUN ("compiled-function-domain", Fcompiled_function_domain, 1, 1, 0, /*
+Return the domain of the compiled-function object, or nil.
+This is only meaningful if I18N3 was enabled when emacs was compiled.
+*/
+ (function))
+{
+ CHECK_COMPILED_FUNCTION (function);
+ return XCOMPILED_FUNCTION (function)->flags.domainp
+ ? compiled_function_domain (XCOMPILED_FUNCTION (function))
+ : Qnil;
+}
+
+\f
+/**********************************************************************/
+/* Arithmetic functions */
+/**********************************************************************/
+
+Lisp_Object
+arithcompare (Lisp_Object num1, Lisp_Object num2,
+ enum arith_comparison comparison)
+{
+ CHECK_INT_OR_FLOAT_COERCE_CHAR_OR_MARKER (num1);
+ CHECK_INT_OR_FLOAT_COERCE_CHAR_OR_MARKER (num2);
+
+#ifdef LISP_FLOAT_TYPE
+ if (FLOATP (num1) || FLOATP (num2))
{
- obj = wrong_type_argument (Qinteger_char_or_marker_p, obj);
- goto retry;
+ double f1 = FLOATP (num1) ? float_data (XFLOAT (num1)) : XINT (num1);
+ double f2 = FLOATP (num2) ? float_data (XFLOAT (num2)) : XINT (num2);
+
+ switch (comparison)
+ {
+ case arith_equal: return f1 == f2 ? Qt : Qnil;
+ case arith_notequal: return f1 != f2 ? Qt : Qnil;
+ case arith_less: return f1 < f2 ? Qt : Qnil;
+ case arith_less_or_equal: return f1 <= f2 ? Qt : Qnil;
+ case arith_grtr: return f1 > f2 ? Qt : Qnil;
+ case arith_grtr_or_equal: return f1 >= f2 ? Qt : Qnil;
+ }
+ }
+#endif /* LISP_FLOAT_TYPE */
+
+ switch (comparison)
+ {
+ case arith_equal: return XINT (num1) == XINT (num2) ? Qt : Qnil;
+ case arith_notequal: return XINT (num1) != XINT (num2) ? Qt : Qnil;
+ case arith_less: return XINT (num1) < XINT (num2) ? Qt : Qnil;
+ case arith_less_or_equal: return XINT (num1) <= XINT (num2) ? Qt : Qnil;
+ case arith_grtr: return XINT (num1) > XINT (num2) ? Qt : Qnil;
+ case arith_grtr_or_equal: return XINT (num1) >= XINT (num2) ? Qt : Qnil;
}
+
+ abort ();
+ return Qnil; /* suppress compiler warning */
}
-#define ARITHCOMPARE_MANY(op) \
-{ \
- int_or_double iod1, iod2, *p = &iod1, *q = &iod2; \
- Lisp_Object *args_end = args + nargs; \
- \
- number_char_or_marker_to_int_or_double (*args++, p); \
- \
- while (args < args_end) \
- { \
- number_char_or_marker_to_int_or_double (*args++, q); \
- \
- if (!((p->int_p && q->int_p) ? \
- (p->c.ival op q->c.ival) : \
- ((p->int_p ? (double) p->c.ival : p->c.dval) op \
- (q->int_p ? (double) q->c.ival : q->c.dval)))) \
- return Qnil; \
- \
- { /* swap */ int_or_double *r = p; p = q; q = r; } \
- } \
- return Qt; \
+static Lisp_Object
+arithcompare_many (enum arith_comparison comparison,
+ int nargs, Lisp_Object *args)
+{
+ for (; --nargs > 0; args++)
+ if (NILP (arithcompare (*args, *(args + 1), comparison)))
+ return Qnil;
+
+ return Qt;
}
DEFUN ("=", Feqlsign, 1, MANY, 0, /*
*/
(int nargs, Lisp_Object *args))
{
- ARITHCOMPARE_MANY (==)
+ return arithcompare_many (arith_equal, nargs, args);
}
DEFUN ("<", Flss, 1, MANY, 0, /*
*/
(int nargs, Lisp_Object *args))
{
- ARITHCOMPARE_MANY (<)
+ return arithcompare_many (arith_less, nargs, args);
}
DEFUN (">", Fgtr, 1, MANY, 0, /*
*/
(int nargs, Lisp_Object *args))
{
- ARITHCOMPARE_MANY (>)
+ return arithcompare_many (arith_grtr, nargs, args);
}
DEFUN ("<=", Fleq, 1, MANY, 0, /*
*/
(int nargs, Lisp_Object *args))
{
- ARITHCOMPARE_MANY (<=)
+ return arithcompare_many (arith_less_or_equal, nargs, args);
}
DEFUN (">=", Fgeq, 1, MANY, 0, /*
*/
(int nargs, Lisp_Object *args))
{
- ARITHCOMPARE_MANY (>=)
+ return arithcompare_many (arith_grtr_or_equal, nargs, args);
}
DEFUN ("/=", Fneq, 1, MANY, 0, /*
*/
(int nargs, Lisp_Object *args))
{
- Lisp_Object *args_end = args + nargs;
- Lisp_Object *p, *q;
-
- /* Unlike all the other comparisons, this is an N*N algorithm.
- We could use a hash table for nargs > 50 to make this linear. */
- for (p = args; p < args_end; p++)
- {
- int_or_double iod1, iod2;
- number_char_or_marker_to_int_or_double (*p, &iod1);
-
- for (q = p + 1; q < args_end; q++)
- {
- number_char_or_marker_to_int_or_double (*q, &iod2);
-
- if (!((iod1.int_p && iod2.int_p) ?
- (iod1.c.ival != iod2.c.ival) :
- ((iod1.int_p ? (double) iod1.c.ival : iod1.c.dval) !=
- (iod2.int_p ? (double) iod2.c.ival : iod2.c.dval))))
- return Qnil;
- }
- }
- return Qt;
+ return arithcompare_many (arith_notequal, nargs, args);
}
DEFUN ("zerop", Fzerop, 1, 1, 0, /*
*/
(number))
{
- retry:
- if (INTP (number))
- return EQ (number, Qzero) ? Qt : Qnil;
+ CHECK_INT_OR_FLOAT (number);
+
#ifdef LISP_FLOAT_TYPE
- else if (FLOATP (number))
- return XFLOAT_DATA (number) == 0.0 ? Qt : Qnil;
+ if (FLOATP (number))
+ return float_data (XFLOAT (number)) == 0.0 ? Qt : Qnil;
#endif /* LISP_FLOAT_TYPE */
- else
- {
- number = wrong_type_argument (Qnumberp, number);
- goto retry;
- }
+
+ return EQ (number, Qzero) ? Qt : Qnil;
}
\f
/* Convert between a 32-bit value and a cons of two 16-bit values.
{
char pigbuf[350]; /* see comments in float_to_string */
- float_to_string (pigbuf, XFLOAT_DATA (num));
+ float_to_string (pigbuf, float_data (XFLOAT (num)));
return build_string (pigbuf);
}
#endif /* LISP_FLOAT_TYPE */
if (b == 10)
{
/* Use the system-provided functions for base 10. */
-#if SIZEOF_EMACS_INT == SIZEOF_INT
+#if SIZEOF_EMACS_INT == SIZEOF_INT
return make_int (atoi (p));
#elif SIZEOF_EMACS_INT == SIZEOF_LONG
return make_int (atol (p));
}
}
\f
+enum arithop
+ { Aadd, Asub, Amult, Adiv, Alogand, Alogior, Alogxor, Amax, Amin };
-DEFUN ("+", Fplus, 0, MANY, 0, /*
-Return sum of any number of arguments.
-The arguments should all be numbers, characters or markers.
-*/
- (int nargs, Lisp_Object *args))
-{
- EMACS_INT iaccum = 0;
- Lisp_Object *args_end = args + nargs;
-
- while (args < args_end)
- {
- int_or_double iod;
- number_char_or_marker_to_int_or_double (*args++, &iod);
- if (iod.int_p)
- iaccum += iod.c.ival;
- else
- {
- double daccum = (double) iaccum + iod.c.dval;
- while (args < args_end)
- daccum += number_char_or_marker_to_double (*args++);
- return make_float (daccum);
- }
- }
-
- return make_int (iaccum);
-}
-DEFUN ("-", Fminus, 1, MANY, 0, /*
-Negate number or subtract numbers, characters or markers.
-With one arg, negates it. With more than one arg,
-subtracts all but the first from the first.
-*/
- (int nargs, Lisp_Object *args))
+#ifdef LISP_FLOAT_TYPE
+static Lisp_Object
+float_arith_driver (double accum, int argnum, enum arithop code, int nargs,
+ Lisp_Object *args)
{
- EMACS_INT iaccum;
- double daccum;
- Lisp_Object *args_end = args + nargs;
- int_or_double iod;
+ REGISTER Lisp_Object val;
+ double next;
- number_char_or_marker_to_int_or_double (*args++, &iod);
- if (iod.int_p)
- iaccum = nargs > 1 ? iod.c.ival : - iod.c.ival;
- else
- {
- daccum = nargs > 1 ? iod.c.dval : - iod.c.dval;
- goto do_float;
- }
-
- while (args < args_end)
+ for (; argnum < nargs; argnum++)
{
- number_char_or_marker_to_int_or_double (*args++, &iod);
- if (iod.int_p)
- iaccum -= iod.c.ival;
- else
- {
- daccum = (double) iaccum - iod.c.dval;
- goto do_float;
- }
- }
-
- return make_int (iaccum);
-
- do_float:
- for (; args < args_end; args++)
- daccum -= number_char_or_marker_to_double (*args);
- return make_float (daccum);
-}
+ /* using args[argnum] as argument to CHECK_INT_OR_FLOAT_... */
+ val = args[argnum];
+ CHECK_INT_OR_FLOAT_COERCE_CHAR_OR_MARKER (val);
-DEFUN ("*", Ftimes, 0, MANY, 0, /*
-Return product of any number of arguments.
-The arguments should all be numbers, characters or markers.
-*/
- (int nargs, Lisp_Object *args))
-{
- EMACS_INT iaccum = 1;
- Lisp_Object *args_end = args + nargs;
-
- while (args < args_end)
- {
- int_or_double iod;
- number_char_or_marker_to_int_or_double (*args++, &iod);
- if (iod.int_p)
- iaccum *= iod.c.ival;
- else
+ if (FLOATP (val))
{
- double daccum = (double) iaccum * iod.c.dval;
- while (args < args_end)
- daccum *= number_char_or_marker_to_double (*args++);
- return make_float (daccum);
+ next = float_data (XFLOAT (val));
}
- }
-
- return make_int (iaccum);
-}
-
-DEFUN ("/", Fquo, 1, MANY, 0, /*
-Return first argument divided by all the remaining arguments.
-The arguments must be numbers, characters or markers.
-With one argument, reciprocates the argument.
-*/
- (int nargs, Lisp_Object *args))
-{
- EMACS_INT iaccum;
- double daccum;
- Lisp_Object *args_end = args + nargs;
- int_or_double iod;
-
- if (nargs == 1)
- iaccum = 1;
- else
- {
- number_char_or_marker_to_int_or_double (*args++, &iod);
- if (iod.int_p)
- iaccum = iod.c.ival;
else
{
- daccum = iod.c.dval;
- goto divide_floats;
+ args[argnum] = val; /* runs into a compiler bug. */
+ next = XINT (args[argnum]);
}
- }
-
- while (args < args_end)
- {
- number_char_or_marker_to_int_or_double (*args++, &iod);
- if (iod.int_p)
- {
- if (iod.c.ival == 0) goto divide_by_zero;
- iaccum /= iod.c.ival;
- }
- else
+ switch (code)
{
- if (iod.c.dval == 0) goto divide_by_zero;
- daccum = (double) iaccum / iod.c.dval;
- goto divide_floats;
+ case Aadd:
+ accum += next;
+ break;
+ case Asub:
+ if (!argnum && nargs != 1)
+ next = - next;
+ accum -= next;
+ break;
+ case Amult:
+ accum *= next;
+ break;
+ case Adiv:
+ if (!argnum)
+ accum = next;
+ else
+ {
+ if (next == 0)
+ Fsignal (Qarith_error, Qnil);
+ accum /= next;
+ }
+ break;
+ case Alogand:
+ case Alogior:
+ case Alogxor:
+ return wrong_type_argument (Qinteger_char_or_marker_p, val);
+ case Amax:
+ if (!argnum || isnan (next) || next > accum)
+ accum = next;
+ break;
+ case Amin:
+ if (!argnum || isnan (next) || next < accum)
+ accum = next;
+ break;
}
}
- return make_int (iaccum);
-
- divide_floats:
- for (; args < args_end; args++)
- {
- double dval = number_char_or_marker_to_double (*args);
- if (dval == 0) goto divide_by_zero;
- daccum /= dval;
- }
- return make_float (daccum);
-
- divide_by_zero:
- Fsignal (Qarith_error, Qnil);
- return Qnil; /* not reached */
+ return make_float (accum);
}
+#endif /* LISP_FLOAT_TYPE */
-DEFUN ("max", Fmax, 1, MANY, 0, /*
-Return largest of all the arguments.
-All arguments must be numbers, characters or markers.
-The value is always a number; markers and characters are converted
-to numbers.
-*/
- (int nargs, Lisp_Object *args))
+static Lisp_Object
+arith_driver (enum arithop code, int nargs, Lisp_Object *args)
{
- EMACS_INT imax;
- double dmax;
- Lisp_Object *args_end = args + nargs;
- int_or_double iod;
+ Lisp_Object val;
+ REGISTER int argnum;
+ REGISTER EMACS_INT accum = 0;
+ REGISTER EMACS_INT next;
- number_char_or_marker_to_int_or_double (*args++, &iod);
- if (iod.int_p)
- imax = iod.c.ival;
- else
+ switch (code)
{
- dmax = iod.c.dval;
- goto max_floats;
- }
-
- while (args < args_end)
- {
- number_char_or_marker_to_int_or_double (*args++, &iod);
- if (iod.int_p)
- {
- if (imax < iod.c.ival) imax = iod.c.ival;
- }
- else
- {
- dmax = (double) imax;
- if (dmax < iod.c.dval) dmax = iod.c.dval;
- goto max_floats;
- }
- }
-
- return make_int (imax);
-
- max_floats:
- while (args < args_end)
- {
- double dval = number_char_or_marker_to_double (*args++);
- if (dmax < dval) dmax = dval;
+ case Alogior:
+ case Alogxor:
+ case Aadd:
+ case Asub:
+ accum = 0; break;
+ case Amult:
+ accum = 1; break;
+ case Alogand:
+ accum = -1; break;
+ case Adiv:
+ case Amax:
+ case Amin:
+ accum = 0; break;
+ default:
+ abort ();
}
- return make_float (dmax);
-}
-
-DEFUN ("min", Fmin, 1, MANY, 0, /*
-Return smallest of all the arguments.
-All arguments must be numbers, characters or markers.
-The value is always a number; markers and characters are converted
-to numbers.
-*/
- (int nargs, Lisp_Object *args))
-{
- EMACS_INT imin;
- double dmin;
- Lisp_Object *args_end = args + nargs;
- int_or_double iod;
- number_char_or_marker_to_int_or_double (*args++, &iod);
- if (iod.int_p)
- imin = iod.c.ival;
- else
+ for (argnum = 0; argnum < nargs; argnum++)
{
- dmin = iod.c.dval;
- goto min_floats;
- }
+ /* using args[argnum] as argument to CHECK_INT_OR_FLOAT_... */
+ val = args[argnum];
+ CHECK_INT_OR_FLOAT_COERCE_CHAR_OR_MARKER (val);
- while (args < args_end)
- {
- number_char_or_marker_to_int_or_double (*args++, &iod);
- if (iod.int_p)
- {
- if (imin > iod.c.ival) imin = iod.c.ival;
- }
- else
+#ifdef LISP_FLOAT_TYPE
+ if (FLOATP (val)) /* time to do serious math */
+ return float_arith_driver ((double) accum, argnum, code,
+ nargs, args);
+#endif /* LISP_FLOAT_TYPE */
+ args[argnum] = val; /* runs into a compiler bug. */
+ next = XINT (args[argnum]);
+ switch (code)
{
- dmin = (double) imin;
- if (dmin > iod.c.dval) dmin = iod.c.dval;
- goto min_floats;
+ case Aadd: accum += next; break;
+ case Asub:
+ if (!argnum && nargs != 1)
+ next = - next;
+ accum -= next;
+ break;
+ case Amult: accum *= next; break;
+ case Adiv:
+ if (!argnum) accum = next;
+ else
+ {
+ if (next == 0)
+ Fsignal (Qarith_error, Qnil);
+ accum /= next;
+ }
+ break;
+ case Alogand: accum &= next; break;
+ case Alogior: accum |= next; break;
+ case Alogxor: accum ^= next; break;
+ case Amax: if (!argnum || next > accum) accum = next; break;
+ case Amin: if (!argnum || next < accum) accum = next; break;
}
}
- return make_int (imin);
-
- min_floats:
- while (args < args_end)
- {
- double dval = number_char_or_marker_to_double (*args++);
- if (dmin > dval) dmin = dval;
- }
- return make_float (dmin);
+ XSETINT (val, accum);
+ return val;
}
-DEFUN ("logand", Flogand, 0, MANY, 0, /*
-Return bitwise-and of all the arguments.
-Arguments may be integers, or markers or characters converted to integers.
+DEFUN ("+", Fplus, 0, MANY, 0, /*
+Return sum of any number of arguments.
+The arguments should all be numbers, characters or markers.
*/
(int nargs, Lisp_Object *args))
{
- EMACS_INT bits = ~0;
- Lisp_Object *args_end = args + nargs;
-
- while (args < args_end)
- bits &= integer_char_or_marker_to_int (*args++);
-
- return make_int (bits);
+ return arith_driver (Aadd, nargs, args);
}
-DEFUN ("logior", Flogior, 0, MANY, 0, /*
-Return bitwise-or of all the arguments.
-Arguments may be integers, or markers or characters converted to integers.
+DEFUN ("-", Fminus, 0, MANY, 0, /*
+Negate number or subtract numbers, characters or markers.
+With one arg, negates it. With more than one arg,
+subtracts all but the first from the first.
*/
(int nargs, Lisp_Object *args))
{
- EMACS_INT bits = 0;
- Lisp_Object *args_end = args + nargs;
-
- while (args < args_end)
- bits |= integer_char_or_marker_to_int (*args++);
-
- return make_int (bits);
+ return arith_driver (Asub, nargs, args);
}
-DEFUN ("logxor", Flogxor, 0, MANY, 0, /*
-Return bitwise-exclusive-or of all the arguments.
-Arguments may be integers, or markers or characters converted to integers.
+DEFUN ("*", Ftimes, 0, MANY, 0, /*
+Return product of any number of arguments.
+The arguments should all be numbers, characters or markers.
*/
(int nargs, Lisp_Object *args))
{
- EMACS_INT bits = 0;
- Lisp_Object *args_end = args + nargs;
-
- while (args < args_end)
- bits ^= integer_char_or_marker_to_int (*args++);
-
- return make_int (bits);
+ return arith_driver (Amult, nargs, args);
}
-DEFUN ("lognot", Flognot, 1, 1, 0, /*
-Return the bitwise complement of NUMBER.
-NUMBER may be an integer, marker or character converted to integer.
+DEFUN ("/", Fquo, 2, MANY, 0, /*
+Return first argument divided by all the remaining arguments.
+The arguments must be numbers, characters or markers.
*/
- (number))
+ (int nargs, Lisp_Object *args))
{
- return make_int (~ integer_char_or_marker_to_int (number));
+ return arith_driver (Adiv, nargs, args);
}
DEFUN ("%", Frem, 2, 2, 0, /*
*/
(num1, num2))
{
- int ival1 = integer_char_or_marker_to_int (num1);
- int ival2 = integer_char_or_marker_to_int (num2);
+ CHECK_INT_COERCE_CHAR_OR_MARKER (num1);
+ CHECK_INT_COERCE_CHAR_OR_MARKER (num2);
- if (ival2 == 0)
+ if (ZEROP (num2))
Fsignal (Qarith_error, Qnil);
- return make_int (ival1 % ival2);
+ return make_int (XINT (num1) % XINT (num2));
}
/* Note, ANSI *requires* the presence of the fmod() library routine.
*/
(x, y))
{
- int_or_double iod1, iod2;
- number_char_or_marker_to_int_or_double (x, &iod1);
- number_char_or_marker_to_int_or_double (y, &iod2);
+ EMACS_INT i1, i2;
#ifdef LISP_FLOAT_TYPE
- if (!iod1.int_p || !iod2.int_p)
+ CHECK_INT_OR_FLOAT_COERCE_CHAR_OR_MARKER (x);
+ CHECK_INT_OR_FLOAT_COERCE_CHAR_OR_MARKER (y);
+
+ if (FLOATP (x) || FLOATP (y))
{
- double dval1 = iod1.int_p ? (double) iod1.c.ival : iod1.c.dval;
- double dval2 = iod2.int_p ? (double) iod2.c.ival : iod2.c.dval;
- if (dval2 == 0) goto divide_by_zero;
- dval1 = fmod (dval1, dval2);
+ double f1, f2;
- /* If the "remainder" comes out with the wrong sign, fix it. */
- if (dval2 < 0 ? dval1 > 0 : dval1 < 0)
- dval1 += dval2;
+ f1 = ((FLOATP (x)) ? float_data (XFLOAT (x)) : XINT (x));
+ f2 = ((FLOATP (y)) ? float_data (XFLOAT (y)) : XINT (y));
+ if (f2 == 0)
+ Fsignal (Qarith_error, Qnil);
+
+ f1 = fmod (f1, f2);
- return make_float (dval1);
+ /* If the "remainder" comes out with the wrong sign, fix it. */
+ if (f2 < 0 ? f1 > 0 : f1 < 0)
+ f1 += f2;
+ return make_float (f1);
}
-#endif /* LISP_FLOAT_TYPE */
- {
- int ival;
- if (iod2.c.ival == 0) goto divide_by_zero;
+#else /* not LISP_FLOAT_TYPE */
+ CHECK_INT_OR_FLOAT_COERCE_CHAR_OR_MARKER (x);
+ CHECK_INT_OR_FLOAT_COERCE_CHAR_OR_MARKER (y);
+#endif /* not LISP_FLOAT_TYPE */
- ival = iod1.c.ival % iod2.c.ival;
+ i1 = XINT (x);
+ i2 = XINT (y);
- /* If the "remainder" comes out with the wrong sign, fix it. */
- if (iod2.c.ival < 0 ? ival > 0 : ival < 0)
- ival += iod2.c.ival;
+ if (i2 == 0)
+ Fsignal (Qarith_error, Qnil);
- return make_int (ival);
- }
+ i1 %= i2;
- divide_by_zero:
- Fsignal (Qarith_error, Qnil);
- return Qnil; /* not reached */
+ /* If the "remainder" comes out with the wrong sign, fix it. */
+ if (i2 < 0 ? i1 > 0 : i1 < 0)
+ i1 += i2;
+
+ return make_int (i1);
+}
+
+
+DEFUN ("max", Fmax, 1, MANY, 0, /*
+Return largest of all the arguments.
+All arguments must be numbers, characters or markers.
+The value is always a number; markers and characters are converted
+to numbers.
+*/
+ (int nargs, Lisp_Object *args))
+{
+ return arith_driver (Amax, nargs, args);
+}
+
+DEFUN ("min", Fmin, 1, MANY, 0, /*
+Return smallest of all the arguments.
+All arguments must be numbers, characters or markers.
+The value is always a number; markers and characters are converted
+to numbers.
+*/
+ (int nargs, Lisp_Object *args))
+{
+ return arith_driver (Amin, nargs, args);
+}
+
+DEFUN ("logand", Flogand, 0, MANY, 0, /*
+Return bitwise-and of all the arguments.
+Arguments may be integers, or markers or characters converted to integers.
+*/
+ (int nargs, Lisp_Object *args))
+{
+ return arith_driver (Alogand, nargs, args);
+}
+
+DEFUN ("logior", Flogior, 0, MANY, 0, /*
+Return bitwise-or of all the arguments.
+Arguments may be integers, or markers or characters converted to integers.
+*/
+ (int nargs, Lisp_Object *args))
+{
+ return arith_driver (Alogior, nargs, args);
+}
+
+DEFUN ("logxor", Flogxor, 0, MANY, 0, /*
+Return bitwise-exclusive-or of all the arguments.
+Arguments may be integers, or markers or characters converted to integers.
+*/
+ (int nargs, Lisp_Object *args))
+{
+ return arith_driver (Alogxor, nargs, args);
}
DEFUN ("ash", Fash, 2, 2, 0, /*
(value, count))
{
CHECK_INT_COERCE_CHAR (value);
- CONCHECK_INT (count);
+ CHECK_INT (count);
return make_int (XINT (count) > 0 ?
XINT (value) << XINT (count) :
(value, count))
{
CHECK_INT_COERCE_CHAR (value);
- CONCHECK_INT (count);
+ CHECK_INT (count);
return make_int (XINT (count) > 0 ?
XUINT (value) << XINT (count) :
}
DEFUN ("1+", Fadd1, 1, 1, 0, /*
-Return NUMBER plus one. NUMBER may be a number, character or marker.
+Return NUMBER plus one. NUMBER may be a number or a marker.
Markers and characters are converted to integers.
*/
(number))
{
- retry:
+ CHECK_INT_OR_FLOAT_COERCE_CHAR_OR_MARKER (number);
- if (INTP (number)) return make_int (XINT (number) + 1);
- if (CHARP (number)) return make_int (XCHAR (number) + 1);
- if (MARKERP (number)) return make_int (marker_position (number) + 1);
#ifdef LISP_FLOAT_TYPE
- if (FLOATP (number)) return make_float (XFLOAT_DATA (number) + 1.0);
+ if (FLOATP (number))
+ return make_float (1.0 + float_data (XFLOAT (number)));
#endif /* LISP_FLOAT_TYPE */
- number = wrong_type_argument (Qnumber_char_or_marker_p, number);
- goto retry;
+ return make_int (XINT (number) + 1);
}
DEFUN ("1-", Fsub1, 1, 1, 0, /*
-Return NUMBER minus one. NUMBER may be a number, character or marker.
+Return NUMBER minus one. NUMBER may be a number or a marker.
Markers and characters are converted to integers.
*/
(number))
{
- retry:
+ CHECK_INT_OR_FLOAT_COERCE_CHAR_OR_MARKER (number);
- if (INTP (number)) return make_int (XINT (number) - 1);
- if (CHARP (number)) return make_int (XCHAR (number) - 1);
- if (MARKERP (number)) return make_int (marker_position (number) - 1);
#ifdef LISP_FLOAT_TYPE
- if (FLOATP (number)) return make_float (XFLOAT_DATA (number) - 1.0);
+ if (FLOATP (number))
+ return make_float (-1.0 + (float_data (XFLOAT (number))));
#endif /* LISP_FLOAT_TYPE */
- number = wrong_type_argument (Qnumber_char_or_marker_p, number);
- goto retry;
+ return make_int (XINT (number) - 1);
+}
+
+DEFUN ("lognot", Flognot, 1, 1, 0, /*
+Return the bitwise complement of NUMBER. NUMBER must be an integer.
+*/
+ (number))
+{
+ CHECK_INT (number);
+ return make_int (~XINT (number));
}
\f
disappear when no longer in use, i.e. when no longer GC-protected.
The basic idea is that we don't mark the elements during GC, but
wait for them to be marked elsewhere. If they're not marked, we
- remove them. This is analogous to weak hash tables; see the explanation
+ remove them. This is analogous to weak hashtables; see the explanation
there for more info. */
static Lisp_Object Vall_weak_lists; /* Gemarke es nicht!!! */
}
static int
-weak_list_equal (Lisp_Object obj1, Lisp_Object obj2, int depth)
+weak_list_equal (Lisp_Object o1, Lisp_Object o2, int depth)
{
- struct weak_list *w1 = XWEAK_LIST (obj1);
- struct weak_list *w2 = XWEAK_LIST (obj2);
+ struct weak_list *w1 = XWEAK_LIST (o1);
+ struct weak_list *w2 = XWEAK_LIST (o2);
return ((w1->type == w2->type) &&
internal_equal (w1->list, w2->list, depth + 1));
{
Lisp_Object result;
struct weak_list *wl =
- alloc_lcrecord_type (struct weak_list, &lrecord_weak_list);
+ alloc_lcrecord_type (struct weak_list, lrecord_weak_list);
wl->list = Qnil;
wl->type = type;
return result;
}
-static const struct lrecord_description weak_list_description[] = {
- { XD_LISP_OBJECT, offsetof(struct weak_list, list), 1 },
- { XD_LISP_OBJECT, offsetof(struct weak_list, next_weak), 1 },
- { XD_END }
-};
-
DEFINE_LRECORD_IMPLEMENTATION ("weak-list", weak_list,
mark_weak_list, print_weak_list,
0, weak_list_equal, weak_list_hash,
- weak_list_description,
struct weak_list);
/*
-- we do not mark the list elements (either the elements themselves
Lisp_Object rest2;
enum weak_list_type type = XWEAK_LIST (rest)->type;
- if (! obj_marked_p (rest))
+ if (! ((*obj_marked_p) (rest)))
/* The weak list is probably garbage. Ignore it. */
continue;
(either because of an external pointer or because of
a previous call to this function), and likewise for all
the rest of the elements in the list, so we can stop now. */
- if (obj_marked_p (rest2))
+ if ((*obj_marked_p) (rest2))
break;
elem = XCAR (rest2);
switch (type)
{
case WEAK_LIST_SIMPLE:
- if (obj_marked_p (elem))
+ if ((*obj_marked_p) (elem))
need_to_mark_cons = 1;
break;
need_to_mark_cons = 1;
need_to_mark_elem = 1;
}
- else if (obj_marked_p (XCAR (elem)) &&
- obj_marked_p (XCDR (elem)))
+ else if ((*obj_marked_p) (XCAR (elem)) &&
+ (*obj_marked_p) (XCDR (elem)))
{
need_to_mark_cons = 1;
/* We still need to mark elem, because it's
need_to_mark_cons = 1;
need_to_mark_elem = 1;
}
- else if (obj_marked_p (XCAR (elem)))
+ else if ((*obj_marked_p) (XCAR (elem)))
{
need_to_mark_cons = 1;
/* We still need to mark elem and XCDR (elem);
need_to_mark_cons = 1;
need_to_mark_elem = 1;
}
- else if (obj_marked_p (XCDR (elem)))
+ else if ((*obj_marked_p) (XCDR (elem)))
{
need_to_mark_cons = 1;
/* We still need to mark elem and XCAR (elem);
abort ();
}
- if (need_to_mark_elem && ! obj_marked_p (elem))
+ if (need_to_mark_elem && ! (*obj_marked_p) (elem))
{
- markobj (elem);
+ (*markobj) (elem);
did_mark = 1;
}
/* In case of imperfect list, need to mark the final cons
because we're not removing it */
- if (!GC_NILP (rest2) && ! obj_marked_p (rest2))
+ if (!GC_NILP (rest2) && ! (obj_marked_p) (rest2))
{
- markobj (rest2);
+ (markobj) (rest2);
did_mark = 1;
}
}
!GC_NILP (rest);
rest = XWEAK_LIST (rest)->next_weak)
{
- if (! (obj_marked_p (rest)))
+ if (! ((*obj_marked_p) (rest)))
{
/* This weak list itself is garbage. Remove it from the list. */
if (GC_NILP (prev))
have been marked in finish_marking_weak_lists().
-- otherwise, it's not marked and should disappear.
*/
- if (! obj_marked_p (rest2))
+ if (!(*obj_marked_p) (rest2))
{
/* bye bye :-( */
if (GC_NILP (prev2))
"Attempt to set a constant symbol", Qerror);
deferror (&Qinvalid_read_syntax, "invalid-read-syntax",
"Invalid read syntax", Qerror);
-
- /* Generated by list traversal macros */
deferror (&Qmalformed_list, "malformed-list",
"Malformed list", Qerror);
deferror (&Qmalformed_property_list, "malformed-property-list",
- "Malformed property list", Qmalformed_list);
+ "Malformed property list", Qerror);
deferror (&Qcircular_list, "circular-list",
"Circular list", Qerror);
deferror (&Qcircular_property_list, "circular-property-list",
- "Circular property list", Qcircular_list);
-
+ "Circular property list", Qerror);
deferror (&Qinvalid_function, "invalid-function", "Invalid function",
Qerror);
deferror (&Qwrong_number_of_arguments, "wrong-number-of-arguments",
defsymbol (&Qbitp, "bitp");
defsymbol (&Qbit_vectorp, "bit-vector-p");
defsymbol (&Qvectorp, "vectorp");
+ defsymbol (&Qcompiled_functionp, "compiled-function-p");
defsymbol (&Qchar_or_string_p, "char-or-string-p");
defsymbol (&Qmarkerp, "markerp");
defsymbol (&Qinteger_or_marker_p, "integer-or-marker-p");
DEFSUBR (Feq);
DEFSUBR (Fold_eq);
DEFSUBR (Fnull);
- Ffset (intern ("not"), intern ("null"));
DEFSUBR (Flistp);
DEFSUBR (Fnlistp);
DEFSUBR (Ftrue_list_p);
DEFSUBR (Fsubr_min_args);
DEFSUBR (Fsubr_max_args);
DEFSUBR (Fsubr_interactive);
+ DEFSUBR (Fcompiled_function_p);
DEFSUBR (Ftype_of);
DEFSUBR (Fcar);
DEFSUBR (Fcdr);
DEFSUBR (Faref);
DEFSUBR (Faset);
+ DEFSUBR (Fcompiled_function_instructions);
+ DEFSUBR (Fcompiled_function_constants);
+ DEFSUBR (Fcompiled_function_stack_depth);
+ DEFSUBR (Fcompiled_function_arglist);
+ DEFSUBR (Fcompiled_function_interactive);
+ DEFSUBR (Fcompiled_function_doc_string);
+ DEFSUBR (Fcompiled_function_domain);
+#ifdef COMPILED_FUNCTION_ANNOTATION_HACK
+ DEFSUBR (Fcompiled_function_annotation);
+#endif
+
DEFSUBR (Fnumber_to_string);
DEFSUBR (Fstring_to_number);
DEFSUBR (Feqlsign);
Vall_weak_lists = Qnil;
#ifdef DEBUG_XEMACS
- DEFVAR_BOOL ("debug-issue-ebola-notices", &debug_issue_ebola_notices /*
-If non-zero, note when your code may be suffering from char-int confoundance.
+ DEFVAR_INT ("debug-issue-ebola-notices", &debug_issue_ebola_notices /*
+If non-nil, note when your code may be suffering from char-int confoundance.
That is to say, if XEmacs encounters a usage of `eq', `memq', `equal',
-etc. where an int and a char with the same value are being compared,
+etc. where a int and a char with the same value are being compared,
it will issue a notice on stderr to this effect, along with a backtrace.
In such situations, the result would be different in XEmacs 19 versus
XEmacs 20, and you probably don't want this.
impossible to accurately determine Ebola infection.
*/ );
- debug_issue_ebola_notices = 0;
+ debug_issue_ebola_notices = 2; /* #### temporary hack */
DEFVAR_INT ("debug-ebola-backtrace-length",
&debug_ebola_backtrace_length /*
#include <config.h>
#include "lisp.h"
#include "sysfile.h"
-#include "buffer.h"
#include <errno.h>
#ifndef HAVE_DATABASE
Lisp_Object Qdbm;
#endif /* HAVE_DBM */
-#ifdef MULE
-/* #### The following should be settable on a per-database level.
- But the whole coding-system infrastructure should be rewritten someday.
- We really need coding-system aliases. -- martin */
-Lisp_Object Vdatabase_coding_system;
-#endif
-
Lisp_Object Qdatabasep;
+typedef enum { DB_DBM, DB_BERKELEY, DB_IS_UNKNOWN } XEMACS_DB_TYPE;
+
struct Lisp_Database;
-typedef struct Lisp_Database Lisp_Database;
typedef struct
{
- Lisp_Object (*get_subtype) (Lisp_Database *);
- Lisp_Object (*get_type) (Lisp_Database *);
- Lisp_Object (*get) (Lisp_Database *, Lisp_Object);
- int (*put) (Lisp_Database *, Lisp_Object, Lisp_Object, Lisp_Object);
- int (*rem) (Lisp_Database *, Lisp_Object);
- void (*map) (Lisp_Database *, Lisp_Object);
- void (*close) (Lisp_Database *);
- Lisp_Object (*last_error) (Lisp_Database *);
+ Lisp_Object (*get_subtype) (struct Lisp_Database *);
+ Lisp_Object (*get_type) (struct Lisp_Database *);
+ Lisp_Object (*get) (struct Lisp_Database *, Lisp_Object);
+ int (*put) (struct Lisp_Database *, Lisp_Object, Lisp_Object, Lisp_Object);
+ int (*rem) (struct Lisp_Database *, Lisp_Object);
+ void (*map) (struct Lisp_Database *, Lisp_Object);
+ void (*close) (struct Lisp_Database *);
+ Lisp_Object (*last_error) (struct Lisp_Database *);
} DB_FUNCS;
struct Lisp_Database
{
struct lcrecord_header header;
Lisp_Object fname;
+ XEMACS_DB_TYPE type;
int mode;
int access_;
int dberrno;
#endif
};
-#define XDATABASE(x) XRECORD (x, database, Lisp_Database)
+#define XDATABASE(x) XRECORD (x, database, struct Lisp_Database)
#define XSETDATABASE(x, p) XSETRECORD (x, p, database)
#define DATABASEP(x) RECORDP (x, database)
#define GC_DATABASEP(x) GC_RECORDP (x, database)
} while (0)
-static Lisp_Database *
+static struct Lisp_Database *
allocate_database (void)
{
- Lisp_Database *db = alloc_lcrecord_type (Lisp_Database, &lrecord_database);
+ struct Lisp_Database *db =
+ alloc_lcrecord_type (struct Lisp_Database, lrecord_database);
db->fname = Qnil;
db->live_p = 0;
db->access_ = 0;
db->mode = 0;
db->dberrno = 0;
+ db->type = DB_IS_UNKNOWN;
#ifdef MULE
db->coding_system = Fget_coding_system (Qbinary);
#endif
static Lisp_Object
mark_database (Lisp_Object obj, void (*markobj) (Lisp_Object))
{
- Lisp_Database *db = XDATABASE (obj);
+ struct Lisp_Database *db = XDATABASE (obj);
- markobj (db->fname);
+ ((markobj) (db->fname));
return Qnil;
}
print_database (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
{
char buf[64];
- Lisp_Database *db = XDATABASE (obj);
+ struct Lisp_Database *db = XDATABASE (obj);
if (print_readably)
error ("printing unreadable object #<database 0x%x>", db->header.uid);
static void
finalize_database (void *header, int for_disksave)
{
- Lisp_Database *db = (Lisp_Database *) header;
+ struct Lisp_Database *db = (struct Lisp_Database *) header;
if (for_disksave)
{
Lisp_Object obj;
- XSETDATABASE (obj, db);
+ XSETOBJ (obj, Lisp_Type_Record, (void *) db);
signal_simple_error
("Can't dump an emacs containing database objects", obj);
DEFINE_LRECORD_IMPLEMENTATION ("database", database,
mark_database, print_database,
- finalize_database, 0, 0, 0,
- Lisp_Database);
+ finalize_database, 0, 0,
+ struct Lisp_Database);
DEFUN ("close-database", Fclose_database, 1, 1, 0, /*
Close database DATABASE.
*/
(database))
{
- Lisp_Database *db;
+ struct Lisp_Database *db;
CHECK_LIVE_DATABASE (database);
db = XDATABASE (database);
db->funcs->close (db);
#ifdef HAVE_DBM
static void
-dbm_map (Lisp_Database *db, Lisp_Object func)
+dbm_map (struct Lisp_Database *db, Lisp_Object func)
{
datum keydatum, valdatum;
Lisp_Object key, val;
}
static Lisp_Object
-dbm_get (Lisp_Database *db, Lisp_Object key)
+dbm_get (struct Lisp_Database *db, Lisp_Object key)
{
datum keydatum, valdatum;
}
static int
-dbm_put (Lisp_Database *db,
+dbm_put (struct Lisp_Database *db,
Lisp_Object key, Lisp_Object val, Lisp_Object replace)
{
datum keydatum, valdatum;
}
static int
-dbm_remove (Lisp_Database *db, Lisp_Object key)
+dbm_remove (struct Lisp_Database *db, Lisp_Object key)
{
datum keydatum;
}
static Lisp_Object
-dbm_type (Lisp_Database *db)
+dbm_type (struct Lisp_Database *db)
{
return Qdbm;
}
static Lisp_Object
-dbm_subtype (Lisp_Database *db)
+dbm_subtype (struct Lisp_Database *db)
{
return Qnil;
}
static Lisp_Object
-dbm_lasterr (Lisp_Database *db)
+dbm_lasterr (struct Lisp_Database *db)
{
return lisp_strerror (db->dberrno);
}
static void
-dbm_closeit (Lisp_Database *db)
+dbm_closeit (struct Lisp_Database *db)
{
if (db->dbm_handle)
{
#ifdef HAVE_BERKELEY_DB
static Lisp_Object
-berkdb_type (Lisp_Database *db)
+berkdb_type (struct Lisp_Database *db)
{
return Qberkeley_db;
}
static Lisp_Object
-berkdb_subtype (Lisp_Database *db)
+berkdb_subtype (struct Lisp_Database *db)
{
if (!db->db_handle)
return Qnil;
}
static Lisp_Object
-berkdb_lasterr (Lisp_Database *db)
+berkdb_lasterr (struct Lisp_Database *db)
{
return lisp_strerror (db->dberrno);
}
static Lisp_Object
-berkdb_get (Lisp_Database *db, Lisp_Object key)
+berkdb_get (struct Lisp_Database *db, Lisp_Object key)
{
+ /* #### Needs mule-izing */
DBT keydatum, valdatum;
int status = 0;
- /* DB Version 2 requires DBT's to be zeroed before use. */
+#if DB_VERSION_MAJOR == 2
+ /* Always initialize keydatum, valdatum. */
xzero (keydatum);
xzero (valdatum);
+#endif /* DV_VERSION_MAJOR = 2 */
keydatum.data = XSTRING_DATA (key);
keydatum.size = XSTRING_LENGTH (key);
#endif /* DB_VERSION_MAJOR */
if (!status)
- /* #### Not mule-ized! will crash! */
return make_string ((Bufbyte *) valdatum.data, valdatum.size);
#if DB_VERSION_MAJOR == 1
}
static int
-berkdb_put (Lisp_Database *db,
+berkdb_put (struct Lisp_Database *db,
Lisp_Object key,
Lisp_Object val,
Lisp_Object replace)
DBT keydatum, valdatum;
int status = 0;
- /* DB Version 2 requires DBT's to be zeroed before use. */
+#if DB_VERSION_MAJOR == 2
+ /* Always initalize keydatum, valdatum. */
xzero (keydatum);
xzero (valdatum);
+#endif /* DV_VERSION_MAJOR = 2 */
keydatum.data = XSTRING_DATA (key);
keydatum.size = XSTRING_LENGTH (key);
}
static int
-berkdb_remove (Lisp_Database *db, Lisp_Object key)
+berkdb_remove (struct Lisp_Database *db, Lisp_Object key)
{
DBT keydatum;
int status;
- /* DB Version 2 requires DBT's to be zeroed before use. */
+#if DB_VERSION_MAJOR == 2
+ /* Always initialize keydatum. */
xzero (keydatum);
+#endif /* DV_VERSION_MAJOR = 2 */
keydatum.data = XSTRING_DATA (key);
keydatum.size = XSTRING_LENGTH (key);
}
static void
-berkdb_map (Lisp_Database *db, Lisp_Object func)
+berkdb_map (struct Lisp_Database *db, Lisp_Object func)
{
DBT keydatum, valdatum;
Lisp_Object key, val;
DB *dbp = db->db_handle;
int status;
- xzero (keydatum);
- xzero (valdatum);
-
#if DB_VERSION_MAJOR == 1
for (status = dbp->seq (dbp, &keydatum, &valdatum, R_FIRST);
status == 0;
call2 (func, key, val);
}
#else
- {
- DBC *dbcp;
+ DBC *dbcp;
+ /* Initialize the key/data pair so the flags aren't set. */
+ xzero (keydatum);
+ xzero (valdatum);
-#if DB_VERSION_MAJOR > 2 || DB_VERSION_MINOR >=6
- status = dbp->cursor (dbp, NULL, &dbcp, 0);
-#else
- status = dbp->cursor (dbp, NULL, &dbcp);
-#endif
- for (status = dbcp->c_get (dbcp, &keydatum, &valdatum, DB_FIRST);
- status == 0;
- status = dbcp->c_get (dbcp, &keydatum, &valdatum, DB_NEXT))
- {
- /* ### Needs mule-izing */
- key = make_string ((Bufbyte *) keydatum.data, keydatum.size);
- val = make_string ((Bufbyte *) valdatum.data, valdatum.size);
- call2 (func, key, val);
- }
- dbcp->c_close (dbcp);
- }
+ status = dbp->cursor (dbp, NULL, &dbcp);
+ for (status = dbcp->c_get (dbcp, &keydatum, &valdatum, DB_FIRST);
+ status == 0;
+ status = dbcp->c_get (dbcp, &keydatum, &valdatum, DB_NEXT))
+ {
+ /* ### Needs mule-izing */
+ key = make_string ((Bufbyte *) keydatum.data, keydatum.size);
+ val = make_string ((Bufbyte *) valdatum.data, valdatum.size);
+ call2 (func, key, val);
+ }
+ dbcp->c_close (dbcp);
#endif /* DB_VERSION_MAJOR */
}
static void
-berkdb_close (Lisp_Database *db)
+berkdb_close (struct Lisp_Database *db)
{
if (db->db_handle)
{
/* This function can GC */
int modemask;
int accessmask = 0;
- Lisp_Database *db = NULL;
+ struct Lisp_Database *db = NULL;
char *filename;
struct gcpro gcpro1, gcpro2;
GCPRO2 (file, access_);
file = Fexpand_file_name (file, Qnil);
UNGCPRO;
-
- GET_C_CHARPTR_EXT_FILENAME_DATA_ALLOCA (XSTRING_DATA (file), filename);
+ filename = (char *) XSTRING_DATA (file);
if (NILP (access_))
{
db = allocate_database ();
db->dbm_handle = dbase;
+ db->type = DB_DBM;
db->funcs = &ndbm_func_block;
goto db_done;
}
db = allocate_database ();
db->db_handle = dbase;
+ db->type = DB_BERKELEY;
db->funcs = &berk_func_block;
goto db_done;
}
CHECK_STRING (key);
CHECK_STRING (value);
{
- Lisp_Database *db = XDATABASE (database);
+ struct Lisp_Database *db = XDATABASE (database);
int status = db->funcs->put (db, key, value, replace);
return status ? Qt : Qnil;
}
CHECK_LIVE_DATABASE (database);
CHECK_STRING (key);
{
- Lisp_Database *db = XDATABASE (database);
+ struct Lisp_Database *db = XDATABASE (database);
int status = db->funcs->rem (db, key);
return status ? Qt : Qnil;
}
CHECK_LIVE_DATABASE (database);
CHECK_STRING (key);
{
- Lisp_Database *db = XDATABASE (database);
+ struct Lisp_Database *db = XDATABASE (database);
Lisp_Object retval = db->funcs->get (db, key);
return NILP (retval) ? default_ : retval;
}
#ifdef HAVE_BERKELEY_DB
Fprovide (Qberkeley_db);
#endif
-
-#if 0 /* #### implement me! */
-#ifdef MULE
- DEFVAR_LISP ("database-coding-system", &Vdatabase_coding_system /*
-Coding system used to convert data in database files.
-*/ );
- Vdatabase_coding_system = Qnil;
-#endif
-#endif /* 0 */
}
--- /dev/null
+# -*- ksh -*-
+# Copyright (C) 1998 Free Software Foundation, Inc.
+
+# This file is part of XEmacs.
+
+# XEmacs is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2, or (at your option) any
+# later version.
+
+# XEmacs is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with XEmacs; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# Author: Martin Buchholz
+
+# You can use this file to debug XEmacs using Sun WorkShop's dbx.
+# Add the contents of this file to $HOME/.dbxrc or
+# Source the contents of this file with something like:
+# test -r ./dbxrc && . ./dbxrc
+
+# Some functions defined here require a running process, but most
+# don't. Considerable effort has been expended to this end.
+
+# See also the comments in gdbinit.
+
+# See also the question of the XEmacs FAQ, titled
+# "How to Debug an XEmacs problem with a debugger".
+
+ignore POLL
+ignore IO
+
+document lbt << 'end'
+Usage: lbt
+Print the current Lisp stack trace.
+Requires a running xemacs process.
+end
+
+function lbt {
+ call debug_backtrace()
+}
+
+document ldp << 'end'
+Usage: ldp lisp_object
+Print a Lisp Object value using the Lisp printer.
+Requires a running xemacs process.
+end
+
+function ldp {
+ call debug_print ($1);
+}
+
+# A bug in dbx prevents string variables from having values beginning with `-'!!
+function XEmacsInit {
+ eval $(echo $(whatis -t `alloc.c`dbg_constants) | \
+ perl -e 'print "@{[map {s/=(-\d+)/sprintf(q[=0x%x],$1)/oge; /\w+=[0-9a-fx]+/og} <>]}\n"')
+ xemacs_initted=yes
+ #printvar dbg_valbits dbg_valmask
+}
+
+function printvar {
+ for i in $*; do eval "echo $i=\$$i"; done
+}
+
+document decode_object << 'end'
+Usage: decode_object lisp_object
+Extract implementation information from a Lisp Object.
+Defines variables $val, $type and $imp.
+end
+
+# Various dbx bugs cause ugliness in following code
+function decode_object {
+ test -z "$xemacs_initted" && XEmacsInit
+ obj=$[*(void**)(&$1)]
+ test "$obj" = "(nil)" && obj="0x0"
+ if test $dbg_USE_MINIMAL_TAGBITS = 1; then
+ if test $[(int)($obj & 1)] = 1; then
+ # It's an int
+ val=$[(long)(((unsigned long long)$obj) >> 1)]
+ type=$dbg_Lisp_Type_Int
+ else
+ type=$[(int)(((void*)$obj) & $dbg_typemask)]
+ if test $type = $dbg_Lisp_Type_Char; then
+ val=$[(void*)(long)(((unsigned long long)($obj & $dbg_valmask)) >> $dbg_gctypebits)]
+ else
+ # It's a record pointer
+ val=$[(void*)$obj]
+ fi
+ fi
+ else
+ # not dbg_USE_MINIMAL_TAGBITS
+ val=$[(void*)($obj & $dbg_valmask)]
+ test "$val" = "(nil)" && val="0x0"
+ type=$[(int)(((unsigned long long)($obj & $dbg_typemask)) >> ($dbg_valbits + 1))]
+ fi
+
+ if test $type = $dbg_Lisp_Type_Record; then
+ typeset lheader="((struct lrecord_header *) $val)"
+ if test $dbg_USE_INDEXED_LRECORD_IMPLEMENTATION = 1; then
+ imp=$[(void*)(lrecord_implementations_table[$lheader->type])]
+ else
+ imp=$[(void*)($lheader->implementation)]
+ fi
+ else
+ imp="0xdeadbeef"
+ fi
+ #printvar obj val type imp
+}
+
+function xint {
+ decode_object "$*"
+ print (long) ($val)
+}
+
+function xtype {
+ decode_object "$*"
+ if test $type = $dbg_Lisp_Type_Int; then echo "int"
+ elif test $type = $dbg_Lisp_Type_Char; then echo "char"
+ elif test $type = $dbg_Lisp_Type_Symbol; then echo "symbol"
+ elif test $type = $dbg_Lisp_Type_String; then echo "string"
+ elif test $type = $dbg_Lisp_Type_Vector; then echo "vector"
+ elif test $type = $dbg_Lisp_Type_Cons; then echo "cons"
+ else
+ echo "record type with name: $[((struct lrecord_implementation *)$imp)->name]"
+ fi
+}
+
+document run-temacs << 'end'
+Usage: run-temacs
+Run temacs interactively, like xemacs.
+Use this with debugging tools (like purify) that cannot deal with dumping,
+or when temacs builds successfully, but xemacs does not.
+end
+
+function run-temacs {
+ unset EMACSLOADPATH
+ export EMACSBOOTSTRAPLOADPATH=../lisp/:..
+ run -batch -l ../lisp/loadup.el run-temacs -q
+}
+
+document update-elc << 'end'
+Usage: update-elc
+Run the core lisp byte compilation part of the build procedure.
+Use when debugging temacs, not xemacs!
+Use this when temacs builds successfully, but xemacs does not.
+end
+
+function update-elc {
+ unset EMACSLOADPATH
+ export EMACSBOOTSTRAPLOADPATH=../lisp/:..
+ run -batch -l ../lisp/update-elc.el
+}
+
+
+function dump-temacs {
+ unset EMACSLOADPATH
+ export EMACSBOOTSTRAPLOADPATH=../lisp/:..
+ run -batch -l ../lisp/loadup.el dump
+}
+
+document dump-temacs << 'end'
+Usage: dump-temacs
+Run the dumping part of the build procedure.
+Use when debugging temacs, not xemacs!
+Use this when temacs builds successfully, but xemacs does not.
+end
+
+function pstruct {
+ xstruct="((struct $1 *) $val)"
+ print $xstruct
+ print *$xstruct
+}
+
+function lrecord_type_p {
+ if eval test -z \"\$lrecord_$1\" && test $imp = $[(void*)(&lrecord_$1)]; then return 0; else return 1; fi
+}
+
+document pobj << 'end'
+Usage: pobj lisp_object
+Print the internal C structure of a underlying Lisp Object.
+end
+
+function pobj {
+ decode_object $1
+ if test $type = $dbg_Lisp_Type_Int; then
+ print -f"Integer: %d" $val
+ elif test $type = $dbg_Lisp_Type_Char; then
+ if $val < 128; then
+ print -f"Char: %c" $val
+ else
+ print -f"Char: %d" $val
+ fi
+ elif test $type = $dbg_Lisp_Type_String || lrecord_type_p string; then
+ pstruct Lisp_String
+ elif test $type = $dbg_Lisp_Type_Cons || lrecord_type_p cons; then
+ pstruct Lisp_Cons
+ elif test $type = $dbg_Lisp_Type_Symbol || lrecord_type_p symbol; then
+ pstruct Lisp_Symbol
+ echo "Symbol name: $[(char *)($xstruct->name->_data)]"
+ elif test $type = $dbg_Lisp_Type_Vector || lrecord_type_p vector; then
+ pstruct Lisp_Vector
+ echo "Vector of length $[$xstruct->size]"
+ elif lrecord_type_p bit_vector; then
+ pstruct Lisp_Bit_Vector
+ elif lrecord_type_p buffer; then
+ pstruct buffer
+ elif lrecord_type_p char_table; then
+ pstruct Lisp_Char_Table
+ elif lrecord_type_p char_table_entry; then
+ pstruct Lisp_Char_Table_Entry
+ elif lrecord_type_p charset; then
+ pstruct Lisp_Charset
+ elif lrecord_type_p coding_system; then
+ pstruct Lisp_Coding_System
+ elif lrecord_type_p color_instance; then
+ pstruct Lisp_Color_Instance
+ elif lrecord_type_p command_builder; then
+ pstruct command_builder
+ elif lrecord_type_p compiled_function; then
+ pstruct Lisp_Compiled_Function
+ elif lrecord_type_p console; then
+ pstruct console
+ elif lrecord_type_p database; then
+ pstruct database
+ elif lrecord_type_p device; then
+ pstruct device
+ elif lrecord_type_p event; then
+ pstruct Lisp_Event
+ elif lrecord_type_p extent; then
+ pstruct extent
+ elif lrecord_type_p extent_auxiliary; then
+ pstruct extent_auxiliary
+ elif lrecord_type_p extent_info; then
+ pstruct extent_info
+ elif lrecord_type_p face; then
+ pstruct Lisp_Face
+ elif lrecord_type_p float; then
+ pstruct Lisp_Float
+ elif lrecord_type_p font_instance; then
+ pstruct Lisp_Font_Instance
+ elif lrecord_type_p frame; then
+ pstruct frame
+ elif lrecord_type_p glyph; then
+ pstruct Lisp_Glyph
+ elif lrecord_type_p hashtable; then
+ pstruct hashtable
+ elif lrecord_type_p image_instance; then
+ pstruct Lisp_Image_Instance
+ elif lrecord_type_p keymap; then
+ pstruct keymap
+ elif lrecord_type_p lcrecord_list; then
+ pstruct lcrecord_list
+ elif lrecord_type_p lstream; then
+ pstruct lstream
+ elif lrecord_type_p marker; then
+ pstruct Lisp_Marker
+ elif lrecord_type_p opaque; then
+ pstruct Lisp_Opaque
+ elif lrecord_type_p opaque_list; then
+ pstruct Lisp_Opaque_List
+ elif lrecord_type_p popup_data; then
+ pstruct popup_data
+ elif lrecord_type_p process; then
+ pstruct Lisp_Process
+ elif lrecord_type_p range_table; then
+ pstruct Lisp_Range_Table
+ elif lrecord_type_p specifier; then
+ pstruct Lisp_Specifier
+ elif lrecord_type_p subr; then
+ pstruct Lisp_Subr
+ elif lrecord_type_p symbol_value_buffer_local; then
+ pstruct symbol_value_buffer_local
+ elif lrecord_type_p symbol_value_forward; then
+ pstruct symbol_value_forward
+ elif lrecord_type_p symbol_value_lisp_magic; then
+ pstruct symbol_value_lisp_magic
+ elif lrecord_type_p symbol_value_varalias; then
+ pstruct symbol_value_varalias
+ elif lrecord_type_p toolbar_button; then
+ pstruct toolbar_button
+ elif lrecord_type_p tooltalk_message; then
+ pstruct Lisp_Tooltalk_Message
+ elif lrecord_type_p tooltalk_pattern; then
+ pstruct Lisp_Tooltalk_Pattern
+ elif lrecord_type_p weak_list; then
+ pstruct weak_list
+ elif lrecord_type_p window; then
+ pstruct window
+ elif lrecord_type_p window_configuration; then
+ pstruct window_config
+ else
+ echo "Unknown Lisp Object type"
+ print $1
+ fi
+}
+
+function pproc {
+ print *(`process.c`struct Lisp_Process*)$1 ;
+ ldp "(`process.c`struct Lisp_Process*)$1->name" ;
+ ldp "(`process.c`struct Lisp_Process*)$1->command" ;
+}
+
+dbxenv suppress_startup_message 4.0
+
+function dp_core {
+ print ((struct x_frame *)(((struct frame*)(Fselected_frame(Qnil)&0x00FFFFFF))->frame_data))->widget->core
+}
+
+# Barf!
+function print_shell {
+ print *(`frame-x.c`TopLevelShellRec*) (((struct `frame-x.c`x_frame*) (((struct `frame-x.c`frame*) (Fselected_frame(Qnil)&0x00FFFFFF))->frame_data))->widget)
+}
LISP_H = lisp.h config.h $(LISP_UNION_H)
#ifdef HAVE_MS_WINDOWS
console-msw.o: $(LISP_H) conslots.h console-msw.h console.h events.h lisp-disunion.h lisp-union.h lrecord.h opaque.h symeval.h symsinit.h systime.h
-device-msw.o: $(LISP_H) buffer.h bufslots.h conslots.h console-msw.h console-stream.h console.h device.h events.h faces.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h systime.h toolbar.h
-dialog-msw.o: $(LISP_H) buffer.h bufslots.h conslots.h console-msw.h console.h device.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h opaque.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h
+device-msw.o: $(LISP_H) buffer.h bufslots.h conslots.h console-msw.h console-stream.h console.h device.h events.h faces.h frame.h frameslots.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h systime.h toolbar.h
+dialog-msw.o: $(LISP_H) buffer.h bufslots.h conslots.h console-msw.h console.h device.h frame.h frameslots.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h opaque.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h
dired-msw.o: $(LISP_H) buffer.h bufslots.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h ndir.h nt.h regex.h symeval.h symsinit.h sysdir.h sysfile.h sysproc.h systime.h
-event-msw.o: $(LISP_H) buffer.h bufslots.h conslots.h console-msw.h console-tty.h console.h device.h dragdrop.h events-mod.h events.h faces.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h lstream.h menubar-msw.h mule-charset.h objects-msw.h objects.h process.h redisplay.h scrollbar-msw.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h sysproc.h syssignal.h systime.h systty.h syswait.h toolbar.h
-frame-msw.o: $(LISP_H) buffer.h bufslots.h conslots.h console-msw.h console.h device.h elhash.h events.h faces.h frame.h frameslots.h glyphs-msw.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h toolbar.h window.h winslots.h
-glyphs-msw.o: $(LISP_H) buffer.h bufslots.h conslots.h console-msw.h console.h device.h elhash.h faces.h file-coding.h frame.h frameslots.h glyphs-msw.h glyphs.h gui.h imgproc.h insdel.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h objects-msw.h objects.h opaque.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysfile.h toolbar.h window.h winslots.h
-gui-msw.o: $(LISP_H) conslots.h console-msw.h console.h device.h elhash.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h
-menubar-msw.o: $(LISP_H) buffer.h bufslots.h commands.h conslots.h console-msw.h console.h device.h elhash.h events.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h menubar-msw.h menubar.h mule-charset.h opaque.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h toolbar.h window.h winslots.h
+event-msw.o: $(LISP_H) conslots.h console-msw.h console.h device.h dragdrop.h events-mod.h events.h frame.h frameslots.h lisp-disunion.h lisp-union.h lrecord.h lstream.h menubar-msw.h mule-charset.h process.h redisplay.h scrollbar-msw.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h sysproc.h systime.h syswait.h toolbar.h
+frame-msw.o: $(LISP_H) buffer.h bufslots.h conslots.h console-msw.h console.h device.h events.h faces.h frame.h frameslots.h glyphs-msw.h glyphs.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h toolbar.h window.h winslots.h
+glyphs-msw.o: $(LISP_H) buffer.h bufslots.h conslots.h console-msw.h console.h device.h faces.h file-coding.h frame.h frameslots.h glyphs-msw.h glyphs.h imgproc.h insdel.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h objects-msw.h objects.h opaque.h scrollbar.h specifier.h symeval.h symsinit.h sysfile.h toolbar.h
+menubar-msw.o: $(LISP_H) buffer.h bufslots.h commands.h conslots.h console-msw.h console.h device.h elhash.h events.h frame.h frameslots.h gui.h lisp-disunion.h lisp-union.h lrecord.h menubar-msw.h menubar.h mule-charset.h opaque.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h toolbar.h window.h winslots.h
objects-msw.o: $(LISP_H) buffer.h bufslots.h conslots.h console-msw.h console.h device.h hash.h insdel.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h objects-msw.h objects.h specifier.h symeval.h symsinit.h
-redisplay-msw.o: $(LISP_H) buffer.h bufslots.h conslots.h console-msw.h console.h debug.h device.h events.h faces.h frame.h frameslots.h glyphs-msw.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-ccl.h mule-charset.h objects-msw.h objects.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h systime.h toolbar.h window.h winslots.h
-scrollbar-msw.o: $(LISP_H) conslots.h console-msw.h console.h device.h events.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h redisplay.h scrollbar-msw.h scrollbar.h specifier.h symeval.h symsinit.h systime.h toolbar.h window.h winslots.h
+redisplay-msw.o: $(LISP_H) buffer.h bufslots.h conslots.h console-msw.h console.h debug.h device.h events.h faces.h frame.h frameslots.h glyphs-msw.h glyphs.h lisp-disunion.h lisp-union.h lrecord.h mule-ccl.h mule-charset.h objects-msw.h objects.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h systime.h toolbar.h window.h winslots.h
+scrollbar-msw.o: $(LISP_H) conslots.h console-msw.h console.h device.h events.h frame.h frameslots.h lisp-disunion.h lisp-union.h lrecord.h redisplay.h scrollbar-msw.h scrollbar.h specifier.h symeval.h symsinit.h systime.h toolbar.h window.h winslots.h
select-msw.o: $(LISP_H) conslots.h console-msw.h console.h lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h
toolbar-msw.o: $(LISP_H) buffer.h bufslots.h conslots.h console-msw.h console.h device.h elhash.h faces.h frame.h frameslots.h glyphs-msw.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h objects-msw.h objects.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h window.h winslots.h
#endif
#ifdef HAVE_X_WINDOWS
balloon-x.o: $(LISP_H) balloon_help.h conslots.h console-x.h console.h device.h lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h xintrinsic.h
console-x.o: $(LISP_H) conslots.h console-x.h console.h lisp-disunion.h lisp-union.h lrecord.h process.h redisplay.h symeval.h symsinit.h xintrinsic.h
-device-x.o: $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h buffer.h bufslots.h conslots.h console-x.h console.h device.h elhash.h events.h faces.h frame.h frameslots.h glyphs-x.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h objects-x.h objects.h offix-types.h offix.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h systime.h toolbar.h window.h winslots.h xgccache.h xintrinsic.h xintrinsicp.h xmu.h
-dialog-x.o: $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h EmacsFrame.h buffer.h bufslots.h commands.h conslots.h console-x.h console.h device.h events.h frame.h frameslots.h glyphs.h gui-x.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h opaque.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h toolbar.h window.h winslots.h xintrinsic.h
-frame-x.o: $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h EmacsFrame.h EmacsFrameP.h EmacsManager.h EmacsShell.h ExternalShell.h buffer.h bufslots.h conslots.h console-x.h console.h device.h dragdrop.h events-mod.h events.h extents.h faces.h frame.h frameslots.h glyphs-x.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h objects-x.h objects.h offix-types.h offix.h redisplay.h scrollbar-x.h scrollbar.h specifier.h symeval.h symsinit.h systime.h toolbar.h window.h winslots.h xintrinsic.h xintrinsicp.h xmprimitivep.h xmu.h
-glyphs-x.o: $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h bitmaps.h buffer.h bufslots.h conslots.h console-x.h console.h device.h file-coding.h frame.h frameslots.h glyphs-x.h glyphs.h gui.h imgproc.h insdel.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h objects-x.h objects.h opaque.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysfile.h toolbar.h window.h winslots.h xintrinsic.h xmu.h
-gui-x.o: $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h buffer.h bufslots.h conslots.h console-x.h console.h device.h frame.h frameslots.h glyphs.h gui-x.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h opaque.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h xintrinsic.h
-input-method-xfs.o: $(LISP_H) EmacsFrame.h buffer.h bufslots.h conslots.h console-x.h console.h device.h events.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h toolbar.h window.h winslots.h xintrinsic.h
-input-method-xlib.o: $(LISP_H) EmacsFrame.h buffer.h bufslots.h conslots.h console-x.h console.h device.h events.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h toolbar.h window.h winslots.h xintrinsic.h
-menubar-x.o: $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h EmacsFrame.h buffer.h bufslots.h commands.h conslots.h console-x.h console.h device.h events.h frame.h frameslots.h glyphs.h gui-x.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h opaque.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h toolbar.h window.h winslots.h xintrinsic.h
+device-x.o: $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h buffer.h bufslots.h conslots.h console-x.h console.h device.h events.h faces.h frame.h frameslots.h glyphs-x.h glyphs.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h objects-x.h objects.h offix-types.h offix.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h systime.h toolbar.h window.h winslots.h xgccache.h xintrinsic.h xintrinsicp.h xmu.h
+dialog-x.o: $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h EmacsFrame.h EmacsManager.h EmacsShell.h buffer.h bufslots.h commands.h conslots.h console-x.h console.h device.h events.h frame.h frameslots.h gui-x.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h opaque.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h toolbar.h window.h winslots.h xintrinsic.h
+frame-x.o: $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h EmacsFrame.h EmacsFrameP.h EmacsManager.h EmacsShell.h ExternalShell.h buffer.h bufslots.h conslots.h console-x.h console.h device.h dragdrop.h events-mod.h events.h extents.h faces.h frame.h frameslots.h glyphs-x.h glyphs.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h objects-x.h objects.h offix-types.h offix.h redisplay.h scrollbar-x.h scrollbar.h specifier.h symeval.h symsinit.h systime.h toolbar.h window.h winslots.h xintrinsic.h xintrinsicp.h xmprimitivep.h xmu.h
+glyphs-x.o: $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h bitmaps.h buffer.h bufslots.h conslots.h console-x.h console.h device.h file-coding.h frame.h frameslots.h glyphs-x.h glyphs.h imgproc.h insdel.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h objects-x.h objects.h opaque.h scrollbar.h specifier.h symeval.h symsinit.h sysfile.h toolbar.h xintrinsic.h xmu.h
+gui-x.o: $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h buffer.h bufslots.h conslots.h console-x.h console.h device.h frame.h frameslots.h gui-x.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h opaque.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h xintrinsic.h
+input-method-xfs.o: $(LISP_H) EmacsFrame.h buffer.h bufslots.h conslots.h console-x.h console.h device.h events.h frame.h frameslots.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h toolbar.h window.h winslots.h xintrinsic.h
+input-method-xlib.o: $(LISP_H) EmacsFrame.h buffer.h bufslots.h conslots.h console-x.h console.h device.h events.h frame.h frameslots.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h toolbar.h window.h winslots.h xintrinsic.h
+menubar-x.o: $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h EmacsFrame.h EmacsManager.h EmacsShell.h buffer.h bufslots.h commands.h conslots.h console-x.h console.h device.h events.h frame.h frameslots.h gui-x.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h opaque.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h toolbar.h window.h winslots.h xintrinsic.h
objects-x.o: $(LISP_H) buffer.h bufslots.h conslots.h console-x.h console.h device.h insdel.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h objects-x.h objects.h specifier.h symeval.h symsinit.h xintrinsic.h
-redisplay-x.o: $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h EmacsFrame.h EmacsFrameP.h buffer.h bufslots.h conslots.h console-x.h console.h debug.h device.h faces.h file-coding.h frame.h frameslots.h glyphs-x.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-ccl.h mule-charset.h objects-x.h objects.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysproc.h systime.h toolbar.h window.h winslots.h xgccache.h xintrinsic.h xintrinsicp.h xmprimitivep.h
-scrollbar-x.o: $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h conslots.h console-x.h console.h device.h frame.h frameslots.h glyphs-x.h glyphs.h gui-x.h gui.h lisp-disunion.h lisp-union.h lrecord.h redisplay.h scrollbar-x.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h window.h winslots.h xintrinsic.h
-toolbar-x.o: $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h EmacsFrame.h EmacsFrameP.h buffer.h bufslots.h conslots.h console-x.h console.h device.h faces.h frame.h frameslots.h glyphs-x.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h objects-x.h objects.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h window.h winslots.h xintrinsic.h xintrinsicp.h xmprimitivep.h
+redisplay-x.o: $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h EmacsFrame.h EmacsFrameP.h buffer.h bufslots.h conslots.h console-x.h console.h debug.h device.h faces.h file-coding.h frame.h frameslots.h glyphs-x.h glyphs.h lisp-disunion.h lisp-union.h lrecord.h mule-ccl.h mule-charset.h objects-x.h objects.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysproc.h systime.h toolbar.h window.h winslots.h xgccache.h xintrinsic.h xintrinsicp.h xmprimitivep.h
+scrollbar-x.o: $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h EmacsFrame.h EmacsManager.h conslots.h console-x.h console.h device.h frame.h frameslots.h glyphs-x.h glyphs.h gui-x.h lisp-disunion.h lisp-union.h lrecord.h redisplay.h scrollbar-x.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h window.h winslots.h xintrinsic.h
+toolbar-x.o: $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h EmacsFrame.h EmacsFrameP.h EmacsManager.h buffer.h bufslots.h conslots.h console-x.h console.h device.h faces.h frame.h frameslots.h glyphs-x.h glyphs.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h objects-x.h objects.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h window.h winslots.h xgccache.h xintrinsic.h xintrinsicp.h xmprimitivep.h
#endif
#ifdef HAVE_DATABASE
-database.o: $(LISP_H) buffer.h bufslots.h database.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h symeval.h symsinit.h sysfile.h
+database.o: $(LISP_H) database.h lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h sysfile.h
#endif
#ifdef MULE
mule-canna.o: $(LISP_H) buffer.h bufslots.h file-coding.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h symeval.h symsinit.h
mule-ccl.o: $(LISP_H) buffer.h bufslots.h file-coding.h lisp-disunion.h lisp-union.h lrecord.h mule-ccl.h mule-charset.h symeval.h symsinit.h
mule-charset.o: $(LISP_H) buffer.h bufslots.h chartab.h conslots.h console.h device.h elhash.h faces.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h symeval.h symsinit.h
+mule-coding.o: $(LISP_H) buffer.h bufslots.h elhash.h insdel.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-ccl.h mule-charset.h mule-coding.h symeval.h symsinit.h
mule-mcpath.o: $(LISP_H) buffer.h bufslots.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h symeval.h symsinit.h sysfile.h
mule-wnnfns.o: $(LISP_H) buffer.h bufslots.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h scrollbar.h symeval.h symsinit.h sysdep.h window.h winslots.h
mule.o: $(LISP_H) lisp-disunion.h lisp-union.h lrecord.h regex.h symeval.h symsinit.h
extw-Xlib.o: config.h extw-Xlib.h
extw-Xt.o: config.h extw-Xlib.h extw-Xt.h
#endif
-EmacsFrame.o: $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h EmacsFrame.h EmacsFrameP.h EmacsManager.h buffer.h bufslots.h conslots.h console-x.h console.h device.h faces.h frame.h frameslots.h glyphs-x.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h objects-x.h objects.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h window.h winslots.h xintrinsic.h xintrinsicp.h xmprimitivep.h xmu.h
+EmacsFrame.o: $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h EmacsFrame.h EmacsFrameP.h EmacsManager.h buffer.h bufslots.h conslots.h console-x.h console.h device.h faces.h frame.h frameslots.h glyphs-x.h glyphs.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h objects-x.h objects.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h window.h winslots.h xintrinsic.h xintrinsicp.h xmprimitivep.h xmu.h
EmacsManager.o: EmacsManager.h EmacsManagerP.h config.h xintrinsicp.h xmmanagerp.h
EmacsShell-sub.o: EmacsShell.h EmacsShellP.h config.h xintrinsic.h xintrinsicp.h
EmacsShell.o: EmacsShell.h ExternalShell.h config.h xintrinsicp.h
abbrev.o: $(LISP_H) buffer.h bufslots.h chartab.h commands.h insdel.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h scrollbar.h symeval.h symsinit.h syntax.h window.h winslots.h
-alloc.o: $(LISP_H) backtrace.h buffer.h bufslots.h bytecode.h chartab.h conslots.h console.h device.h elhash.h events.h extents.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h opaque.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysfile.h systime.h toolbar.h window.h winslots.h
+alloc.o: $(LISP_H) backtrace.h buffer.h bufslots.h bytecode.h chartab.h conslots.h console.h device.h elhash.h events.h extents.h frame.h frameslots.h glyphs.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h puresize.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysfile.h systime.h toolbar.h window.h winslots.h
alloca.o: config.h
balloon_help.o: balloon_help.h config.h xintrinsic.h
blocktype.o: $(LISP_H) blocktype.h lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h
-buffer.o: $(LISP_H) buffer.h bufslots.h chartab.h commands.h conslots.h console.h device.h elhash.h extents.h faces.h frame.h frameslots.h glyphs.h gui.h insdel.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h process.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h syntax.h sysdep.h sysfile.h toolbar.h window.h winslots.h
-bytecode.o: $(LISP_H) backtrace.h buffer.h bufslots.h bytecode.h chartab.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h opaque.h symeval.h symsinit.h syntax.h
+buffer.o: $(LISP_H) buffer.h bufslots.h chartab.h commands.h conslots.h console.h device.h elhash.h extents.h faces.h frame.h frameslots.h insdel.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h process.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h syntax.h sysdep.h sysfile.h toolbar.h window.h winslots.h
+bytecode.o: $(LISP_H) buffer.h bufslots.h chartab.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h symeval.h symsinit.h syntax.h
callint.o: $(LISP_H) buffer.h bufslots.h bytecode.h commands.h events.h insdel.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h scrollbar.h symeval.h symsinit.h systime.h window.h winslots.h
-callproc.o: $(LISP_H) buffer.h bufslots.h commands.h file-coding.h insdel.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h nt.h process.h redisplay.h scrollbar.h symeval.h symsinit.h sysdep.h sysfile.h sysproc.h syssignal.h systime.h systty.h window.h winslots.h
-casefiddle.o: $(LISP_H) buffer.h bufslots.h chartab.h insdel.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h symeval.h symsinit.h syntax.h
+callproc.o: $(LISP_H) buffer.h bufslots.h commands.h file-coding.h insdel.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h nt.h paths.h process.h redisplay.h scrollbar.h symeval.h symsinit.h sysdep.h sysfile.h sysproc.h syssignal.h systime.h systty.h window.h winslots.h
+casefiddle.o: $(LISP_H) buffer.h bufslots.h chartab.h commands.h insdel.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h symeval.h symsinit.h syntax.h
casetab.o: $(LISP_H) buffer.h bufslots.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h opaque.h symeval.h symsinit.h
-chartab.o: $(LISP_H) buffer.h bufslots.h chartab.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h symeval.h symsinit.h syntax.h
-cm.o: $(LISP_H) conslots.h console-tty.h console.h device.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h syssignal.h systty.h toolbar.h
-cmdloop.o: $(LISP_H) buffer.h bufslots.h commands.h conslots.h console.h device.h events.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h toolbar.h window.h winslots.h
+chartab.o: $(LISP_H) buffer.h bufslots.h chartab.h commands.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h symeval.h symsinit.h syntax.h
+cm.o: $(LISP_H) conslots.h console-tty.h console.h device.h frame.h frameslots.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h syssignal.h systty.h toolbar.h
+cmdloop.o: $(LISP_H) buffer.h bufslots.h commands.h conslots.h console.h device.h events.h frame.h frameslots.h lisp-disunion.h lisp-union.h lrecord.h macros.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h toolbar.h window.h winslots.h
cmds.o: $(LISP_H) buffer.h bufslots.h chartab.h commands.h insdel.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h symeval.h symsinit.h syntax.h
-console-stream.o: $(LISP_H) conslots.h console-stream.h console-tty.h console.h device.h events.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h syssignal.h systime.h systty.h toolbar.h window.h winslots.h
-console-tty.o: $(LISP_H) buffer.h bufslots.h conslots.h console-stream.h console-tty.h console.h device.h faces.h file-coding.h frame.h frameslots.h glyphs.h gpmevent.h gui.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h syssignal.h systty.h toolbar.h
-console.o: $(LISP_H) buffer.h bufslots.h conslots.h console-tty.h console.h device.h events.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h syssignal.h systime.h systty.h toolbar.h window.h winslots.h
-data.o: $(LISP_H) buffer.h bufslots.h bytecode.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h symeval.h symsinit.h sysfloat.h syssignal.h
+console-stream.o: $(LISP_H) conslots.h console-stream.h console-tty.h console.h device.h events.h frame.h frameslots.h lisp-disunion.h lisp-union.h lrecord.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h syssignal.h systime.h systty.h toolbar.h window.h winslots.h
+console-tty.o: $(LISP_H) buffer.h bufslots.h conslots.h console-stream.h console-tty.h console.h device.h faces.h file-coding.h frame.h frameslots.h gpmevent.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h syssignal.h systty.h toolbar.h
+console.o: $(LISP_H) buffer.h bufslots.h conslots.h console-tty.h console.h device.h events.h frame.h frameslots.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h syssignal.h systime.h systty.h toolbar.h window.h winslots.h
+data.o: $(LISP_H) backtrace.h buffer.h bufslots.h bytecode.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h symeval.h symsinit.h sysfloat.h syssignal.h
debug.o: $(LISP_H) bytecode.h debug.h lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h
-device-tty.o: $(LISP_H) buffer.h bufslots.h conslots.h console-stream.h console-tty.h console.h device.h events.h faces.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h syssignal.h systime.h systty.h toolbar.h
-device.o: $(LISP_H) buffer.h bufslots.h conslots.h console.h device.h elhash.h events.h faces.h frame.h frameslots.h glyphs.h gui.h keymap.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h syssignal.h systime.h toolbar.h window.h winslots.h
-dgif_lib.o: gifrlib.h
-dialog.o: $(LISP_H) conslots.h console.h device.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h
-dired.o: $(LISP_H) buffer.h bufslots.h commands.h elhash.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h ndir.h opaque.h regex.h symeval.h symsinit.h sysdep.h sysdir.h sysfile.h syspwd.h systime.h
+device-tty.o: $(LISP_H) buffer.h bufslots.h conslots.h console-stream.h console-tty.h console.h device.h events.h faces.h frame.h frameslots.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h syssignal.h systime.h systty.h toolbar.h
+device.o: $(LISP_H) buffer.h bufslots.h conslots.h console.h device.h elhash.h events.h faces.h frame.h frameslots.h keymap.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h syssignal.h systime.h toolbar.h window.h winslots.h
+dialog.o: $(LISP_H) conslots.h console.h device.h frame.h frameslots.h lisp-disunion.h lisp-union.h lrecord.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h
+dired.o: $(LISP_H) buffer.h bufslots.h commands.h elhash.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h ndir.h opaque.h regex.h symeval.h symsinit.h sysdir.h sysfile.h
+dll.o: $(LISP_H) buffer.h bufslots.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h symeval.h symsinit.h sysdll.h
doc.o: $(LISP_H) buffer.h bufslots.h bytecode.h insdel.h keymap.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h symeval.h symsinit.h sysfile.h
doprnt.o: $(LISP_H) buffer.h bufslots.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h symeval.h symsinit.h
dragdrop.o: $(LISP_H) dragdrop.h lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h
dynarr.o: $(LISP_H) lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h
ecrt0.o: config.h
-editfns.o: $(LISP_H) buffer.h bufslots.h chartab.h commands.h conslots.h console.h device.h events.h extents.h frame.h frameslots.h glyphs.h gui.h insdel.h line-number.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h syspwd.h systime.h toolbar.h window.h winslots.h
-eldap.o: $(LISP_H) buffer.h bufslots.h eldap.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h opaque.h symeval.h symsinit.h sysdep.h
-elhash.o: $(LISP_H) bytecode.h elhash.h lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h
-emacs.o: $(LISP_H) backtrace.h buffer.h bufslots.h commands.h conslots.h console.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h paths.h process.h redisplay.h symeval.h symsinit.h sysdep.h sysdll.h sysfile.h syssignal.h systime.h systty.h
-emodules.o: $(LISP_H) buffer.h bufslots.h conslots.h console.h device.h emodules.h file-coding.h frame.h frameslots.h glyphs.h gui.h insdel.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysdll.h toolbar.h window.h winslots.h
+editfns.o: $(LISP_H) buffer.h bufslots.h commands.h conslots.h console.h device.h events.h extents.h frame.h frameslots.h insdel.h line-number.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h syspwd.h systime.h toolbar.h window.h winslots.h
+eldap.o: $(LISP_H) eldap.h lisp-disunion.h lisp-union.h lrecord.h opaque.h symeval.h symsinit.h sysdep.h
+elhash.o: $(LISP_H) bytecode.h elhash.h hash.h lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h
+emacs.o: $(LISP_H) backtrace.h buffer.h bufslots.h commands.h conslots.h console.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h paths.h process.h symeval.h symsinit.h sysdep.h sysdll.h sysfile.h syssignal.h systime.h systty.h
eval.o: $(LISP_H) backtrace.h buffer.h bufslots.h bytecode.h commands.h conslots.h console.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h opaque.h symeval.h symsinit.h
-event-Xt.o: $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h EmacsFrame.h blocktype.h buffer.h bufslots.h conslots.h console-tty.h console-x.h console.h device.h dragdrop.h elhash.h events-mod.h events.h file-coding.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h objects-x.h objects.h offix-types.h offix.h process.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysproc.h syssignal.h systime.h systty.h toolbar.h xintrinsic.h xintrinsicp.h
-event-stream.o: $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h blocktype.h buffer.h bufslots.h commands.h conslots.h console-x.h console.h device.h elhash.h events-mod.h events.h file-coding.h frame.h frameslots.h glyphs.h gui-x.h gui.h insdel.h keymap.h lisp-disunion.h lisp-union.h lrecord.h lstream.h macros.h mule-charset.h opaque.h process.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h syssignal.h systime.h toolbar.h window.h winslots.h xintrinsic.h
-event-tty.o: $(LISP_H) conslots.h console-tty.h console.h device.h events.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h process.h scrollbar.h specifier.h symeval.h symsinit.h sysproc.h syssignal.h systime.h systty.h syswait.h toolbar.h
+event-Xt.o: $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h EmacsFrame.h blocktype.h buffer.h bufslots.h commands.h conslots.h console-tty.h console-x.h console.h device.h dragdrop.h elhash.h events-mod.h events.h file-coding.h frame.h frameslots.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h objects-x.h objects.h offix-types.h offix.h process.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysproc.h syssignal.h systime.h systty.h toolbar.h xintrinsic.h xintrinsicp.h
+event-stream.o: $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h blocktype.h buffer.h bufslots.h commands.h conslots.h console-x.h console.h device.h elhash.h events-mod.h events.h file-coding.h frame.h frameslots.h gui-x.h insdel.h keymap.h lisp-disunion.h lisp-union.h lrecord.h lstream.h macros.h mule-charset.h opaque.h process.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h syssignal.h systime.h toolbar.h window.h winslots.h xintrinsic.h
+event-tty.o: $(LISP_H) conslots.h console-tty.h console.h device.h events.h frame.h frameslots.h lisp-disunion.h lisp-union.h lrecord.h process.h scrollbar.h specifier.h symeval.h symsinit.h sysproc.h syssignal.h systime.h systty.h syswait.h toolbar.h
event-unixoid.o: $(LISP_H) conslots.h console-stream.h console-tty.h console.h device.h events.h gpmevent.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h process.h symeval.h symsinit.h sysdep.h sysfile.h sysproc.h syssignal.h systime.h systty.h
-events.o: $(LISP_H) buffer.h bufslots.h conslots.h console-tty.h console-x.h console.h device.h events-mod.h events.h extents.h frame.h frameslots.h glyphs.h gui.h keymap.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h syssignal.h systime.h systty.h toolbar.h window.h winslots.h xintrinsic.h
-extents.o: $(LISP_H) buffer.h bufslots.h conslots.h console.h debug.h device.h elhash.h extents.h faces.h frame.h frameslots.h glyphs.h gui.h insdel.h keymap.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h opaque.h process.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h
-faces.o: $(LISP_H) buffer.h bufslots.h conslots.h console.h device.h elhash.h extents.h faces.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h objects.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h window.h winslots.h
-file-coding.o: $(LISP_H) buffer.h bufslots.h chartab.h elhash.h file-coding.h insdel.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-ccl.h mule-charset.h symeval.h symsinit.h
-fileio.o: $(LISP_H) buffer.h bufslots.h conslots.h console.h device.h events.h file-coding.h frame.h frameslots.h glyphs.h gui.h insdel.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h ndir.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysdir.h sysfile.h sysproc.h syspwd.h systime.h toolbar.h window.h winslots.h
+events.o: $(LISP_H) buffer.h bufslots.h conslots.h console-tty.h console-x.h console.h device.h events-mod.h events.h extents.h frame.h frameslots.h glyphs.h keymap.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h syssignal.h systime.h systty.h toolbar.h window.h winslots.h xintrinsic.h
+extents.o: $(LISP_H) buffer.h bufslots.h conslots.h console.h debug.h device.h elhash.h extents.h faces.h frame.h frameslots.h glyphs.h hash.h insdel.h keymap.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h opaque.h process.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h
+faces.o: $(LISP_H) buffer.h bufslots.h conslots.h console.h device.h elhash.h extents.h faces.h frame.h frameslots.h glyphs.h hash.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h objects.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h window.h winslots.h
+file-coding.o: $(LISP_H) buffer.h bufslots.h elhash.h file-coding.h insdel.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-ccl.h mule-charset.h symeval.h symsinit.h
+fileio.o: $(LISP_H) buffer.h bufslots.h conslots.h console.h device.h events.h file-coding.h frame.h frameslots.h insdel.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h ndir.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysdir.h sysfile.h sysproc.h syspwd.h systime.h toolbar.h window.h winslots.h
filelock.o: $(LISP_H) buffer.h bufslots.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h ndir.h paths.h symeval.h symsinit.h sysdir.h sysfile.h syspwd.h syssignal.h
filemode.o: $(LISP_H) lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h sysfile.h
floatfns.o: $(LISP_H) lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h sysfloat.h syssignal.h
-fns.o: $(LISP_H) buffer.h bufslots.h bytecode.h conslots.h console.h device.h events.h extents.h frame.h frameslots.h glyphs.h gui.h insdel.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h opaque.h scrollbar.h specifier.h symeval.h symsinit.h systime.h toolbar.h
+fns.o: $(LISP_H) buffer.h bufslots.h bytecode.h commands.h conslots.h console.h device.h events.h extents.h frame.h frameslots.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h scrollbar.h specifier.h symeval.h symsinit.h systime.h toolbar.h
font-lock.o: $(LISP_H) buffer.h bufslots.h chartab.h insdel.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h symeval.h symsinit.h syntax.h
-frame-tty.o: $(LISP_H) conslots.h console-tty.h console.h device.h events.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h scrollbar.h specifier.h symeval.h symsinit.h syssignal.h systime.h systty.h toolbar.h
-frame.o: $(LISP_H) buffer.h bufslots.h conslots.h console.h device.h events.h extents.h faces.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h menubar.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h toolbar.h window.h winslots.h
+frame-tty.o: $(LISP_H) conslots.h console-tty.h console.h device.h events.h frame.h frameslots.h lisp-disunion.h lisp-union.h lrecord.h scrollbar.h specifier.h symeval.h symsinit.h syssignal.h systime.h systty.h toolbar.h
+frame.o: $(LISP_H) buffer.h bufslots.h conslots.h console.h device.h events.h extents.h faces.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h menubar.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h systime.h toolbar.h window.h winslots.h
free-hook.o: $(LISP_H) hash.h lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h
general.o: $(LISP_H) lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h
getloadavg.o: $(LISP_H) lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h sysfile.h
-gif_io.o: gifrlib.h
-glyphs-eimage.o: $(LISP_H) buffer.h bufslots.h conslots.h console.h device.h faces.h file-coding.h frame.h frameslots.h gifrlib.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h objects.h opaque.h scrollbar.h specifier.h symeval.h symsinit.h sysfile.h toolbar.h
-glyphs-widget.o: $(LISP_H) buffer.h bufslots.h bytecode.h conslots.h console.h device.h faces.h frame.h frameslots.h glyphs.h gui.h insdel.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h objects.h opaque.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h window.h winslots.h
-glyphs.o: $(LISP_H) buffer.h bufslots.h chartab.h conslots.h console.h device.h elhash.h faces.h frame.h frameslots.h glyphs.h gui.h insdel.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h objects.h opaque.h rangetab.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h window.h winslots.h
+glyphs-eimage.o: $(LISP_H) buffer.h bufslots.h conslots.h console.h device.h file-coding.h frame.h frameslots.h glyphs.h imgproc.h insdel.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h objects.h opaque.h scrollbar.h specifier.h symeval.h symsinit.h sysfile.h toolbar.h
+glyphs.o: $(LISP_H) buffer.h bufslots.h conslots.h console.h device.h elhash.h faces.h frame.h frameslots.h glyphs.h insdel.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h objects.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h window.h winslots.h
gmalloc.o: config.h getpagesize.h
gpmevent.o: $(LISP_H) conslots.h console-tty.h console.h device.h events-mod.h events.h gpmevent.h lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h sysdep.h syssignal.h systime.h systty.h
-gui.o: $(LISP_H) bytecode.h elhash.h gui.h lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h
-hash.o: $(LISP_H) hash.h lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h
+gui.o: $(LISP_H) bytecode.h gui.h lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h
+hash.o: $(LISP_H) elhash.h hash.h lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h
hftctl.o: $(LISP_H) lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h
hpplay.o: $(LISP_H) lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h
imgproc.o: $(LISP_H) imgproc.h lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h
-indent.o: $(LISP_H) buffer.h bufslots.h conslots.h console.h device.h extents.h faces.h frame.h frameslots.h glyphs.h gui.h insdel.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h window.h winslots.h
-inline.o: $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h buffer.h bufslots.h bytecode.h chartab.h conslots.h console.h database.h device.h eldap.h elhash.h events.h extents.h faces.h file-coding.h frame.h frameslots.h glyphs-x.h glyphs.h gui-x.h gui.h keymap.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h objects.h opaque.h process.h rangetab.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h syntax.h systime.h toolbar.h tooltalk.h window.h winslots.h xintrinsic.h
-input-method-motif.o: $(LISP_H) EmacsFrame.h conslots.h console-x.h console.h device.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h xintrinsic.h
-insdel.o: $(LISP_H) buffer.h bufslots.h conslots.h console.h device.h extents.h frame.h frameslots.h glyphs.h gui.h insdel.h line-number.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h
+indent.o: $(LISP_H) buffer.h bufslots.h conslots.h console.h device.h extents.h faces.h frame.h frameslots.h glyphs.h insdel.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h window.h winslots.h
+inline.o: $(LISP_H) $(LWLIB_SRCDIR)/lwlib.h buffer.h bufslots.h bytecode.h chartab.h conslots.h console.h database.h device.h eldap.h elhash.h events.h extents.h faces.h file-coding.h frame.h frameslots.h glyphs-x.h glyphs.h gui-x.h keymap.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h objects.h opaque.h process.h rangetab.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h syntax.h systime.h toolbar.h tooltalk.h window.h winslots.h xintrinsic.h
+input-method-motif.o: $(LISP_H) EmacsFrame.h conslots.h console-x.h console.h device.h frame.h frameslots.h lisp-disunion.h lisp-union.h lrecord.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h xintrinsic.h
+insdel.o: $(LISP_H) buffer.h bufslots.h conslots.h console.h device.h extents.h frame.h frameslots.h insdel.h line-number.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h
intl.o: $(LISP_H) bytecode.h conslots.h console.h device.h lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h
-keymap.o: $(LISP_H) buffer.h bufslots.h bytecode.h conslots.h console.h device.h elhash.h events-mod.h events.h frame.h frameslots.h glyphs.h gui.h insdel.h keymap.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h toolbar.h window.h winslots.h
+keymap.o: $(LISP_H) buffer.h bufslots.h bytecode.h commands.h conslots.h console.h device.h elhash.h events-mod.h events.h frame.h frameslots.h insdel.h keymap.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h toolbar.h window.h winslots.h
libsst.o: $(LISP_H) libsst.h lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h
-line-number.o: $(LISP_H) buffer.h bufslots.h line-number.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h symeval.h symsinit.h
+line-number.o: $(LISP_H) buffer.h bufslots.h insdel.h line-number.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h symeval.h symsinit.h
linuxplay.o: $(LISP_H) lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h sysfile.h syssignal.h
-lread.o: $(LISP_H) buffer.h bufslots.h bytecode.h elhash.h file-coding.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h opaque.h symeval.h symsinit.h sysfile.h sysfloat.h
+lread.o: $(LISP_H) buffer.h bufslots.h bytecode.h commands.h file-coding.h insdel.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h opaque.h paths.h symeval.h symsinit.h sysfile.h sysfloat.h
lstream.o: $(LISP_H) buffer.h bufslots.h insdel.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h symeval.h symsinit.h sysfile.h
-macros.o: $(LISP_H) buffer.h bufslots.h commands.h conslots.h console.h device.h events.h frame.h frameslots.h glyphs.h gui.h keymap.h lisp-disunion.h lisp-union.h lrecord.h macros.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h toolbar.h window.h winslots.h
+macros.o: $(LISP_H) buffer.h bufslots.h commands.h conslots.h console.h device.h events.h frame.h frameslots.h keymap.h lisp-disunion.h lisp-union.h lrecord.h macros.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h toolbar.h window.h winslots.h
malloc.o: config.h getpagesize.h
marker.o: $(LISP_H) buffer.h bufslots.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h symeval.h symsinit.h
md5.o: $(LISP_H) buffer.h bufslots.h file-coding.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h symeval.h symsinit.h
-menubar.o: $(LISP_H) buffer.h bufslots.h conslots.h console.h device.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h menubar.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h window.h winslots.h
-minibuf.o: $(LISP_H) buffer.h bufslots.h commands.h conslots.h console-stream.h console.h device.h events.h frame.h frameslots.h glyphs.h gui.h insdel.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h toolbar.h window.h winslots.h
-nas.o: $(LISP_H) lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h sysdep.h syssignal.h
+menubar.o: $(LISP_H) buffer.h bufslots.h conslots.h console.h device.h frame.h frameslots.h gui.h lisp-disunion.h lisp-union.h lrecord.h menubar.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h window.h winslots.h
+minibuf.o: $(LISP_H) buffer.h bufslots.h commands.h conslots.h console-stream.h console.h device.h events.h frame.h frameslots.h insdel.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h systime.h toolbar.h window.h winslots.h
+nas.o: $(LISP_H) lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h syssignal.h
nt.o: $(LISP_H) lisp-disunion.h lisp-union.h lrecord.h nt.h ntheap.h symeval.h symsinit.h sysproc.h syssignal.h systime.h
ntheap.o: $(LISP_H) lisp-disunion.h lisp-union.h lrecord.h ntheap.h symeval.h symsinit.h
ntplay.o: $(LISP_H) lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h sysfile.h
ntproc.o: $(LISP_H) lisp-disunion.h lisp-union.h lrecord.h nt.h ntheap.h process.h symeval.h symsinit.h sysproc.h syssignal.h systime.h syswait.h
objects-tty.o: $(LISP_H) conslots.h console-tty.h console.h device.h insdel.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h objects-tty.h objects.h specifier.h symeval.h symsinit.h syssignal.h systty.h
-objects.o: $(LISP_H) buffer.h bufslots.h conslots.h console.h device.h elhash.h faces.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h objects.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h window.h winslots.h
+objects.o: $(LISP_H) buffer.h bufslots.h conslots.h console.h device.h elhash.h faces.h frame.h frameslots.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h objects.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h window.h winslots.h
offix.o: offix-cursors.h offix-types.h offix.h xintrinsic.h
opaque.o: $(LISP_H) lisp-disunion.h lisp-union.h lrecord.h opaque.h symeval.h symsinit.h
-print.o: $(LISP_H) backtrace.h buffer.h bufslots.h bytecode.h conslots.h console-stream.h console-tty.h console.h device.h extents.h frame.h frameslots.h glyphs.h gui.h insdel.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h scrollbar.h specifier.h symeval.h symsinit.h sysfile.h syssignal.h systty.h toolbar.h
+print.o: $(LISP_H) backtrace.h buffer.h bufslots.h bytecode.h conslots.h console-stream.h console-tty.h console.h device.h extents.h frame.h frameslots.h insdel.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h scrollbar.h specifier.h symeval.h symsinit.h sysfile.h syssignal.h systty.h toolbar.h
process-nt.o: $(LISP_H) hash.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h process.h procimpl.h symeval.h symsinit.h sysdep.h
-process-unix.o: $(LISP_H) buffer.h bufslots.h conslots.h console.h device.h events.h file-coding.h frame.h frameslots.h glyphs.h gui.h hash.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h opaque.h process.h procimpl.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h sysproc.h syssignal.h systime.h systty.h syswait.h toolbar.h window.h winslots.h
-process.o: $(LISP_H) buffer.h bufslots.h commands.h conslots.h console.h device.h events.h file-coding.h frame.h frameslots.h glyphs.h gui.h hash.h insdel.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h opaque.h process.h procimpl.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysfile.h sysproc.h syssignal.h systime.h systty.h syswait.h toolbar.h window.h winslots.h
-profile.o: $(LISP_H) backtrace.h bytecode.h elhash.h hash.h lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h syssignal.h systime.h
+process-unix.o: $(LISP_H) buffer.h bufslots.h commands.h conslots.h console.h device.h events.h file-coding.h frame.h frameslots.h hash.h insdel.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h opaque.h process.h procimpl.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h sysproc.h syssignal.h systime.h systty.h syswait.h toolbar.h window.h winslots.h
+process.o: $(LISP_H) buffer.h bufslots.h commands.h conslots.h console.h device.h events.h file-coding.h frame.h frameslots.h hash.h insdel.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h opaque.h process.h procimpl.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysfile.h sysproc.h syssignal.h systime.h systty.h syswait.h toolbar.h window.h winslots.h
+profile.o: $(LISP_H) backtrace.h bytecode.h hash.h lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h syssignal.h systime.h
+pure.o: $(LISP_H) lisp-disunion.h lisp-union.h lrecord.h puresize-adjust.h puresize.h symeval.h symsinit.h
ralloc.o: $(LISP_H) getpagesize.h lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h
rangetab.o: $(LISP_H) lisp-disunion.h lisp-union.h lrecord.h rangetab.h symeval.h symsinit.h
realpath.o: config.h
-redisplay-output.o: $(LISP_H) buffer.h bufslots.h conslots.h console.h device.h faces.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h window.h winslots.h
-redisplay-tty.o: $(LISP_H) buffer.h bufslots.h conslots.h console-tty.h console.h device.h events.h faces.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h objects-tty.h objects.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h syssignal.h systime.h systty.h toolbar.h window.h winslots.h
-redisplay.o: $(LISP_H) buffer.h bufslots.h commands.h conslots.h console-tty.h console.h debug.h device.h elhash.h extents.h faces.h file-coding.h frame.h frameslots.h glyphs.h gui.h insdel.h line-number.h lisp-disunion.h lisp-union.h lrecord.h menubar.h mule-charset.h objects.h process.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h syssignal.h systty.h toolbar.h window.h winslots.h
+redisplay-output.o: $(LISP_H) buffer.h bufslots.h conslots.h console.h debug.h device.h faces.h frame.h frameslots.h glyphs.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h toolbar.h window.h winslots.h
+redisplay-tty.o: $(LISP_H) buffer.h bufslots.h conslots.h console-tty.h console.h device.h events.h faces.h frame.h frameslots.h glyphs.h lisp-disunion.h lisp-union.h lrecord.h lstream.h mule-charset.h objects-tty.h objects.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h syssignal.h systime.h systty.h toolbar.h window.h winslots.h
+redisplay.o: $(LISP_H) buffer.h bufslots.h commands.h conslots.h console-tty.h console.h debug.h device.h extents.h faces.h file-coding.h frame.h frameslots.h glyphs.h gui.h insdel.h line-number.h lisp-disunion.h lisp-union.h lrecord.h menubar.h mule-charset.h objects.h process.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h syssignal.h systty.h toolbar.h window.h winslots.h
regex.o: $(LISP_H) buffer.h bufslots.h chartab.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h regex.h symeval.h symsinit.h syntax.h
-scrollbar.o: $(LISP_H) buffer.h bufslots.h commands.h conslots.h console.h device.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h window.h winslots.h
-search.o: $(LISP_H) buffer.h bufslots.h chartab.h insdel.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h opaque.h regex.h symeval.h symsinit.h syntax.h
+scrollbar.o: $(LISP_H) buffer.h bufslots.h commands.h conslots.h console.h device.h frame.h frameslots.h glyphs.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h window.h winslots.h
+search.o: $(LISP_H) buffer.h bufslots.h chartab.h commands.h insdel.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h opaque.h regex.h symeval.h symsinit.h syntax.h
sgiplay.o: $(LISP_H) libst.h lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h
sheap.o: $(LISP_H) lisp-disunion.h lisp-union.h lrecord.h sheap-adjust.h symeval.h symsinit.h
-signal.o: $(LISP_H) conslots.h console.h device.h events.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h syssignal.h systime.h toolbar.h
-sound.o: $(LISP_H) buffer.h bufslots.h conslots.h console-x.h console.h device.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h symeval.h symsinit.h sysdep.h xintrinsic.h
-specifier.o: $(LISP_H) buffer.h bufslots.h chartab.h conslots.h console.h device.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h opaque.h rangetab.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h window.h winslots.h
+signal.o: $(LISP_H) conslots.h console.h device.h events.h frame.h frameslots.h lisp-disunion.h lisp-union.h lrecord.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h syssignal.h systime.h toolbar.h
+sound.o: $(LISP_H) buffer.h bufslots.h commands.h conslots.h console-x.h console.h device.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h symeval.h symsinit.h sysdep.h xintrinsic.h
+specifier.o: $(LISP_H) buffer.h bufslots.h conslots.h console.h device.h frame.h frameslots.h glyphs.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h opaque.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h window.h winslots.h
strcat.o: config.h
strcmp.o: config.h
strcpy.o: config.h
sunplay.o: $(LISP_H) lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h sysdep.h syssignal.h
sunpro.o: $(LISP_H) lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h
symbols.o: $(LISP_H) buffer.h bufslots.h conslots.h console.h elhash.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h symeval.h symsinit.h
-syntax.o: $(LISP_H) buffer.h bufslots.h chartab.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h symeval.h symsinit.h syntax.h
-sysdep.o: $(LISP_H) buffer.h bufslots.h conslots.h console-stream.h console-tty.h console.h device.h events.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h ndir.h ntheap.h process.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysdir.h sysfile.h syssignal.h systime.h systty.h syswait.h toolbar.h window.h winslots.h
+syntax.o: $(LISP_H) buffer.h bufslots.h chartab.h commands.h insdel.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h symeval.h symsinit.h syntax.h
+sysdep.o: $(LISP_H) buffer.h bufslots.h conslots.h console-stream.h console-tty.h console.h device.h events.h frame.h frameslots.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h ndir.h ntheap.h process.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h sysdep.h sysdir.h sysfile.h syssignal.h systime.h systty.h syswait.h toolbar.h window.h winslots.h
sysdll.o: config.h sysdll.h
termcap.o: $(LISP_H) conslots.h console.h device.h lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h
terminfo.o: config.h
-toolbar.o: $(LISP_H) buffer.h bufslots.h conslots.h console.h device.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h window.h winslots.h
+toolbar.o: $(LISP_H) buffer.h bufslots.h conslots.h console.h device.h frame.h frameslots.h glyphs.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h window.h winslots.h
tooltalk.o: $(LISP_H) buffer.h bufslots.h elhash.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h process.h symeval.h symsinit.h tooltalk.h
tparam.o: config.h
undo.o: $(LISP_H) buffer.h bufslots.h extents.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h symeval.h symsinit.h
unexhp9k3.o: config.h sysdep.h
unexhp9k800.o: config.h
unexmips.o: config.h getpagesize.h
-unexnt.o: config.h ntheap.h
+unexnt.o: ntheap.h
unexsunos4.o: config.h
vm-limit.o: $(LISP_H) lisp-disunion.h lisp-union.h lrecord.h mem-limits.h symeval.h symsinit.h
-widget.o: $(LISP_H) buffer.h bufslots.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h symeval.h symsinit.h
-window.o: $(LISP_H) buffer.h bufslots.h commands.h conslots.h console.h device.h elhash.h faces.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h objects.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h window.h winslots.h
+widget.o: $(LISP_H) buffer.h bufslots.h insdel.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h symeval.h symsinit.h
+window.o: $(LISP_H) buffer.h bufslots.h commands.h conslots.h console.h device.h faces.h frame.h frameslots.h glyphs.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h objects.h redisplay.h scrollbar.h specifier.h symeval.h symsinit.h toolbar.h window.h winslots.h
xgccache.o: $(LISP_H) hash.h lisp-disunion.h lisp-union.h lrecord.h symeval.h symsinit.h xgccache.h
xmu.o: config.h
-xselect.o: $(LISP_H) buffer.h bufslots.h conslots.h console-x.h console.h device.h frame.h frameslots.h glyphs.h gui.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h objects-x.h objects.h opaque.h scrollbar.h specifier.h symeval.h symsinit.h systime.h toolbar.h xintrinsic.h
+xselect.o: $(LISP_H) buffer.h bufslots.h conslots.h console-x.h console.h device.h frame.h frameslots.h lisp-disunion.h lisp-union.h lrecord.h mule-charset.h objects-x.h objects.h opaque.h scrollbar.h specifier.h symeval.h symsinit.h systime.h toolbar.h xintrinsic.h
--- /dev/null
+/* Lisp interface to dynamic loading.
+ Copyright (C) 1998 Joshua Rowe.
+ Additional cleanup by Hrvoje Niksic.
+
+This file is part of XEmacs.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/* Synched up with: Not in FSF. */
+
+/* A shared object must have the symbol `emacs_initialize' defined.
+ It should contain initialization of functions, symbols, etc. and
+ their loading into Lisp-land. The function will be called without
+ arguments and is not expected to return any.
+
+ All of this needs lots and LOTS of work. Some things to work on:
+
+ 1) A good foreign interface. This is probably tough, because it
+ implies drawing a new border between "external" and "internal"
+ stuff (traditionally, Lisp code was external, while C was
+ internal). Also, we need a modules/ directory with a few nice
+ sample modules, a sample Makefile, etc. so people can start
+ hacking.
+
+ 2) All of this is sooo simple-minded. As it gets more complex,
+ we'll have to look at how others have done similar things
+ (e.g. Perl 5 and Zsh 3.1), to avoid botching it up. */
+
+#include <config.h>
+#include "lisp.h"
+#include "buffer.h"
+#include "sysdll.h"
+#include <errno.h>
+
+DEFUN ("dll-open", Fdll_open, 1, 1, "FShared object: ", /*
+Load LIBRARY as a shared object file.
+
+After the LIBRARY is dynamically linked with the executable, the
+`emacs_initialize' function will be called without arguments. It
+should define all the symbols, subr's and variables the module
+introduces.
+
+After this point, any lisp symbols defined in the shared object are
+available for use.
+*/
+ (library))
+{
+ /* This function can GC */
+ dll_handle *handle;
+ void (*function) (void);
+ CONST char *filename;
+
+ CHECK_STRING (library);
+ library = Fexpand_file_name (library, Qnil);
+
+ GET_C_CHARPTR_EXT_FILENAME_DATA_ALLOCA (XSTRING_DATA (library), filename);
+
+ handle = (dll_handle *) dll_open (filename);
+ if (handle == NULL)
+ {
+ signal_error (Qerror,
+ list3 (build_translated_string ("Cannot load shared library"),
+ library, build_translated_string (dll_error (handle))));
+ }
+
+ /* #### Perhaps emacs_initialize() should return a Lisp_Object, so
+ we can return it? */
+
+ function = (void (*)(void)) dll_function (handle, "emacs_initialize");
+ if (!function)
+ signal_simple_error ("Shared library does not define `emacs_initialize'",
+ library);
+ (*function) ();
+
+ return Qnil;
+}
+
+void syms_of_dll ()
+{
+ DEFSUBR (Fdll_open);
+}
{
Lisp_Object obj = largs[spec->argnum - 1];
if (CHARP (obj))
- obj = make_int (XCHAR (obj));
+ CHECK_INT_COERCE_CHAR (obj);
if (!INT_OR_FLOATP (obj))
{
error ("format specifier %%%c doesn't match argument type",
#include "commands.h"
#include "console.h"
#include "process.h"
-#include "redisplay.h"
#include "sysdep.h"
+#include <setjmp.h>
#include "syssignal.h" /* Always include before systty.h */
#include "systty.h"
#include "sysfile.h"
#include "systime.h"
-#ifdef QUANTIFY
-#include <quantify.h>
-#endif
-
#ifdef HAVE_SHLIB
#include "sysdll.h"
#endif
/* For PATH_EXEC */
#include <paths.h>
-#ifdef HEAP_IN_DATA
-void report_sheap_usage (int die_if_pure_storage_exceeded);
-#endif
-
-#if !defined (SYSTEM_MALLOC) && !defined (DOUG_LEA_MALLOC)
+#if !defined SYSTEM_MALLOC && !defined DOUG_LEA_MALLOC
extern void *(*__malloc_hook)(size_t);
extern void *(*__realloc_hook)(void *, size_t);
extern void (*__free_hook)(void *);
/* Version numbers and strings */
Lisp_Object Vemacs_major_version;
Lisp_Object Vemacs_minor_version;
-Lisp_Object Vemacs_patch_level;
Lisp_Object Vemacs_beta_version;
Lisp_Object Vxemacs_codename;
#ifdef INFODOCK
Lisp_Object Vexec_path;
Lisp_Object Vexec_directory, Vconfigure_exec_directory;
Lisp_Object Vlisp_directory, Vconfigure_lisp_directory;
-Lisp_Object Vmodule_directory, Vconfigure_module_directory;
-Lisp_Object Vsite_module_directory, Vconfigure_site_module_directory;
Lisp_Object Vconfigure_package_path;
Lisp_Object Vdata_directory, Vconfigure_data_directory;
Lisp_Object Vdoc_directory, Vconfigure_doc_directory;
/* Nonzero means don't perform site-lisp searches at startup */
int inhibit_site_lisp;
-/* Nonzero means don't perform site-modules searches at startup */
-int inhibit_site_modules;
-
/* Nonzero means don't respect early packages at startup */
int inhibit_early_packages;
static void sort_args (int argc, char **argv);
+extern int always_gc; /* hack */
+
Lisp_Object Qkill_emacs_hook;
Lisp_Object Qsave_buffers_kill_emacs;
-extern Lisp_Object Vlisp_EXEC_SUFFIXES;
-
\f
/* Signal code for the fatal signal that was received */
static int fatal_error_code;
#endif
#if defined (MULE) && defined (MSDOS) && defined (EMX)
-/* Setup all of files be input/output'ed with binary translation mode. */
+/* Setup all of files be input/output'ed with binary translation mdoe. */
asm (" .text");
asm ("L_setbinmode:");
asm (" movl $1, __fmode_bin");
/* Make stack traces always identify version + configuration */
#define main_1 STACK_TRACE_EYE_CATCHER
-/* This function is not static, so that the compiler is less likely to
- inline it, which would make it not show up in stack traces. */
-DECLARE_DOESNT_RETURN (main_1 (int, char **, char **, int));
-DOESNT_RETURN
+static DOESNT_RETURN
main_1 (int argc, char **argv, char **envp, int restart)
{
char stack_bottom_variable;
#if defined (HAVE_MMAP) && defined (REL_ALLOC)
/* ralloc can only be used if using the GNU memory allocator. */
init_ralloc ();
-#elif defined (REL_ALLOC) && !defined(DOUG_LEA_MALLOC)
- if (initialized)
- init_ralloc();
#endif
#ifdef HAVE_SOCKS
inhibit_early_packages = 1;
skip_args--;
}
-#ifdef HAVE_SHLIB
- if (argmatch (argv, argc, "-no-site-modules", "--no-site-modules",
- 9, NULL, &skip_args))
- {
- inhibit_site_modules = 1;
- skip_args--;
- }
-#else
- inhibit_site_modules = 1;
-#endif
if (argmatch (argv, argc, "-vanilla", "--vanilla",
7, NULL, &skip_args))
{
syms_of_dialog ();
#endif
syms_of_dired ();
+#ifdef HAVE_SHLIB
+ syms_of_dll ();
+#endif
syms_of_doc ();
syms_of_editfns ();
syms_of_elhash ();
syms_of_emacs ();
syms_of_eval ();
-#ifdef HAVE_X_WINDOWS
- syms_of_event_Xt ();
-#endif
#ifdef HAVE_DRAGNDROP
syms_of_dragdrop ();
#endif
syms_of_general ();
syms_of_glyphs ();
syms_of_glyphs_eimage ();
- syms_of_glyphs_widget ();
#if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
syms_of_gui ();
#endif
syms_of_menubar ();
#endif
syms_of_minibuf ();
-#ifdef HAVE_SHLIB
- syms_of_module ();
-#endif
syms_of_objects ();
syms_of_print ();
#if !defined (NO_SUBPROCESSES)
syms_of_rangetab ();
syms_of_redisplay ();
syms_of_search ();
- syms_of_select ();
syms_of_signal ();
syms_of_sound ();
syms_of_specifier ();
syms_of_device_tty ();
syms_of_objects_tty ();
#endif
-
#ifdef HAVE_X_WINDOWS
syms_of_device_x ();
#ifdef HAVE_DIALOGS
syms_of_dialog_x ();
#endif
+ syms_of_event_Xt ();
syms_of_frame_x ();
syms_of_glyphs_x ();
syms_of_objects_x ();
#ifdef HAVE_MS_WINDOWS
syms_of_console_mswindows ();
syms_of_device_mswindows ();
+ syms_of_event_mswindows ();
syms_of_frame_mswindows ();
syms_of_objects_mswindows ();
syms_of_select_mswindows ();
#ifdef HAVE_MSW_C_DIRED
syms_of_dired_mswindows ();
#endif
-#ifdef WINDOWSNT
- syms_of_ntproc ();
-#endif
#endif /* HAVE_MS_WINDOWS */
#ifdef MULE
syms_of_mule_charset ();
#endif
#ifdef FILE_CODING
- syms_of_file_coding ();
+ syms_of_mule_coding ();
#endif
#ifdef MULE
#ifdef HAVE_WNN
SYMS_MACHINE;
#endif
+#ifdef EMACS_BTL
+ syms_of_btl ();
+#endif
+
/*
#if defined (GNU_MALLOC) && \
defined (ERROR_CHECK_MALLOC) && \
console_type_create_device_x ();
console_type_create_frame_x ();
console_type_create_glyphs_x ();
- console_type_create_select_x ();
#ifdef HAVE_MENUBARS
console_type_create_menubar_x ();
#endif
console_type_create_objects_mswindows ();
console_type_create_redisplay_mswindows ();
console_type_create_glyphs_mswindows ();
- console_type_create_select_mswindows ();
# ifdef HAVE_SCROLLBARS
console_type_create_scrollbar_mswindows ();
# endif
structure_type_create_chartab ();
structure_type_create_faces ();
structure_type_create_rangetab ();
- structure_type_create_hash_table ();
+ structure_type_create_hashtable ();
/* Now initialize the image instantiator formats and associated symbols.
Other than the first function below, the functions may
image_instantiator_format_create ();
image_instantiator_format_create_glyphs_eimage ();
- image_instantiator_format_create_glyphs_widget ();
-#ifdef HAVE_TTY
- image_instantiator_format_create_glyphs_tty ();
-#endif
#ifdef HAVE_X_WINDOWS
image_instantiator_format_create_glyphs_x ();
#endif /* HAVE_X_WINDOWS */
lstream_type_create ();
#ifdef FILE_CODING
- lstream_type_create_file_coding ();
+ lstream_type_create_mule_coding ();
#endif
#if defined (HAVE_MS_WINDOWS) && !defined(HAVE_MSG_SELECT)
lstream_type_create_mswindows_selectable ();
#endif
-
+
/* Initialize processes implementation.
The functions may make exactly the following function/macro calls:
vars_of_bytecode ();
vars_of_callint ();
vars_of_callproc ();
- vars_of_chartab ();
vars_of_cmdloop ();
vars_of_cmds ();
vars_of_console ();
vars_of_elhash ();
vars_of_emacs ();
vars_of_eval ();
-
-#ifdef HAVE_X_WINDOWS
- vars_of_event_Xt ();
-#endif
-#if defined(HAVE_TTY) && (defined (DEBUG_TTY_EVENT_STREAM) || !defined (HAVE_X_WINDOWS))
- vars_of_event_tty ();
-#endif
-#ifdef HAVE_MS_WINDOWS
- vars_of_event_mswindows ();
-#endif
vars_of_event_stream ();
-
vars_of_events ();
vars_of_extents ();
vars_of_faces ();
vars_of_fileio ();
+#ifdef CLASH_DETECTION
+ vars_of_filelock ();
+#endif
vars_of_floatfns ();
vars_of_font_lock ();
vars_of_frame ();
vars_of_glyphs ();
vars_of_glyphs_eimage ();
- vars_of_glyphs_widget ();
#if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
vars_of_gui ();
#endif
vars_of_menubar ();
#endif
vars_of_minibuf ();
-#ifdef HAVE_SHLIB
- vars_of_module ();
-#endif
-#ifdef WINDOWSNT
- vars_of_ntproc ();
-#endif
vars_of_objects ();
vars_of_print ();
vars_of_scrollbar ();
#endif
vars_of_search ();
- vars_of_select ();
vars_of_sound ();
vars_of_specifier ();
vars_of_symbols ();
#ifdef HAVE_TTY
vars_of_console_tty ();
+ vars_of_event_tty ();
vars_of_frame_tty ();
vars_of_objects_tty ();
#endif
#ifdef HAVE_DIALOGS
vars_of_dialog_x ();
#endif
+ vars_of_event_Xt ();
vars_of_frame_x ();
vars_of_glyphs_x ();
#ifdef HAVE_MENUBARS
#ifdef HAVE_MS_WINDOWS
vars_of_device_mswindows ();
vars_of_console_mswindows ();
+ vars_of_event_mswindows ();
vars_of_frame_mswindows ();
vars_of_objects_mswindows ();
vars_of_select_mswindows ();
#ifdef MULE
vars_of_mule ();
- vars_of_mule_ccl ();
vars_of_mule_charset ();
#endif
#ifdef FILE_CODING
- vars_of_file_coding ();
+ vars_of_mule_coding ();
#endif
#ifdef MULE
#ifdef HAVE_WNN
/* Calls Fmake_range_table(). */
complex_vars_of_search ();
- /* Calls make_lisp_hash_table(). */
+ /* Calls make_lisp_hashtable(). */
complex_vars_of_extents ();
- /* Depends on hash tables and specifiers. */
+ /* Depends on hashtables and specifiers. */
complex_vars_of_faces ();
#ifdef MULE
- /* These two depend on hash tables and various variables declared
+ /* These two depend on hashtables and various variables declared
earlier. The second may also depend on the first. */
complex_vars_of_mule_charset ();
#endif
#if defined(FILE_CODING)
- complex_vars_of_file_coding ();
+ complex_vars_of_mule_coding ();
#endif
/* This calls allocate_glyph(), which creates specifiers
might depend on all sorts of things; I'm not sure. */
complex_vars_of_emacs ();
+#ifdef CLASH_DETECTION
+ complex_vars_of_filelock ();
+#endif /* CLASH_DETECTION */
+
/* This creates a couple of basic keymaps and depends on Lisp
- hash tables and Ffset() (both of which depend on some variables
+ hashtables and Ffset() (both of which depend on some variables
initialized in the vars_of_*() section) and possibly other
stuff. */
complex_vars_of_keymap ();
-
- /* Calls make_lisp_hash_table() and creates a keymap */
+ /* Calls Fmake_hashtable() and creates a keymap */
complex_vars_of_event_stream ();
-#ifdef ERROR_CHECK_GC
- {
- extern int always_gc;
- if (always_gc) /* purification debugging hack */
- garbage_collect_1 ();
- }
-#endif
+ if (always_gc) /* purification debugging hack */
+ garbage_collect_1 ();
}
/* CONGRATULATIONS!!! We have successfully initialized the Lisp
#ifdef WINDOWSNT
/*
* For Win32, call init_environment() now, so that environment/registry
- * variables will be properly entered into Vprocess_environment.
+ * variables will be properly entered into Vprocess_envonment.
*/
init_environment();
#endif
else
{
Vinvocation_path = decode_env_path ("PATH", NULL);
- locate_file (Vinvocation_path, Vinvocation_name,
- Vlisp_EXEC_SUFFIXES,
+ locate_file (Vinvocation_path, Vinvocation_name, EXEC_SUFFIXES,
&Vinvocation_directory, X_OK);
}
char *buf = (char *)alloca (XSTRING_LENGTH (Vinvocation_directory)
+ XSTRING_LENGTH (Vinvocation_name)
+ 2);
- sprintf (buf, "%s/%s", XSTRING_DATA (Vinvocation_directory),
- XSTRING_DATA (Vinvocation_name));
+ sprintf (buf, "%s/%s", XSTRING_DATA(Vinvocation_directory),
+ XSTRING_DATA(Vinvocation_name));
/* All we can do is cry if an error happens, so ignore it. */
- (void) dll_init (buf);
+ (void)dll_init(buf);
}
#endif
static void
sort_args (int argc, char **argv)
{
- char **new_argv = xnew_array (char *, argc);
+ char **new = xnew_array (char *, argc);
/* For each element of argv,
the corresponding element of options is:
0 for an option that takes no arguments,
}
}
- /* Copy the arguments, in order of decreasing priority, to NEW_ARGV. */
- new_argv[0] = argv[0];
+ /* Copy the arguments, in order of decreasing priority, to NEW. */
+ new[0] = argv[0];
while (to < argc)
{
int best = -1;
if (best < 0)
abort ();
- /* Copy the highest priority remaining option, with its args, to NEW_ARGV. */
- new_argv[to++] = argv[best];
+ /* Copy the highest priority remaining option, with its args, to NEW. */
+ new[to++] = argv[best];
for (i = 0; i < options[best]; i++)
- new_argv[to++] = argv[best + i + 1];
+ new[to++] = argv[best + i + 1];
/* Clear out this option in ARGV. */
argv[best] = 0;
argv[best + i + 1] = 0;
}
- memcpy (argv, new_argv, sizeof (char *) * argc);
- xfree (new_argv);
- xfree (options);
- xfree (priority);
+ memcpy (argv, new, sizeof (char *) * argc);
}
static JMP_BUF run_temacs_catch;
a dumped version in case you want to rerun it. This function is most
useful when used as part of the `make all-elc' command. --ben]
This will "restart" emacs with the specified command-line arguments.
-
- Martin thinks this function is most useful when using debugging
- tools like Purify or tcov that get confused by XEmacs' dumping. */
+ */
(int nargs, Lisp_Object *args))
{
int ac;
total_len += wampum_all_len[ac];
}
DO_REALLOC (run_temacs_args, run_temacs_args_size, total_len, char);
- DO_REALLOC (run_temacs_argv, run_temacs_argv_size, nargs+2, char *);
+ DO_REALLOC (run_temacs_argv, run_temacs_argv_size, nargs+1, char *);
memcpy (run_temacs_args, wampum, namesize);
run_temacs_argv [0] = run_temacs_args;
unbind_to (0, Qnil); /* this closes loadup.el */
purify_flag = 0;
run_temacs_argc = nargs + 1;
-#ifdef HEAP_IN_DATA
- report_sheap_usage (0);
+#ifdef REPORT_PURE_USAGE
+ report_pure_usage (1, 0);
+#else
+ report_pure_usage (0, 0);
#endif
LONGJMP (run_temacs_catch, 1);
return Qnil; /* not reached; warning suppression */
int volatile vol_argc = argc;
char ** volatile vol_argv = argv;
char ** volatile vol_envp = envp;
- /* This is hairy. We need to compute where the XEmacs binary was invoked
- from because temacs initialization requires it to find the lisp
- directories. The code that recomputes the path is guarded by the
- restarted flag. There are three possible paths I've found so far
- through this:
-
- temacs -- When running temacs for basic build stuff, the first main_1
- will be the only one invoked. It must compute the path else there
- will be a very ugly bomb in startup.el (can't find obvious location
- for doc-directory data-directory, etc.).
-
- temacs w/ run-temacs on the command line -- This is run to bytecompile
- all the out of date dumped lisp. It will execute both of the main_1
- calls and the second one must not touch the first computation because
- argc/argv are hosed the second time through.
-
- xemacs -- Only the second main_1 is executed. The invocation path must
- computed but this only matters when running in place or when running
- as a login shell.
-
- As a bonus for straightening this out, XEmacs can now be run in place
- as a login shell. This never used to work.
-
- As another bonus, we can now guarantee that
- (concat invocation-directory invocation-name) contains the filename
- of the XEmacs binary we are running. This can now be used in a
- definite test for out of date dumped files. -slb */
+ /* This is hairy. We need to compute where the XEmacs binary was invoked */
+ /* from because temacs initialization requires it to find the lisp */
+ /* directories. The code that recomputes the path is guarded by the */
+ /* restarted flag. There are three possible paths I've found so far */
+ /* through this: */
+ /* temacs -- When running temacs for basic build stuff, the first main_1 */
+ /* will be the only one invoked. It must compute the path else there */
+ /* will be a very ugly bomb in startup.el (can't find obvious location */
+ /* for doc-directory data-directory, etc.). */
+ /* temacs w/ run-temacs on the command line -- This is run to bytecompile */
+ /* all the out of date dumped lisp. It will execute both of the main_1 */
+ /* calls and the second one must not touch the first computation because */
+ /* argc/argv are hosed the second time through. */
+ /* xemacs -- Only the second main_1 is executed. The invocation path must */
+ /* computed but this only matters when running in place or when running */
+ /* as a login shell. */
+ /* As a bonus for straightening this out, XEmacs can now be run in place */
+ /* as a login shell. This never used to work. */
+ /* As another bonus, we can now guarantee that */
+ /* (concat invocation-directory invocation-name) contains the filename */
+ /* of the XEmacs binary we are running. This can now be used in a */
+ /* definite test for out of date dumped files. -slb */
int restarted = 0;
#ifdef QUANTIFY
quantify_stop_recording_data ();
}
#ifdef RUN_TIME_REMAP
else
- /* obviously no-one uses this because where it was before initialized was
+ /* obviously no-one uses this because where it was before initalized was
*always* true */
run_time_remap (argv[0]);
#endif
/* GCC >= 2.8. -slb */
#if defined(GNU_MALLOC)
static void
-voodoo_free_hook (void *mem)
+voodoo_free_hook(void *mem)
{
/* Disable all calls to free() when XEmacs is exiting and it doesn't */
/* matter. */
/* When we're dumping, we can't use the debugging free() */
disable_free_hook ();
#endif
+#if 1 /* martin */
+#endif
CHECK_STRING (intoname);
intoname = Fexpand_file_name (intoname, Qnil);
opurify = purify_flag;
purify_flag = 0;
-#ifdef HEAP_IN_DATA
- report_sheap_usage (1);
+#ifdef DEBUG_XEMACS
+ report_pure_usage (1, 1);
+#else
+ report_pure_usage (0, 1);
#endif
- clear_message ();
-
fflush (stderr);
fflush (stdout);
It's a whole lot easier to do the conversion here than to
modify all the unexec routines to ensure that filename
conversion is applied everywhere. Don't worry about memory
- leakage because this call only happens once. */
- unexec (intoname_ext, symname_ext, (uintptr_t) my_edata, 0, 0);
+ leakage because this call only happens once. */
+ unexec (intoname_ext, symname_ext, (uintptr_t) my_edata, 0, 0);
#ifdef DOUG_LEA_MALLOC
- free (malloc_state_ptr);
+ free (malloc_state_ptr);
#endif
}
#endif /* not MSDOS and EMX */
GET_C_CHARPTR_INT_FILENAME_DATA_ALLOCA (path, newpath);
- len = strlen ((const char *) newpath);
+ len = strlen (newpath);
/* #### Does this make sense? It certainly does for
decode_env_path(), but it looks dubious here. Does any code
depend on decode_path("") returning nil instead of an empty
#ifdef QUANTIFY
DEFUN ("quantify-start-recording-data", Fquantify_start_recording_data,
- 0, 0, "", /*
+ 0, 0, 0, /*
Start recording Quantify data.
*/
())
}
DEFUN ("quantify-stop-recording-data", Fquantify_stop_recording_data,
- 0, 0, "", /*
+ 0, 0, 0, /*
Stop recording Quantify data.
*/
())
return Qnil;
}
-DEFUN ("quantify-clear-data", Fquantify_clear_data, 0, 0, "", /*
+DEFUN ("quantify-clear-data", Fquantify_clear_data, 0, 0, 0, /*
Clear all Quantify data.
*/
())
*/ );
Vemacs_minor_version = make_int (EMACS_MINOR_VERSION);
- DEFVAR_LISP ("emacs-patch-level", &Vemacs_patch_level /*
-The patch level of this version of Emacs, as an integer.
-The value is non-nil if this version of XEmacs is part of a series of
-stable XEmacsen, but has bug fixes applied.
-Warning: this variable does not exist in FSF Emacs or in XEmacs versions
-earlier than 21.1.1
-*/ );
-#ifdef EMACS_PATCH_LEVEL
- Vemacs_patch_level = make_int (EMACS_PATCH_LEVEL);
-#else
- Vemacs_patch_level = Qnil;
-#endif
-
- DEFVAR_LISP ("emacs-beta-version", &Vemacs_beta_version /*
+ DEFVAR_LISP ("emacs-beta-version", &Vemacs_beta_version /*
Beta number of this version of Emacs, as an integer.
The value is nil if this is an officially released version of XEmacs.
Warning: this variable does not exist in FSF Emacs or in XEmacs versions
inhibit_site_lisp = 1;
#endif
- DEFVAR_BOOL ("inhibit-site-modules", &inhibit_site_modules /*
-Set to non-nil when site-modules should not be searched at startup.
-*/ );
-#ifdef INHIBIT_SITE_MODULES
- inhibit_site_modules = 1;
-#endif
-
DEFVAR_INT ("emacs-priority", &emacs_priority /*
Priority for XEmacs to run at.
This value is effective only if set before XEmacs is dumped,
complex_vars_of_emacs (void)
{
/* This is all related to path searching. */
-
+
DEFVAR_LISP ("emacs-program-name", &Vemacs_program_name /*
*Name of the Emacs variant.
For example, this may be \"xemacs\" or \"infodock\".
Vconfigure_lisp_directory = Qnil;
#endif
- DEFVAR_LISP ("module-directory", &Vmodule_directory /*
-*Directory of core dynamic modules that come with XEmacs.
-*/ );
- Vmodule_directory = Qnil;
-
- DEFVAR_LISP ("configure-module-directory", &Vconfigure_module_directory /*
-For internal use by the build procedure only.
-configure's idea of what MODULE-DIRECTORY will be.
-*/ );
-#ifdef PATH_MODULESEARCH
- Vconfigure_module_directory = Ffile_name_as_directory
- (build_string ((char *) PATH_MODULESEARCH));
-#else
- Vconfigure_module_directory = Qnil;
-#endif
-
DEFVAR_LISP ("configure-package-path", &Vconfigure_package_path /*
For internal use by the build procedure only.
configure's idea of what the package path will be.
Vconfigure_site_directory = Qnil;
#endif
- DEFVAR_LISP ("site-module-directory", &Vsite_module_directory /*
-*Directory of site-specific loadable modules that come with XEmacs.
-*/ );
- Vsite_module_directory = Qnil;
-
- DEFVAR_LISP ("configure-site-module-directory", &Vconfigure_site_module_directory /*
-For internal use by the build procedure only.
-configure's idea of what SITE-DIRECTORY will be.
-*/ );
-#ifdef PATH_SITE_MODULES
- Vconfigure_site_module_directory = Ffile_name_as_directory
- (build_string ((char *) PATH_SITE_MODULES));
-#else
- Vconfigure_site_module_directory = Qnil;
-#endif
-
DEFVAR_LISP ("doc-directory", &Vdoc_directory /*
*Directory containing the DOC file that comes with XEmacs.
This is usually the same as exec-directory.
* cores on us when re-started from the dumped executable.
* This will have to go for 21.1 -- OG.
*/
-void __sti__iflPNGFile_c___(void);
void __sti__iflPNGFile_c___()
{
}
#include "faces.h"
#include "frame.h"
#include "glyphs.h"
+#include "hash.h"
#include "objects.h"
#include "specifier.h"
#include "window.h"
calling Ffind_face. */
Lisp_Object Vdefault_face, Vmodeline_face, Vgui_element_face;
Lisp_Object Vleft_margin_face, Vright_margin_face, Vtext_cursor_face;
-Lisp_Object Vpointer_face, Vvertical_divider_face, Vtoolbar_face, Vwidget_face;
+Lisp_Object Vpointer_face, Vvertical_divider_face, Vtoolbar_face;
/* Qdefault, Qhighlight defined in general.c */
Lisp_Object Qmodeline, Qgui_element, Qleft_margin, Qright_margin, Qtext_cursor;
{
struct Lisp_Face *face = XFACE (obj);
- markobj (face->name);
- markobj (face->doc_string);
+ ((markobj) (face->name));
+ ((markobj) (face->doc_string));
- markobj (face->foreground);
- markobj (face->background);
- markobj (face->font);
- markobj (face->display_table);
- markobj (face->background_pixmap);
- markobj (face->underline);
- markobj (face->strikethru);
- markobj (face->highlight);
- markobj (face->dim);
- markobj (face->blinking);
- markobj (face->reverse);
+ ((markobj) (face->foreground));
+ ((markobj) (face->background));
+ ((markobj) (face->font));
+ ((markobj) (face->display_table));
+ ((markobj) (face->background_pixmap));
+ ((markobj) (face->underline));
+ ((markobj) (face->strikethru));
+ ((markobj) (face->highlight));
+ ((markobj) (face->dim));
+ ((markobj) (face->blinking));
+ ((markobj) (face->reverse));
- markobj (face->charsets_warned_about);
+ ((markobj) (face->charsets_warned_about));
return face->plist;
}
This isn't concerned with "unspecified" attributes, that's what
#'face-differs-from-default-p is for. */
static int
-face_equal (Lisp_Object obj1, Lisp_Object obj2, int depth)
+face_equal (Lisp_Object o1, Lisp_Object o2, int depth)
{
- struct Lisp_Face *f1 = XFACE (obj1);
- struct Lisp_Face *f2 = XFACE (obj2);
+ struct Lisp_Face *f1 = XFACE (o1);
+ struct Lisp_Face *f2 = XFACE (o2);
depth++;
DEFINE_LRECORD_IMPLEMENTATION_WITH_PROPS ("face", face,
mark_face, print_face, 0, face_equal,
- face_hash, 0, face_getprop,
+ face_hash, face_getprop,
face_putprop, face_remprop,
face_plist, struct Lisp_Face);
\f
allocate_face (void)
{
struct Lisp_Face *result =
- alloc_lcrecord_type (struct Lisp_Face, &lrecord_face);
+ alloc_lcrecord_type (struct Lisp_Face, lrecord_face);
reset_face (result);
return result;
};
static int
-add_face_to_list_mapper (Lisp_Object key, Lisp_Object value,
+add_face_to_list_mapper (CONST void *hash_key, void *hash_contents,
void *face_list_closure)
{
/* This function can GC */
+ Lisp_Object key, contents;
+ Lisp_Object *face_list;
struct face_list_closure *fcl =
(struct face_list_closure *) face_list_closure;
+ CVOID_TO_LISP (key, hash_key);
+ VOID_TO_LISP (contents, hash_contents);
+ face_list = fcl->face_list;
- *(fcl->face_list) = Fcons (XFACE (value)->name, (*fcl->face_list));
+ *face_list = Fcons (XFACE (contents)->name, *face_list);
return 0;
}
\f
static int
-mark_face_as_clean_mapper (Lisp_Object key, Lisp_Object value,
+mark_face_as_clean_mapper (CONST void *hash_key, void *hash_contents,
void *flag_closure)
{
/* This function can GC */
+ Lisp_Object key, contents;
int *flag = (int *) flag_closure;
- XFACE (value)->dirty = *flag;
+ CVOID_TO_LISP (key, hash_key);
+ VOID_TO_LISP (contents, hash_contents);
+ XFACE (contents)->dirty = *flag;
return 0;
}
for (i = 0; i < NUM_LEADING_BYTES; i++)
if (!NILP (cachel->font[i]) && !UNBOUNDP (cachel->font[i]))
- markobj (cachel->font[i]);
+ ((markobj) (cachel->font[i]));
}
- markobj (cachel->face);
- markobj (cachel->foreground);
- markobj (cachel->background);
- markobj (cachel->display_table);
- markobj (cachel->background_pixmap);
+ ((markobj) (cachel->face));
+ ((markobj) (cachel->foreground));
+ ((markobj) (cachel->background));
+ ((markobj) (cachel->display_table));
+ ((markobj) (cachel->background_pixmap));
}
}
if (WINDOWP (locale))
{
- MARK_FRAME_FACES_CHANGED (XFRAME (XWINDOW (locale)->frame));
+ struct frame *f = XFRAME (XWINDOW (locale)->frame);
+ MARK_FRAME_FACES_CHANGED (f);
}
else if (FRAMEP (locale))
{
- MARK_FRAME_FACES_CHANGED (XFRAME (locale));
+ struct frame *f = XFRAME (locale);
+ MARK_FRAME_FACES_CHANGED (f);
}
else if (DEVICEP (locale))
{
- MARK_DEVICE_FRAMES_FACES_CHANGED (XDEVICE (locale));
+ struct device *d = XDEVICE (locale);
+ MARK_DEVICE_FRAMES_FACES_CHANGED (d);
}
else
{
Lisp_Object devcons, concons;
+
DEVICE_LOOP_NO_BREAK (devcons, concons)
MARK_DEVICE_FRAMES_FACES_CHANGED (XDEVICE (XCAR (devcons)));
}
void
syms_of_faces (void)
{
- /* Qdefault & Qwidget defined in general.c */
+ /* Qdefault defined in general.c */
defsymbol (&Qmodeline, "modeline");
defsymbol (&Qgui_element, "gui-element");
defsymbol (&Qleft_margin, "left-margin");
Vdefault_face = Qnil;
staticpro (&Vgui_element_face);
Vgui_element_face = Qnil;
- staticpro (&Vwidget_face);
- Vwidget_face = Qnil;
staticpro (&Vmodeline_face);
Vmodeline_face = Qnil;
staticpro (&Vtoolbar_face);
syms[n++] = Qblinking;
syms[n++] = Qreverse;
- Vbuilt_in_face_specifiers = Flist (n, syms);
+ Vbuilt_in_face_specifiers = pure_list (n, syms);
staticpro (&Vbuilt_in_face_specifiers);
}
}
void
complex_vars_of_faces (void)
{
- Vpermanent_faces_cache =
- make_lisp_hash_table (10, HASH_TABLE_NON_WEAK, HASH_TABLE_EQ);
- Vtemporary_faces_cache =
- make_lisp_hash_table (0, HASH_TABLE_WEAK, HASH_TABLE_EQ);
+ Vpermanent_faces_cache = make_lisp_hashtable (10, HASHTABLE_NONWEAK,
+ HASHTABLE_EQ);
+ Vtemporary_faces_cache = make_lisp_hashtable (0, HASHTABLE_WEAK,
+ HASHTABLE_EQ);
/* Create the default face now so we know what it is immediately. */
inst_list);
#endif /* HAVE_TTY */
#ifdef HAVE_MS_WINDOWS
- inst_list = Fcons (Fcons (list1 (Qmswindows),
- build_string ("Fixedsys:Regular:9::Western")), inst_list);
- inst_list = Fcons (Fcons (list1 (Qmswindows),
- build_string ("Courier:Regular:10::Western")), inst_list);
- inst_list = Fcons (Fcons (list1 (Qmswindows),
- build_string ("Courier New:Regular:10::Western")), inst_list);
+ inst_list = Fcons (Fcons (list1 (Qmswindows), build_string ("Courier New")),
+ inst_list);
#endif /* HAVE_MS_WINDOWS */
set_specifier_fallback (Fget (Vdefault_face, Qfont, Qnil), inst_list);
}
list1 (Fcons (Qnil, Qnil)));
set_specifier_fallback (Fget (Vdefault_face, Qreverse, Qnil),
list1 (Fcons (Qnil, Qnil)));
-
+
/* gui-element is the parent face of all gui elements such as
modeline, vertical divider and toolbar. */
Vgui_element_face = Fmake_face (Qgui_element,
set_specifier_fallback (Fget (Vmodeline_face, Qbackground_pixmap, Qnil),
Fget (Vgui_element_face, Qbackground_pixmap,
Qunbound));
-
+
/* toolbar is another gui element */
Vtoolbar_face = Fmake_face (Qtoolbar,
build_string ("toolbar face"),
Fget (Vgui_element_face, Qbackground_pixmap,
Qunbound));
- /* widget is another gui element */
- Vwidget_face = Fmake_face (Qwidget,
- build_string ("widget face"),
- Qnil);
- set_specifier_fallback (Fget (Vwidget_face, Qforeground, Qunbound),
- Fget (Vgui_element_face, Qforeground, Qunbound));
- set_specifier_fallback (Fget (Vwidget_face, Qbackground, Qunbound),
- Fget (Vgui_element_face, Qbackground, Qunbound));
- set_specifier_fallback (Fget (Vwidget_face, Qbackground_pixmap, Qnil),
- Fget (Vgui_element_face, Qbackground_pixmap,
- Qunbound));
-
Vleft_margin_face = Fmake_face (Qleft_margin,
build_string ("left margin face"),
Qnil);
right sort are available on the system. In this case, the
whole program will just crash. For the moment, this is
OK (for debugging purposes) but we should fix this by
- storing a "blank font" if the instantiation fails. */
+ storing a "blank font" if the instantation fails. */
unsigned int dirty :1;
unsigned int updated :1;
/* #### Of course we should use a bit array or something. */
extern Lisp_Object Qstrikethru, Vbuilt_in_face_specifiers, Vdefault_face;
extern Lisp_Object Vleft_margin_face, Vpointer_face, Vright_margin_face;
extern Lisp_Object Vtext_cursor_face, Vvertical_divider_face;
-extern Lisp_Object Vtoolbar_face, Vgui_element_face, Vwidget_face;
+extern Lisp_Object Vtoolbar_face, Vgui_element_face;
void mark_all_faces_as_clean (void);
void init_frame_faces (struct frame *f);
#include <config.h>
#include "lisp.h"
-
#include "buffer.h"
#include "elhash.h"
#include "insdel.h"
#include "lstream.h"
#ifdef MULE
#include "mule-ccl.h"
-#include "chartab.h"
#endif
#include "file-coding.h"
Lisp_Object Qcoding_system_p;
-Lisp_Object Qraw_text, Qno_conversion, Qccl, Qiso2022;
+Lisp_Object Qno_conversion, Qccl, Qiso2022;
/* Qinternal in general.c */
Lisp_Object Qmnemonic, Qeol_type;
Lisp_Object Qpre_write_conversion;
#ifdef MULE
-Lisp_Object Qucs4, Qutf8;
Lisp_Object Qbig5, Qshift_jis;
Lisp_Object Qcharset_g0, Qcharset_g1, Qcharset_g2, Qcharset_g3;
Lisp_Object Qforce_g0_on_output, Qforce_g1_on_output;
#endif
Lisp_Object Qencode, Qdecode;
-Lisp_Object Vcoding_system_hash_table;
+Lisp_Object Vcoding_system_hashtable;
int enable_multibyte_characters;
/* Index for next byte to store in ISO escape sequence. */
int esc_bytes_index;
-#ifdef ENABLE_COMPOSITE_CHARS
/* Stuff seen so far when composing a string. */
unsigned_char_dynarr *composite_chars;
-#endif
/* If we saw an invalid designation sequence for a particular
register, we flag it here and switch to ASCII. The next time we
static void encode_coding_big5 (Lstream *encoding,
CONST unsigned char *src,
unsigned_char_dynarr *dst, unsigned int n);
-static int detect_coding_ucs4 (struct detection_state *st,
- CONST unsigned char *src,
- unsigned int n);
-static void decode_coding_ucs4 (Lstream *decoding,
- CONST unsigned char *src,
- unsigned_char_dynarr *dst, unsigned int n);
-static void encode_coding_ucs4 (Lstream *encoding,
- CONST unsigned char *src,
- unsigned_char_dynarr *dst, unsigned int n);
-static int detect_coding_utf8 (struct detection_state *st,
- CONST unsigned char *src,
- unsigned int n);
-static void decode_coding_utf8 (Lstream *decoding,
- CONST unsigned char *src,
- unsigned_char_dynarr *dst, unsigned int n);
-static void encode_coding_utf8 (Lstream *encoding,
- CONST unsigned char *src,
- unsigned_char_dynarr *dst, unsigned int n);
static int postprocess_iso2022_mask (int mask);
static void reset_iso2022 (Lisp_Object coding_system,
struct iso2022_decoder *iso);
static void print_coding_system (Lisp_Object, Lisp_Object, int);
static void finalize_coding_system (void *header, int for_disksave);
-#ifdef MULE
-static const struct lrecord_description ccs_description_1[] = {
- { XD_LISP_OBJECT, offsetof(charset_conversion_spec, from_charset), 2 },
- { XD_END }
-};
-
-static const struct struct_description ccs_description = {
- sizeof(charset_conversion_spec),
- ccs_description_1
-};
-
-static const struct lrecord_description ccsd_description_1[] = {
- XD_DYNARR_DESC(charset_conversion_spec_dynarr, &ccs_description),
- { XD_END }
-};
-
-static const struct struct_description ccsd_description = {
- sizeof(charset_conversion_spec_dynarr),
- ccsd_description_1
-};
-#endif
-
-static const struct lrecord_description coding_system_description[] = {
- { XD_LISP_OBJECT, offsetof(struct Lisp_Coding_System, name), 2 },
- { XD_LISP_OBJECT, offsetof(struct Lisp_Coding_System, mnemonic), 3 },
- { XD_LISP_OBJECT, offsetof(struct Lisp_Coding_System, eol_lf), 3 },
-#ifdef MULE
- { XD_LISP_OBJECT, offsetof(struct Lisp_Coding_System, iso2022.initial_charset), 4 },
- { XD_STRUCT_PTR, offsetof(struct Lisp_Coding_System, iso2022.input_conv), 1, &ccsd_description },
- { XD_STRUCT_PTR, offsetof(struct Lisp_Coding_System, iso2022.output_conv), 1, &ccsd_description },
- { XD_LISP_OBJECT, offsetof(struct Lisp_Coding_System, ccl.decode), 2 },
-#endif
- { XD_END }
-};
-
DEFINE_LRECORD_IMPLEMENTATION ("coding-system", coding_system,
mark_coding_system, print_coding_system,
finalize_coding_system,
- 0, 0, coding_system_description,
- struct Lisp_Coding_System);
+ 0, 0, struct Lisp_Coding_System);
static Lisp_Object
mark_coding_system (Lisp_Object obj, void (*markobj) (Lisp_Object))
{
- Lisp_Coding_System *codesys = XCODING_SYSTEM (obj);
+ struct Lisp_Coding_System *codesys = XCODING_SYSTEM (obj);
- markobj (CODING_SYSTEM_NAME (codesys));
- markobj (CODING_SYSTEM_DOC_STRING (codesys));
- markobj (CODING_SYSTEM_MNEMONIC (codesys));
- markobj (CODING_SYSTEM_EOL_LF (codesys));
- markobj (CODING_SYSTEM_EOL_CRLF (codesys));
- markobj (CODING_SYSTEM_EOL_CR (codesys));
+ (markobj) (CODING_SYSTEM_NAME (codesys));
+ (markobj) (CODING_SYSTEM_DOC_STRING (codesys));
+ (markobj) (CODING_SYSTEM_MNEMONIC (codesys));
+ (markobj) (CODING_SYSTEM_EOL_LF (codesys));
+ (markobj) (CODING_SYSTEM_EOL_CRLF (codesys));
+ (markobj) (CODING_SYSTEM_EOL_CR (codesys));
switch (CODING_SYSTEM_TYPE (codesys))
{
int i;
case CODESYS_ISO2022:
for (i = 0; i < 4; i++)
- markobj (CODING_SYSTEM_ISO2022_INITIAL_CHARSET (codesys, i));
+ (markobj) (CODING_SYSTEM_ISO2022_INITIAL_CHARSET (codesys, i));
if (codesys->iso2022.input_conv)
{
for (i = 0; i < Dynarr_length (codesys->iso2022.input_conv); i++)
{
struct charset_conversion_spec *ccs =
Dynarr_atp (codesys->iso2022.input_conv, i);
- markobj (ccs->from_charset);
- markobj (ccs->to_charset);
+ (markobj) (ccs->from_charset);
+ (markobj) (ccs->to_charset);
}
}
if (codesys->iso2022.output_conv)
{
struct charset_conversion_spec *ccs =
Dynarr_atp (codesys->iso2022.output_conv, i);
- markobj (ccs->from_charset);
- markobj (ccs->to_charset);
+ (markobj) (ccs->from_charset);
+ (markobj) (ccs->to_charset);
}
}
break;
case CODESYS_CCL:
- markobj (CODING_SYSTEM_CCL_DECODE (codesys));
- markobj (CODING_SYSTEM_CCL_ENCODE (codesys));
+ (markobj) (CODING_SYSTEM_CCL_DECODE (codesys));
+ (markobj) (CODING_SYSTEM_CCL_ENCODE (codesys));
break;
#endif /* MULE */
default:
break;
}
- markobj (CODING_SYSTEM_PRE_WRITE_CONVERSION (codesys));
+ (markobj) (CODING_SYSTEM_PRE_WRITE_CONVERSION (codesys));
return CODING_SYSTEM_POST_READ_CONVERSION (codesys);
}
print_coding_system (Lisp_Object obj, Lisp_Object printcharfun,
int escapeflag)
{
- Lisp_Coding_System *c = XCODING_SYSTEM (obj);
+ struct Lisp_Coding_System *c = XCODING_SYSTEM (obj);
if (print_readably)
error ("printing unreadable object #<coding_system 0x%x>",
c->header.uid);
static void
finalize_coding_system (void *header, int for_disksave)
{
- Lisp_Coding_System *c = (Lisp_Coding_System *) header;
+ struct Lisp_Coding_System *c = (struct Lisp_Coding_System *) header;
/* Since coding systems never go away, this function is not
necessary. But it would be necessary if we changed things
so that coding systems could go away. */
{
switch (type)
{
- default: abort ();
case EOL_LF: return Qlf;
case EOL_CRLF: return Qcrlf;
case EOL_CR: return Qcr;
case EOL_AUTODETECT: return Qnil;
+ default: abort (); return Qnil; /* not reached */
}
}
static void
-setup_eol_coding_systems (Lisp_Coding_System *codesys)
+setup_eol_coding_systems (struct Lisp_Coding_System *codesys)
{
Lisp_Object codesys_obj;
int len = string_length (XSYMBOL (CODING_SYSTEM_NAME (codesys))->name);
else
CHECK_SYMBOL (coding_system_or_name);
- return Fgethash (coding_system_or_name, Vcoding_system_hash_table, Qnil);
+ return Fgethash (coding_system_or_name, Vcoding_system_hashtable, Qnil);
}
DEFUN ("get-coding-system", Fget_coding_system, 1, 1, 0, /*
};
static int
-add_coding_system_to_list_mapper (Lisp_Object key, Lisp_Object value,
+add_coding_system_to_list_mapper (CONST void *hash_key, void *hash_contents,
void *coding_system_list_closure)
{
/* This function can GC */
+ Lisp_Object key, contents;
+ Lisp_Object *coding_system_list;
struct coding_system_list_closure *cscl =
(struct coding_system_list_closure *) coding_system_list_closure;
- Lisp_Object *coding_system_list = cscl->coding_system_list;
+ CVOID_TO_LISP (key, hash_key);
+ VOID_TO_LISP (contents, hash_contents);
+ coding_system_list = cscl->coding_system_list;
- *coding_system_list = Fcons (XCODING_SYSTEM (value)->name,
+ *coding_system_list = Fcons (XCODING_SYSTEM (contents)->name,
*coding_system_list);
return 0;
}
GCPRO1 (coding_system_list);
coding_system_list_closure.coding_system_list = &coding_system_list;
- elisp_maphash (add_coding_system_to_list_mapper, Vcoding_system_hash_table,
+ elisp_maphash (add_coding_system_to_list_mapper, Vcoding_system_hashtable,
&coding_system_list_closure);
UNGCPRO;
return XCODING_SYSTEM_NAME (coding_system);
}
-static Lisp_Coding_System *
+static struct Lisp_Coding_System *
allocate_coding_system (enum coding_system_type type, Lisp_Object name)
{
- Lisp_Coding_System *codesys =
- alloc_lcrecord_type (Lisp_Coding_System, &lrecord_coding_system);
+ struct Lisp_Coding_System *codesys =
+ alloc_lcrecord_type (struct Lisp_Coding_System, lrecord_coding_system);
zero_lcrecord (codesys);
CODING_SYSTEM_PRE_WRITE_CONVERSION (codesys) = Qnil;
characters will only be present if you explicitly insert them.)
'shift-jis
Shift-JIS (a Japanese encoding commonly used in PC operating systems).
-'ucs-4
- ISO 10646 UCS-4 encoding.
-'utf-8
- ISO 10646 UTF-8 encoding.
'iso2022
Any ISO2022-compliant encoding. Among other things, this includes
JIS (the Japanese encoding commonly used for e-mail), EUC (the
*/
(name, type, doc_string, props))
{
- Lisp_Coding_System *codesys;
+ struct Lisp_Coding_System *codesys;
Lisp_Object rest, key, value;
enum coding_system_type ty;
int need_to_setup_eol_systems = 1;
else if (EQ (type, Qshift_jis)) { ty = CODESYS_SHIFT_JIS; }
else if (EQ (type, Qiso2022)) { ty = CODESYS_ISO2022; }
else if (EQ (type, Qbig5)) { ty = CODESYS_BIG5; }
- else if (EQ (type, Qucs4)) { ty = CODESYS_UCS4; }
- else if (EQ (type, Qutf8)) { ty = CODESYS_UTF8; }
else if (EQ (type, Qccl)) { ty = CODESYS_CCL; }
#endif
else if (EQ (type, Qno_conversion)) { ty = CODESYS_NO_CONVERSION; }
{
Lisp_Object codesys_obj;
XSETCODING_SYSTEM (codesys_obj, codesys);
- Fputhash (name, codesys_obj, Vcoding_system_hash_table);
+ Fputhash (name, codesys_obj, Vcoding_system_hashtable);
return codesys_obj;
}
}
allocate_coding_system
(XCODING_SYSTEM_TYPE (old_coding_system),
new_name));
- Fputhash (new_name, new_coding_system, Vcoding_system_hash_table);
+ Fputhash (new_name, new_coding_system, Vcoding_system_hashtable);
}
{
- Lisp_Coding_System *to = XCODING_SYSTEM (new_coding_system);
- Lisp_Coding_System *from = XCODING_SYSTEM (old_coding_system);
+ struct Lisp_Coding_System *to = XCODING_SYSTEM (new_coding_system);
+ struct Lisp_Coding_System *from = XCODING_SYSTEM (old_coding_system);
memcpy (((char *) to ) + sizeof (to->header),
((char *) from) + sizeof (from->header),
sizeof (*from) - sizeof (from->header));
return new_coding_system;
}
-DEFUN ("define-coding-system-alias", Fdefine_coding_system_alias, 2, 2, 0, /*
-Define symbol ALIAS as an alias for coding system CODING-SYSTEM.
-*/
- (alias, coding_system))
-{
- CHECK_SYMBOL (alias);
- if (!NILP (Ffind_coding_system (alias)))
- signal_simple_error ("Symbol already names a coding system", alias);
- coding_system = Fget_coding_system (coding_system);
- Fputhash (alias, coding_system, Vcoding_system_hash_table);
-
- /* Set up aliases for subsidiaries. */
- if (XCODING_SYSTEM_EOL_TYPE (coding_system) == EOL_AUTODETECT)
- {
- Lisp_Object str;
- XSETSTRING (str, symbol_name (XSYMBOL (alias)));
-#define FROB(type, name) \
- do { \
- Lisp_Object subsidiary = XCODING_SYSTEM_EOL_##type (coding_system); \
- if (!NILP (subsidiary)) \
- Fdefine_coding_system_alias \
- (Fintern (concat2 (str, build_string (name)), Qnil), subsidiary); \
- } while (0)
- FROB (LF, "-unix");
- FROB (CRLF, "-dos");
- FROB (CR, "-mac");
-#undef FROB
- }
- /* FSF return value is a vector of [ALIAS-unix ALIAS-doc ALIAS-mac],
- but it doesn't look intentional, so I'd rather return something
- meaningful or nothing at all. */
- return Qnil;
-}
-
static Lisp_Object
subsidiary_coding_system (Lisp_Object coding_system, enum eol_type type)
{
- Lisp_Coding_System *cs = XCODING_SYSTEM (coding_system);
+ struct Lisp_Coding_System *cs = XCODING_SYSTEM (coding_system);
Lisp_Object new_coding_system;
if (CODING_SYSTEM_EOL_TYPE (cs) != EOL_AUTODETECT)
{
switch (XCODING_SYSTEM_TYPE (Fget_coding_system (coding_system)))
{
- default: abort ();
case CODESYS_AUTODETECT: return Qundecided;
#ifdef MULE
case CODESYS_SHIFT_JIS: return Qshift_jis;
case CODESYS_ISO2022: return Qiso2022;
case CODESYS_BIG5: return Qbig5;
- case CODESYS_UCS4: return Qucs4;
- case CODESYS_UTF8: return Qutf8;
case CODESYS_CCL: return Qccl;
#endif
case CODESYS_NO_CONVERSION: return Qno_conversion;
#ifdef DEBUG_XEMACS
case CODESYS_INTERNAL: return Qinternal;
#endif
+ default:
+ abort ();
}
+
+ return Qnil; /* not reached */
}
#ifdef MULE
struct
{
int mask;
- int in_byte;
- }
- ucs4;
-
- struct
- {
- int mask;
- int in_byte;
- }
- utf8;
-
- struct
- {
- int mask;
int initted;
struct iso2022_decoder iso;
unsigned int flags;
#ifdef MULE
st->shift_jis.mask = ~0;
st->big5.mask = ~0;
- st->ucs4.mask = ~0;
- st->utf8.mask = ~0;
st->iso2022.mask = ~0;
#endif
break;
st->shift_jis.mask = detect_coding_sjis (st, src, n);
if (!mask_has_at_most_one_bit_p (st->big5.mask))
st->big5.mask = detect_coding_big5 (st, src, n);
- if (!mask_has_at_most_one_bit_p (st->utf8.mask))
- st->utf8.mask = detect_coding_utf8 (st, src, n);
- if (!mask_has_at_most_one_bit_p (st->ucs4.mask))
- st->ucs4.mask = detect_coding_ucs4 (st, src, n);
-
- st->mask
- = st->iso2022.mask | st->shift_jis.mask | st->big5.mask
- | st->utf8.mask | st->ucs4.mask;
+
+ st->mask = st->iso2022.mask | st->shift_jis.mask | st->big5.mask;
#endif
{
int retval = mask_has_at_most_one_bit_p (st->mask);
}
}
if (NILP (retval))
- retval = Fget_coding_system (Qraw_text);
+ retval = Fget_coding_system (Qno_conversion);
return retval;
}
else
if (cat >= 0)
return coding_category_system[cat];
else
- return Fget_coding_system (Qraw_text);
+ return Fget_coding_system (Qno_conversion);
}
}
#define DECODE_HANDLE_END_OF_CONVERSION(flags, ch, dst) \
do { \
- if (flags & CODING_STATE_END) \
- { \
- DECODE_OUTPUT_PARTIAL_CHAR (ch); \
- if (flags & CODING_STATE_CR) \
- Dynarr_add (dst, '\r'); \
- } \
+ DECODE_OUTPUT_PARTIAL_CHAR (ch); \
+ if ((flags & CODING_STATE_END) && \
+ (flags & CODING_STATE_CR)) \
+ Dynarr_add (dst, '\r'); \
} while (0)
#define DECODING_STREAM_DATA(stream) LSTREAM_TYPE_DATA (stream, decoding)
struct decoding_stream
{
/* Coding system that governs the conversion. */
- Lisp_Coding_System *codesys;
+ struct Lisp_Coding_System *codesys;
/* Stream that we read the encoded data from or
write the decoded data to. */
and automatically marked. */
XSETLSTREAM (str_obj, str);
- markobj (str_obj);
+ (markobj) (str_obj);
if (str->imp->marker)
return (str->imp->marker) (str_obj, markobj);
else
}
Dynarr_free (str->runoff);
#ifdef MULE
-#ifdef ENABLE_COMPOSITE_CHARS
if (str->iso2022.composite_chars)
Dynarr_free (str->iso2022.composite_chars);
#endif
-#endif
return Lstream_close (str->other_end);
}
void
set_decoding_stream_coding_system (Lstream *lstr, Lisp_Object codesys)
{
- Lisp_Coding_System *cs = XCODING_SYSTEM (codesys);
+ struct Lisp_Coding_System *cs = XCODING_SYSTEM (codesys);
struct decoding_stream *str = DECODING_STREAM_DATA (lstr);
str->codesys = cs;
if (CODING_SYSTEM_EOL_TYPE (cs) != EOL_AUTODETECT)
case CODESYS_BIG5:
decode_coding_big5 (decoding, src, dst, n);
break;
- case CODESYS_UCS4:
- decode_coding_ucs4 (decoding, src, dst, n);
- break;
- case CODESYS_UTF8:
- decode_coding_utf8 (decoding, src, dst, n);
- break;
case CODESYS_CCL:
- ccl_driver (&str->ccl, src, dst, n, 0, CCL_MODE_DECODING);
+ ccl_driver (&str->ccl, src, dst, n, 0);
break;
case CODESYS_ISO2022:
decode_coding_iso2022 (decoding, src, dst, n);
struct encoding_stream
{
/* Coding system that governs the conversion. */
- Lisp_Coding_System *codesys;
+ struct Lisp_Coding_System *codesys;
/* Stream that we read the encoded data from or
write the decoded data to. */
and automatically marked. */
XSETLSTREAM (str_obj, str);
- markobj (str_obj);
+ (markobj) (str_obj);
if (str->imp->marker)
return (str->imp->marker) (str_obj, markobj);
else
void
set_encoding_stream_coding_system (Lstream *lstr, Lisp_Object codesys)
{
- Lisp_Coding_System *cs = XCODING_SYSTEM (codesys);
+ struct Lisp_Coding_System *cs = XCODING_SYSTEM (codesys);
struct encoding_stream *str = ENCODING_STREAM_DATA (lstr);
str->codesys = cs;
reset_encoding_stream (str);
case CODESYS_BIG5:
encode_coding_big5 (encoding, src, dst, n);
break;
- case CODESYS_UCS4:
- encode_coding_ucs4 (encoding, src, dst, n);
- break;
- case CODESYS_UTF8:
- encode_coding_utf8 (encoding, src, dst, n);
- break;
case CODESYS_CCL:
- ccl_driver (&str->ccl, src, dst, n, 0, CCL_MODE_ENCODING);
+ ccl_driver (&str->ccl, src, dst, n, 0);
break;
case CODESYS_ISO2022:
encode_coding_iso2022 (encoding, src, dst, n);
/* Shift-JIS is a coding system encoding three character sets: ASCII, right
half of JISX0201-Kana, and JISX0208. An ASCII character is encoded
- as is. A character of JISX0201-Kana (DIMENSION1_CHARS94 character set) is
+ as is. A character of JISX0201-Kana (TYPE94 character set) is
encoded by "position-code + 0x80". A character of JISX0208
- (DIMENSION2_CHARS94 character set) is encoded in 2-byte but two
+ (TYPE94x94 character set) is encoded in 2-byte but two
position-codes are divided and shifted so that it fit in the range
below.
unsigned_char_dynarr *dst, unsigned int n)
{
unsigned char c;
+ unsigned int flags, ch;
+ enum eol_type eol_type;
struct decoding_stream *str = DECODING_STREAM_DATA (decoding);
- unsigned int flags = str->flags;
- unsigned int ch = str->ch;
- eol_type_t eol_type = str->eol_type;
+
+ CODING_STREAM_DECOMPOSE (str, flags, ch);
+ eol_type = str->eol_type;
while (n--)
{
DECODE_HANDLE_END_OF_CONVERSION (flags, ch, dst);
- str->flags = flags;
- str->ch = ch;
+ CODING_STREAM_COMPOSE (str, flags, ch);
}
/* Convert internally-formatted data to Shift-JIS. */
{
unsigned char c;
struct encoding_stream *str = ENCODING_STREAM_DATA (encoding);
- unsigned int flags = str->flags;
- unsigned int ch = str->ch;
- eol_type_t eol_type = CODING_SYSTEM_EOL_TYPE (str->codesys);
+ unsigned int flags, ch;
+ enum eol_type eol_type;
+
+ CODING_STREAM_DECOMPOSE (str, flags, ch);
+ eol_type = CODING_SYSTEM_EOL_TYPE (str->codesys);
while (n--)
{
}
}
- str->flags = flags;
- str->ch = ch;
+ CODING_STREAM_COMPOSE (str, flags, ch);
}
DEFUN ("decode-shift-jis-char", Fdecode_shift_jis_char, 1, 1, 0, /*
Since the number of characters in Big5 is larger than maximum
characters in Emacs' charset (96x96), it can't be handled as one
- charset. So, in Emacs, Big5 is divided into two: `charset-big5-1'
- and `charset-big5-2'. Both <type>s are DIMENSION2_CHARS94. The former
+ charset. So, in Emacs, Big5 is devided into two: `charset-big5-1'
+ and `charset-big5-2'. Both <type>s are TYPE94x94. The former
contains frequently used characters and the latter contains less
frequently used characters. */
unsigned_char_dynarr *dst, unsigned int n)
{
unsigned char c;
+ unsigned int flags, ch;
+ enum eol_type eol_type;
struct decoding_stream *str = DECODING_STREAM_DATA (decoding);
- unsigned int flags = str->flags;
- unsigned int ch = str->ch;
- eol_type_t eol_type = str->eol_type;
+
+ CODING_STREAM_DECOMPOSE (str, flags, ch);
+ eol_type = str->eol_type;
while (n--)
{
DECODE_HANDLE_END_OF_CONVERSION (flags, ch, dst);
- str->flags = flags;
- str->ch = ch;
+ CODING_STREAM_COMPOSE (str, flags, ch);
}
/* Convert internally-formatted data to Big5. */
{
unsigned char c;
struct encoding_stream *str = ENCODING_STREAM_DATA (encoding);
- unsigned int flags = str->flags;
- unsigned int ch = str->ch;
- eol_type_t eol_type = CODING_SYSTEM_EOL_TYPE (str->codesys);
+ unsigned int flags, ch;
+ enum eol_type eol_type;
+
+ CODING_STREAM_DECOMPOSE (str, flags, ch);
+ eol_type = CODING_SYSTEM_EOL_TYPE (str->codesys);
while (n--)
{
ch = 0;
}
- str->flags = flags;
- str->ch = ch;
+ CODING_STREAM_COMPOSE (str, flags, ch);
}
\f
/************************************************************************/
-/* UCS-4 methods */
-/* */
-/* UCS-4 character codes are implemented as nonnegative integers. */
-/* */
-/************************************************************************/
-
-Lisp_Object ucs_to_mule_table[65536];
-Lisp_Object mule_to_ucs_table;
-
-DEFUN ("set-ucs-char", Fset_ucs_char, 2, 2, 0, /*
-Map UCS-4 code CODE to Mule character CHARACTER.
-
-Return T on success, NIL on failure.
-*/
- (code, character))
-{
- unsigned int c;
-
- CHECK_CHAR (character);
- CHECK_INT (code);
- c = XINT (code);
-
- if (c < sizeof (ucs_to_mule_table))
- {
- ucs_to_mule_table[c] = character;
- return Qt;
- }
- else
- return Qnil;
-}
-
-static Lisp_Object
-ucs_to_char (unsigned long code)
-{
- if (code < sizeof (ucs_to_mule_table))
- {
- return ucs_to_mule_table[code];
- }
- else if ((0xe00000 <= code) && (code <= 0xe00000 + 94 * 94 * 14))
- {
- unsigned int c;
-
- code -= 0xe00000;
- c = code % (94 * 94);
- return make_char
- (MAKE_CHAR (CHARSET_BY_ATTRIBUTES
- (CHARSET_TYPE_94X94, code / (94 * 94) + '@',
- CHARSET_LEFT_TO_RIGHT),
- c / 94 + 33, c % 94 + 33));
- }
- else
- return Qnil;
-}
-
-DEFUN ("ucs-char", Fucs_char, 1, 1, 0, /*
-Return Mule character corresponding to UCS code CODE (a positive integer).
-*/
- (code))
-{
- CHECK_NATNUM (code);
- return ucs_to_char (XINT (code));
-}
-
-DEFUN ("set-char-ucs", Fset_char_ucs, 2, 2, 0, /*
-Map Mule character CHARACTER to UCS code CODE (a positive integer).
-*/
- (character, code))
-{
- /* #### Isn't this gilding the lily? Fput_char_table checks its args.
- Fset_char_ucs is more restrictive on index arg, but should
- check code arg in a char_table method. */
- CHECK_CHAR (character);
- CHECK_NATNUM (code);
- return Fput_char_table (character, code, mule_to_ucs_table);
-}
-
-DEFUN ("char-ucs", Fchar_ucs, 1, 1, 0, /*
-Return the UCS code (a positive integer) corresponding to CHARACTER.
-*/
- (character))
-{
- return Fget_char_table (character, mule_to_ucs_table);
-}
-
-/* Decode a UCS-4 character into a buffer. If the lookup fails, use
- <GETA MARK> (U+3013) of JIS X 0208, which means correct character
- is not found, instead.
- #### do something more appropriate (use blob?)
- Danger, Will Robinson! Data loss. Should we signal user? */
-static void
-decode_ucs4 (unsigned long ch, unsigned_char_dynarr *dst)
-{
- Lisp_Object chr = ucs_to_char (ch);
-
- if (! NILP (chr))
- {
- Bufbyte work[MAX_EMCHAR_LEN];
- int len;
-
- ch = XCHAR (chr);
- len = (ch < 128) ?
- simple_set_charptr_emchar (work, ch) :
- non_ascii_set_charptr_emchar (work, ch);
- Dynarr_add_many (dst, work, len);
- }
- else
- {
- Dynarr_add (dst, LEADING_BYTE_JAPANESE_JISX0208);
- Dynarr_add (dst, 34 + 128);
- Dynarr_add (dst, 46 + 128);
- }
-}
-
-static unsigned long
-mule_char_to_ucs4 (Lisp_Object charset,
- unsigned char h, unsigned char l)
-{
- Lisp_Object code
- = Fget_char_table (make_char (MAKE_CHAR (charset, h & 127, l & 127)),
- mule_to_ucs_table);
-
- if (INTP (code))
- {
- return XINT (code);
- }
- else if ( (XCHARSET_DIMENSION (charset) == 2) &&
- (XCHARSET_CHARS (charset) == 94) )
- {
- unsigned char final = XCHARSET_FINAL (charset);
-
- if ( ('@' <= final) && (final < 0x7f) )
- {
- return 0xe00000 + (final - '@') * 94 * 94
- + ((h & 127) - 33) * 94 + (l & 127) - 33;
- }
- else
- {
- return '?';
- }
- }
- else
- {
- return '?';
- }
-}
-
-static void
-encode_ucs4 (Lisp_Object charset,
- unsigned char h, unsigned char l, unsigned_char_dynarr *dst)
-{
- unsigned long code = mule_char_to_ucs4 (charset, h, l);
- Dynarr_add (dst, code >> 24);
- Dynarr_add (dst, (code >> 16) & 255);
- Dynarr_add (dst, (code >> 8) & 255);
- Dynarr_add (dst, code & 255);
-}
-
-static int
-detect_coding_ucs4 (struct detection_state *st, CONST unsigned char *src,
- unsigned int n)
-{
- while (n--)
- {
- int c = *src++;
- switch (st->ucs4.in_byte)
- {
- case 0:
- if (c >= 128)
- return 0;
- else
- st->ucs4.in_byte++;
- break;
- case 3:
- st->ucs4.in_byte = 0;
- break;
- default:
- st->ucs4.in_byte++;
- }
- }
- return CODING_CATEGORY_UCS4_MASK;
-}
-
-static void
-decode_coding_ucs4 (Lstream *decoding, CONST unsigned char *src,
- unsigned_char_dynarr *dst, unsigned int n)
-{
- struct decoding_stream *str = DECODING_STREAM_DATA (decoding);
- unsigned int flags = str->flags;
- unsigned int ch = str->ch;
-
- while (n--)
- {
- unsigned char c = *src++;
- switch (flags)
- {
- case 0:
- ch = c;
- flags = 3;
- break;
- case 1:
- decode_ucs4 ( ( ch << 8 ) | c, dst);
- ch = 0;
- flags = 0;
- break;
- default:
- ch = ( ch << 8 ) | c;
- flags--;
- }
- }
- if (flags & CODING_STATE_END)
- DECODE_OUTPUT_PARTIAL_CHAR (ch);
-
- str->flags = flags;
- str->ch = ch;
-}
-
-static void
-encode_coding_ucs4 (Lstream *encoding, CONST unsigned char *src,
- unsigned_char_dynarr *dst, unsigned int n)
-{
- struct encoding_stream *str = ENCODING_STREAM_DATA (encoding);
- unsigned int flags = str->flags;
- unsigned int ch = str->ch;
- unsigned char char_boundary = str->iso2022.current_char_boundary;
- Lisp_Object charset = str->iso2022.current_charset;
-
-#ifdef ENABLE_COMPOSITE_CHARS
- /* flags for handling composite chars. We do a little switcharoo
- on the source while we're outputting the composite char. */
- unsigned int saved_n = 0;
- CONST unsigned char *saved_src = NULL;
- int in_composite = 0;
-
- back_to_square_n:
-#endif
-
- while (n--)
- {
- unsigned char c = *src++;
-
- if (BYTE_ASCII_P (c))
- { /* Processing ASCII character */
- ch = 0;
- encode_ucs4 (Vcharset_ascii, c, 0, dst);
- char_boundary = 1;
- }
- else if (BUFBYTE_LEADING_BYTE_P (c) || BUFBYTE_LEADING_BYTE_P (ch))
- { /* Processing Leading Byte */
- ch = 0;
- charset = CHARSET_BY_LEADING_BYTE (c);
- if (LEADING_BYTE_PREFIX_P(c))
- ch = c;
- char_boundary = 0;
- }
- else
- { /* Processing Non-ASCII character */
- char_boundary = 1;
- if (EQ (charset, Vcharset_control_1))
- {
- encode_ucs4 (Vcharset_control_1, c, 0, dst);
- }
- else
- {
- switch (XCHARSET_REP_BYTES (charset))
- {
- case 2:
- encode_ucs4 (charset, c, 0, dst);
- break;
- case 3:
- if (XCHARSET_PRIVATE_P (charset))
- {
- encode_ucs4 (charset, c, 0, dst);
- ch = 0;
- }
- else if (ch)
- {
-#ifdef ENABLE_COMPOSITE_CHARS
- if (EQ (charset, Vcharset_composite))
- {
- if (in_composite)
- {
- /* #### Bother! We don't know how to
- handle this yet. */
- Dynarr_add (dst, 0);
- Dynarr_add (dst, 0);
- Dynarr_add (dst, 0);
- Dynarr_add (dst, '~');
- }
- else
- {
- Emchar emch = MAKE_CHAR (Vcharset_composite,
- ch & 0x7F, c & 0x7F);
- Lisp_Object lstr = composite_char_string (emch);
- saved_n = n;
- saved_src = src;
- in_composite = 1;
- src = XSTRING_DATA (lstr);
- n = XSTRING_LENGTH (lstr);
- }
- }
- else
-#endif /* ENABLE_COMPOSITE_CHARS */
- {
- encode_ucs4(charset, ch, c, dst);
- }
- ch = 0;
- }
- else
- {
- ch = c;
- char_boundary = 0;
- }
- break;
- case 4:
- if (ch)
- {
- encode_ucs4 (charset, ch, c, dst);
- ch = 0;
- }
- else
- {
- ch = c;
- char_boundary = 0;
- }
- break;
- default:
- abort ();
- }
- }
- }
- }
-
-#ifdef ENABLE_COMPOSITE_CHARS
- if (in_composite)
- {
- n = saved_n;
- src = saved_src;
- in_composite = 0;
- goto back_to_square_n; /* Wheeeeeeeee ..... */
- }
-#endif /* ENABLE_COMPOSITE_CHARS */
-
- str->flags = flags;
- str->ch = ch;
- str->iso2022.current_char_boundary = char_boundary;
- str->iso2022.current_charset = charset;
-
- /* Verbum caro factum est! */
-}
-
-\f
-/************************************************************************/
-/* UTF-8 methods */
-/************************************************************************/
-
-static int
-detect_coding_utf8 (struct detection_state *st, CONST unsigned char *src,
- unsigned int n)
-{
- while (n--)
- {
- unsigned char c = *src++;
- switch (st->utf8.in_byte)
- {
- case 0:
- if (c == ISO_CODE_ESC || c == ISO_CODE_SI || c == ISO_CODE_SO)
- return 0;
- else if (c >= 0xfc)
- st->utf8.in_byte = 5;
- else if (c >= 0xf8)
- st->utf8.in_byte = 4;
- else if (c >= 0xf0)
- st->utf8.in_byte = 3;
- else if (c >= 0xe0)
- st->utf8.in_byte = 2;
- else if (c >= 0xc0)
- st->utf8.in_byte = 1;
- else if (c >= 0x80)
- return 0;
- break;
- default:
- if ((c & 0xc0) != 0x80)
- return 0;
- else
- st->utf8.in_byte--;
- }
- }
- return CODING_CATEGORY_UTF8_MASK;
-}
-
-static void
-decode_coding_utf8 (Lstream *decoding, CONST unsigned char *src,
- unsigned_char_dynarr *dst, unsigned int n)
-{
- struct decoding_stream *str = DECODING_STREAM_DATA (decoding);
- unsigned int flags = str->flags;
- unsigned int ch = str->ch;
- eol_type_t eol_type = str->eol_type;
-
- while (n--)
- {
- unsigned char c = *src++;
- switch (flags)
- {
- case 0:
- if ( c >= 0xfc )
- {
- ch = c & 0x01;
- flags = 5;
- }
- else if ( c >= 0xf8 )
- {
- ch = c & 0x03;
- flags = 4;
- }
- else if ( c >= 0xf0 )
- {
- ch = c & 0x07;
- flags = 3;
- }
- else if ( c >= 0xe0 )
- {
- ch = c & 0x0f;
- flags = 2;
- }
- else if ( c >= 0xc0 )
- {
- ch = c & 0x1f;
- flags = 1;
- }
- else
- {
- DECODE_HANDLE_EOL_TYPE (eol_type, c, flags, dst);
- decode_ucs4 (c, dst);
- }
- break;
- case 1:
- ch = ( ch << 6 ) | ( c & 0x3f );
- decode_ucs4 (ch, dst);
- ch = 0;
- flags = 0;
- break;
- default:
- ch = ( ch << 6 ) | ( c & 0x3f );
- flags--;
- }
- label_continue_loop:;
- }
-
- if (flags & CODING_STATE_END)
- DECODE_OUTPUT_PARTIAL_CHAR (ch);
-
- str->flags = flags;
- str->ch = ch;
-}
-
-static void
-encode_utf8 (Lisp_Object charset,
- unsigned char h, unsigned char l, unsigned_char_dynarr *dst)
-{
- unsigned long code = mule_char_to_ucs4 (charset, h, l);
- if ( code <= 0x7f )
- {
- Dynarr_add (dst, code);
- }
- else if ( code <= 0x7ff )
- {
- Dynarr_add (dst, (code >> 6) | 0xc0);
- Dynarr_add (dst, (code & 0x3f) | 0x80);
- }
- else if ( code <= 0xffff )
- {
- Dynarr_add (dst, (code >> 12) | 0xe0);
- Dynarr_add (dst, ((code >> 6) & 0x3f) | 0x80);
- Dynarr_add (dst, (code & 0x3f) | 0x80);
- }
- else if ( code <= 0x1fffff )
- {
- Dynarr_add (dst, (code >> 18) | 0xf0);
- Dynarr_add (dst, ((code >> 12) & 0x3f) | 0x80);
- Dynarr_add (dst, ((code >> 6) & 0x3f) | 0x80);
- Dynarr_add (dst, (code & 0x3f) | 0x80);
- }
- else if ( code <= 0x3ffffff )
- {
- Dynarr_add (dst, (code >> 24) | 0xf8);
- Dynarr_add (dst, ((code >> 18) & 0x3f) | 0x80);
- Dynarr_add (dst, ((code >> 12) & 0x3f) | 0x80);
- Dynarr_add (dst, ((code >> 6) & 0x3f) | 0x80);
- Dynarr_add (dst, (code & 0x3f) | 0x80);
- }
- else
- {
- Dynarr_add (dst, (code >> 30) | 0xfc);
- Dynarr_add (dst, ((code >> 24) & 0x3f) | 0x80);
- Dynarr_add (dst, ((code >> 18) & 0x3f) | 0x80);
- Dynarr_add (dst, ((code >> 12) & 0x3f) | 0x80);
- Dynarr_add (dst, ((code >> 6) & 0x3f) | 0x80);
- Dynarr_add (dst, (code & 0x3f) | 0x80);
- }
-}
-
-static void
-encode_coding_utf8 (Lstream *encoding, CONST unsigned char *src,
- unsigned_char_dynarr *dst, unsigned int n)
-{
- struct encoding_stream *str = ENCODING_STREAM_DATA (encoding);
- unsigned int flags = str->flags;
- unsigned int ch = str->ch;
- eol_type_t eol_type = CODING_SYSTEM_EOL_TYPE (str->codesys);
- unsigned char char_boundary = str->iso2022.current_char_boundary;
- Lisp_Object charset = str->iso2022.current_charset;
-
-#ifdef ENABLE_COMPOSITE_CHARS
- /* flags for handling composite chars. We do a little switcharoo
- on the source while we're outputting the composite char. */
- unsigned int saved_n = 0;
- CONST unsigned char *saved_src = NULL;
- int in_composite = 0;
-
- back_to_square_n:
-#endif /* ENABLE_COMPOSITE_CHARS */
-
- while (n--)
- {
- unsigned char c = *src++;
-
- if (BYTE_ASCII_P (c))
- { /* Processing ASCII character */
- ch = 0;
- if (c == '\n')
- {
- if (eol_type != EOL_LF && eol_type != EOL_AUTODETECT)
- Dynarr_add (dst, '\r');
- if (eol_type != EOL_CR)
- Dynarr_add (dst, c);
- }
- else
- encode_utf8 (Vcharset_ascii, c, 0, dst);
- char_boundary = 1;
- }
- else if (BUFBYTE_LEADING_BYTE_P (c) || BUFBYTE_LEADING_BYTE_P (ch))
- { /* Processing Leading Byte */
- ch = 0;
- charset = CHARSET_BY_LEADING_BYTE (c);
- if (LEADING_BYTE_PREFIX_P(c))
- ch = c;
- char_boundary = 0;
- }
- else
- { /* Processing Non-ASCII character */
- char_boundary = 1;
- if (EQ (charset, Vcharset_control_1))
- {
- encode_utf8 (Vcharset_control_1, c, 0, dst);
- }
- else
- {
- switch (XCHARSET_REP_BYTES (charset))
- {
- case 2:
- encode_utf8 (charset, c, 0, dst);
- break;
- case 3:
- if (XCHARSET_PRIVATE_P (charset))
- {
- encode_utf8 (charset, c, 0, dst);
- ch = 0;
- }
- else if (ch)
- {
-#ifdef ENABLE_COMPOSITE_CHARS
- if (EQ (charset, Vcharset_composite))
- {
- if (in_composite)
- {
- /* #### Bother! We don't know how to
- handle this yet. */
- encode_utf8 (Vcharset_ascii, '~', 0, dst);
- }
- else
- {
- Emchar emch = MAKE_CHAR (Vcharset_composite,
- ch & 0x7F, c & 0x7F);
- Lisp_Object lstr = composite_char_string (emch);
- saved_n = n;
- saved_src = src;
- in_composite = 1;
- src = XSTRING_DATA (lstr);
- n = XSTRING_LENGTH (lstr);
- }
- }
- else
-#endif /* ENABLE_COMPOSITE_CHARS */
- {
- encode_utf8 (charset, ch, c, dst);
- }
- ch = 0;
- }
- else
- {
- ch = c;
- char_boundary = 0;
- }
- break;
- case 4:
- if (ch)
- {
- encode_utf8 (charset, ch, c, dst);
- ch = 0;
- }
- else
- {
- ch = c;
- char_boundary = 0;
- }
- break;
- default:
- abort ();
- }
- }
- }
- }
-
-#ifdef ENABLE_COMPOSITE_CHARS
- if (in_composite)
- {
- n = saved_n;
- src = saved_src;
- in_composite = 0;
- goto back_to_square_n; /* Wheeeeeeeee ..... */
- }
-#endif
-
- str->flags = flags;
- str->ch = ch;
- str->iso2022.current_char_boundary = char_boundary;
- str->iso2022.current_charset = charset;
-
- /* Verbum caro factum est! */
-}
-
-\f
-/************************************************************************/
/* ISO2022 methods */
/************************************************************************/
/* The following note describes the coding system ISO2022 briefly.
- Since the intention of this note is to help understand the
- functions in this file, some parts are NOT ACCURATE or OVERLY
+ Since the intention of this note is to help understanding of the
+ programs in this file, some parts are NOT ACCURATE or OVERLY
SIMPLIFIED. For thorough understanding, please refer to the
original document of ISO2022.
ISO2022 provides many mechanisms to encode several character sets
- in 7-bit and 8-bit environments. For 7-bit environments, all text
- is encoded using bytes less than 128. This may make the encoded
- text a little bit longer, but the text passes more easily through
- several gateways, some of which strip off MSB (Most Signigant Bit).
+ in 7-bit and 8-bit environments. If one chooses 7-bit environment,
+ all text is encoded by codes of less than 128. This may make the
+ encoded text a little bit longer, but the text get more stability
+ to pass through several gateways (some of them strip off MSB).
- There are two kinds of character sets: control character set and
+ There are two kind of character sets: control character set and
graphic character set. The former contains control characters such
as `newline' and `escape' to provide control functions (control
- functions are also provided by escape sequences). The latter
+ functions are provided also by escape sequence). The latter
contains graphic characters such as 'A' and '-'. Emacs recognizes
two control character sets and many graphic character sets.
- Graphic character sets are classified into one of the following
- four classes, according to the number of bytes (DIMENSION) and
- number of characters in one dimension (CHARS) of the set:
- - DIMENSION1_CHARS94
- - DIMENSION1_CHARS96
- - DIMENSION2_CHARS94
- - DIMENSION2_CHARS96
-
- In addition, each character set is assigned an identification tag,
- unique for each set, called "final character" (denoted as <F>
- hereafter). The <F> of each character set is decided by ECMA(*)
- when it is registered in ISO. The code range of <F> is 0x30..0x7F
- (0x30..0x3F are for private use only).
+ Graphic character sets are classified into one of four types,
+ according to the dimension and number of characters in the set:
+ TYPE94, TYPE96, TYPE94x94, and TYPE96x96. In addition, each
+ character set is assigned an identification byte, unique for each
+ type, called "final character" (denoted as <F> hereafter). The <F>
+ of each character set is decided by ECMA(*) when it is registered
+ in ISO. Code range of <F> is 0x30..0x7F (0x30..0x3F are for
+ private use only).
Note (*): ECMA = European Computer Manufacturers Association
Here are examples of graphic character set [NAME(<F>)]:
- o DIMENSION1_CHARS94 -- ASCII('B'), right-half-of-JISX0201('I'), ...
- o DIMENSION1_CHARS96 -- right-half-of-ISO8859-1('A'), ...
- o DIMENSION2_CHARS94 -- GB2312('A'), JISX0208('B'), ...
- o DIMENSION2_CHARS96 -- none for the moment
+ o TYPE94 -- ASCII('B'), right-half-of-JISX0201('I'), ...
+ o TYPE96 -- right-half-of-ISO8859-1('A'), ...
+ o TYPE94x94 -- GB2312('A'), JISX0208('B'), ...
+ o TYPE96x96 -- none for the moment
- A code area (1 byte = 8 bits) is divided into 4 areas, C0, GL, C1, and GR.
+ A code area (1byte=8bits) is divided into 4 areas, C0, GL, C1, and GR.
C0 [0x00..0x1F] -- control character plane 0
GL [0x20..0x7F] -- graphic character plane 0
C1 [0x80..0x9F] -- control character plane 1
these invocations and designations are omitted in encoded text.
In a 7-bit environment, only GL can be used.
- When a graphic character set of CHARS94 is invoked to GL, codes
- 0x20 and 0x7F of the GL area work as control characters SPACE and
- DEL respectively, and codes 0xA0 and 0xFF of the GR area should not
- be used.
+ When a graphic character set of TYPE94 or TYPE94x94 is invoked to
+ GL, codes 0x20 and 0x7F of the GL area work as control characters
+ SPACE and DEL respectively, and code 0xA0 and 0xFF of GR area
+ should not be used.
There are two ways of invocation: locking-shift and single-shift.
With locking-shift, the invocation lasts until the next different
- invocation, whereas with single-shift, the invocation affects the
- following character only and doesn't affect the locking-shift
- state. Invocations are done by the following control characters or
- escape sequences:
+ invocation, whereas with single-shift, the invocation works only
+ for the following character and doesn't affect locking-shift.
+ Invocations are done by the following control characters or escape
+ sequences.
----------------------------------------------------------------------
abbrev function cntrl escape seq description
----------------------------------------------------------------------
SI/LS0 (shift-in) 0x0F none invoke G0 into GL
SO/LS1 (shift-out) 0x0E none invoke G1 into GL
+ LS1R (locking-shift-1 right) none ESC '~' invoke G1 into GR
LS2 (locking-shift-2) none ESC 'n' invoke G2 into GL
+ LS2R (locking-shift-2 right) none ESC '}' invoke G2 into GR
LS3 (locking-shift-3) none ESC 'o' invoke G3 into GL
- LS1R (locking-shift-1 right) none ESC '~' invoke G1 into GR (*)
- LS2R (locking-shift-2 right) none ESC '}' invoke G2 into GR (*)
- LS3R (locking-shift 3 right) none ESC '|' invoke G3 into GR (*)
+ LS3R (locking-shift 3 right) none ESC '|' invoke G3 into GR
SS2 (single-shift-2) 0x8E ESC 'N' invoke G2 for one char
SS3 (single-shift-3) 0x8F ESC 'O' invoke G3 for one char
----------------------------------------------------------------------
- (*) These are not used by any known coding system.
+ The first four are for locking-shift. Control characters for these
+ functions are defined by macros ISO_CODE_XXX in `coding.h'.
- Control characters for these functions are defined by macros
- ISO_CODE_XXX in `coding.h'.
-
- Designations are done by the following escape sequences:
+ Designations are done by the following escape sequences.
----------------------------------------------------------------------
escape sequence description
----------------------------------------------------------------------
- ESC '(' <F> designate DIMENSION1_CHARS94<F> to G0
- ESC ')' <F> designate DIMENSION1_CHARS94<F> to G1
- ESC '*' <F> designate DIMENSION1_CHARS94<F> to G2
- ESC '+' <F> designate DIMENSION1_CHARS94<F> to G3
- ESC ',' <F> designate DIMENSION1_CHARS96<F> to G0 (*)
- ESC '-' <F> designate DIMENSION1_CHARS96<F> to G1
- ESC '.' <F> designate DIMENSION1_CHARS96<F> to G2
- ESC '/' <F> designate DIMENSION1_CHARS96<F> to G3
- ESC '$' '(' <F> designate DIMENSION2_CHARS94<F> to G0 (**)
- ESC '$' ')' <F> designate DIMENSION2_CHARS94<F> to G1
- ESC '$' '*' <F> designate DIMENSION2_CHARS94<F> to G2
- ESC '$' '+' <F> designate DIMENSION2_CHARS94<F> to G3
- ESC '$' ',' <F> designate DIMENSION2_CHARS96<F> to G0 (*)
- ESC '$' '-' <F> designate DIMENSION2_CHARS96<F> to G1
- ESC '$' '.' <F> designate DIMENSION2_CHARS96<F> to G2
- ESC '$' '/' <F> designate DIMENSION2_CHARS96<F> to G3
+ ESC '(' <F> designate TYPE94<F> to G0
+ ESC ')' <F> designate TYPE94<F> to G1
+ ESC '*' <F> designate TYPE94<F> to G2
+ ESC '+' <F> designate TYPE94<F> to G3
+ ESC ',' <F> designate TYPE96<F> to G0 (*)
+ ESC '-' <F> designate TYPE96<F> to G1
+ ESC '.' <F> designate TYPE96<F> to G2
+ ESC '/' <F> designate TYPE96<F> to G3
+ ESC '$' '(' <F> designate TYPE94x94<F> to G0 (**)
+ ESC '$' ')' <F> designate TYPE94x94<F> to G1
+ ESC '$' '*' <F> designate TYPE94x94<F> to G2
+ ESC '$' '+' <F> designate TYPE94x94<F> to G3
+ ESC '$' ',' <F> designate TYPE96x96<F> to G0 (*)
+ ESC '$' '-' <F> designate TYPE96x96<F> to G1
+ ESC '$' '.' <F> designate TYPE96x96<F> to G2
+ ESC '$' '/' <F> designate TYPE96x96<F> to G3
----------------------------------------------------------------------
-
- In this list, "DIMENSION1_CHARS94<F>" means a graphic character set
- of dimension 1, chars 94, and final character <F>, etc...
+ In this list, "TYPE94<F>" means a graphic character set of type TYPE94
+ and final character <F>, and etc.
Note (*): Although these designations are not allowed in ISO2022,
Emacs accepts them on decoding, and produces them on encoding
- CHARS96 character sets in a coding system which is characterized as
- 7-bit environment, non-locking-shift, and non-single-shift.
+ TYPE96 or TYPE96x96 character set in a coding system which is
+ characterized as 7-bit environment, non-locking-shift, and
+ non-single-shift.
Note (**): If <F> is '@', 'A', or 'B', the intermediate character
- '(' can be omitted. We refer to this as "short-form" hereafter.
+ '(' can be omitted. We call this as "short-form" here after.
Now you may notice that there are a lot of ways for encoding the
same multilingual text in ISO2022. Actually, there exist many
- coding systems such as Compound Text (used in X11's inter client
+ coding systems such as Compound Text (used in X's inter client
communication, ISO-2022-JP (used in Japanese internet), ISO-2022-KR
(used in Korean internet), EUC (Extended UNIX Code, used in Asian
localized platforms), and all of these are variants of ISO2022.
sequences: ISO6429's direction specification and Emacs' private
sequence for specifying character composition.
- ISO6429's direction specification takes the following form:
+ ISO6429's direction specification takes the following format:
o CSI ']' -- end of the current direction
o CSI '0' ']' -- end of the current direction
o CSI '1' ']' -- start of left-to-right text
o CSI '2' ']' -- start of right-to-left text
The control character CSI (0x9B: control sequence introducer) is
- abbreviated to the escape sequence ESC '[' in a 7-bit environment.
+ abbreviated to the escape sequence ESC '[' in 7-bit environment.
- Character composition specification takes the following form:
+ Character composition specification takes the following format:
o ESC '0' -- start character composition
o ESC '1' -- end character composition
- Since these are not standard escape sequences of any ISO standard,
- their use with these meanings is restricted to Emacs only. */
+ Since these are not standard escape sequences of any ISO, the use
+ of them for these meanings is restricted to Emacs only. */
static void
reset_iso2022 (Lisp_Object coding_system, struct iso2022_decoder *iso)
iso->invalid_switch_dir = 0;
iso->output_direction_sequence = 0;
iso->output_literally = 0;
-#ifdef ENABLE_COMPOSITE_CHARS
if (iso->composite_chars)
Dynarr_reset (iso->composite_chars);
-#endif
}
static int
reg = 3; half = 1;
goto locking_shift;
-#ifdef ENABLE_COMPOSITE_CHARS
/**** composite ****/
case '0':
*flags = (*flags & CODING_STATE_ISO2022_LOCK) &
~CODING_STATE_COMPOSITE;
return 1;
-#endif /* ENABLE_COMPOSITE_CHARS */
/**** directionality ****/
detect_coding_iso2022 (struct detection_state *st, CONST unsigned char *src,
unsigned int n)
{
+ int c;
int mask;
/* #### There are serious deficiencies in the recognition mechanism
- here. This needs to be much smarter if it's going to cut it.
- The sequence "\xff\x0f" is currently detected as LOCK_SHIFT while
- it should be detected as Latin-1.
- All the ISO2022 stuff in this file should be synced up with the
- code from FSF Emacs-20.4, in which Mule should be more or less stable.
- Perhaps we should wait till R2L works in FSF Emacs? */
+ here. This needs to be much smarter if it's going to cut it. */
if (!st->iso2022.initted)
{
while (n--)
{
- int c = *src++;
+ c = *src++;
if (c >= 0xA0)
{
mask &= ~CODING_CATEGORY_ISO_7_MASK;
need to handle the CSI differently. */
static void
-restore_left_to_right_direction (Lisp_Coding_System *codesys,
+restore_left_to_right_direction (struct Lisp_Coding_System *codesys,
unsigned_char_dynarr *dst,
unsigned int *flags,
int internal_p)
need to handle the CSI differently. */
static void
-ensure_correct_direction (int direction, Lisp_Coding_System *codesys,
+ensure_correct_direction (int direction, struct Lisp_Coding_System *codesys,
unsigned_char_dynarr *dst, unsigned int *flags,
int internal_p)
{
decode_coding_iso2022 (Lstream *decoding, CONST unsigned char *src,
unsigned_char_dynarr *dst, unsigned int n)
{
+ unsigned char c;
+ unsigned int flags, ch;
+ enum eol_type eol_type;
struct decoding_stream *str = DECODING_STREAM_DATA (decoding);
- unsigned int flags = str->flags;
- unsigned int ch = str->ch;
- eol_type_t eol_type = str->eol_type;
-#ifdef ENABLE_COMPOSITE_CHARS
- unsigned_char_dynarr *real_dst = dst;
-#endif
Lisp_Object coding_system;
+ unsigned_char_dynarr *real_dst = dst;
+ CODING_STREAM_DECOMPOSE (str, flags, ch);
+ eol_type = str->eol_type;
XSETCODING_SYSTEM (coding_system, str->codesys);
-#ifdef ENABLE_COMPOSITE_CHARS
if (flags & CODING_STATE_COMPOSITE)
dst = str->iso2022.composite_chars;
-#endif /* ENABLE_COMPOSITE_CHARS */
while (n--)
{
- unsigned char c = *src++;
+ c = *src++;
if (flags & CODING_STATE_ESCAPE)
{ /* Within ESC sequence */
int retval = parse_iso2022_esc (coding_system, &str->iso2022,
{
switch (str->iso2022.esc)
{
-#ifdef ENABLE_COMPOSITE_CHARS
case ISO_ESC_START_COMPOSITE:
if (str->iso2022.composite_chars)
Dynarr_reset (str->iso2022.composite_chars);
Dynarr_add_many (dst, comstr, len);
break;
}
-#endif /* ENABLE_COMPOSITE_CHARS */
case ISO_ESC_LITERAL:
DECODE_ADD_BINARY_CHAR (c, dst);
charset = str->iso2022.charset[reg];
/* Error checking: */
- if (! CHARSETP (charset)
- || str->iso2022.invalid_designated[reg]
+ if (NILP (charset) || str->iso2022.invalid_designated[reg]
|| (((c & 0x7F) == ' ' || (c & 0x7F) == ISO_CODE_DEL)
&& XCHARSET_CHARS (charset) == 94))
/* Mrmph. We are trying to invoke a register that has no
if (flags & CODING_STATE_END)
DECODE_OUTPUT_PARTIAL_CHAR (ch);
- str->flags = flags;
- str->ch = ch;
+ CODING_STREAM_COMPOSE (str, flags, ch);
}
iso2022_designate (Lisp_Object charset, unsigned char reg,
struct encoding_stream *str, unsigned_char_dynarr *dst)
{
- static CONST char inter94[] = "()*+";
- static CONST char inter96[] = ",-./";
+ CONST char *inter94 = "()*+", *inter96= ",-./";
unsigned int type;
unsigned char final;
Lisp_Object old_charset = str->iso2022.charset[reg];
unsigned_char_dynarr *dst, unsigned int n)
{
unsigned char charmask, c;
+ unsigned int flags, ch;
+ enum eol_type eol_type;
unsigned char char_boundary;
struct encoding_stream *str = ENCODING_STREAM_DATA (encoding);
- unsigned int flags = str->flags;
- unsigned int ch = str->ch;
- Lisp_Coding_System *codesys = str->codesys;
- eol_type_t eol_type = CODING_SYSTEM_EOL_TYPE (str->codesys);
+ struct Lisp_Coding_System *codesys = str->codesys;
int i;
Lisp_Object charset;
int half;
-#ifdef ENABLE_COMPOSITE_CHARS
/* flags for handling composite chars. We do a little switcharoo
on the source while we're outputting the composite char. */
unsigned int saved_n = 0;
CONST unsigned char *saved_src = NULL;
int in_composite = 0;
-#endif /* ENABLE_COMPOSITE_CHARS */
+ CODING_STREAM_DECOMPOSE (str, flags, ch);
+ eol_type = CODING_SYSTEM_EOL_TYPE (str->codesys);
char_boundary = str->iso2022.current_char_boundary;
charset = str->iso2022.current_charset;
half = str->iso2022.current_half;
-#ifdef ENABLE_COMPOSITE_CHARS
back_to_square_n:
-#endif
while (n--)
{
c = *src++;
if (LEADING_BYTE_PREFIX_P(c))
ch = c;
else if (!EQ (charset, Vcharset_control_1)
-#ifdef ENABLE_COMPOSITE_CHARS
- && !EQ (charset, Vcharset_composite)
-#endif
- )
+ && !EQ (charset, Vcharset_composite))
{
int reg;
}
else if (ch)
{
-#ifdef ENABLE_COMPOSITE_CHARS
if (EQ (charset, Vcharset_composite))
{
if (in_composite)
}
}
else
-#endif /* ENABLE_COMPOSITE_CHARS */
{
Dynarr_add (dst, ch & charmask);
Dynarr_add (dst, c & charmask);
}
}
-#ifdef ENABLE_COMPOSITE_CHARS
if (in_composite)
{
n = saved_n;
Dynarr_add (dst, '1'); /* end composing */
goto back_to_square_n; /* Wheeeeeeeee ..... */
}
-#endif /* ENABLE_COMPOSITE_CHARS */
if (char_boundary && flags & CODING_STATE_END)
{
}
}
- str->flags = flags;
- str->ch = ch;
+ CODING_STREAM_COMPOSE (str, flags, ch);
str->iso2022.current_char_boundary = char_boundary;
str->iso2022.current_charset = charset;
str->iso2022.current_half = half;
unsigned_char_dynarr *dst, unsigned int n)
{
unsigned char c;
+ unsigned int flags, ch;
+ enum eol_type eol_type;
struct decoding_stream *str = DECODING_STREAM_DATA (decoding);
- unsigned int flags = str->flags;
- unsigned int ch = str->ch;
- eol_type_t eol_type = str->eol_type;
+
+ CODING_STREAM_DECOMPOSE (str, flags, ch);
+ eol_type = str->eol_type;
while (n--)
{
DECODE_HANDLE_END_OF_CONVERSION (flags, ch, dst);
- str->flags = flags;
- str->ch = ch;
+ CODING_STREAM_COMPOSE (str, flags, ch);
}
static void
{
unsigned char c;
struct encoding_stream *str = ENCODING_STREAM_DATA (encoding);
- unsigned int flags = str->flags;
- unsigned int ch = str->ch;
- eol_type_t eol_type = CODING_SYSTEM_EOL_TYPE (str->codesys);
+ unsigned int flags, ch;
+ enum eol_type eol_type;
+
+ CODING_STREAM_DECOMPOSE (str, flags, ch);
+ eol_type = CODING_SYSTEM_EOL_TYPE (str->codesys);
while (n--)
{
}
}
- str->flags = flags;
- str->ch = ch;
+ CODING_STREAM_COMPOSE (str, flags, ch);
}
\f
/* Determine coding system from coding format */
+#define FILE_NAME_CODING_SYSTEM \
+ ((NILP (Vfile_name_coding_system) || \
+ (EQ ((Vfile_name_coding_system), Qbinary))) ? \
+ Qnil : Fget_coding_system (Vfile_name_coding_system))
+
/* #### not correct for all values of `fmt'! */
-static Lisp_Object
-external_data_format_to_coding_system (enum external_data_format fmt)
-{
- switch (fmt)
- {
- case FORMAT_FILENAME:
- case FORMAT_TERMINAL:
- if (EQ (Vfile_name_coding_system, Qnil) ||
- EQ (Vfile_name_coding_system, Qbinary))
- return Qnil;
- else
- return Fget_coding_system (Vfile_name_coding_system);
#ifdef MULE
- case FORMAT_CTEXT:
- return Fget_coding_system (Qctext);
+#define FMT_CODING_SYSTEM(fmt) \
+ (((fmt) == FORMAT_FILENAME) ? FILE_NAME_CODING_SYSTEM : \
+ ((fmt) == FORMAT_CTEXT ) ? Fget_coding_system (Qctext) : \
+ ((fmt) == FORMAT_TERMINAL) ? FILE_NAME_CODING_SYSTEM : \
+ Qnil)
+#else
+#define FMT_CODING_SYSTEM(fmt) \
+ (((fmt) == FORMAT_FILENAME) ? FILE_NAME_CODING_SYSTEM : \
+ ((fmt) == FORMAT_TERMINAL) ? FILE_NAME_CODING_SYSTEM : \
+ Qnil)
#endif
- default:
- return Qnil;
- }
-}
Extbyte *
convert_to_external_format (CONST Bufbyte *ptr,
Extcount *len_out,
enum external_data_format fmt)
{
- Lisp_Object coding_system = external_data_format_to_coding_system (fmt);
+ Lisp_Object coding_system = FMT_CODING_SYSTEM (fmt);
if (!conversion_out_dynarr)
conversion_out_dynarr = Dynarr_new (Extbyte);
Bytecount *len_out,
enum external_data_format fmt)
{
- Lisp_Object coding_system = external_data_format_to_coding_system (fmt);
+ Lisp_Object coding_system = FMT_CODING_SYSTEM (fmt);
if (!conversion_in_dynarr)
conversion_in_dynarr = Dynarr_new (Bufbyte);
/************************************************************************/
void
-syms_of_file_coding (void)
+syms_of_mule_coding (void)
{
defsymbol (&Qbuffer_file_coding_system, "buffer-file-coding-system");
deferror (&Qcoding_system_error, "coding-system-error",
DEFSUBR (Fcoding_system_name);
DEFSUBR (Fmake_coding_system);
DEFSUBR (Fcopy_coding_system);
- DEFSUBR (Fdefine_coding_system_alias);
DEFSUBR (Fsubsidiary_coding_system);
DEFSUBR (Fcoding_system_type);
DEFSUBR (Fencode_shift_jis_char);
DEFSUBR (Fdecode_big5_char);
DEFSUBR (Fencode_big5_char);
- DEFSUBR (Fset_ucs_char);
- DEFSUBR (Fucs_char);
- DEFSUBR (Fset_char_ucs);
- DEFSUBR (Fchar_ucs);
#endif /* MULE */
defsymbol (&Qcoding_system_p, "coding-system-p");
defsymbol (&Qno_conversion, "no-conversion");
- defsymbol (&Qraw_text, "raw-text");
#ifdef MULE
defsymbol (&Qbig5, "big5");
defsymbol (&Qshift_jis, "shift-jis");
- defsymbol (&Qucs4, "ucs-4");
- defsymbol (&Qutf8, "utf-8");
defsymbol (&Qccl, "ccl");
defsymbol (&Qiso2022, "iso2022");
#endif /* MULE */
"shift-jis");
defsymbol (&coding_category_symbol[CODING_CATEGORY_BIG5],
"big5");
- defsymbol (&coding_category_symbol[CODING_CATEGORY_UCS4],
- "ucs-4");
- defsymbol (&coding_category_symbol[CODING_CATEGORY_UTF8],
- "utf-8");
defsymbol (&coding_category_symbol[CODING_CATEGORY_ISO_7],
"iso-7");
defsymbol (&coding_category_symbol[CODING_CATEGORY_ISO_8_DESIGNATE],
}
void
-lstream_type_create_file_coding (void)
+lstream_type_create_mule_coding (void)
{
LSTREAM_HAS_METHOD (decoding, reader);
LSTREAM_HAS_METHOD (decoding, writer);
}
void
-vars_of_file_coding (void)
+vars_of_mule_coding (void)
{
int i;
}
void
-complex_vars_of_file_coding (void)
+complex_vars_of_mule_coding (void)
{
- staticpro (&Vcoding_system_hash_table);
- Vcoding_system_hash_table =
- make_lisp_hash_table (50, HASH_TABLE_NON_WEAK, HASH_TABLE_EQ);
+ staticpro (&Vcoding_system_hashtable);
+ Vcoding_system_hashtable = make_lisp_hashtable (50, HASHTABLE_NONWEAK,
+ HASHTABLE_EQ);
the_codesys_prop_dynarr = Dynarr_new (codesys_prop);
DEFINE_CODESYS_PROP (CODESYS_PROP_CCL, Qdecode);
#endif /* MULE */
/* Need to create this here or we're really screwed. */
- Fmake_coding_system
- (Qraw_text, Qno_conversion,
- build_string ("Raw text, which means it converts only line-break-codes."),
- list2 (Qmnemonic, build_string ("Raw")));
+ Fmake_coding_system (Qno_conversion, Qno_conversion, build_string ("No conversion"),
+ list2 (Qmnemonic, build_string ("Noconv")));
- Fmake_coding_system
- (Qbinary, Qno_conversion,
- build_string ("Binary, which means it does not convert anything."),
- list4 (Qeol_type, Qlf,
- Qmnemonic, build_string ("Binary")));
-
- Fdefine_coding_system_alias (Qno_conversion, Qraw_text);
+ Fcopy_coding_system (Fcoding_system_property (Qno_conversion, Qeol_lf),
+ Qbinary);
/* Need this for bootstrapping */
coding_category_system[CODING_CATEGORY_NO_CONVERSION] =
- Fget_coding_system (Qraw_text);
-
-#ifdef MULE
- {
- unsigned int i;
-
- for (i = 0; i < 65536; i++)
- ucs_to_mule_table[i] = Qnil;
- }
- staticpro (&mule_to_ucs_table);
- mule_to_ucs_table = Fmake_char_table(Qgeneric);
-#endif /* MULE */
+ Fget_coding_system (Qno_conversion);
}
CODESYS_ISO2022, /* Any ISO2022-compliant coding system.
Includes JIS, EUC, CTEXT */
CODESYS_BIG5, /* BIG5 (used for Taiwanese). */
- CODESYS_UCS4, /* ISO 10646 UCS-4 */
- CODESYS_UTF8, /* ISO 10646 UTF-8 */
CODESYS_CCL, /* Converter written in CCL. */
#endif
CODESYS_NO_CONVERSION /* "No conversion"; used for binary files.
EOL_CRLF,
EOL_CR
};
-typedef enum eol_type eol_type_t;
#ifdef MULE
typedef struct charset_conversion_spec charset_conversion_spec;
} ccl;
#endif
};
-typedef struct Lisp_Coding_System Lisp_Coding_System;
DECLARE_LRECORD (coding_system, struct Lisp_Coding_System);
#define XCODING_SYSTEM(x) XRECORD (x, coding_system, struct Lisp_Coding_System)
EXFUN (Fset_coding_priority_list, 1);
EXFUN (Fsubsidiary_coding_system, 2);
-extern Lisp_Object Qucs4, Qutf8;
extern Lisp_Object Qbig5, Qbuffer_file_coding_system, Qccl, Qcharset_g0;
extern Lisp_Object Qcharset_g1, Qcharset_g2, Qcharset_g3, Qcoding_system_error;
extern Lisp_Object Qcoding_system_p, Qcr, Qcrlf, Qctext, Qdecode, Qencode;
extern Lisp_Object Qforce_g2_on_output, Qforce_g3_on_output;
extern Lisp_Object Qinput_charset_conversion, Qiso2022, Qlf, Qlock_shift;
extern Lisp_Object Qmnemonic, Qno_ascii_cntl, Qno_ascii_eol, Qno_conversion;
-extern Lisp_Object Qraw_text;
extern Lisp_Object Qno_iso6429, Qoutput_charset_conversion;
extern Lisp_Object Qpost_read_conversion, Qpre_write_conversion, Qseven;
extern Lisp_Object Qshift_jis, Qshort, Vcoding_system_for_read;
-extern Lisp_Object Vcoding_system_for_write, Vcoding_system_hash_table;
+extern Lisp_Object Vcoding_system_for_write, Vcoding_system_hashtable;
extern Lisp_Object Vfile_name_coding_system, Vkeyboard_coding_system;
extern Lisp_Object Vterminal_coding_system;
CODING_STATE_SS2 overrides; but
this probably indicates an error
in the text encoding. */
-#ifdef ENABLE_COMPOSITE_CHARS
#define CODING_STATE_COMPOSITE (1 << 8) /* If set, we're currently processing
a composite character (i.e. a
character constructed by
overstriking two or more
characters). */
-#endif /* ENABLE_COMPOSITE_CHARS */
/* CODING_STATE_ISO2022_LOCK is the mask of flags that remain on until
explicitly turned off when in the ISO2022 encoder/decoder. Other flags are
turned off at the end of processing each character or escape sequence. */
-#ifdef ENABLE_COMPOSITE_CHARS
# define CODING_STATE_ISO2022_LOCK \
(CODING_STATE_END | CODING_STATE_COMPOSITE | CODING_STATE_R2L)
-#else
-# define CODING_STATE_ISO2022_LOCK (CODING_STATE_END | CODING_STATE_R2L)
-#endif
-
-#define CODING_STATE_BIG5_LOCK CODING_STATE_END
+#define CODING_STATE_BIG5_LOCK \
+ CODING_STATE_END
/* Flags indicating what we've seen so far when parsing an
ISO2022 escape sequence. */
starts a directionality-control
sequence. The next character
must be 0, 1, 2, or ]. */
- ISO_ESC_5_11_0, /* We've seen 0x9B 0. The next character must be ]. */
- ISO_ESC_5_11_1, /* We've seen 0x9B 1. The next character must be ]. */
- ISO_ESC_5_11_2, /* We've seen 0x9B 2. The next character must be ]. */
+ ISO_ESC_5_11_0, /* We've seen 0x9B 0. The next
+ character must be ]. */
+ ISO_ESC_5_11_1, /* We've seen 0x9B 1. The next
+ character must be ]. */
+ ISO_ESC_5_11_2, /* We've seen 0x9B 2. The next
+ character must be ]. */
/* Full sequences. */
-#ifdef ENABLE_COMPOSITE_CHARS
ISO_ESC_START_COMPOSITE, /* Private usage for START COMPOSING */
- ISO_ESC_END_COMPOSITE, /* Private usage for END COMPOSING */
-#endif /* ENABLE_COMPOSITE_CHARS */
+ ISO_ESC_END_COMPOSITE, /* Private usage for END COMPOSING */
ISO_ESC_SINGLE_SHIFT, /* We've seen a complete single-shift sequence. */
ISO_ESC_LOCKING_SHIFT,/* We've seen a complete locking-shift sequence. */
ISO_ESC_DESIGNATE, /* We've seen a complete designation sequence. */
#define ISO_CODE_CSI 0x9B /* control-sequence-introduce */
#endif /* MULE */
+/* Macros to access an encoding stream or decoding stream */
+
+#define CODING_STREAM_DECOMPOSE(str, flags, ch) \
+do { \
+ flags = (str)->flags; \
+ ch = (str)->ch; \
+} while (0)
+
+#define CODING_STREAM_COMPOSE(str, flags, ch) \
+do { \
+ (str)->flags = flags; \
+ (str)->ch = ch; \
+} while (0)
+
+
/* For detecting the encoding of text */
enum coding_category_type
{
two-dimension characters in the upper half. */
CODING_CATEGORY_ISO_LOCK_SHIFT, /* ISO2022 system using locking shift */
CODING_CATEGORY_BIG5,
- CODING_CATEGORY_UCS4,
- CODING_CATEGORY_UTF8,
#endif /* MULE */
CODING_CATEGORY_NO_CONVERSION
};
(1 << CODING_CATEGORY_ISO_LOCK_SHIFT)
#define CODING_CATEGORY_BIG5_MASK \
(1 << CODING_CATEGORY_BIG5)
-#define CODING_CATEGORY_UCS4_MASK \
- (1 << CODING_CATEGORY_UCS4)
-#define CODING_CATEGORY_UTF8_MASK \
- (1 << CODING_CATEGORY_UTF8)
#endif
#define CODING_CATEGORY_NO_CONVERSION_MASK \
(1 << CODING_CATEGORY_NO_CONVERSION)
#ifndef MULE
#define MIN_LEADING_BYTE 0x80
/* These need special treatment in a string and/or character */
-#ifdef ENABLE_COMPOSITE_CHARS
#define LEADING_BYTE_COMPOSITE 0x80 /* for a composite character */
-#endif
#define LEADING_BYTE_CONTROL_1 0x8F /* represent normal 80-9F */
#define LEADING_BYTE_LATIN_ISO8859_1 0x81 /* Right half of ISO 8859-1 */
#define BYTE_C1_P(c) ((unsigned int) ((unsigned int) (c) - 0x80) < 0x20)
#include "buffer.h"
#include "bytecode.h"
+#include "commands.h"
#include "device.h"
#include "events.h"
#include "extents.h"
#include "frame.h"
#include "systime.h"
-#include "insdel.h"
-#include "lstream.h"
-#include "opaque.h"
/* NOTE: This symbol is also used in lread.c */
#define FEATUREP_SYNTAX
}
static int
-bit_vector_equal (Lisp_Object obj1, Lisp_Object obj2, int depth)
+bit_vector_equal (Lisp_Object o1, Lisp_Object o2, int depth)
{
- struct Lisp_Bit_Vector *v1 = XBIT_VECTOR (obj1);
- struct Lisp_Bit_Vector *v2 = XBIT_VECTOR (obj2);
+ struct Lisp_Bit_Vector *v1 = XBIT_VECTOR (o1);
+ struct Lisp_Bit_Vector *v2 = XBIT_VECTOR (o2);
return ((bit_vector_length (v1) == bit_vector_length (v2)) &&
!memcmp (v1->bits, v2->bits,
DEFINE_BASIC_LRECORD_IMPLEMENTATION ("bit-vector", bit_vector,
mark_bit_vector, print_bit_vector, 0,
- bit_vector_equal, bit_vector_hash, 0,
+ bit_vector_equal, bit_vector_hash,
struct Lisp_Bit_Vector);
\f
DEFUN ("identity", Fidentity, 1, 1, 0, /*
return XINT (Flength (seq));
else
{
- struct Lisp_Compiled_Function *f = XCOMPILED_FUNCTION (seq);
+ struct Lisp_Compiled_Function *b = XCOMPILED_FUNCTION (seq);
- return (f->flags.interactivep ? COMPILED_INTERACTIVE :
- f->flags.domainp ? COMPILED_DOMAIN :
+ return (b->flags.interactivep ? COMPILED_INTERACTIVE :
+ b->flags.domainp ? COMPILED_DOMAIN :
COMPILED_DOC_STRING)
+ 1;
}
return make_int (XSTRING_CHAR_LENGTH (sequence));
else if (CONSP (sequence))
{
- int len;
- GET_EXTERNAL_LIST_LENGTH (sequence, len);
- return make_int (len);
+ Lisp_Object tail;
+ int i = 0;
+
+ EXTERNAL_LIST_LOOP (tail, sequence)
+ {
+ QUIT;
+ i++;
+ }
+
+ return make_int (i);
}
else if (VECTORP (sequence))
return make_int (XVECTOR_LENGTH (sequence));
}
}
+/* This does not check for quits. That is safe
+ since it must terminate. */
+
DEFUN ("safe-length", Fsafe_length, 1, 1, 0, /*
Return the length of a list, but avoid error or infinite loop.
This function never gets an error. If LIST is not really a list,
*/
(list))
{
- Lisp_Object hare, tortoise;
- int len;
+ Lisp_Object halftail = list; /* Used to detect circular lists. */
+ Lisp_Object tail;
+ int len = 0;
- for (hare = tortoise = list, len = 0;
- CONSP (hare) && (! EQ (hare, tortoise) || len == 0);
- hare = XCDR (hare), len++)
+ for (tail = list; CONSP (tail); tail = XCDR (tail))
{
- if (len & 1)
- tortoise = XCDR (tortoise);
+ if (EQ (tail, halftail) && len != 0)
+ break;
+ len++;
+ if ((len & 1) == 0)
+ halftail = XCDR (halftail);
}
return make_int (len);
properly, it would still not work because strcoll() does not
handle multiple locales. This is the fundamental flaw in the
locale model. */
- {
- Bytecount bcend = charcount_to_bytecount (string_data (p1), end);
- /* Compare strings using collation order of locale. */
- /* Need to be tricky to handle embedded nulls. */
+ Bytecount bcend = charcount_to_bytecount (string_data (p1), end);
+ /* Compare strings using collation order of locale. */
+ /* Need to be tricky to handle embedded nulls. */
- for (i = 0; i < bcend; i += strlen((char *) string_data (p1) + i) + 1)
- {
- int val = strcoll ((char *) string_data (p1) + i,
- (char *) string_data (p2) + i);
- if (val < 0)
- return Qt;
- if (val > 0)
- return Qnil;
- }
- }
+ for (i = 0; i < bcend; i += strlen((char *) string_data (p1) + i) + 1)
+ {
+ int val = strcoll ((char *) string_data (p1) + i,
+ (char *) string_data (p2) + i);
+ if (val < 0)
+ return Qt;
+ if (val > 0)
+ return Qnil;
+ }
#else /* not I18N2, or MULE */
- {
- Bufbyte *ptr1 = string_data (p1);
- Bufbyte *ptr2 = string_data (p2);
-
- /* #### It is not really necessary to do this: We could compare
- byte-by-byte and still get a reasonable comparison, since this
- would compare characters with a charset in the same way. With
- a little rearrangement of the leading bytes, we could make most
- inter-charset comparisons work out the same, too; even if some
- don't, this is not a big deal because inter-charset comparisons
- aren't really well-defined anyway. */
- for (i = 0; i < end; i++)
- {
- if (charptr_emchar (ptr1) != charptr_emchar (ptr2))
- return charptr_emchar (ptr1) < charptr_emchar (ptr2) ? Qt : Qnil;
- INC_CHARPTR (ptr1);
- INC_CHARPTR (ptr2);
- }
- }
+ /* #### It is not really necessary to do this: We could compare
+ byte-by-byte and still get a reasonable comparison, since this
+ would compare characters with a charset in the same way.
+ With a little rearrangement of the leading bytes, we could
+ make most inter-charset comparisons work out the same, too;
+ even if some don't, this is not a big deal because inter-charset
+ comparisons aren't really well-defined anyway. */
+ for (i = 0; i < end; i++)
+ {
+ if (string_char (p1, i) != string_char (p2, i))
+ return string_char (p1, i) < string_char (p2, i) ? Qt : Qnil;
+ }
#endif /* not I18N2, or MULE */
/* Can't do i < len2 because then comparison between "foo" and "foo^@"
won't work right in I18N2 case */
return concat (nargs, args, c_bit_vector, 0);
}
-/* Copy a (possibly dotted) list. LIST must be a cons.
- Can't use concat (1, &alist, c_cons, 0) - doesn't handle dotted lists. */
-static Lisp_Object
-copy_list (Lisp_Object list)
-{
- Lisp_Object list_copy = Fcons (XCAR (list), XCDR (list));
- Lisp_Object last = list_copy;
- Lisp_Object hare, tortoise;
- int len;
-
- for (tortoise = hare = XCDR (list), len = 1;
- CONSP (hare);
- hare = XCDR (hare), len++)
- {
- XCDR (last) = Fcons (XCAR (hare), XCDR (hare));
- last = XCDR (last);
-
- if (len < CIRCULAR_LIST_SUSPICION_LENGTH)
- continue;
- if (len & 1)
- tortoise = XCDR (tortoise);
- if (EQ (tortoise, hare))
- signal_circular_list_error (list);
- }
-
- return list_copy;
-}
-
-DEFUN ("copy-list", Fcopy_list, 1, 1, 0, /*
-Return a copy of list LIST, which may be a dotted list.
-The elements of LIST are not copied; they are shared
+DEFUN ("copy-sequence", Fcopy_sequence, 1, 1, 0, /*
+Return a copy of a list, vector, bit vector or string.
+The elements of a list or vector are not copied; they are shared
with the original.
*/
- (list))
+ (arg))
{
again:
- if (NILP (list)) return list;
- if (CONSP (list)) return copy_list (list);
+ if (NILP (arg)) return arg;
+ /* We handle conses separately because concat() is big and hairy and
+ doesn't handle (copy-sequence '(a b . c)) and it's easier to redo this
+ than to fix concat() without worrying about breaking other things.
+ */
+ if (CONSP (arg))
+ {
+ Lisp_Object head = Fcons (XCAR (arg), XCDR (arg));
+ Lisp_Object tail = head;
- list = wrong_type_argument (Qlistp, list);
- goto again;
-}
+ for (arg = XCDR (arg); CONSP (arg); arg = XCDR (arg))
+ {
+ XCDR (tail) = Fcons (XCAR (arg), XCDR (arg));
+ tail = XCDR (tail);
+ QUIT;
+ }
+ return head;
+ }
+ if (STRINGP (arg)) return concat (1, &arg, c_string, 0);
+ if (VECTORP (arg)) return concat (1, &arg, c_vector, 0);
+ if (BIT_VECTORP (arg)) return concat (1, &arg, c_bit_vector, 0);
-DEFUN ("copy-sequence", Fcopy_sequence, 1, 1, 0, /*
-Return a copy of list, vector, bit vector or string SEQUENCE.
-The elements of a list or vector are not copied; they are shared
-with the original. SEQUENCE may be a dotted list.
-*/
- (sequence))
-{
- again:
- if (NILP (sequence)) return sequence;
- if (CONSP (sequence)) return copy_list (sequence);
- if (STRINGP (sequence)) return concat (1, &sequence, c_string, 0);
- if (VECTORP (sequence)) return concat (1, &sequence, c_vector, 0);
- if (BIT_VECTORP (sequence)) return concat (1, &sequence, c_bit_vector, 0);
-
- check_losing_bytecode ("copy-sequence", sequence);
- sequence = wrong_type_argument (Qsequencep, sequence);
+ check_losing_bytecode ("copy-sequence", arg);
+ arg = wrong_type_argument (Qsequencep, arg);
goto again;
}
(string, from, to))
{
Charcount ccfr, ccto;
- Bytecount bfr, blen;
+ Bytecount bfr, bto;
Lisp_Object val;
CHECK_STRING (string);
+ /* Historically, FROM could not be omitted. Whatever ... */
CHECK_INT (from);
get_string_range_char (string, from, to, &ccfr, &ccto,
GB_HISTORICAL_STRING_BEHAVIOR);
bfr = charcount_to_bytecount (XSTRING_DATA (string), ccfr);
- blen = charcount_to_bytecount (XSTRING_DATA (string) + bfr, ccto - ccfr);
- val = make_string (XSTRING_DATA (string) + bfr, blen);
+ bto = charcount_to_bytecount (XSTRING_DATA (string), ccto);
+ val = make_string (XSTRING_DATA (string) + bfr, bto - bfr);
/* Copy any applicable extent information into the new string: */
- copy_string_extents (val, string, 0, bfr, blen);
+ copy_string_extents (val, string, 0, bfr, bto - bfr);
return val;
}
args_out_of_range (sequence, n);
#endif
}
- else if (STRINGP (sequence) ||
- VECTORP (sequence) ||
- BIT_VECTORP (sequence))
+ else if (STRINGP (sequence)
+ || VECTORP (sequence)
+ || BIT_VECTORP (sequence))
return Faref (sequence, n);
#ifdef LOSING_BYTECODE
else if (COMPILED_FUNCTIONP (sequence))
}
/* Utter perversity */
{
- Lisp_Compiled_Function *f = XCOMPILED_FUNCTION (sequence);
+ struct Lisp_Compiled_Function *b = XCOMPILED_FUNCTION (sequence);
switch (idx)
{
case COMPILED_ARGLIST:
- return compiled_function_arglist (f);
- case COMPILED_INSTRUCTIONS:
- return compiled_function_instructions (f);
+ return b->arglist;
+ case COMPILED_BYTECODE:
+ return b->bytecodes;
case COMPILED_CONSTANTS:
- return compiled_function_constants (f);
+ return b->constants;
case COMPILED_STACK_DEPTH:
- return compiled_function_stack_depth (f);
+ return make_int (b->maxdepth);
case COMPILED_DOC_STRING:
- return compiled_function_documentation (f);
+ return compiled_function_documentation (b);
case COMPILED_DOMAIN:
- return compiled_function_domain (f);
+ return compiled_function_domain (b);
case COMPILED_INTERACTIVE:
- if (f->flags.interactivep)
- return compiled_function_interactive (f);
+ if (b->flags.interactivep)
+ return compiled_function_interactive (b);
/* if we return nil, can't tell interactive with no args
from noninteractive. */
goto lose;
}
}
-DEFUN ("last", Flast, 1, 2, 0, /*
-Return the tail of list LIST, of length N (default 1).
-LIST may be a dotted list, but not a circular list.
-Optional argument N must be a non-negative integer.
-If N is zero, then the atom that terminates the list is returned.
-If N is greater than the length of LIST, then LIST itself is returned.
-*/
- (list, n))
-{
- int int_n, count;
- Lisp_Object retval, tortoise, hare;
-
- CHECK_LIST (list);
-
- if (NILP (n))
- int_n = 1;
- else
- {
- CHECK_NATNUM (n);
- int_n = XINT (n);
- }
-
- for (retval = tortoise = hare = list, count = 0;
- CONSP (hare);
- hare = XCDR (hare),
- (int_n-- <= 0 ? ((void) (retval = XCDR (retval))) : (void)0),
- count++)
- {
- if (count < CIRCULAR_LIST_SUSPICION_LENGTH) continue;
-
- if (count & 1)
- tortoise = XCDR (tortoise);
- if (EQ (hare, tortoise))
- signal_circular_list_error (list);
- }
-
- return retval;
-}
-
-DEFUN ("nbutlast", Fnbutlast, 1, 2, 0, /*
-Modify LIST to remove the last N (default 1) elements.
-If LIST has N or fewer elements, nil is returned and LIST is unmodified.
-*/
- (list, n))
-{
- int int_n;
-
- CHECK_LIST (list);
-
- if (NILP (n))
- int_n = 1;
- else
- {
- CHECK_NATNUM (n);
- int_n = XINT (n);
- }
-
- {
- Lisp_Object last_cons = list;
-
- EXTERNAL_LIST_LOOP_1 (list)
- {
- if (int_n-- < 0)
- last_cons = XCDR (last_cons);
- }
-
- if (int_n >= 0)
- return Qnil;
-
- XCDR (last_cons) = Qnil;
- return list;
- }
-}
-
-DEFUN ("butlast", Fbutlast, 1, 2, 0, /*
-Return a copy of LIST with the last N (default 1) elements removed.
-If LIST has N or fewer elements, nil is returned.
-*/
- (list, n))
-{
- int int_n;
-
- CHECK_LIST (list);
-
- if (NILP (n))
- int_n = 1;
- else
- {
- CHECK_NATNUM (n);
- int_n = XINT (n);
- }
-
- {
- Lisp_Object retval = Qnil;
- Lisp_Object tail = list;
-
- EXTERNAL_LIST_LOOP_1 (list)
- {
- if (--int_n < 0)
- {
- retval = Fcons (XCAR (tail), retval);
- tail = XCDR (tail);
- }
- }
-
- return Fnreverse (retval);
- }
-}
-
DEFUN ("member", Fmember, 2, 2, 0, /*
Return non-nil if ELT is an element of LIST. Comparison done with `equal'.
The value is actually the tail of LIST whose car is ELT.
*/
(elt, list))
{
- Lisp_Object list_elt, tail;
- EXTERNAL_LIST_LOOP_3 (list_elt, list, tail)
+ REGISTER Lisp_Object tail;
+ LIST_LOOP (tail, list)
{
- if (internal_equal (elt, list_elt, 0))
+ CONCHECK_CONS (tail);
+ if (internal_equal (elt, XCAR (tail), 0))
return tail;
+ QUIT;
}
return Qnil;
}
*/
(elt, list))
{
- Lisp_Object list_elt, tail;
- EXTERNAL_LIST_LOOP_3 (list_elt, list, tail)
+ REGISTER Lisp_Object tail;
+ LIST_LOOP (tail, list)
{
- if (internal_old_equal (elt, list_elt, 0))
+ CONCHECK_CONS (tail);
+ if (internal_old_equal (elt, XCAR (tail), 0))
return tail;
+ QUIT;
}
return Qnil;
}
*/
(elt, list))
{
- Lisp_Object list_elt, tail;
- EXTERNAL_LIST_LOOP_3 (list_elt, list, tail)
+ REGISTER Lisp_Object tail;
+ LIST_LOOP (tail, list)
{
- if (EQ_WITH_EBOLA_NOTICE (elt, list_elt))
+ REGISTER Lisp_Object tem;
+ CONCHECK_CONS (tail);
+ if (tem = XCAR (tail), EQ_WITH_EBOLA_NOTICE (elt, tem))
return tail;
+ QUIT;
}
return Qnil;
}
*/
(elt, list))
{
- Lisp_Object list_elt, tail;
- EXTERNAL_LIST_LOOP_3 (list_elt, list, tail)
+ REGISTER Lisp_Object tail;
+ LIST_LOOP (tail, list)
{
- if (HACKEQ_UNSAFE (elt, list_elt))
+ REGISTER Lisp_Object tem;
+ CONCHECK_CONS (tail);
+ if (tem = XCAR (tail), HACKEQ_UNSAFE (elt, tem))
return tail;
+ QUIT;
}
return Qnil;
}
Lisp_Object
memq_no_quit (Lisp_Object elt, Lisp_Object list)
{
- Lisp_Object list_elt, tail;
- LIST_LOOP_3 (list_elt, list, tail)
+ REGISTER Lisp_Object tail;
+ for (tail = list; CONSP (tail); tail = XCDR (tail))
{
- if (EQ_WITH_EBOLA_NOTICE (elt, list_elt))
+ REGISTER Lisp_Object tem;
+ if (tem = XCAR (tail), EQ_WITH_EBOLA_NOTICE (elt, tem))
return tail;
}
return Qnil;
(key, list))
{
/* This function can GC. */
- Lisp_Object elt, elt_car, elt_cdr;
- EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, list)
+ REGISTER Lisp_Object tail;
+ LIST_LOOP (tail, list)
{
- if (internal_equal (key, elt_car, 0))
+ REGISTER Lisp_Object elt;
+ CONCHECK_CONS (tail);
+ elt = XCAR (tail);
+ if (CONSP (elt) && internal_equal (XCAR (elt), key, 0))
return elt;
+ QUIT;
}
return Qnil;
}
(key, list))
{
/* This function can GC. */
- Lisp_Object elt, elt_car, elt_cdr;
- EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, list)
+ REGISTER Lisp_Object tail;
+ LIST_LOOP (tail, list)
{
- if (internal_old_equal (key, elt_car, 0))
+ REGISTER Lisp_Object elt;
+ CONCHECK_CONS (tail);
+ elt = XCAR (tail);
+ if (CONSP (elt) && internal_old_equal (XCAR (elt), key, 0))
return elt;
+ QUIT;
}
return Qnil;
}
*/
(key, list))
{
- Lisp_Object elt, elt_car, elt_cdr;
- EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, list)
+ REGISTER Lisp_Object tail;
+ LIST_LOOP (tail, list)
{
- if (EQ_WITH_EBOLA_NOTICE (key, elt_car))
+ REGISTER Lisp_Object elt, tem;
+ CONCHECK_CONS (tail);
+ elt = XCAR (tail);
+ if (CONSP (elt) && (tem = XCAR (elt), EQ_WITH_EBOLA_NOTICE (key, tem)))
return elt;
+ QUIT;
}
return Qnil;
}
*/
(key, list))
{
- Lisp_Object elt, elt_car, elt_cdr;
- EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, list)
+ REGISTER Lisp_Object tail;
+ LIST_LOOP (tail, list)
{
- if (HACKEQ_UNSAFE (key, elt_car))
+ REGISTER Lisp_Object elt, tem;
+ CONCHECK_CONS (tail);
+ elt = XCAR (tail);
+ if (CONSP (elt) && (tem = XCAR (elt), HACKEQ_UNSAFE (key, tem)))
return elt;
+ QUIT;
}
return Qnil;
}
assq_no_quit (Lisp_Object key, Lisp_Object list)
{
/* This cannot GC. */
- Lisp_Object elt;
- LIST_LOOP_2 (elt, list)
+ REGISTER Lisp_Object tail;
+ for (tail = list; CONSP (tail); tail = XCDR (tail))
{
- Lisp_Object elt_car = XCAR (elt);
- if (EQ_WITH_EBOLA_NOTICE (key, elt_car))
- return elt;
+ REGISTER Lisp_Object tem, elt;
+ elt = XCAR (tail);
+ if (CONSP (elt) && (tem = XCAR (elt), EQ_WITH_EBOLA_NOTICE (key, tem)))
+ return elt;
}
return Qnil;
}
*/
(key, list))
{
- Lisp_Object elt, elt_car, elt_cdr;
- EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, list)
+ REGISTER Lisp_Object tail;
+ LIST_LOOP (tail, list)
{
- if (internal_equal (key, elt_cdr, 0))
+ REGISTER Lisp_Object elt;
+ CONCHECK_CONS (tail);
+ elt = XCAR (tail);
+ if (CONSP (elt) && internal_equal (XCDR (elt), key, 0))
return elt;
+ QUIT;
}
return Qnil;
}
*/
(key, list))
{
- Lisp_Object elt, elt_car, elt_cdr;
- EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, list)
+ REGISTER Lisp_Object tail;
+ LIST_LOOP (tail, list)
{
- if (internal_old_equal (key, elt_cdr, 0))
+ REGISTER Lisp_Object elt;
+ CONCHECK_CONS (tail);
+ elt = XCAR (tail);
+ if (CONSP (elt) && internal_old_equal (XCDR (elt), key, 0))
return elt;
+ QUIT;
}
return Qnil;
}
*/
(key, list))
{
- Lisp_Object elt, elt_car, elt_cdr;
- EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, list)
+ REGISTER Lisp_Object tail;
+ LIST_LOOP (tail, list)
{
- if (EQ_WITH_EBOLA_NOTICE (key, elt_cdr))
+ REGISTER Lisp_Object elt, tem;
+ CONCHECK_CONS (tail);
+ elt = XCAR (tail);
+ if (CONSP (elt) && (tem = XCDR (elt), EQ_WITH_EBOLA_NOTICE (key, tem)))
return elt;
+ QUIT;
}
return Qnil;
}
*/
(key, list))
{
- Lisp_Object elt, elt_car, elt_cdr;
- EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, list)
+ REGISTER Lisp_Object tail;
+ LIST_LOOP (tail, list)
{
- if (HACKEQ_UNSAFE (key, elt_cdr))
+ REGISTER Lisp_Object elt, tem;
+ CONCHECK_CONS (tail);
+ elt = XCAR (tail);
+ if (CONSP (elt) && (tem = XCDR (elt), HACKEQ_UNSAFE (key, tem)))
return elt;
+ QUIT;
}
return Qnil;
}
-/* Like Frassq, but caller must ensure that LIST is properly
- nil-terminated and ebola-free. */
Lisp_Object
rassq_no_quit (Lisp_Object key, Lisp_Object list)
{
- Lisp_Object elt;
- LIST_LOOP_2 (elt, list)
+ REGISTER Lisp_Object tail;
+ for (tail = list; CONSP (tail); tail = XCDR (tail))
{
- Lisp_Object elt_cdr = XCDR (elt);
- if (EQ_WITH_EBOLA_NOTICE (key, elt_cdr))
+ REGISTER Lisp_Object elt, tem;
+ elt = XCAR (tail);
+ if (CONSP (elt) && (tem = XCDR (elt), EQ_WITH_EBOLA_NOTICE (key, tem)))
return elt;
}
return Qnil;
*/
(elt, list))
{
- Lisp_Object list_elt;
- EXTERNAL_LIST_LOOP_DELETE_IF (list_elt, list,
- (internal_equal (elt, list_elt, 0)));
+ REGISTER Lisp_Object tail = list;
+ REGISTER Lisp_Object prev = Qnil;
+
+ while (!NILP (tail))
+ {
+ CONCHECK_CONS (tail);
+ if (internal_equal (elt, XCAR (tail), 0))
+ {
+ if (NILP (prev))
+ list = XCDR (tail);
+ else
+ XCDR (prev) = XCDR (tail);
+ }
+ else
+ prev = tail;
+ tail = XCDR (tail);
+ QUIT;
+ }
return list;
}
*/
(elt, list))
{
- Lisp_Object list_elt;
- EXTERNAL_LIST_LOOP_DELETE_IF (list_elt, list,
- (internal_old_equal (elt, list_elt, 0)));
+ REGISTER Lisp_Object tail = list;
+ REGISTER Lisp_Object prev = Qnil;
+
+ while (!NILP (tail))
+ {
+ CONCHECK_CONS (tail);
+ if (internal_old_equal (elt, XCAR (tail), 0))
+ {
+ if (NILP (prev))
+ list = XCDR (tail);
+ else
+ XCDR (prev) = XCDR (tail);
+ }
+ else
+ prev = tail;
+ tail = XCDR (tail);
+ QUIT;
+ }
return list;
}
*/
(elt, list))
{
- Lisp_Object list_elt;
- EXTERNAL_LIST_LOOP_DELETE_IF (list_elt, list,
- (EQ_WITH_EBOLA_NOTICE (elt, list_elt)));
+ REGISTER Lisp_Object tail = list;
+ REGISTER Lisp_Object prev = Qnil;
+
+ while (!NILP (tail))
+ {
+ REGISTER Lisp_Object tem;
+ CONCHECK_CONS (tail);
+ if (tem = XCAR (tail), EQ_WITH_EBOLA_NOTICE (elt, tem))
+ {
+ if (NILP (prev))
+ list = XCDR (tail);
+ else
+ XCDR (prev) = XCDR (tail);
+ }
+ else
+ prev = tail;
+ tail = XCDR (tail);
+ QUIT;
+ }
return list;
}
*/
(elt, list))
{
- Lisp_Object list_elt;
- EXTERNAL_LIST_LOOP_DELETE_IF (list_elt, list,
- (HACKEQ_UNSAFE (elt, list_elt)));
+ REGISTER Lisp_Object tail = list;
+ REGISTER Lisp_Object prev = Qnil;
+
+ while (!NILP (tail))
+ {
+ REGISTER Lisp_Object tem;
+ CONCHECK_CONS (tail);
+ if (tem = XCAR (tail), HACKEQ_UNSAFE (elt, tem))
+ {
+ if (NILP (prev))
+ list = XCDR (tail);
+ else
+ XCDR (prev) = XCDR (tail);
+ }
+ else
+ prev = tail;
+ tail = XCDR (tail);
+ QUIT;
+ }
return list;
}
-/* Like Fdelq, but caller must ensure that LIST is properly
- nil-terminated and ebola-free. */
+/* no quit, no errors; be careful */
Lisp_Object
delq_no_quit (Lisp_Object elt, Lisp_Object list)
{
- Lisp_Object list_elt;
- LIST_LOOP_DELETE_IF (list_elt, list,
- (EQ_WITH_EBOLA_NOTICE (elt, list_elt)));
+ REGISTER Lisp_Object tail = list;
+ REGISTER Lisp_Object prev = Qnil;
+
+ while (CONSP (tail))
+ {
+ REGISTER Lisp_Object tem;
+ if (tem = XCAR (tail), EQ_WITH_EBOLA_NOTICE (elt, tem))
+ {
+ if (NILP (prev))
+ list = XCDR (tail);
+ else
+ XCDR (prev) = XCDR (tail);
+ }
+ else
+ prev = tail;
+ tail = XCDR (tail);
+ }
return list;
}
{
REGISTER Lisp_Object tail = list;
REGISTER Lisp_Object prev = Qnil;
+ struct Lisp_Cons *cons_to_free = NULL;
- while (!NILP (tail))
+ while (CONSP (tail))
{
- REGISTER Lisp_Object tem = XCAR (tail);
- if (EQ (elt, tem))
+ REGISTER Lisp_Object tem;
+ if (tem = XCAR (tail), EQ_WITH_EBOLA_NOTICE (elt, tem))
{
- Lisp_Object cons_to_free = tail;
if (NILP (prev))
list = XCDR (tail);
else
XCDR (prev) = XCDR (tail);
- tail = XCDR (tail);
- free_cons (XCONS (cons_to_free));
+ cons_to_free = XCONS (tail);
}
else
+ prev = tail;
+ tail = XCDR (tail);
+ if (cons_to_free)
{
- prev = tail;
- tail = XCDR (tail);
+ free_cons (cons_to_free);
+ cons_to_free = NULL;
}
}
return list;
*/
(key, list))
{
- Lisp_Object elt;
- EXTERNAL_LIST_LOOP_DELETE_IF (elt, list,
- (CONSP (elt) &&
- internal_equal (key, XCAR (elt), 0)));
+ REGISTER Lisp_Object tail = list;
+ REGISTER Lisp_Object prev = Qnil;
+
+ while (!NILP (tail))
+ {
+ REGISTER Lisp_Object elt;
+ CONCHECK_CONS (tail);
+ elt = XCAR (tail);
+ if (CONSP (elt) && internal_equal (key, XCAR (elt), 0))
+ {
+ if (NILP (prev))
+ list = XCDR (tail);
+ else
+ XCDR (prev) = XCDR (tail);
+ }
+ else
+ prev = tail;
+ tail = XCDR (tail);
+ QUIT;
+ }
return list;
}
*/
(key, list))
{
- Lisp_Object elt;
- EXTERNAL_LIST_LOOP_DELETE_IF (elt, list,
- (CONSP (elt) &&
- EQ_WITH_EBOLA_NOTICE (key, XCAR (elt))));
+ REGISTER Lisp_Object tail = list;
+ REGISTER Lisp_Object prev = Qnil;
+
+ while (!NILP (tail))
+ {
+ REGISTER Lisp_Object elt, tem;
+ CONCHECK_CONS (tail);
+ elt = XCAR (tail);
+ if (CONSP (elt) && (tem = XCAR (elt), EQ_WITH_EBOLA_NOTICE (key, tem)))
+ {
+ if (NILP (prev))
+ list = XCDR (tail);
+ else
+ XCDR (prev) = XCDR (tail);
+ }
+ else
+ prev = tail;
+ tail = XCDR (tail);
+ QUIT;
+ }
return list;
}
Lisp_Object
remassq_no_quit (Lisp_Object key, Lisp_Object list)
{
- Lisp_Object elt;
- LIST_LOOP_DELETE_IF (elt, list,
- (CONSP (elt) &&
- EQ_WITH_EBOLA_NOTICE (key, XCAR (elt))));
+ REGISTER Lisp_Object tail = list;
+ REGISTER Lisp_Object prev = Qnil;
+
+ while (CONSP (tail))
+ {
+ REGISTER Lisp_Object elt, tem;
+ elt = XCAR (tail);
+ if (CONSP (elt) && (tem = XCAR (elt), EQ_WITH_EBOLA_NOTICE (key, tem)))
+ {
+ if (NILP (prev))
+ list = XCDR (tail);
+ else
+ XCDR (prev) = XCDR (tail);
+ }
+ else
+ prev = tail;
+ tail = XCDR (tail);
+ }
return list;
}
*/
(value, list))
{
- Lisp_Object elt;
- EXTERNAL_LIST_LOOP_DELETE_IF (elt, list,
- (CONSP (elt) &&
- internal_equal (value, XCDR (elt), 0)));
+ REGISTER Lisp_Object tail = list;
+ REGISTER Lisp_Object prev = Qnil;
+
+ while (!NILP (tail))
+ {
+ REGISTER Lisp_Object elt;
+ CONCHECK_CONS (tail);
+ elt = XCAR (tail);
+ if (CONSP (elt) && internal_equal (value, XCDR (elt), 0))
+ {
+ if (NILP (prev))
+ list = XCDR (tail);
+ else
+ XCDR (prev) = XCDR (tail);
+ }
+ else
+ prev = tail;
+ tail = XCDR (tail);
+ QUIT;
+ }
return list;
}
*/
(value, list))
{
- Lisp_Object elt;
- EXTERNAL_LIST_LOOP_DELETE_IF (elt, list,
- (CONSP (elt) &&
- EQ_WITH_EBOLA_NOTICE (value, XCDR (elt))));
+ REGISTER Lisp_Object tail = list;
+ REGISTER Lisp_Object prev = Qnil;
+
+ while (!NILP (tail))
+ {
+ REGISTER Lisp_Object elt, tem;
+ CONCHECK_CONS (tail);
+ elt = XCAR (tail);
+ if (CONSP (elt) && (tem = XCAR (elt), EQ_WITH_EBOLA_NOTICE (value, tem)))
+ {
+ if (NILP (prev))
+ list = XCDR (tail);
+ else
+ XCDR (prev) = XCDR (tail);
+ }
+ else
+ prev = tail;
+ tail = XCDR (tail);
+ QUIT;
+ }
return list;
}
-/* Like Fremrassq, fast and unsafe; be careful */
+/* no quit, no errors; be careful */
+
Lisp_Object
remrassq_no_quit (Lisp_Object value, Lisp_Object list)
{
- Lisp_Object elt;
- LIST_LOOP_DELETE_IF (elt, list,
- (CONSP (elt) &&
- EQ_WITH_EBOLA_NOTICE (value, XCDR (elt))));
+ REGISTER Lisp_Object tail = list;
+ REGISTER Lisp_Object prev = Qnil;
+
+ while (CONSP (tail))
+ {
+ REGISTER Lisp_Object elt, tem;
+ elt = XCAR (tail);
+ if (CONSP (elt) && (tem = XCAR (elt), EQ_WITH_EBOLA_NOTICE (value, tem)))
+ {
+ if (NILP (prev))
+ list = XCDR (tail);
+ else
+ XCDR (prev) = XCDR (tail);
+ }
+ else
+ prev = tail;
+ tail = XCDR (tail);
+ }
return list;
}
while (!NILP (tail))
{
REGISTER Lisp_Object next;
+ QUIT;
CONCHECK_CONS (tail);
next = XCDR (tail);
XCDR (tail) = prev;
*/
(list))
{
- Lisp_Object reversed_list = Qnil;
- Lisp_Object elt;
- EXTERNAL_LIST_LOOP_2 (elt, list)
+ REGISTER Lisp_Object tail;
+ Lisp_Object new = Qnil;
+
+ for (tail = list; CONSP (tail); tail = XCDR (tail))
{
- reversed_list = Fcons (elt, reversed_list);
+ new = Fcons (XCAR (tail), new);
+ QUIT;
}
- return reversed_list;
+ if (!NILP (tail))
+ dead_wrong_type_argument (Qlistp, tail);
+ return new;
}
\f
static Lisp_Object list_merge (Lisp_Object org_l1, Lisp_Object org_l2,
Lisp_Object
internal_plist_get (Lisp_Object plist, Lisp_Object property)
{
- Lisp_Object tail;
+ Lisp_Object tail = plist;
- for (tail = plist; !NILP (tail); tail = XCDR (XCDR (tail)))
+ for (; !NILP (tail); tail = XCDR (XCDR (tail)))
{
- if (EQ (XCAR (tail), property))
- return XCAR (XCDR (tail));
+ struct Lisp_Cons *c = XCONS (tail);
+ if (EQ (c->car, property))
+ return XCAR (c->cdr);
}
return Qunbound;
int
internal_remprop (Lisp_Object *plist, Lisp_Object property)
{
- Lisp_Object tail, prev;
+ Lisp_Object tail = *plist;
+
+ if (NILP (tail))
+ return 0;
+
+ if (EQ (XCAR (tail), property))
+ {
+ *plist = XCDR (XCDR (tail));
+ return 1;
+ }
- for (tail = *plist, prev = Qnil;
- !NILP (tail);
+ for (tail = XCDR (tail); !NILP (XCDR (tail));
tail = XCDR (XCDR (tail)))
{
- if (EQ (XCAR (tail), property))
+ struct Lisp_Cons *c = XCONS (tail);
+ if (EQ (XCAR (c->cdr), property))
{
- if (NILP (prev))
- *plist = XCDR (XCDR (tail));
- else
- XCDR (XCDR (prev)) = XCDR (XCDR (tail));
+ c->cdr = XCDR (XCDR (c->cdr));
return 1;
}
- else
- prev = tail;
}
return 0;
Lisp_Object *tortsave = *tortoise;
/* Note that our "fixing" may be more brutal than necessary,
- but it's the user's own problem, not ours, if they went in and
+ but it's the user's own problem, not ours. if they went in and
manually fucked up a plist. */
for (i = 0; i < 2; i++)
(plist, prop, default_))
{
Lisp_Object val = external_plist_get (&plist, prop, 0, ERROR_ME);
- return UNBOUNDP (val) ? default_ : val;
+ if (UNBOUNDP (val))
+ return default_;
+ return val;
}
DEFUN ("plist-put", Fplist_put, 3, 3, 0, /*
*/
(plist, prop))
{
- Lisp_Object val = Fplist_get (plist, prop, Qunbound);
- return UNBOUNDP (val) ? Qnil : Qt;
+ return UNBOUNDP (Fplist_get (plist, prop, Qunbound)) ? Qnil : Qt;
}
DEFUN ("check-valid-plist", Fcheck_valid_plist, 1, 1, 0, /*
/* external_remprop returns 1 if it removed any property.
We have to loop till it didn't remove anything, in case
the property occurs many times. */
- while (external_remprop (&XCDR (next), prop, 0, ERROR_ME))
- DO_NOTHING;
+ while (external_remprop (&XCDR (next), prop, 0, ERROR_ME));
plist = Fcdr (next);
}
Extract a value from a lax property list.
LAX-PLIST is a lax property list, which is a list of the form \(PROP1
-VALUE1 PROP2 VALUE2...), where comparisons between properties is done
+VALUE1 PROP2 VALUE2...), where comparions between properties is done
using `equal' instead of `eq'. This function returns the value
corresponding to the given PROP, or DEFAULT if PROP is not one of the
properties on the list.
DEFUN ("lax-plist-put", Flax_plist_put, 3, 3, 0, /*
Change value in LAX-PLIST of PROP to VAL.
LAX-PLIST is a lax property list, which is a list of the form \(PROP1
-VALUE1 PROP2 VALUE2...), where comparisons between properties is done
+VALUE1 PROP2 VALUE2...), where comparions between properties is done
using `equal' instead of `eq'. PROP is usually a symbol and VAL is
any object. If PROP is already a property on the list, its value is
set to VAL, otherwise the new PROP VAL pair is added. The new plist
DEFUN ("lax-plist-remprop", Flax_plist_remprop, 2, 2, 0, /*
Remove from LAX-PLIST the property PROP and its value.
LAX-PLIST is a lax property list, which is a list of the form \(PROP1
-VALUE1 PROP2 VALUE2...), where comparisons between properties is done
+VALUE1 PROP2 VALUE2...), where comparions between properties is done
using `equal' instead of `eq'. PROP is usually a symbol. The new
plist is returned; use `(setq x (lax-plist-remprop x prop val))' to be
sure to use the new value. The LAX-PLIST is modified by side effects.
DEFUN ("lax-plist-member", Flax_plist_member, 2, 2, 0, /*
Return t if PROP has a value specified in LAX-PLIST.
LAX-PLIST is a lax property list, which is a list of the form \(PROP1
-VALUE1 PROP2 VALUE2...), where comparisons between properties is done
+VALUE1 PROP2 VALUE2...), where comparions between properties is done
using `equal' instead of `eq'.
*/
(lax_plist, prop))
/* external_remprop returns 1 if it removed any property.
We have to loop till it didn't remove anything, in case
the property occurs many times. */
- while (external_remprop (&XCDR (next), prop, 1, ERROR_ME))
- DO_NOTHING;
+ while (external_remprop (&XCDR (next), prop, 1, ERROR_ME));
lax_plist = Fcdr (next);
}
*/
(object, propname, default_))
{
+ Lisp_Object val;
+
/* Various places in emacs call Fget() and expect it not to quit,
so don't quit. */
/* It's easiest to treat symbols specially because they may not
be an lrecord */
if (SYMBOLP (object))
- return symbol_getprop (object, propname, default_);
+ val = symbol_getprop (object, propname, default_);
else if (STRINGP (object))
- return string_getprop (XSTRING (object), propname, default_);
+ val = string_getprop (XSTRING (object), propname, default_);
else if (LRECORDP (object))
{
- CONST struct lrecord_implementation *imp
- = XRECORD_LHEADER_IMPLEMENTATION (object);
- if (!imp->getprop)
+ CONST struct lrecord_implementation
+ *imp = XRECORD_LHEADER_IMPLEMENTATION (object);
+ if (imp->getprop)
+ {
+ val = (imp->getprop) (object, propname);
+ if (UNBOUNDP (val))
+ val = default_;
+ }
+ else
goto noprops;
-
- {
- Lisp_Object val = (imp->getprop) (object, propname);
- if (UNBOUNDP (val))
- val = default_;
- return val;
- }
}
else
{
noprops:
signal_simple_error ("Object type has no properties", object);
- return Qnil; /* Not reached */
}
+
+ return val;
}
DEFUN ("put", Fput, 3, 3, 0, /*
(object, propname, value))
{
CHECK_SYMBOL (propname);
- CHECK_LISP_WRITEABLE (object);
+ CHECK_IMPURE (object);
if (SYMBOLP (object))
symbol_putprop (object, propname, value);
int retval = 0;
CHECK_SYMBOL (propname);
- CHECK_LISP_WRITEABLE (object);
+ CHECK_IMPURE (object);
if (SYMBOLP (object))
retval = symbol_remprop (object, propname);
\f
int
-internal_equal (Lisp_Object obj1, Lisp_Object obj2, int depth)
+internal_equal (Lisp_Object o1, Lisp_Object o2, int depth)
{
if (depth > 200)
error ("Stack overflow in equal");
+#ifndef LRECORD_CONS
+ do_cdr:
+#endif
QUIT;
- if (EQ_WITH_EBOLA_NOTICE (obj1, obj2))
+ if (EQ_WITH_EBOLA_NOTICE (o1, o2))
return 1;
/* Note that (equal 20 20.0) should be nil */
- if (XTYPE (obj1) != XTYPE (obj2))
+ else if (XTYPE (o1) != XTYPE (o2))
return 0;
- if (LRECORDP (obj1))
+#ifndef LRECORD_CONS
+ else if (CONSP (o1))
+ {
+ if (!internal_equal (XCAR (o1), XCAR (o2), depth + 1))
+ return 0;
+ o1 = XCDR (o1);
+ o2 = XCDR (o2);
+ goto do_cdr;
+ }
+#endif
+#ifndef LRECORD_VECTOR
+ else if (VECTORP (o1))
+ {
+ Lisp_Object *v1 = XVECTOR_DATA (o1);
+ Lisp_Object *v2 = XVECTOR_DATA (o2);
+ int len = XVECTOR_LENGTH (o1);
+ if (len != XVECTOR_LENGTH (o2))
+ return 0;
+ while (len--)
+ if (!internal_equal (*v1++, *v2++, depth + 1))
+ return 0;
+ return 1;
+ }
+#endif
+#ifndef LRECORD_STRING
+ else if (STRINGP (o1))
+ {
+ Bytecount len;
+ return (((len = XSTRING_LENGTH (o1)) == XSTRING_LENGTH (o2)) &&
+ !memcmp (XSTRING_DATA (o1), XSTRING_DATA (o2), len));
+ }
+#endif
+ else if (LRECORDP (o1))
{
CONST struct lrecord_implementation
- *imp1 = XRECORD_LHEADER_IMPLEMENTATION (obj1),
- *imp2 = XRECORD_LHEADER_IMPLEMENTATION (obj2);
-
- return (imp1 == imp2) &&
+ *imp1 = XRECORD_LHEADER_IMPLEMENTATION (o1),
+ *imp2 = XRECORD_LHEADER_IMPLEMENTATION (o2);
+ if (imp1 != imp2)
+ return 0;
+ else if (imp1->equal == 0)
/* EQ-ness of the objects was noticed above */
- (imp1->equal && (imp1->equal) (obj1, obj2, depth));
+ return 0;
+ else
+ return (imp1->equal) (o1, o2, depth);
}
return 0;
but that seems unlikely. */
static int
-internal_old_equal (Lisp_Object obj1, Lisp_Object obj2, int depth)
+internal_old_equal (Lisp_Object o1, Lisp_Object o2, int depth)
{
if (depth > 200)
error ("Stack overflow in equal");
+#ifndef LRECORD_CONS
+ do_cdr:
+#endif
QUIT;
- if (HACKEQ_UNSAFE (obj1, obj2))
+ if (HACKEQ_UNSAFE (o1, o2))
return 1;
/* Note that (equal 20 20.0) should be nil */
- if (XTYPE (obj1) != XTYPE (obj2))
+ else if (XTYPE (o1) != XTYPE (o2))
return 0;
+#ifndef LRECORD_CONS
+ else if (CONSP (o1))
+ {
+ if (!internal_old_equal (XCAR (o1), XCAR (o2), depth + 1))
+ return 0;
+ o1 = XCDR (o1);
+ o2 = XCDR (o2);
+ goto do_cdr;
+ }
+#endif
+#ifndef LRECORD_VECTOR
+ else if (VECTORP (o1))
+ {
+ int indice;
+ int len = XVECTOR_LENGTH (o1);
+ if (len != XVECTOR_LENGTH (o2))
+ return 0;
+ for (indice = 0; indice < len; indice++)
+ {
+ if (!internal_old_equal (XVECTOR_DATA (o1) [indice],
+ XVECTOR_DATA (o2) [indice],
+ depth + 1))
+ return 0;
+ }
+ return 1;
+ }
+#endif
+#ifndef LRECORD_STRING
+ else if (STRINGP (o1))
+ {
+ Bytecount len = XSTRING_LENGTH (o1);
+ if (len != XSTRING_LENGTH (o2))
+ return 0;
+ if (memcmp (XSTRING_DATA (o1), XSTRING_DATA (o2), len))
+ return 0;
+ return 1;
+ }
+#endif
+ else if (LRECORDP (o1))
+ {
+ CONST struct lrecord_implementation
+ *imp1 = XRECORD_LHEADER_IMPLEMENTATION (o1),
+ *imp2 = XRECORD_LHEADER_IMPLEMENTATION (o2);
+ if (imp1 != imp2)
+ return 0;
+ else if (imp1->equal == 0)
+ /* EQ-ness of the objects was noticed above */
+ return 0;
+ else
+ return (imp1->equal) (o1, o2, depth);
+ }
- return internal_equal (obj1, obj2, depth);
+ return 0;
}
DEFUN ("equal", Fequal, 2, 2, 0, /*
Vectors and strings are compared element by element.
Numbers are compared by value. Symbols must match exactly.
*/
- (obj1, obj2))
+ (o1, o2))
{
- return internal_equal (obj1, obj2, 0) ? Qt : Qnil;
+ return internal_equal (o1, o2, 0) ? Qt : Qnil;
}
DEFUN ("old-equal", Fold_equal, 2, 2, 0, /*
This function is provided only for byte-code compatibility with v19.
Do not use it.
*/
- (obj1, obj2))
+ (o1, o2))
{
- return internal_old_equal (obj1, obj2, 0) ? Qt : Qnil;
+ return internal_old_equal (o1, o2, 0) ? Qt : Qnil;
}
\f
Charcount len = string_char_length (s);
Charcount i;
CHECK_CHAR_COERCE_INT (item);
- CHECK_LISP_WRITEABLE (array);
+ CHECK_IMPURE (array);
charval = XCHAR (item);
for (i = 0; i < len; i++)
set_string_char (s, i, charval);
{
Lisp_Object *p = XVECTOR_DATA (array);
int len = XVECTOR_LENGTH (array);
- CHECK_LISP_WRITEABLE (array);
+ CHECK_IMPURE (array);
while (len--)
*p++ = item;
}
int len = bit_vector_length (v);
int bit;
CHECK_BIT (item);
- CHECK_LISP_WRITEABLE (array);
+ CHECK_IMPURE (array);
bit = XINT (item);
while (len--)
set_bit_vector_bit (v, len, bit);
}
Lisp_Object
-nconc2 (Lisp_Object arg1, Lisp_Object arg2)
+nconc2 (Lisp_Object s1, Lisp_Object s2)
{
Lisp_Object args[2];
- struct gcpro gcpro1;
- args[0] = arg1;
- args[1] = arg2;
-
- GCPRO1 (args[0]);
- gcpro1.nvars = 2;
-
- RETURN_UNGCPRO (bytecode_nconc2 (args));
-}
-
-Lisp_Object
-bytecode_nconc2 (Lisp_Object *args)
-{
- retry:
-
- if (CONSP (args[0]))
- {
- /* (setcdr (last args[0]) args[1]) */
- Lisp_Object tortoise, hare;
- int count;
-
- for (hare = tortoise = args[0], count = 0;
- CONSP (XCDR (hare));
- hare = XCDR (hare), count++)
- {
- if (count < CIRCULAR_LIST_SUSPICION_LENGTH) continue;
-
- if (count & 1)
- tortoise = XCDR (tortoise);
- if (EQ (hare, tortoise))
- signal_circular_list_error (args[0]);
- }
- XCDR (hare) = args[1];
- return args[0];
- }
- else if (NILP (args[0]))
- {
- return args[1];
- }
- else
- {
- args[0] = wrong_type_argument (args[0], Qlistp);
- goto retry;
- }
+ args[0] = s1;
+ args[1] = s2;
+ return Fnconc (2, args);
}
DEFUN ("nconc", Fnconc, 0, MANY, 0, /*
while (argnum < nargs)
{
- Lisp_Object val;
- retry:
- val = args[argnum];
+ Lisp_Object val = args[argnum];
if (CONSP (val))
{
- /* `val' is the first cons, which will be our return value. */
- /* `last_cons' will be the cons cell to mutate. */
- Lisp_Object last_cons = val;
- Lisp_Object tortoise = val;
+ /* Found the first cons, which will be our return value. */
+ Lisp_Object last = val;
for (argnum++; argnum < nargs; argnum++)
{
Lisp_Object next = args[argnum];
- retry_next:
+ redo:
if (CONSP (next) || argnum == nargs -1)
{
/* (setcdr (last val) next) */
- int count;
-
- for (count = 0;
- CONSP (XCDR (last_cons));
- last_cons = XCDR (last_cons), count++)
+ while (CONSP (XCDR (last)))
{
- if (count < CIRCULAR_LIST_SUSPICION_LENGTH) continue;
-
- if (count & 1)
- tortoise = XCDR (tortoise);
- if (EQ (last_cons, tortoise))
- signal_circular_list_error (args[argnum-1]);
+ last = XCDR (last);
+ QUIT;
}
- XCDR (last_cons) = next;
+ XCDR (last) = next;
}
else if (NILP (next))
{
}
else
{
- next = wrong_type_argument (Qlistp, next);
- goto retry_next;
+ next = wrong_type_argument (next, Qlistp);
+ goto redo;
}
}
RETURN_UNGCPRO (val);
else if (argnum == nargs - 1) /* last arg? */
RETURN_UNGCPRO (val);
else
- {
- args[argnum] = wrong_type_argument (Qlistp, val);
- goto retry;
- }
+ args[argnum] = wrong_type_argument (val, Qlistp);
}
RETURN_UNGCPRO (Qnil); /* No non-nil args provided. */
}
\f
/* This is the guts of all mapping functions.
- Apply fn to each element of seq, one by one,
- storing the results into elements of vals, a C vector of Lisp_Objects.
- leni is the length of vals, which should also be the length of seq.
+ Apply fn to each element of seq, one by one,
+ storing the results into elements of vals, a C vector of Lisp_Objects.
+ leni is the length of vals, which should also be the length of seq.
- If VALS is a null pointer, do not accumulate the results. */
+ If VALS is a null pointer, do not accumulate the results. */
static void
-mapcar1 (size_t leni, Lisp_Object *vals, Lisp_Object fn, Lisp_Object seq)
+mapcar1 (int leni, Lisp_Object *vals, Lisp_Object fn, Lisp_Object seq)
{
- Lisp_Object result;
- Lisp_Object args[2];
+ Lisp_Object tail;
+ Lisp_Object dummy = Qnil;
int i;
- struct gcpro gcpro1;
+ struct gcpro gcpro1, gcpro2, gcpro3;
+ Lisp_Object result;
+
+ GCPRO3 (dummy, fn, seq);
if (vals)
{
- GCPRO1 (vals[0]);
- gcpro1.nvars = 0;
+ /* Don't let vals contain any garbage when GC happens. */
+ for (i = 0; i < leni; i++)
+ vals[i] = Qnil;
+ gcpro1.var = vals;
+ gcpro1.nvars = leni;
}
- args[0] = fn;
+ /* We need not explicitly protect `tail' because it is used only on
+ lists, and 1) lists are not relocated and 2) the list is marked
+ via `seq' so will not be freed */
- if (LISTP (seq))
+ if (VECTORP (seq))
{
for (i = 0; i < leni; i++)
{
- args[1] = XCAR (seq);
- seq = XCDR (seq);
- result = Ffuncall (2, args);
- if (vals) vals[gcpro1.nvars++] = result;
+ dummy = XVECTOR_DATA (seq)[i];
+ result = call1 (fn, dummy);
+ if (vals)
+ vals[i] = result;
}
}
- else if (VECTORP (seq))
+ else if (BIT_VECTORP (seq))
{
- Lisp_Object *objs = XVECTOR_DATA (seq);
+ struct Lisp_Bit_Vector *v = XBIT_VECTOR (seq);
for (i = 0; i < leni; i++)
{
- args[1] = *objs++;
- result = Ffuncall (2, args);
- if (vals) vals[gcpro1.nvars++] = result;
+ XSETINT (dummy, bit_vector_bit (v, i));
+ result = call1 (fn, dummy);
+ if (vals)
+ vals[i] = result;
}
}
else if (STRINGP (seq))
{
- Bufbyte *p = XSTRING_DATA (seq);
for (i = 0; i < leni; i++)
{
- args[1] = make_char (charptr_emchar (p));
- INC_CHARPTR (p);
- result = Ffuncall (2, args);
- if (vals) vals[gcpro1.nvars++] = result;
+ result = call1 (fn, make_char (string_char (XSTRING (seq), i)));
+ if (vals)
+ vals[i] = result;
}
}
- else if (BIT_VECTORP (seq))
+ else /* Must be a list, since Flength did not get an error */
{
- struct Lisp_Bit_Vector *v = XBIT_VECTOR (seq);
+ tail = seq;
for (i = 0; i < leni; i++)
{
- args[1] = make_int (bit_vector_bit (v, i));
- result = Ffuncall (2, args);
- if (vals) vals[gcpro1.nvars++] = result;
+ result = call1 (fn, Fcar (tail));
+ if (vals)
+ vals[i] = result;
+ tail = Fcdr (tail);
}
}
- else
- abort(); /* cannot get here since Flength(seq) did not get an error */
- if (vals)
- UNGCPRO;
+ UNGCPRO;
}
DEFUN ("mapconcat", Fmapconcat, 3, 3, 0, /*
*/
(fn, seq, sep))
{
- size_t len = XINT (Flength (seq));
+ int len = XINT (Flength (seq));
Lisp_Object *args;
int i;
struct gcpro gcpro1;
*/
(fn, seq))
{
- size_t len = XINT (Flength (seq));
+ int len = XINT (Flength (seq));
Lisp_Object *args = alloca_array (Lisp_Object, len);
mapcar1 (len, args, fn, seq);
*/
(fn, seq))
{
- size_t len = XINT (Flength (seq));
+ int len = XINT (Flength (seq));
+ /* Ideally, this should call make_vector_internal, because we don't
+ need initialization. */
Lisp_Object result = make_vector (len, Qnil);
struct gcpro gcpro1;
return unbind_to (speccount, feature);
}
}
-\f
-/* base64 encode/decode functions.
-
- Originally based on code from GNU recode. Ported to FSF Emacs by
- Lars Magne Ingebrigtsen and Karl Heuer. Ported to XEmacs and
- subsequently heavily hacked by Hrvoje Niksic. */
-
-#define MIME_LINE_LENGTH 72
-
-#define IS_ASCII(Character) \
- ((Character) < 128)
-#define IS_BASE64(Character) \
- (IS_ASCII (Character) && base64_char_to_value[Character] >= 0)
-
-/* Table of characters coding the 64 values. */
-static char base64_value_to_char[64] =
-{
- 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', /* 0- 9 */
- 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', /* 10-19 */
- 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', /* 20-29 */
- 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', /* 30-39 */
- 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', /* 40-49 */
- 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', /* 50-59 */
- '8', '9', '+', '/' /* 60-63 */
-};
-
-/* Table of base64 values for first 128 characters. */
-static short base64_char_to_value[128] =
-{
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0- 9 */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 10- 19 */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 20- 29 */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 30- 39 */
- -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, /* 40- 49 */
- 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, /* 50- 59 */
- -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, /* 60- 69 */
- 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, /* 70- 79 */
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, /* 80- 89 */
- 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, /* 90- 99 */
- 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, /* 100-109 */
- 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, /* 110-119 */
- 49, 50, 51, -1, -1, -1, -1, -1 /* 120-127 */
-};
-
-/* The following diagram shows the logical steps by which three octets
- get transformed into four base64 characters.
-
- .--------. .--------. .--------.
- |aaaaaabb| |bbbbcccc| |ccdddddd|
- `--------' `--------' `--------'
- 6 2 4 4 2 6
- .--------+--------+--------+--------.
- |00aaaaaa|00bbbbbb|00cccccc|00dddddd|
- `--------+--------+--------+--------'
-
- .--------+--------+--------+--------.
- |AAAAAAAA|BBBBBBBB|CCCCCCCC|DDDDDDDD|
- `--------+--------+--------+--------'
-
- The octets are divided into 6 bit chunks, which are then encoded into
- base64 characters. */
-
-#define ADVANCE_INPUT(c, stream) \
- ((ec = Lstream_get_emchar (stream)) == -1 ? 0 : \
- ((ec > 255) ? \
- (signal_simple_error ("Non-ascii character in base64 input", \
- make_char (ec)), 0) \
- : (c = (Bufbyte)ec), 1))
-static Bytind
-base64_encode_1 (Lstream *istream, Bufbyte *to, int line_break)
-{
- EMACS_INT counter = 0;
- Bufbyte *e = to;
- Emchar ec;
- unsigned int value;
-
- while (1)
- {
- Bufbyte c;
- if (!ADVANCE_INPUT (c, istream))
- break;
-
- /* Wrap line every 76 characters. */
- if (line_break)
- {
- if (counter < MIME_LINE_LENGTH / 4)
- counter++;
- else
- {
- *e++ = '\n';
- counter = 1;
- }
- }
-
- /* Process first byte of a triplet. */
- *e++ = base64_value_to_char[0x3f & c >> 2];
- value = (0x03 & c) << 4;
-
- /* Process second byte of a triplet. */
- if (!ADVANCE_INPUT (c, istream))
- {
- *e++ = base64_value_to_char[value];
- *e++ = '=';
- *e++ = '=';
- break;
- }
-
- *e++ = base64_value_to_char[value | (0x0f & c >> 4)];
- value = (0x0f & c) << 2;
-
- /* Process third byte of a triplet. */
- if (!ADVANCE_INPUT (c, istream))
- {
- *e++ = base64_value_to_char[value];
- *e++ = '=';
- break;
- }
-
- *e++ = base64_value_to_char[value | (0x03 & c >> 6)];
- *e++ = base64_value_to_char[0x3f & c];
- }
-
- return e - to;
-}
-#undef ADVANCE_INPUT
-
-/* Get next character from the stream, except that non-base64
- characters are ignored. This is in accordance with rfc2045. EC
- should be an Emchar, so that it can hold -1 as the value for EOF. */
-#define ADVANCE_INPUT_IGNORE_NONBASE64(ec, stream, streampos) do { \
- ec = Lstream_get_emchar (stream); \
- ++streampos; \
- /* IS_BASE64 may not be called with negative arguments so check for \
- EOF first. */ \
- if (ec < 0 || IS_BASE64 (ec) || ec == '=') \
- break; \
-} while (1)
-
-#define STORE_BYTE(pos, val, ccnt) do { \
- pos += set_charptr_emchar (pos, (Emchar)((unsigned char)(val))); \
- ++ccnt; \
-} while (0)
-
-static Bytind
-base64_decode_1 (Lstream *istream, Bufbyte *to, Charcount *ccptr)
-{
- Charcount ccnt = 0;
- Bufbyte *e = to;
- EMACS_INT streampos = 0;
-
- while (1)
- {
- Emchar ec;
- unsigned long value;
-
- /* Process first byte of a quadruplet. */
- ADVANCE_INPUT_IGNORE_NONBASE64 (ec, istream, streampos);
- if (ec < 0)
- break;
- if (ec == '=')
- signal_simple_error ("Illegal `=' character while decoding base64",
- make_int (streampos));
- value = base64_char_to_value[ec] << 18;
-
- /* Process second byte of a quadruplet. */
- ADVANCE_INPUT_IGNORE_NONBASE64 (ec, istream, streampos);
- if (ec < 0)
- error ("Premature EOF while decoding base64");
- if (ec == '=')
- signal_simple_error ("Illegal `=' character while decoding base64",
- make_int (streampos));
- value |= base64_char_to_value[ec] << 12;
- STORE_BYTE (e, value >> 16, ccnt);
-
- /* Process third byte of a quadruplet. */
- ADVANCE_INPUT_IGNORE_NONBASE64 (ec, istream, streampos);
- if (ec < 0)
- error ("Premature EOF while decoding base64");
-
- if (ec == '=')
- {
- ADVANCE_INPUT_IGNORE_NONBASE64 (ec, istream, streampos);
- if (ec < 0)
- error ("Premature EOF while decoding base64");
- if (ec != '=')
- signal_simple_error ("Padding `=' expected but not found while decoding base64",
- make_int (streampos));
- continue;
- }
-
- value |= base64_char_to_value[ec] << 6;
- STORE_BYTE (e, 0xff & value >> 8, ccnt);
-
- /* Process fourth byte of a quadruplet. */
- ADVANCE_INPUT_IGNORE_NONBASE64 (ec, istream, streampos);
- if (ec < 0)
- error ("Premature EOF while decoding base64");
- if (ec == '=')
- continue;
-
- value |= base64_char_to_value[ec];
- STORE_BYTE (e, 0xff & value, ccnt);
- }
-
- *ccptr = ccnt;
- return e - to;
-}
-#undef ADVANCE_INPUT
-#undef ADVANCE_INPUT_IGNORE_NONBASE64
-#undef STORE_BYTE
-
-static Lisp_Object
-free_malloced_ptr (Lisp_Object unwind_obj)
-{
- void *ptr = (void *)get_opaque_ptr (unwind_obj);
- xfree (ptr);
- free_opaque_ptr (unwind_obj);
- return Qnil;
-}
-
-/* Don't use alloca for regions larger than this, lest we overflow
- the stack. */
-#define MAX_ALLOCA 65536
-
-/* We need to setup proper unwinding, because there is a number of
- ways these functions can blow up, and we don't want to have memory
- leaks in those cases. */
-#define XMALLOC_OR_ALLOCA(ptr, len, type) do { \
- size_t XOA_len = (len); \
- if (XOA_len > MAX_ALLOCA) \
- { \
- ptr = xnew_array (type, XOA_len); \
- record_unwind_protect (free_malloced_ptr, \
- make_opaque_ptr ((void *)ptr)); \
- } \
- else \
- ptr = alloca_array (type, XOA_len); \
-} while (0)
-
-#define XMALLOC_UNBIND(ptr, len, speccount) do { \
- if ((len) > MAX_ALLOCA) \
- unbind_to (speccount, Qnil); \
-} while (0)
-
-DEFUN ("base64-encode-region", Fbase64_encode_region, 2, 3, "r", /*
-Base64-encode the region between BEG and END.
-Return the length of the encoded text.
-Optional third argument NO-LINE-BREAK means do not break long lines
-into shorter lines.
-*/
- (beg, end, no_line_break))
-{
- Bufbyte *encoded;
- Bytind encoded_length;
- Charcount allength, length;
- struct buffer *buf = current_buffer;
- Bufpos begv, zv, old_pt = BUF_PT (buf);
- Lisp_Object input;
- int speccount = specpdl_depth();
-
- get_buffer_range_char (buf, beg, end, &begv, &zv, 0);
- barf_if_buffer_read_only (buf, begv, zv);
-
- /* We need to allocate enough room for encoding the text.
- We need 33 1/3% more space, plus a newline every 76
- characters, and then we round up. */
- length = zv - begv;
- allength = length + length/3 + 1;
- allength += allength / MIME_LINE_LENGTH + 1 + 6;
-
- input = make_lisp_buffer_input_stream (buf, begv, zv, 0);
- /* We needn't multiply allength with MAX_EMCHAR_LEN because all the
- base64 characters will be single-byte. */
- XMALLOC_OR_ALLOCA (encoded, allength, Bufbyte);
- encoded_length = base64_encode_1 (XLSTREAM (input), encoded,
- NILP (no_line_break));
- if (encoded_length > allength)
- abort ();
- Lstream_delete (XLSTREAM (input));
-
- /* Now we have encoded the region, so we insert the new contents
- and delete the old. (Insert first in order to preserve markers.) */
- buffer_insert_raw_string_1 (buf, begv, encoded, encoded_length, 0);
- XMALLOC_UNBIND (encoded, allength, speccount);
- buffer_delete_range (buf, begv + encoded_length, zv + encoded_length, 0);
-
- /* Simulate FSF Emacs implementation of this function: if point was
- in the region, place it at the beginning. */
- if (old_pt >= begv && old_pt < zv)
- BUF_SET_PT (buf, begv);
-
- /* We return the length of the encoded text. */
- return make_int (encoded_length);
-}
-
-DEFUN ("base64-encode-string", Fbase64_encode_string, 1, 2, 0, /*
-Base64 encode STRING and return the result.
-*/
- (string, no_line_break))
-{
- Charcount allength, length;
- Bytind encoded_length;
- Bufbyte *encoded;
- Lisp_Object input, result;
- int speccount = specpdl_depth();
-
- CHECK_STRING (string);
-
- length = XSTRING_CHAR_LENGTH (string);
- allength = length + length/3 + 1;
- allength += allength / MIME_LINE_LENGTH + 1 + 6;
-
- input = make_lisp_string_input_stream (string, 0, -1);
- XMALLOC_OR_ALLOCA (encoded, allength, Bufbyte);
- encoded_length = base64_encode_1 (XLSTREAM (input), encoded,
- NILP (no_line_break));
- if (encoded_length > allength)
- abort ();
- Lstream_delete (XLSTREAM (input));
- result = make_string (encoded, encoded_length);
- XMALLOC_UNBIND (encoded, allength, speccount);
- return result;
-}
-
-DEFUN ("base64-decode-region", Fbase64_decode_region, 2, 2, "r", /*
-Base64-decode the region between BEG and END.
-Return the length of the decoded text.
-If the region can't be decoded, return nil and don't modify the buffer.
-Characters out of the base64 alphabet are ignored.
-*/
- (beg, end))
-{
- struct buffer *buf = current_buffer;
- Bufpos begv, zv, old_pt = BUF_PT (buf);
- Bufbyte *decoded;
- Bytind decoded_length;
- Charcount length, cc_decoded_length;
- Lisp_Object input;
- int speccount = specpdl_depth();
-
- get_buffer_range_char (buf, beg, end, &begv, &zv, 0);
- barf_if_buffer_read_only (buf, begv, zv);
-
- length = zv - begv;
-
- input = make_lisp_buffer_input_stream (buf, begv, zv, 0);
- /* We need to allocate enough room for decoding the text. */
- XMALLOC_OR_ALLOCA (decoded, length * MAX_EMCHAR_LEN, Bufbyte);
- decoded_length = base64_decode_1 (XLSTREAM (input), decoded, &cc_decoded_length);
- if (decoded_length > length * MAX_EMCHAR_LEN)
- abort ();
- Lstream_delete (XLSTREAM (input));
-
- /* Now we have decoded the region, so we insert the new contents
- and delete the old. (Insert first in order to preserve markers.) */
- BUF_SET_PT (buf, begv);
- buffer_insert_raw_string_1 (buf, begv, decoded, decoded_length, 0);
- XMALLOC_UNBIND (decoded, length * MAX_EMCHAR_LEN, speccount);
- buffer_delete_range (buf, begv + cc_decoded_length,
- zv + cc_decoded_length, 0);
-
- /* Simulate FSF Emacs implementation of this function: if point was
- in the region, place it at the beginning. */
- if (old_pt >= begv && old_pt < zv)
- BUF_SET_PT (buf, begv);
-
- return make_int (cc_decoded_length);
-}
-
-DEFUN ("base64-decode-string", Fbase64_decode_string, 1, 1, 0, /*
-Base64-decode STRING and return the result.
-Characters out of the base64 alphabet are ignored.
-*/
- (string))
-{
- Bufbyte *decoded;
- Bytind decoded_length;
- Charcount length, cc_decoded_length;
- Lisp_Object input, result;
- int speccount = specpdl_depth();
-
- CHECK_STRING (string);
-
- length = XSTRING_CHAR_LENGTH (string);
- /* We need to allocate enough room for decoding the text. */
- XMALLOC_OR_ALLOCA (decoded, length * MAX_EMCHAR_LEN, Bufbyte);
-
- input = make_lisp_string_input_stream (string, 0, -1);
- decoded_length = base64_decode_1 (XLSTREAM (input), decoded,
- &cc_decoded_length);
- if (decoded_length > length * MAX_EMCHAR_LEN)
- abort ();
- Lstream_delete (XLSTREAM (input));
-
- result = make_string (decoded, decoded_length);
- XMALLOC_UNBIND (decoded, length * MAX_EMCHAR_LEN, speccount);
- return result;
-}
\f
Lisp_Object Qyes_or_no_p;
DEFSUBR (Fconcat);
DEFSUBR (Fvconcat);
DEFSUBR (Fbvconcat);
- DEFSUBR (Fcopy_list);
DEFSUBR (Fcopy_sequence);
DEFSUBR (Fcopy_alist);
DEFSUBR (Fcopy_tree);
DEFSUBR (Fnthcdr);
DEFSUBR (Fnth);
DEFSUBR (Felt);
- DEFSUBR (Flast);
- DEFSUBR (Fbutlast);
- DEFSUBR (Fnbutlast);
DEFSUBR (Fmember);
DEFSUBR (Fold_member);
DEFSUBR (Fmemq);
DEFSUBR (Ffeaturep);
DEFSUBR (Frequire);
DEFSUBR (Fprovide);
- DEFSUBR (Fbase64_encode_region);
- DEFSUBR (Fbase64_encode_string);
- DEFSUBR (Fbase64_decode_region);
- DEFSUBR (Fbase64_decode_string);
}
void
Used by `featurep' and `require', and altered by `provide'.
*/ );
Vfeatures = Qnil;
-
- Fprovide (intern ("base64"));
}
#include "scrollbar.h"
#include "window.h"
+#include <errno.h>
+#include "sysdep.h"
+
Lisp_Object Vselect_frame_hook, Qselect_frame_hook;
Lisp_Object Vdeselect_frame_hook, Qdeselect_frame_hook;
Lisp_Object Vcreate_frame_hook, Qcreate_frame_hook;
{
struct frame *f = XFRAME (obj);
-#define MARKED_SLOT(x) ((void) (markobj (f->x)));
+#define MARKED_SLOT(x) ((markobj) (f->x));
#include "frameslots.h"
- mark_subwindow_cachels (f->subwindow_cachels, markobj);
-
if (FRAME_LIVE_P (f)) /* device is nil for a dead frame */
MAYBE_FRAMEMETH (f, mark_frame, (f, markobj));
}
DEFINE_LRECORD_IMPLEMENTATION ("frame", frame,
- mark_frame, print_frame, 0, 0, 0, 0,
+ mark_frame, print_frame, 0, 0, 0,
struct frame);
\f
static void
/* This function can GC */
Lisp_Object frame;
Lisp_Object root_window;
- struct frame *f = alloc_lcrecord_type (struct frame, &lrecord_frame);
+ struct frame *f = alloc_lcrecord_type (struct frame, lrecord_frame);
zero_lcrecord (f);
nuke_all_frame_slots (f);
XWINDOW (root_window)->frame = frame;
/* 10 is arbitrary,
- Just so that there is "something there."
+ just so that there is "something there."
Correct size will be set up later with change_frame_size. */
- f->width = 10;
+ f->width = 10;
f->height = 10;
XWINDOW (root_window)->pixel_width = 10;
f->selected_window = root_window;
f->last_nonminibuf_window = root_window;
- /* cache of subwindows visible on frame */
- f->subwindow_cachels = Dynarr_new (subwindow_cachel);
-
/* Choose a buffer for the frame's root window. */
XWINDOW (root_window)->buffer = Qt;
{
things. */
init_frame_toolbars (f);
#endif
+
reset_face_cachels (XWINDOW (FRAME_SELECTED_WINDOW (f)));
reset_glyph_cachels (XWINDOW (FRAME_SELECTED_WINDOW (f)));
- reset_subwindow_cachels (f);
change_frame_size (f, f->height, f->width, 0);
}
void
invalidate_vertical_divider_cache_in_frame (struct frame *f)
{
- /* Invalidate cached value of needs_vertical_divider_p in
+ /* Invalidate cached value of needs_vertical_divider_p in
every and all windows */
map_windows (f, invalidate_vertical_divider_cache_in_window, 0);
}
#ifdef HAVE_TOOLBARS
if (!EQ (f->last_nonminibuf_window, window))
MARK_TOOLBAR_CHANGED;
-#endif
+#endif
f->last_nonminibuf_window = window;
}
}
delete_all_subwindows (XWINDOW (f->root_window));
f->root_window = Qnil;
- /* clear out the cached glyph information */
- if (f->subwindow_cachels)
- {
- Dynarr_free (f->subwindow_cachels);
- f->subwindow_cachels = 0;
- }
-
/* Remove the frame now from the list. This way, any events generated
on this frame by the maneuvers below will disperse themselves. */
struct window *w;
int pix_x, pix_y;
- CHECK_LIVE_WINDOW (window);
+ CHECK_WINDOW (window);
CHECK_INT (x);
CHECK_INT (y);
{
struct window *w;
- CHECK_LIVE_WINDOW (window);
+ CHECK_WINDOW (window);
CHECK_INT (x);
CHECK_INT (y);
/* when frame_conversion_internal() calculated the number of rows/cols
in the frame, the theoretical toolbar sizes were subtracted out.
- The calculations below adjust for real toolbar height/width in
+ The caluclations below adjust for real toolbar height/width in
frame, which may be different from frame spec, taking the above
fact into account */
new_pixheight +=
+ 2 * FRAME_THEORETICAL_TOP_TOOLBAR_BORDER_WIDTH (f)
- FRAME_REAL_TOP_TOOLBAR_HEIGHT (f)
- 2 * FRAME_REAL_TOP_TOOLBAR_BORDER_WIDTH (f);
-
+
new_pixheight +=
+ FRAME_THEORETICAL_BOTTOM_TOOLBAR_HEIGHT (f)
+ 2 * FRAME_THEORETICAL_BOTTOM_TOOLBAR_BORDER_WIDTH (f)
+ 2 * FRAME_THEORETICAL_LEFT_TOOLBAR_BORDER_WIDTH (f)
- FRAME_REAL_LEFT_TOOLBAR_WIDTH (f)
- 2 * FRAME_REAL_LEFT_TOOLBAR_BORDER_WIDTH (f);
-
+
new_pixwidth +=
+ FRAME_THEORETICAL_RIGHT_TOOLBAR_WIDTH (f)
+ 2 * FRAME_THEORETICAL_RIGHT_TOOLBAR_BORDER_WIDTH (f)
- FRAME_REAL_RIGHT_TOOLBAR_WIDTH (f)
- 2 * FRAME_REAL_RIGHT_TOOLBAR_BORDER_WIDTH (f);
-
+
/* Adjust the width for the end glyph which may be a different width
than the default character width. */
{
FRAME_CHARWIDTH (f) = FRAME_WIDTH (f);
FRAME_CHARHEIGHT (f) = FRAME_HEIGHT (f);
}
-
+
MARK_FRAME_TOOLBARS_CHANGED (f);
MARK_FRAME_CHANGED (f);
f->echo_area_garbaged = 1;
--- /dev/null
+# -*- ksh -*-
+# Copyright (C) 1998 Free Software Foundation, Inc.
+
+# This file is part of XEmacs.
+
+# XEmacs is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2, or (at your option) any
+# later version.
+
+# XEmacs is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with XEmacs; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# Author: Martin Buchholz
+
+# Some useful commands for debugging emacs with gdb 4.16 or better.
+# Install this as your .gdbinit file in your home directory,
+# or source this file from your .gdbinit
+# Configure xemacs with --debug, and compile with -g.
+#
+# See also the question of the XEmacs FAQ, titled
+# "How to Debug an XEmacs problem with a debugger".
+#
+# This can be used to debug XEmacs no matter how the following are
+# specified:
+
+# USE_UNION_TYPE
+# USE_MINIMAL_TAGBITS
+# USE_INDEXED_LRECORD_IMPLEMENTATION
+# LRECORD_(SYMBOL|STRING|VECTOR)
+
+# (the above all have configure equivalents)
+
+# Some functions defined here require a running process, but most
+# don't. Considerable effort has been expended to this end.
+
+# See the dbg_ C support code in src/alloc.c that allows the functions
+# defined in this file to work correctly.
+
+set print union off
+set print pretty off
+
+define decode_object
+ set $obj = (unsigned long) $arg0
+ if dbg_USE_MINIMAL_TAGBITS
+ if $obj & 1
+ # It's an int
+ set $val = $obj >> 1
+ set $type = dbg_Lisp_Type_Int
+ else
+ set $type = $obj & dbg_typemask
+ if $type == dbg_Lisp_Type_Char
+ set $val = ($obj & dbg_valmask) >> dbg_gctypebits
+ else
+ # It's a record pointer
+ set $val = $obj
+ end
+ end
+ else
+ # not dbg_USE_MINIMAL_TAGBITS
+ set $val = $obj & dbg_valmask
+ set $type = ($obj & dbg_typemask) >> (dbg_valbits + 1)
+ end
+
+ if $type == dbg_Lisp_Type_Record
+ set $lheader = (struct lrecord_header *) $val
+ if dbg_USE_INDEXED_LRECORD_IMPLEMENTATION
+ set $imp = lrecord_implementations_table[$lheader->type]
+ else
+ set $imp = $lheader->implementation
+ end
+ else
+ set $imp = -1
+ end
+end
+
+document decode_object
+Usage: decode_object lisp_object
+Extract implementation information from a Lisp Object.
+Defines variables $val, $type and $imp.
+end
+
+define xint
+decode_object $arg0
+print ((long) $val)
+end
+
+define xtype
+ decode_object $arg0
+ if $type == dbg_Lisp_Type_Int
+ echo int\n
+ else
+ if $type == dbg_Lisp_Type_Char
+ echo char\n
+ else
+ if $type == dbg_Lisp_Type_Symbol
+ echo symbol\n
+ else
+ if $type == dbg_Lisp_Type_String
+ echo string\n
+ else
+ if $type == dbg_Lisp_Type_Vector
+ echo vector\n
+ else
+ if $type == dbg_Lisp_Type_Cons
+ echo cons\n
+ else
+ printf "record type: %s\n", $imp->name
+ # barf
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+define run-temacs
+ unset env EMACSLOADPATH
+ set env EMACSBOOTSTRAPLOADPATH ../lisp/:..
+ run -batch -l ../lisp/loadup.el run-temacs -q
+end
+
+document run-temacs
+Usage: run-temacs
+Run temacs interactively, like xemacs.
+Use this with debugging tools (like purify) that cannot deal with dumping,
+or when temacs builds successfully, but xemacs does not.
+end
+
+define update-elc
+ unset env EMACSLOADPATH
+ set env EMACSBOOTSTRAPLOADPATH ../lisp/:..
+ run -batch -l ../lisp/update-elc.el
+end
+
+document update-elc
+Usage: update-elc
+Run the core lisp byte compilation part of the build procedure.
+Use when debugging temacs, not xemacs!
+Use this when temacs builds successfully, but xemacs does not.
+end
+
+define dump-temacs
+ unset env EMACSLOADPATH
+ set env EMACSBOOTSTRAPLOADPATH ../lisp/:..
+ run -batch -l ../lisp/loadup.el dump
+end
+
+document dump-temacs
+Usage: dump-temacs
+Run the dumping part of the build procedure.
+Use when debugging temacs, not xemacs!
+Use this when temacs builds successfully, but xemacs does not.
+end
+
+# if you use Purify, do this:
+# export PURIFYOPTIONS='-pointer-mask=0x0fffffff'
+
+define ldp
+ printf "%s", "Lisp => "
+ call debug_print($arg0)
+end
+
+document ldp
+Usage: ldp lisp_object
+Print a Lisp Object value using the Lisp printer.
+Requires a running xemacs process.
+end
+
+define lbt
+call debug_backtrace()
+end
+
+document lbt
+Usage: lbt
+Print the current Lisp stack trace.
+Requires a running xemacs process.
+end
+
+define wtype
+print $arg0->core.widget_class->core_class.class_name
+end
+
+define xtname
+print XrmQuarkToString(((Object)($arg0))->object.xrm_name)
+end
+
+# GDB's command language makes you want to ...
+
+define pstruct
+ set $xstruct = (struct $arg0 *) $val
+ print $xstruct
+ print *$xstruct
+end
+
+define pobj
+ decode_object $arg0
+ if $type == dbg_Lisp_Type_Int
+ printf "Integer: %d\n", $val
+ else
+ if $type == dbg_Lisp_Type_Char
+ if $val < 128
+ printf "Char: %c\n", $val
+ else
+ printf "Char: %d\n", $val
+ end
+ else
+ if $type == dbg_Lisp_Type_String || $imp == lrecord_string
+ pstruct Lisp_String
+ else
+ if $type == dbg_Lisp_Type_Cons || $imp == lrecord_cons
+ pstruct Lisp_Cons
+ else
+ if $type == dbg_Lisp_Type_Symbol || $imp == lrecord_symbol
+ pstruct Lisp_Symbol
+ printf "Symbol name: %s\n", $xstruct->name->_data
+ else
+ if $type == dbg_Lisp_Type_Vector || $imp == lrecord_vector
+ pstruct Lisp_Vector
+ printf "Vector of length %d\n", $xstruct->size
+ #print *($xstruct->_data) @ $xstruct->size
+ else
+ if $imp == lrecord_bit_vector
+ pstruct Lisp_Bit_Vector
+ else
+ if $imp == lrecord_buffer
+ pstruct buffer
+ else
+ if $imp == lrecord_char_table
+ pstruct Lisp_Char_Table
+ else
+ if $imp == lrecord_char_table_entry
+ pstruct Lisp_Char_Table_Entry
+ else
+ if $imp == lrecord_charset
+ pstruct Lisp_Charset
+ else
+ if $imp == lrecord_coding_system
+ pstruct Lisp_Coding_System
+ else
+ if $imp == lrecord_color_instance
+ pstruct Lisp_Color_Instance
+ else
+ if $imp == lrecord_command_builder
+ pstruct command_builder
+ else
+ if $imp == lrecord_compiled_function
+ pstruct Lisp_Compiled_Function
+ else
+ if $imp == lrecord_console
+ pstruct console
+ else
+ if $imp == lrecord_database
+ pstruct database
+ else
+ if $imp == lrecord_device
+ pstruct device
+ else
+ if $imp == lrecord_event
+ pstruct Lisp_Event
+ else
+ if $imp == lrecord_extent
+ pstruct extent
+ else
+ if $imp == lrecord_extent_auxiliary
+ pstruct extent_auxiliary
+ else
+ if $imp == lrecord_extent_info
+ pstruct extent_info
+ else
+ if $imp == lrecord_face
+ pstruct Lisp_Face
+ else
+ if $imp == lrecord_float
+ pstruct Lisp_Float
+ else
+ if $imp == lrecord_font_instance
+ pstruct Lisp_Font_Instance
+ else
+ if $imp == lrecord_frame
+ pstruct frame
+ else
+ if $imp == lrecord_glyph
+ pstruct Lisp_Glyph
+ else
+ if $imp == lrecord_hashtable
+ pstruct hashtable
+ else
+ if $imp == lrecord_image_instance
+ pstruct Lisp_Image_Instance
+ else
+ if $imp == lrecord_keymap
+ pstruct keymap
+ else
+ if $imp == lrecord_lcrecord_list
+ pstruct lcrecord_list
+ else
+ if $imp == lrecord_lstream
+ pstruct lstream
+ else
+ if $imp == lrecord_marker
+ pstruct Lisp_Marker
+ else
+ if $imp == lrecord_opaque
+ pstruct Lisp_Opaque
+ else
+ if $imp == lrecord_opaque_list
+ pstruct Lisp_Opaque_List
+ else
+ if $imp == lrecord_popup_data
+ pstruct popup_data
+ else
+ if $imp == lrecord_process
+ pstruct Lisp_Process
+ else
+ if $imp == lrecord_range_table
+ pstruct Lisp_Range_Table
+ else
+ if $imp == lrecord_specifier
+ pstruct Lisp_Specifier
+ else
+ if $imp == lrecord_subr
+ pstruct Lisp_Subr
+ else
+ if $imp == lrecord_symbol_value_buffer_local
+ pstruct symbol_value_buffer_local
+ else
+ if $imp == lrecord_symbol_value_forward
+ pstruct symbol_value_forward
+ else
+ if $imp == lrecord_symbol_value_lisp_magic
+ pstruct symbol_value_lisp_magic
+ else
+ if $imp == lrecord_symbol_value_varalias
+ pstruct symbol_value_varalias
+ else
+ if $imp == lrecord_toolbar_button
+ pstruct toolbar_button
+ else
+ if $imp == lrecord_tooltalk_message
+ pstruct Lisp_Tooltalk_Message
+ else
+ if $imp == lrecord_tooltalk_pattern
+ pstruct Lisp_Tooltalk_Pattern
+ else
+ if $imp == lrecord_weak_list
+ pstruct weak_list
+ else
+ if $imp == lrecord_window
+ pstruct window
+ else
+ if $imp == lrecord_window_configuration
+ pstruct window_config
+ else
+ echo Unknown Lisp Object type\n
+ print $arg0
+ # Barf, gag, retch
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+document pobj
+Usage: pobj lisp_object
+Print the internal C structure of a underlying Lisp Object.
+end
#include "lstream.h"
#include "console.h"
#include "device.h"
-#include "faces.h"
#include "glyphs.h"
#include "objects.h"
#include "buffer.h"
#include "frame.h"
+#include "insdel.h"
#include "opaque.h"
+#include "imgproc.h"
#include "sysfile.h"
#ifdef HAVE_PNG
#include "file-coding.h"
#endif
+#if INTBITS == 32
+# define FOUR_BYTE_TYPE unsigned int
+#elif LONGBITS == 32
+# define FOUR_BYTE_TYPE unsigned long
+#elif SHORTBITS == 32
+# define FOUR_BYTE_TYPE unsigned short
+#else
+#error What kind of strange-ass system are we running on?
+#endif
+
#ifdef HAVE_TIFF
DEFINE_IMAGE_INSTANTIATOR_FORMAT (tiff);
Lisp_Object Qtiff;
{
/* we're relying on the jpeg driver to do any other conversions,
or signal an error if the conversion isn't supported. */
- cinfo.out_color_space = JCS_RGB;
+ cinfo.out_color_space = JCS_RGB;
}
/* Step 5: Start decompressor */
for (i = 0; i < cinfo.output_width; i++)
{
int clr;
- if (jpeg_gray)
+ if (jpeg_gray)
{
unsigned char val;
#if (BITS_IN_JSAMPLE == 8)
/* Step 6.5: Create the pixmap and set up the image instance */
/* now instantiate */
- MAYBE_DEVMETH (XDEVICE (ii->device),
+ MAYBE_DEVMETH (XDEVICE (ii->device),
init_image_instance_from_eimage,
- (ii, cinfo.output_width, cinfo.output_height,
- unwind.eimage, dest_mask,
+ (ii, cinfo.output_width, cinfo.output_height,
+ unwind.eimage, dest_mask,
instantiator, domain));
/* Step 7: Finish decompression */
* GIF *
**********************************************************************/
-#include "gifrlib.h"
+#include <gifrlib.h>
static void
gif_validate (Lisp_Object instantiator)
gif_read_from_memory(GifByteType *buf, size_t size, VoidPtr data)
{
gif_memory_storage *mem = (gif_memory_storage*)data;
-
+
if (size > (mem->len - mem->index))
- return (size_t) -1;
+ return -1;
memcpy(buf, mem->bytes + mem->index, size);
mem->index = mem->index + size;
return size;
Extcount len;
int height = 0;
int width = 0;
-
+
xzero (unwind);
record_unwind_protect (gif_instantiate_unwind, make_opaque_ptr (&unwind));
-
+
/* 1. Now decode the data. */
-
+
{
Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
-
+
assert (!NILP (data));
-
+
if (!(unwind.giffile = GifSetup()))
signal_image_error ("Insufficent memory to instantiate GIF image", instantiator);
-
+
/* set up error facilities */
if (setjmp(gif_err.setjmp_buffer))
{
signal_image_error_2 ("GIF decoding error", errstring, instantiator);
}
GifSetErrorFunc(unwind.giffile, (Gif_error_func)gif_error_func, (VoidPtr)&gif_err);
-
+
GET_STRING_BINARY_DATA_ALLOCA (data, bytes, len);
mem_struct.bytes = bytes;
mem_struct.len = len;
GifSetReadFunc(unwind.giffile, gif_read_from_memory, (VoidPtr)&mem_struct);
GifSetCloseFunc(unwind.giffile, gif_memory_close, (VoidPtr)&mem_struct);
DGifInitRead(unwind.giffile);
-
+
/* Then slurp the image into memory, decoding along the way.
The result is the image in a simple one-byte-per-pixel
format (#### the GIF routines only support 8-bit GIFs,
it appears). */
DGifSlurp (unwind.giffile);
}
-
+
/* 3. Now create the EImage */
{
ColorMapObject *cmo = unwind.giffile->SColorMap;
0, 8, 16, ..., 4, 12, 20, ..., 2, 6, 10, ..., 1, 3, 5, ... */
static int InterlacedOffset[] = { 0, 4, 2, 1 };
static int InterlacedJumps[] = { 8, 8, 4, 2 };
-
+
height = unwind.giffile->SHeight;
width = unwind.giffile->SWidth;
unwind.eimage = (unsigned char*) xmalloc (width * height * 3);
if (!unwind.eimage)
signal_image_error("Unable to allocate enough memory for image", instantiator);
-
+
/* write the data in EImage format (8bit RGB triples) */
-
+
/* Note: We just use the first image in the file and ignore the rest.
We check here that that image covers the full "screen" size.
I don't know whether that's always the case.
|| unwind.giffile->SavedImages[0].ImageDesc.Top != 0)
signal_image_error ("First image in GIF file is not full size",
instantiator);
-
+
interlace = unwind.giffile->SavedImages[0].ImageDesc.Interlace;
pass = 0;
row = interlace ? InterlacedOffset[pass] : 0;
eip = unwind.eimage;
for (i = 0; i < height; i++)
{
- if (interlace)
- if (row >= height) {
- row = InterlacedOffset[++pass];
- while (row >= height)
- row = InterlacedOffset[++pass];
- }
+ if (interlace && row >= height)
+ row = InterlacedOffset[++pass];
eip = unwind.eimage + (row * width * 3);
for (j = 0; j < width; j++)
{
}
}
/* now instantiate */
- MAYBE_DEVMETH (XDEVICE (ii->device),
+ MAYBE_DEVMETH (XDEVICE (ii->device),
init_image_instance_from_eimage,
- (ii, width, height, unwind.eimage, dest_mask,
+ (ii, width, height, unwind.eimage, dest_mask,
instantiator, domain));
-
+
unbind_to (speccount, Qnil);
}
/* jh 98/03/12 - #### AARRRGH! libpng includes jmp_buf inside its own
structure, and there are cases where the size can be different from
- between inside the library, and inside the code! To do an end run
+ between inside the libarary, and inside the code! To do an end run
around this, use our own error functions, and don't rely on things
passed in the png_ptr to them. This is an ugly hack and must
go away when the lisp engine is threaded! */
if (data->instream)
fclose (data->instream);
- if (data->eimage) xfree(data->eimage);
-
return Qnil;
}
png_destroy_read_struct (&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
signal_image_error ("Error obtaining memory for png_read", instantiator);
}
-
+
xzero (unwind);
unwind.png_ptr = png_ptr;
unwind.info_ptr = info_ptr;
and is no longer usable for previous versions. jh
*/
- /* Set the jmp_buf return context for png_error ... if this returns !0, then
+ /* Set the jmp_buf reurn context for png_error ... if this returns !0, then
we ran into a problem somewhere, and need to clean up after ourselves. */
if (setjmp (png_err_stct.setjmp_buffer))
{
/* libpng expects that the image buffer passed in contains a
picture to draw on top of if the png has any transparencies.
This could be a good place to pass that in... */
-
+
row_pointers = xnew_array (png_byte *, height);
for (y = 0; y < height; y++)
row_pointers[y] = unwind.eimage + (width * 3 * y);
- {
- /* if the png specifies a background chunk, go ahead and
- use it, else use what we can get from the default face. */
- png_color_16 my_background, *image_background;
- Lisp_Object bkgd = Qnil;
-
- my_background.red = 0x7fff;
- my_background.green = 0x7fff;
- my_background.blue = 0x7fff;
- bkgd = FACE_BACKGROUND (Vdefault_face, domain);
- if (!COLOR_INSTANCEP (bkgd))
- {
- warn_when_safe (Qpng, Qinfo, "Couldn't get background color!");
- }
- else
- {
- struct Lisp_Color_Instance *c;
- Lisp_Object rgblist;
-
- c = XCOLOR_INSTANCE (bkgd);
- rgblist = MAYBE_LISP_DEVMETH (XDEVICE (c->device),
- color_instance_rgb_components,
- (c));
- my_background.red = XINT (XCAR (rgblist));
- my_background.green = XINT (XCAR (XCDR (rgblist)));
- my_background.blue = XINT (XCAR (XCDR (XCDR (rgblist))));
- }
-
- if (png_get_bKGD (png_ptr, info_ptr, &image_background))
- png_set_background (png_ptr, image_background,
- PNG_BACKGROUND_GAMMA_FILE, 1, 1.0);
- else
- png_set_background (png_ptr, &my_background,
- PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0);
- }
-
/* Now that we're using EImage, ask for 8bit RGB triples for any type
of image*/
- /* convert palette images to full RGB */
+ /* convert palatte images to full RGB */
if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
png_set_expand (png_ptr);
/* send grayscale images to RGB too */
/* we can't handle alpha values */
if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA)
png_set_strip_alpha (png_ptr);
+ /* rip out any transparancy layers/colors */
+ if (png_get_valid (png_ptr, info_ptr, PNG_INFO_tRNS))
+ {
+ png_set_expand (png_ptr);
+ png_set_strip_alpha (png_ptr);
+ }
/* tell libpng to strip 16 bit depth files down to 8 bits */
if (info_ptr->bit_depth == 16)
png_set_strip_16 (png_ptr);
png_set_packing (png_ptr);
}
+#if 1 /* tests? or permanent? */
+ {
+ /* if the png specifies a background chunk, go ahead and
+ use it */
+ png_color_16 my_background, *image_background;
+
+ /* ### how do I get the background of the current frame? */
+ my_background.red = 0x7fff;
+ my_background.green = 0x7fff;
+ my_background.blue = 0x7fff;
+
+ if (png_get_bKGD (png_ptr, info_ptr, &image_background))
+ png_set_background (png_ptr, image_background,
+ PNG_BACKGROUND_GAMMA_FILE, 1, 1.0);
+ else
+ png_set_background (png_ptr, &my_background,
+ PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0);
+ }
+#endif
png_read_image (png_ptr, row_pointers);
png_read_end (png_ptr, info_ptr);
-
+
#ifdef PNG_SHOW_COMMENTS
/* ####
* I turn this off by default now, because the !%^@#!% comments
}
/* now instantiate */
- MAYBE_DEVMETH (XDEVICE (ii->device),
+ MAYBE_DEVMETH (XDEVICE (ii->device),
init_image_instance_from_eimage,
- (ii, width, height, unwind.eimage, dest_mask,
+ (ii, width, height, unwind.eimage, dest_mask,
instantiator, domain));
/* This will clean up everything else. */
if ((newidx > mem->len) || (newidx < 0))
return -1;
-
+
mem->index = newidx;
return newidx;
}
xzero (unwind);
record_unwind_protect (tiff_instantiate_unwind, make_opaque_ptr (&unwind));
-
+
/* set up error facilities */
if (setjmp (tiff_err_data.setjmp_buffer))
{
unwind.eimage = (unsigned char *) xmalloc (width * height * 3);
/* ### This is little more than proof-of-concept/function testing.
- It needs to be reimplemented via scanline reads for both memory
+ It needs to be reimplimented via scanline reads for both memory
compactness. */
raster = (uint32*) _TIFFmalloc (width * height * sizeof (uint32));
if (raster != NULL)
}
/* now instantiate */
- MAYBE_DEVMETH (XDEVICE (ii->device),
+ MAYBE_DEVMETH (XDEVICE (ii->device),
init_image_instance_from_eimage,
- (ii, width, height, unwind.eimage, dest_mask,
+ (ii, width, height, unwind.eimage, dest_mask,
instantiator, domain));
unbind_to (speccount, Qnil);
Copyright (C) 1995 Tinker Systems
Copyright (C) 1995, 1996 Ben Wing
Copyright (C) 1995 Sun Microsystems
- Copyright (C) 1998 Andy Piper
This file is part of XEmacs.
#include "faces.h"
#include "frame.h"
#include "insdel.h"
-#include "opaque.h"
+#include "glyphs.h"
#include "objects.h"
#include "redisplay.h"
#include "window.h"
-#include "frame.h"
-#include "chartab.h"
-#include "rangetab.h"
#ifdef HAVE_XPM
#include <X11/xpm.h>
Lisp_Object Qcolor_pixmap_image_instance_p;
Lisp_Object Qpointer_image_instance_p;
Lisp_Object Qsubwindow_image_instance_p;
-Lisp_Object Qwidget_image_instance_p;
Lisp_Object Qconst_glyph_variable;
Lisp_Object Qmono_pixmap, Qcolor_pixmap, Qsubwindow;
-Lisp_Object Q_file, Q_data, Q_face, Q_pixel_width, Q_pixel_height;
+Lisp_Object Q_file, Q_data, Q_face;
Lisp_Object Qformatted_string;
+
Lisp_Object Vcurrent_display_table;
Lisp_Object Vtruncation_glyph, Vcontinuation_glyph, Voctal_escape_glyph;
Lisp_Object Vcontrol_arrow_glyph, Vinvisible_text_glyph, Vhscroll_glyph;
DEFINE_IMAGE_INSTANTIATOR_FORMAT (inherit);
DEFINE_IMAGE_INSTANTIATOR_FORMAT (string);
DEFINE_IMAGE_INSTANTIATOR_FORMAT (formatted_string);
-DEFINE_IMAGE_INSTANTIATOR_FORMAT (subwindow);
#ifdef HAVE_WINDOW_SYSTEM
DEFINE_IMAGE_INSTANTIATOR_FORMAT (xbm);
#endif
#endif
-#ifdef HAVE_XFACE
-DEFINE_IMAGE_INSTANTIATOR_FORMAT (xface);
-Lisp_Object Qxface;
-#endif
-
#ifdef HAVE_XPM
DEFINE_IMAGE_INSTANTIATOR_FORMAT (xpm);
Lisp_Object Qxpm;
struct image_instantiator_format_entry
{
Lisp_Object symbol;
- Lisp_Object device;
struct image_instantiator_methods *meths;
};
* Image Instantiators *
****************************************************************************/
-struct image_instantiator_methods *
-decode_device_ii_format (Lisp_Object device, Lisp_Object format,
- Error_behavior errb)
+static struct image_instantiator_methods *
+decode_image_instantiator_format (Lisp_Object format, Error_behavior errb)
{
int i;
for (i = 0; i < Dynarr_length (the_image_instantiator_format_entry_dynarr);
i++)
{
- if ( EQ (format,
- Dynarr_at (the_image_instantiator_format_entry_dynarr, i).
- symbol) )
- {
- Lisp_Object d = Dynarr_at (the_image_instantiator_format_entry_dynarr, i).
- device;
- if ((NILP (d) && NILP (device))
- ||
- (!NILP (device) &&
- EQ (CONSOLE_TYPE (XCONSOLE
- (DEVICE_CONSOLE (XDEVICE (device)))), d)))
- return Dynarr_at (the_image_instantiator_format_entry_dynarr, i).meths;
- }
+ if (EQ (format,
+ Dynarr_at (the_image_instantiator_format_entry_dynarr, i).
+ symbol))
+ return Dynarr_at (the_image_instantiator_format_entry_dynarr, i).meths;
}
maybe_signal_simple_error ("Invalid image-instantiator format", format,
return 0;
}
-struct image_instantiator_methods *
-decode_image_instantiator_format (Lisp_Object format, Error_behavior errb)
-{
- return decode_device_ii_format (Qnil, format, errb);
-}
-
static int
-valid_image_instantiator_format_p (Lisp_Object format, Lisp_Object locale)
+valid_image_instantiator_format_p (Lisp_Object format)
{
- int i;
- struct image_instantiator_methods* meths =
- decode_image_instantiator_format (format, ERROR_ME_NOT);
- struct console* console = decode_console (locale);
- Lisp_Object contype = console ? CONSOLE_TYPE (console) : locale;
- /* nothing is valid in all locales */
- if (EQ (format, Qnothing))
- return 1;
- /* reject unknown formats */
- else if (!console || !meths)
- return 0;
-
- for (i = 0; i < Dynarr_length (meths->consoles); i++)
- if (EQ (contype, Dynarr_at (meths->consoles, i).symbol))
- return 1;
- return 0;
+ return (decode_image_instantiator_format (format, ERROR_ME_NOT) != 0);
}
DEFUN ("valid-image-instantiator-format-p", Fvalid_image_instantiator_format_p,
- 1, 2, 0, /*
+ 1, 1, 0, /*
Given an IMAGE-INSTANTIATOR-FORMAT, return non-nil if it is valid.
-If LOCALE is non-nil then the format is checked in that domain.
-If LOCALE is nil the current console is used.
Valid formats are some subset of 'nothing, 'string, 'formatted-string,
'xpm, 'xbm, 'xface, 'gif, 'jpeg, 'png, 'tiff, 'cursor-font, 'font,
-'autodetect, 'widget and 'subwindow, depending on how XEmacs was compiled.
+'autodetect, and 'subwindow, depending on how XEmacs was compiled.
*/
- (image_instantiator_format, locale))
+ (image_instantiator_format))
{
- return valid_image_instantiator_format_p (image_instantiator_format, locale) ?
+ return valid_image_instantiator_format_p (image_instantiator_format) ?
Qt : Qnil;
}
}
void
-add_entry_to_device_ii_format_list (Lisp_Object device, Lisp_Object symbol,
- struct image_instantiator_methods *meths)
+add_entry_to_image_instantiator_format_list (Lisp_Object symbol,
+ struct
+ image_instantiator_methods *meths)
{
struct image_instantiator_format_entry entry;
entry.symbol = symbol;
- entry.device = device;
entry.meths = meths;
Dynarr_add (the_image_instantiator_format_entry_dynarr, entry);
Vimage_instantiator_format_list =
Fcons (symbol, Vimage_instantiator_format_list);
}
-void
-add_entry_to_image_instantiator_format_list (Lisp_Object symbol,
- struct
- image_instantiator_methods *meths)
-{
- add_entry_to_device_ii_format_list (Qnil, symbol, meths);
-}
-
static Lisp_Object *
get_image_conversion_list (Lisp_Object console_type)
{
CHECK_STRING (data);
}
-void
-check_valid_vector (Lisp_Object data)
-{
- CHECK_VECTOR (data);
-}
-
-void
+static void
check_valid_face (Lisp_Object data)
{
Fget_face (data);
longer exist (e.g. w3 pixmaps are almost always from temporary
files). */
{
- struct gcpro gcpro1;
- struct image_instantiator_methods *meths;
-
- GCPRO1 (instantiator);
-
- meths = decode_image_instantiator_format (XVECTOR_DATA (instantiator)[0],
- ERROR_ME);
- RETURN_UNGCPRO (IIFORMAT_METH_OR_GIVEN (meths, normalize,
- (instantiator, contype),
- instantiator));
+ struct image_instantiator_methods * meths =
+ decode_image_instantiator_format (XVECTOR_DATA (instantiator)[0],
+ ERROR_ME);
+ return IIFORMAT_METH_OR_GIVEN (meths, normalize,
+ (instantiator, contype),
+ instantiator);
}
}
Lisp_Object ii = allocate_image_instance (device);
struct image_instantiator_methods *meths;
struct gcpro gcpro1;
- int methp = 0;
GCPRO1 (ii);
- if (!valid_image_instantiator_format_p (XVECTOR_DATA (instantiator)[0], device))
- signal_simple_error
- ("Image instantiator format is invalid in this locale.",
- instantiator);
-
meths = decode_image_instantiator_format (XVECTOR_DATA (instantiator)[0],
ERROR_ME);
- methp = (int)HAS_IIFORMAT_METH_P (meths, instantiate);
- MAYBE_IIFORMAT_METH (meths, instantiate, (ii, instantiator, pointer_fg,
- pointer_bg, dest_mask, domain));
-
- /* now do device specific instantiation */
- meths = decode_device_ii_format (device, XVECTOR_DATA (instantiator)[0],
- ERROR_ME_NOT);
-
- if (!methp && (!meths || !HAS_IIFORMAT_METH_P (meths, instantiate)))
+ if (!HAS_IIFORMAT_METH_P (meths, instantiate))
signal_simple_error
("Don't know how to instantiate this image instantiator?",
instantiator);
- MAYBE_IIFORMAT_METH (meths, instantiate, (ii, instantiator, pointer_fg,
- pointer_bg, dest_mask, domain));
+ IIFORMAT_METH (meths, instantiate, (ii, instantiator, pointer_fg,
+ pointer_bg, dest_mask, domain));
UNGCPRO;
return ii;
{
struct Lisp_Image_Instance *i = XIMAGE_INSTANCE (obj);
- markobj (i->name);
+ (markobj) (i->name);
switch (IMAGE_INSTANCE_TYPE (i))
{
case IMAGE_TEXT:
- markobj (IMAGE_INSTANCE_TEXT_STRING (i));
+ (markobj) (IMAGE_INSTANCE_TEXT_STRING (i));
break;
case IMAGE_MONO_PIXMAP:
case IMAGE_COLOR_PIXMAP:
- markobj (IMAGE_INSTANCE_PIXMAP_FILENAME (i));
- markobj (IMAGE_INSTANCE_PIXMAP_MASK_FILENAME (i));
- markobj (IMAGE_INSTANCE_PIXMAP_HOTSPOT_X (i));
- markobj (IMAGE_INSTANCE_PIXMAP_HOTSPOT_Y (i));
- markobj (IMAGE_INSTANCE_PIXMAP_FG (i));
- markobj (IMAGE_INSTANCE_PIXMAP_BG (i));
+ (markobj) (IMAGE_INSTANCE_PIXMAP_FILENAME (i));
+ (markobj) (IMAGE_INSTANCE_PIXMAP_MASK_FILENAME (i));
+ (markobj) (IMAGE_INSTANCE_PIXMAP_HOTSPOT_X (i));
+ (markobj) (IMAGE_INSTANCE_PIXMAP_HOTSPOT_Y (i));
+ (markobj) (IMAGE_INSTANCE_PIXMAP_FG (i));
+ (markobj) (IMAGE_INSTANCE_PIXMAP_BG (i));
break;
-
- case IMAGE_WIDGET:
- markobj (IMAGE_INSTANCE_WIDGET_TYPE (i));
- markobj (IMAGE_INSTANCE_WIDGET_PROPS (i));
- markobj (IMAGE_INSTANCE_WIDGET_FACE (i));
- markobj (IMAGE_INSTANCE_WIDGET_ITEM (i));
case IMAGE_SUBWINDOW:
- markobj (IMAGE_INSTANCE_SUBWINDOW_FRAME (i));
+ /* #### implement me */
break;
-
default:
break;
}
}
break;
- case IMAGE_WIDGET:
- /*
- if (!NILP (IMAGE_INSTANCE_WIDGET_CALLBACK (ii)))
- {
- print_internal (IMAGE_INSTANCE_WIDGET_CALLBACK (ii), printcharfun, 0);
- write_c_string (", ", printcharfun);
- }
- */
- if (!NILP (IMAGE_INSTANCE_WIDGET_FACE (ii)))
- {
- write_c_string (" (", printcharfun);
- print_internal
- (IMAGE_INSTANCE_WIDGET_FACE (ii), printcharfun, 0);
- write_c_string (")", printcharfun);
- }
-
- if (!NILP (IMAGE_INSTANCE_WIDGET_TEXT (ii)))
- print_internal (IMAGE_INSTANCE_WIDGET_TEXT (ii), printcharfun, 0);
-
case IMAGE_SUBWINDOW:
- sprintf (buf, " %dx%d", IMAGE_INSTANCE_SUBWINDOW_WIDTH (ii),
- IMAGE_INSTANCE_SUBWINDOW_HEIGHT (ii));
- write_c_string (buf, printcharfun);
-
- /* This is stolen from frame.c. Subwindows are strange in that they
- are specific to a particular frame so we want to print in their
- description what that frame is. */
-
- write_c_string (" on #<", printcharfun);
- {
- struct frame* f = XFRAME (IMAGE_INSTANCE_SUBWINDOW_FRAME (ii));
-
- if (!FRAME_LIVE_P (f))
- write_c_string ("dead", printcharfun);
- else
- write_c_string (DEVICE_TYPE_NAME (XDEVICE (FRAME_DEVICE (f))),
- printcharfun);
-
- write_c_string ("-frame ", printcharfun);
- }
- write_c_string (">", printcharfun);
- sprintf (buf, " 0x%p", IMAGE_INSTANCE_SUBWINDOW_ID (ii));
- write_c_string (buf, printcharfun);
-
+ /* #### implement me */
break;
default:
return;
if (for_disksave) finalose (i);
- /* do this so that the cachels get reset */
- if (IMAGE_INSTANCE_TYPE (i) == IMAGE_WIDGET
- ||
- IMAGE_INSTANCE_TYPE (i) == IMAGE_SUBWINDOW)
- {
- MARK_FRAME_GLYPHS_CHANGED
- (XFRAME (IMAGE_INSTANCE_SUBWINDOW_FRAME (i)));
- }
-
MAYBE_DEVMETH (XDEVICE (i->device), finalize_image_instance, (i));
}
static int
-image_instance_equal (Lisp_Object obj1, Lisp_Object obj2, int depth)
+image_instance_equal (Lisp_Object o1, Lisp_Object o2, int depth)
{
- struct Lisp_Image_Instance *i1 = XIMAGE_INSTANCE (obj1);
- struct Lisp_Image_Instance *i2 = XIMAGE_INSTANCE (obj2);
+ struct Lisp_Image_Instance *i1 = XIMAGE_INSTANCE (o1);
+ struct Lisp_Image_Instance *i2 = XIMAGE_INSTANCE (o2);
struct device *d1 = XDEVICE (i1->device);
struct device *d2 = XDEVICE (i2->device);
return 0;
break;
- case IMAGE_WIDGET:
- if (!(EQ (IMAGE_INSTANCE_WIDGET_TYPE (i1),
- IMAGE_INSTANCE_WIDGET_TYPE (i2))
- && internal_equal (IMAGE_INSTANCE_WIDGET_ITEM (i1),
- IMAGE_INSTANCE_WIDGET_ITEM (i2),
- depth + 1)
- && internal_equal (IMAGE_INSTANCE_WIDGET_PROPS (i1),
- IMAGE_INSTANCE_WIDGET_PROPS (i2),
- depth + 1)
- ))
- return 0;
case IMAGE_SUBWINDOW:
- if (!(IMAGE_INSTANCE_SUBWINDOW_WIDTH (i1) ==
- IMAGE_INSTANCE_SUBWINDOW_WIDTH (i2) &&
- IMAGE_INSTANCE_SUBWINDOW_HEIGHT (i1) ==
- IMAGE_INSTANCE_SUBWINDOW_HEIGHT (i2) &&
- IMAGE_INSTANCE_SUBWINDOW_ID (i1) ==
- IMAGE_INSTANCE_SUBWINDOW_ID (i2)))
- return 0;
+ /* #### implement me */
break;
default:
depth + 1));
break;
- case IMAGE_WIDGET:
- hash = HASH4 (hash,
- internal_hash (IMAGE_INSTANCE_WIDGET_TYPE (i), depth + 1),
- internal_hash (IMAGE_INSTANCE_WIDGET_PROPS (i), depth + 1),
- internal_hash (IMAGE_INSTANCE_WIDGET_ITEM (i), depth + 1));
case IMAGE_SUBWINDOW:
- hash = HASH4 (hash, IMAGE_INSTANCE_SUBWINDOW_WIDTH (i),
- IMAGE_INSTANCE_SUBWINDOW_HEIGHT (i),
- (int) IMAGE_INSTANCE_SUBWINDOW_ID (i));
+ /* #### implement me */
break;
default:
DEFINE_LRECORD_IMPLEMENTATION ("image-instance", image_instance,
mark_image_instance, print_image_instance,
finalize_image_instance, image_instance_equal,
- image_instance_hash, 0,
+ image_instance_hash,
struct Lisp_Image_Instance);
static Lisp_Object
allocate_image_instance (Lisp_Object device)
{
struct Lisp_Image_Instance *lp =
- alloc_lcrecord_type (struct Lisp_Image_Instance, &lrecord_image_instance);
+ alloc_lcrecord_type (struct Lisp_Image_Instance, lrecord_image_instance);
Lisp_Object val;
zero_lcrecord (lp);
if (EQ (type, Qcolor_pixmap)) return IMAGE_COLOR_PIXMAP;
if (EQ (type, Qpointer)) return IMAGE_POINTER;
if (EQ (type, Qsubwindow)) return IMAGE_SUBWINDOW;
- if (EQ (type, Qwidget)) return IMAGE_WIDGET;
maybe_signal_simple_error ("Invalid image-instance type", type,
Qimage, errb);
case IMAGE_COLOR_PIXMAP: return Qcolor_pixmap;
case IMAGE_POINTER: return Qpointer;
case IMAGE_SUBWINDOW: return Qsubwindow;
- case IMAGE_WIDGET: return Qwidget;
default:
abort ();
}
/* instantiate_image_instantiator() will abort if given an
image instance ... */
if (IMAGE_INSTANCEP (data))
- signal_simple_error ("Image instances not allowed here", data);
+ signal_simple_error ("image instances not allowed here", data);
image_validate (data);
dest_mask = decode_image_instance_type_list (dest_types);
data = normalize_image_instantiator (data, DEVICE_TYPE (XDEVICE (device)),
make_int (dest_mask));
GCPRO1 (data);
if (VECTORP (data) && EQ (XVECTOR_DATA (data)[0], Qinherit))
- signal_simple_error ("Inheritance not allowed here", data);
+ signal_simple_error ("inheritance not allowed here", data);
ii = instantiate_image_instantiator (device, device, data,
Qnil, Qnil, dest_mask);
RETURN_UNGCPRO (ii);
DEFUN ("image-instance-string", Fimage_instance_string, 1, 1, 0, /*
Return the string of the given image instance.
-This will only be non-nil for text image instances and widgets.
+This will only be non-nil for text image instances.
*/
(image_instance))
{
CHECK_IMAGE_INSTANCE (image_instance);
if (XIMAGE_INSTANCE_TYPE (image_instance) == IMAGE_TEXT)
return XIMAGE_INSTANCE_TEXT_STRING (image_instance);
- else if (XIMAGE_INSTANCE_TYPE (image_instance) == IMAGE_WIDGET)
- return XIMAGE_INSTANCE_WIDGET_TEXT (image_instance);
else
return Qnil;
}
-DEFUN ("image-instance-property", Fimage_instance_property, 2, 2, 0, /*
-Return the given property of the given image instance.
-Returns nil if the property or the property method do not exist for
-the image instance in the domain.
-*/
- (image_instance, prop))
-{
- struct Lisp_Image_Instance* ii;
- Lisp_Object type, ret;
- struct image_instantiator_methods* meths;
-
- CHECK_IMAGE_INSTANCE (image_instance);
- CHECK_SYMBOL (prop);
- ii = XIMAGE_INSTANCE (image_instance);
-
- /* ... then try device specific methods ... */
- type = encode_image_instance_type (IMAGE_INSTANCE_TYPE (ii));
- meths = decode_device_ii_format (IMAGE_INSTANCE_DEVICE (ii),
- type, ERROR_ME_NOT);
- if (meths && HAS_IIFORMAT_METH_P (meths, property)
- &&
- !UNBOUNDP (ret = IIFORMAT_METH (meths, property, (image_instance, prop))))
- {
- return ret;
- }
- /* ... then format specific methods ... */
- meths = decode_device_ii_format (Qnil, type, ERROR_ME_NOT);
- if (meths && HAS_IIFORMAT_METH_P (meths, property)
- &&
- !UNBOUNDP (ret = IIFORMAT_METH (meths, property, (image_instance, prop))))
- {
- return ret;
- }
- /* ... then fail */
- return Qnil;
-}
-
-DEFUN ("set-image-instance-property", Fset_image_instance_property, 3, 3, 0, /*
-Set the given property of the given image instance.
-Does nothing if the property or the property method do not exist for
-the image instance in the domain.
-*/
- (image_instance, prop, val))
-{
- struct Lisp_Image_Instance* ii;
- Lisp_Object type, ret;
- struct image_instantiator_methods* meths;
-
- CHECK_IMAGE_INSTANCE (image_instance);
- CHECK_SYMBOL (prop);
- ii = XIMAGE_INSTANCE (image_instance);
- type = encode_image_instance_type (IMAGE_INSTANCE_TYPE (ii));
- /* try device specific methods first ... */
- meths = decode_device_ii_format (IMAGE_INSTANCE_DEVICE (ii),
- type, ERROR_ME_NOT);
- if (meths && HAS_IIFORMAT_METH_P (meths, set_property)
- &&
- !UNBOUNDP (ret =
- IIFORMAT_METH (meths, set_property, (image_instance, prop, val))))
- {
- return ret;
- }
- /* ... then format specific methods ... */
- meths = decode_device_ii_format (Qnil, type, ERROR_ME_NOT);
- if (meths && HAS_IIFORMAT_METH_P (meths, set_property)
- &&
- !UNBOUNDP (ret =
- IIFORMAT_METH (meths, set_property, (image_instance, prop, val))))
- {
- return ret;
- }
-
- return val;
-}
-
DEFUN ("image-instance-file-name", Fimage_instance_file_name, 1, 1, 0, /*
Return the file name from which IMAGE-INSTANCE was read, if known.
*/
case IMAGE_POINTER:
return make_int (XIMAGE_INSTANCE_PIXMAP_HEIGHT (image_instance));
- case IMAGE_SUBWINDOW:
- case IMAGE_WIDGET:
- return make_int (XIMAGE_INSTANCE_SUBWINDOW_HEIGHT (image_instance));
-
default:
return Qnil;
}
case IMAGE_POINTER:
return make_int (XIMAGE_INSTANCE_PIXMAP_WIDTH (image_instance));
- case IMAGE_SUBWINDOW:
- case IMAGE_WIDGET:
- return make_int (XIMAGE_INSTANCE_SUBWINDOW_WIDTH (image_instance));
-
default:
return Qnil;
}
case IMAGE_POINTER:
return XIMAGE_INSTANCE_PIXMAP_FG (image_instance);
- case IMAGE_WIDGET:
- return FACE_FOREGROUND (
- XIMAGE_INSTANCE_WIDGET_FACE (image_instance),
- XIMAGE_INSTANCE_SUBWINDOW_FRAME
- (image_instance));
-
default:
return Qnil;
}
case IMAGE_POINTER:
return XIMAGE_INSTANCE_PIXMAP_BG (image_instance);
- case IMAGE_WIDGET:
- return FACE_BACKGROUND (
- XIMAGE_INSTANCE_WIDGET_FACE (image_instance),
- XIMAGE_INSTANCE_SUBWINDOW_FRAME
- (image_instance));
-
default:
return Qnil;
}
if (!NILP (file) && NILP (data))
{
Lisp_Object retval = MAYBE_LISP_CONTYPE_METH
- (decode_console_type(console_type, ERROR_ME),
+ (decode_console_type(console_type, ERROR_ME),
locate_pixmap_file, (file));
if (!NILP (retval))
else
return Fcons (file, Qnil); /* should have been file */
}
-
+
return Qnil;
}
Note that if we cannot generate any regular inline data, we
skip out. */
- file = potential_pixmap_file_instantiator (inst, Q_file, Q_data,
+ file = potential_pixmap_file_instantiator (inst, Q_file, Q_data,
console_type);
if (CONSP (file)) /* failure locating filename */
-- maybe return an error, or return Qnil.
*/
-#ifdef HAVE_X_WINDOWS
-#include <X11/Xlib.h>
-#else
+#ifndef HAVE_X_WINDOWS
#define XFree(data) free(data)
#endif
CONST char *filename_ext;
GET_C_STRING_FILENAME_DATA_ALLOCA (name, filename_ext);
- result = read_bitmap_data_from_file (filename_ext, &w, &h,
+ result = read_bitmap_data_from_file (filename_ext, &w, &h,
&data, xhot, yhot);
if (result == BitmapSuccess)
&& !NILP (file))
{
mask_file = MAYBE_LISP_CONTYPE_METH
- (decode_console_type(console_type, ERROR_ME),
+ (decode_console_type(console_type, ERROR_ME),
locate_pixmap_file, (concat2 (file, build_string ("Mask"))));
if (NILP (mask_file))
mask_file = MAYBE_LISP_CONTYPE_METH
- (decode_console_type(console_type, ERROR_ME),
+ (decode_console_type(console_type, ERROR_ME),
locate_pixmap_file, (concat2 (file, build_string ("msk"))));
}
IMAGE_POINTER_MASK;
}
-#endif
-
-\f
-#ifdef HAVE_XFACE
-/**********************************************************************
- * X-Face *
- **********************************************************************/
-
static void
-xface_validate (Lisp_Object instantiator)
-{
- file_or_data_must_be_present (instantiator);
-}
-
-static Lisp_Object
-xface_normalize (Lisp_Object inst, Lisp_Object console_type)
+xbm_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
+ Lisp_Object pointer_fg, Lisp_Object pointer_bg,
+ int dest_mask, Lisp_Object domain)
{
- /* This function can call lisp */
- Lisp_Object file = Qnil, mask_file = Qnil;
- struct gcpro gcpro1, gcpro2, gcpro3;
- Lisp_Object alist = Qnil;
-
- GCPRO3 (file, mask_file, alist);
-
- /* Now, convert any file data into inline data for both the regular
- data and the mask data. At the end of this, `data' will contain
- the inline data (if any) or Qnil, and `file' will contain
- the name this data was derived from (if known) or Qnil.
- Likewise for `mask_file' and `mask_data'.
-
- Note that if we cannot generate any regular inline data, we
- skip out. */
-
- file = potential_pixmap_file_instantiator (inst, Q_file, Q_data,
- console_type);
- mask_file = potential_pixmap_file_instantiator (inst, Q_mask_file,
- Q_mask_data, console_type);
-
- if (CONSP (file)) /* failure locating filename */
- signal_double_file_error ("Opening bitmap file",
- "no such file or directory",
- Fcar (file));
-
- if (NILP (file) && NILP (mask_file)) /* no conversion necessary */
- RETURN_UNGCPRO (inst);
-
- alist = tagged_vector_to_alist (inst);
-
- {
- Lisp_Object data = make_string_from_file (file);
- alist = remassq_no_quit (Q_file, alist);
- /* there can't be a :data at this point. */
- alist = Fcons (Fcons (Q_file, file),
- Fcons (Fcons (Q_data, data), alist));
- }
+ Lisp_Object device= IMAGE_INSTANCE_DEVICE (XIMAGE_INSTANCE (image_instance));
- alist = xbm_mask_file_munging (alist, file, mask_file, console_type);
-
- {
- Lisp_Object result = alist_to_tagged_vector (Qxface, alist);
- free_alist (alist);
- RETURN_UNGCPRO (result);
- }
-}
-
-static int
-xface_possible_dest_types (void)
-{
- return
- IMAGE_MONO_PIXMAP_MASK |
- IMAGE_COLOR_PIXMAP_MASK |
- IMAGE_POINTER_MASK;
+ MAYBE_DEVMETH (XDEVICE (device),
+ xbm_instantiate,
+ (image_instance, instantiator, pointer_fg,
+ pointer_bg, dest_mask, domain));
}
-#endif /* HAVE_XFACE */
+#endif
\f
#ifdef HAVE_XPM
{
char **data;
int result;
- char *fname = 0;
-
- GET_C_STRING_FILENAME_DATA_ALLOCA (name, fname);
- result = XpmReadFileToData (fname, &data);
+
+ result = XpmReadFileToData ((char *) XSTRING_DATA (name), &data);
if (result == XpmSuccess)
{
Note that if we cannot generate any regular inline data, we
skip out. */
- file = potential_pixmap_file_instantiator (inst, Q_file, Q_data,
+ file = potential_pixmap_file_instantiator (inst, Q_file, Q_data,
console_type);
if (CONSP (file)) /* failure locating filename */
if (NILP (file) && !UNBOUNDP (color_symbols))
/* no conversion necessary */
RETURN_UNGCPRO (inst);
-
+
alist = tagged_vector_to_alist (inst);
if (!NILP (file))
alist = Fcons (Fcons (Q_file, file),
Fcons (Fcons (Q_data, data), alist));
}
-
+
if (UNBOUNDP (color_symbols))
{
color_symbols = evaluate_xpm_color_symbols ();
IMAGE_POINTER_MASK;
}
+static void
+xpm_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
+ Lisp_Object pointer_fg, Lisp_Object pointer_bg,
+ int dest_mask, Lisp_Object domain)
+{
+ Lisp_Object device= IMAGE_INSTANCE_DEVICE (XIMAGE_INSTANCE (image_instance));
+
+ MAYBE_DEVMETH (XDEVICE (device),
+ xpm_instantiate,
+ (image_instance, instantiator, pointer_fg,
+ pointer_bg, dest_mask, domain));
+}
+
#endif /* HAVE_XPM */
\f
{
struct Lisp_Specifier *image = XIMAGE_SPECIFIER (obj);
- markobj (IMAGE_SPECIFIER_ATTACHEE (image));
- markobj (IMAGE_SPECIFIER_ATTACHEE_PROPERTY (image));
+ ((markobj) (IMAGE_SPECIFIER_ATTACHEE (image)));
+ ((markobj) (IMAGE_SPECIFIER_ATTACHEE_PROPERTY (image)));
}
static Lisp_Object
/* For the image instance cache, we do comparisons with EQ rather
than with EQUAL, as we do for color and font names.
The reasons are:
-
+
1) pixmap data can be very long, and thus the hashing and
comparing will take awhile.
2) It's not so likely that we'll run into things that are EQUAL
pointer face.
*/
- subtable = make_lisp_hash_table (20,
- pointerp ? HASH_TABLE_KEY_CAR_WEAK
- : HASH_TABLE_KEY_WEAK,
- pointerp ? HASH_TABLE_EQUAL
- : HASH_TABLE_EQ);
+ subtable = make_lisp_hashtable (20,
+ pointerp ? HASHTABLE_KEY_CAR_WEAK
+ : HASHTABLE_KEY_WEAK,
+ pointerp ? HASHTABLE_EQUAL
+ : HASHTABLE_EQ);
Fputhash (make_int (dest_mask), subtable,
d->image_instance_cache);
instance = Qunbound;
}
else
- {
- instance = Fgethash (pointerp ? ls3 : instantiator,
- subtable, Qunbound);
- /* subwindows have a per-window cache and have to be treated
- differently. dest_mask can be a bitwise OR of all image
- types so we will only catch someone possibly trying to
- instantiate a subwindow type thing. Unfortunately, this
- will occur most of the time so this probably slows things
- down. But with the current design I don't see anyway
- round it. */
- if (UNBOUNDP (instance)
- &&
- dest_mask & (IMAGE_SUBWINDOW_MASK | IMAGE_WIDGET_MASK))
- {
- if (!WINDOWP (domain))
- signal_simple_error ("Can't instantiate subwindow outside a window",
- instantiator);
- instance = Fgethash (instantiator,
- XWINDOW (domain)->subwindow_instance_cache,
- Qunbound);
- }
- }
+ instance = Fgethash (pointerp ? ls3 : instantiator,
+ subtable, Qunbound);
if (UNBOUNDP (instance))
{
noseeum_cons (pointerp ? ls3 : instantiator,
subtable));
int speccount = specpdl_depth ();
-
+
/* make sure we cache the failures, too.
Use an unwind-protect to catch such errors.
If we fail, the unwind-protect records nil in
instantiator,
pointer_fg, pointer_bg,
dest_mask);
-
Fsetcar (locative, instance);
- /* only after the image has been instantiated do we know
- whether we need to put it in the per-window image instance
- cache. */
- if (image_instance_type_to_mask (XIMAGE_INSTANCE_TYPE (instance))
- &
- (IMAGE_SUBWINDOW_MASK | IMAGE_WIDGET_MASK))
- {
- if (!WINDOWP (domain))
- signal_simple_error ("Can't instantiate subwindow outside a window",
- instantiator);
-
- Fsetcdr (XCDR (locative), XWINDOW (domain)->subwindow_instance_cache );
- }
unbind_to (speccount, Qnil);
}
else
(Display this image as a text string, with replaceable fields;
not currently implemented.)
'xbm
- (An X bitmap; only if X or Windows support was compiled into this XEmacs.
+ (An X bitmap; only if X support was compiled into this XEmacs.
Can be instanced as `mono-pixmap', `color-pixmap', or `pointer'.)
'xpm
(An XPM pixmap; only if XPM support was compiled into this XEmacs.
instanced as `mono-pixmap', `color-pixmap', or `pointer'.)
'gif
(A GIF87 or GIF89 image; only if GIF support was compiled into this
- XEmacs. NOTE: only the first frame of animated gifs will be displayed.
- Can be instanced as `color-pixmap'.)
+ XEmacs. Can be instanced as `color-pixmap'.)
'jpeg
(A JPEG image; only if JPEG support was compiled into this XEmacs.
Can be instanced as `color-pixmap'.)
'png
- (A PNG image; only if PNG support was compiled into this XEmacs.
+ (A PNG/GIF24 image; only if PNG support was compiled into this XEmacs.
Can be instanced as `color-pixmap'.)
'tiff
- (A TIFF image; only if TIFF support was compiled into this XEmacs.
- Can be instanced as `color-pixmap'.)
+ (A TIFF image; not currently implemented.)
'cursor-font
(One of the standard cursor-font names, such as "watch" or
"right_ptr" under X. Under X, this is, more specifically, any
probably be fixed.)
'subwindow
(An embedded X window; not currently implemented.)
-'widget
- (A widget control, for instance text field or radio button.)
'autodetect
(XEmacs tries to guess what format the data is in. If X support
exists, the data string will be checked to see if it names a filename.
`cursor-font', `font', `autodetect', and `inherit'.)
:foreground
:background
- (For `xbm', `xface', `cursor-font', `widget' and `font'. These keywords
+ (For `xbm', `xface', `cursor-font', and `font'. These keywords
allow you to explicitly specify foreground and background colors.
The argument should be anything acceptable to `make-color-instance'.
This will cause what would be a `mono-pixmap' to instead be colorized
{
struct Lisp_Glyph *glyph = XGLYPH (obj);
- markobj (glyph->image);
- markobj (glyph->contrib_p);
- markobj (glyph->baseline);
- markobj (glyph->face);
+ ((markobj) (glyph->image));
+ ((markobj) (glyph->contrib_p));
+ ((markobj) (glyph->baseline));
+ ((markobj) (glyph->face));
return glyph->plist;
}
This isn't concerned with "unspecified" attributes, that's what
#'glyph-differs-from-default-p is for. */
static int
-glyph_equal (Lisp_Object obj1, Lisp_Object obj2, int depth)
+glyph_equal (Lisp_Object o1, Lisp_Object o2, int depth)
{
- struct Lisp_Glyph *g1 = XGLYPH (obj1);
- struct Lisp_Glyph *g2 = XGLYPH (obj2);
+ struct Lisp_Glyph *g1 = XGLYPH (o1);
+ struct Lisp_Glyph *g2 = XGLYPH (o2);
depth++;
return result;
}
-static const struct lrecord_description glyph_description[] = {
- { XD_LISP_OBJECT, offsetof(struct Lisp_Glyph, image), 5 },
- { XD_END }
-};
-
DEFINE_LRECORD_IMPLEMENTATION_WITH_PROPS ("glyph", glyph,
mark_glyph, print_glyph, 0,
- glyph_equal, glyph_hash, glyph_description,
+ glyph_equal, glyph_hash,
glyph_getprop, glyph_putprop,
glyph_remprop, glyph_plist,
struct Lisp_Glyph);
/* This function can GC */
Lisp_Object obj = Qnil;
struct Lisp_Glyph *g =
- alloc_lcrecord_type (struct Lisp_Glyph, &lrecord_glyph);
+ alloc_lcrecord_type (struct Lisp_Glyph, lrecord_glyph);
g->type = type;
g->image = Fmake_specifier (Qimage); /* This function can GC */
{
case GLYPH_BUFFER:
XIMAGE_SPECIFIER_ALLOWED (g->image) =
- IMAGE_NOTHING_MASK | IMAGE_TEXT_MASK
- | IMAGE_MONO_PIXMAP_MASK | IMAGE_COLOR_PIXMAP_MASK
- | IMAGE_SUBWINDOW_MASK | IMAGE_WIDGET_MASK;
+ IMAGE_NOTHING_MASK | IMAGE_TEXT_MASK | IMAGE_MONO_PIXMAP_MASK |
+ IMAGE_COLOR_PIXMAP_MASK | IMAGE_SUBWINDOW_MASK;
break;
case GLYPH_POINTER:
XIMAGE_SPECIFIER_ALLOWED (g->image) =
CHECK_GLYPH (glyph);
switch (XGLYPH_TYPE (glyph))
{
- default: abort ();
case GLYPH_BUFFER: return Qbuffer;
case GLYPH_POINTER: return Qpointer;
case GLYPH_ICON: return Qicon;
+ default:
+ abort ();
+ return Qnil; /* not reached */
}
}
return 0;
case IMAGE_SUBWINDOW:
- case IMAGE_WIDGET:
- return XIMAGE_INSTANCE_SUBWINDOW_WIDTH (instance);
+ /* #### implement me */
+ return 0;
default:
abort ();
return 0;
case IMAGE_SUBWINDOW:
- case IMAGE_WIDGET:
- /* #### Ugh ugh ugh -- temporary crap */
- if (function == RETURN_ASCENT || function == RETURN_HEIGHT)
- return XIMAGE_INSTANCE_SUBWINDOW_HEIGHT (instance);
- else
- return 0;
+ /* #### implement me */
+ return 0;
default:
abort ();
for (elt = 0; elt < Dynarr_length (elements); elt++)
{
struct glyph_cachel *cachel = Dynarr_atp (elements, elt);
- markobj (cachel->glyph);
+ ((markobj) (cachel->glyph));
}
}
#endif /* MEMORY_USAGE_STATS */
-
\f
/*****************************************************************************
- * subwindow cachel functions *
- *****************************************************************************/
-/* subwindows are curious in that you have to physically unmap them to
- not display them. It is problematic deciding what to do in
- redisplay. We have two caches - a per-window instance cache that
- keeps track of subwindows on a window, these are linked to their
- instantiator in the hashtable and when the instantiator goes away
- we want the instance to go away also. However we also have a
- per-frame instance cache that we use to determine if a subwindow is
- obscuring an area that we want to clear. We need to be able to flip
- through this quickly so a hashtable is not suitable hence the
- subwindow_cachels. The question is should we just not mark
- instances in the subwindow_cachelsnor should we try and invalidate
- the cache at suitable points in redisplay? If we don't invalidate
- the cache it will fill up with crud that will only get removed when
- the frame is deleted. So invalidation is good, the question is when
- and whether we mark as well. Go for the simple option - don't mark,
- MARK_SUBWINDOWS_CHANGED when a subwindow gets deleted. */
-
-void
-mark_subwindow_cachels (subwindow_cachel_dynarr *elements,
- void (*markobj) (Lisp_Object))
-{
- int elt;
-
- if (!elements)
- return;
-
- for (elt = 0; elt < Dynarr_length (elements); elt++)
- {
- struct subwindow_cachel *cachel = Dynarr_atp (elements, elt);
- markobj (cachel->subwindow);
- }
-}
-
-static void
-update_subwindow_cachel_data (struct frame *f, Lisp_Object subwindow,
- struct subwindow_cachel *cachel)
-{
- if (NILP (cachel->subwindow) || !EQ (cachel->subwindow, subwindow))
- {
- cachel->subwindow = subwindow;
- cachel->width = XIMAGE_INSTANCE_SUBWINDOW_WIDTH (subwindow);
- cachel->height = XIMAGE_INSTANCE_SUBWINDOW_HEIGHT (subwindow);
- }
-
- cachel->updated = 1;
-}
-
-static void
-add_subwindow_cachel (struct frame *f, Lisp_Object subwindow)
-{
- struct subwindow_cachel new_cachel;
-
- xzero (new_cachel);
- new_cachel.subwindow = Qnil;
- new_cachel.x=0;
- new_cachel.y=0;
- new_cachel.being_displayed=0;
-
- update_subwindow_cachel_data (f, subwindow, &new_cachel);
- Dynarr_add (f->subwindow_cachels, new_cachel);
-}
-
-static int
-get_subwindow_cachel_index (struct frame *f, Lisp_Object subwindow)
-{
- int elt;
-
- if (noninteractive)
- return 0;
-
- for (elt = 0; elt < Dynarr_length (f->subwindow_cachels); elt++)
- {
- struct subwindow_cachel *cachel =
- Dynarr_atp (f->subwindow_cachels, elt);
-
- if (EQ (cachel->subwindow, subwindow) && !NILP (subwindow))
- {
- if (!cachel->updated)
- update_subwindow_cachel_data (f, subwindow, cachel);
- return elt;
- }
- }
-
- /* If we didn't find the glyph, add it and then return its index. */
- add_subwindow_cachel (f, subwindow);
- return elt;
-}
-
-/* redisplay in general assumes that drawing something will erase
- what was there before. unfortunately this does not apply to
- subwindows that need to be specifically unmapped in order to
- disappear. we take a brute force approach - on the basis that its
- cheap - and unmap all subwindows in a display line */
-void
-reset_subwindow_cachels (struct frame *f)
-{
- int elt;
- for (elt = 0; elt < Dynarr_length (f->subwindow_cachels); elt++)
- {
- struct subwindow_cachel *cachel =
- Dynarr_atp (f->subwindow_cachels, elt);
-
- if (!NILP (cachel->subwindow) && cachel->being_displayed)
- {
- struct Lisp_Image_Instance* ii = XIMAGE_INSTANCE (cachel->subwindow);
- MAYBE_DEVMETH (XDEVICE (f->device), unmap_subwindow, (ii));
- }
- }
- Dynarr_reset (f->subwindow_cachels);
-}
-
-void
-mark_subwindow_cachels_as_not_updated (struct frame *f)
-{
- int elt;
-
- for (elt = 0; elt < Dynarr_length (f->subwindow_cachels); elt++)
- Dynarr_atp (f->subwindow_cachels, elt)->updated = 0;
-}
-
-\f
-/*****************************************************************************
- * subwindow functions *
+ * display tables *
*****************************************************************************/
-/* update the displayed characteristics of a subwindow */
-static void
-update_subwindow (Lisp_Object subwindow)
-{
- struct Lisp_Image_Instance* ii = XIMAGE_INSTANCE (subwindow);
+/* Get the display table for use currently on window W with face FACE.
+ Precedence:
- if (!IMAGE_INSTANCE_TYPE (ii) == IMAGE_WIDGET
- ||
- NILP (IMAGE_INSTANCE_SUBWINDOW_FRAME (ii)))
- return;
+ -- FACE's display table
+ -- W's display table (comes from specifier `current-display-table')
- MAYBE_DEVMETH (XDEVICE (ii->device), update_subwindow, (ii));
-}
+ Ignore the specified tables if they are not valid;
+ if no valid table is specified, return 0. */
-void
-update_frame_subwindows (struct frame *f)
-{
- int elt;
-
- if (f->subwindows_changed || f->glyphs_changed)
- for (elt = 0; elt < Dynarr_length (f->subwindow_cachels); elt++)
- {
- struct subwindow_cachel *cachel =
- Dynarr_atp (f->subwindow_cachels, elt);
-
- if (cachel->being_displayed)
- {
- update_subwindow (cachel->subwindow);
- }
- }
-}
-
-/* remove a subwindow from its frame */
-void unmap_subwindow (Lisp_Object subwindow)
-{
- struct Lisp_Image_Instance* ii = XIMAGE_INSTANCE (subwindow);
- int elt;
- struct subwindow_cachel* cachel;
- struct frame* f;
-
- if (!(IMAGE_INSTANCE_TYPE (ii) == IMAGE_WIDGET
- ||
- IMAGE_INSTANCE_TYPE (ii) == IMAGE_SUBWINDOW)
- ||
- NILP (IMAGE_INSTANCE_SUBWINDOW_FRAME (ii)))
- return;
-
- f = XFRAME (IMAGE_INSTANCE_SUBWINDOW_FRAME (ii));
- elt = get_subwindow_cachel_index (f, subwindow);
- cachel = Dynarr_atp (f->subwindow_cachels, elt);
-
- cachel->x = -1;
- cachel->y = -1;
- cachel->being_displayed = 0;
- IMAGE_INSTANCE_SUBWINDOW_DISPLAYEDP (ii) = 0;
-
- MAYBE_DEVMETH (XDEVICE (ii->device), unmap_subwindow, (ii));
-}
-
-/* show a subwindow in its frame */
-void map_subwindow (Lisp_Object subwindow, int x, int y)
-{
- struct Lisp_Image_Instance* ii = XIMAGE_INSTANCE (subwindow);
- int elt;
- struct subwindow_cachel* cachel;
- struct frame* f;
-
- if (!(IMAGE_INSTANCE_TYPE (ii) == IMAGE_WIDGET
- ||
- IMAGE_INSTANCE_TYPE (ii) == IMAGE_SUBWINDOW)
- ||
- NILP (IMAGE_INSTANCE_SUBWINDOW_FRAME (ii)))
- return;
-
- f = XFRAME (IMAGE_INSTANCE_SUBWINDOW_FRAME (ii));
- IMAGE_INSTANCE_SUBWINDOW_DISPLAYEDP (ii) = 1;
- elt = get_subwindow_cachel_index (f, subwindow);
- cachel = Dynarr_atp (f->subwindow_cachels, elt);
- cachel->x = x;
- cachel->y = y;
- cachel->being_displayed = 1;
-
- MAYBE_DEVMETH (XDEVICE (ii->device), map_subwindow, (ii, x, y));
-}
-
-static int
-subwindow_possible_dest_types (void)
-{
- return IMAGE_SUBWINDOW_MASK;
-}
-
-/* Partially instantiate a subwindow. */
-void
-subwindow_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
- Lisp_Object pointer_fg, Lisp_Object pointer_bg,
- int dest_mask, Lisp_Object domain)
-{
- struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
- Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
- Lisp_Object frame = FW_FRAME (domain);
- Lisp_Object width = find_keyword_in_vector (instantiator, Q_pixel_width);
- Lisp_Object height = find_keyword_in_vector (instantiator, Q_pixel_height);
-
- if (NILP (frame))
- signal_simple_error ("No selected frame", device);
-
- if (!(dest_mask & IMAGE_SUBWINDOW_MASK))
- incompatible_image_types (instantiator, dest_mask, IMAGE_SUBWINDOW_MASK);
-
- ii->data = 0;
- IMAGE_INSTANCE_SUBWINDOW_ID (ii) = 0;
- IMAGE_INSTANCE_SUBWINDOW_FRAME (ii) = Qnil;
- IMAGE_INSTANCE_SUBWINDOW_DISPLAYEDP (ii) = 0;
- IMAGE_INSTANCE_SUBWINDOW_FRAME (ii) = frame;
-
- /* this stuff may get overidden by the widget code */
- if (NILP (width))
- IMAGE_INSTANCE_SUBWINDOW_WIDTH (ii) = 20;
- else
- {
- int w = 1;
- CHECK_INT (width);
- if (XINT (width) > 1)
- w = XINT (width);
- IMAGE_INSTANCE_SUBWINDOW_WIDTH (ii) = w;
- }
- if (NILP (height))
- IMAGE_INSTANCE_SUBWINDOW_HEIGHT (ii) = 20;
- else
- {
- int h = 1;
- CHECK_INT (height);
- if (XINT (height) > 1)
- h = XINT (height);
- IMAGE_INSTANCE_SUBWINDOW_HEIGHT (ii) = h;
- }
-}
-
-DEFUN ("subwindowp", Fsubwindowp, 1, 1, 0, /*
-Return non-nil if OBJECT is a subwindow.
-*/
- (object))
-{
- CHECK_IMAGE_INSTANCE (object);
- return (XIMAGE_INSTANCE_TYPE (object) == IMAGE_SUBWINDOW) ? Qt : Qnil;
-}
-
-DEFUN ("image-instance-subwindow-id", Fimage_instance_subwindow_id, 1, 1, 0, /*
-Return the window id of SUBWINDOW as a number.
-*/
- (subwindow))
-{
- CHECK_SUBWINDOW_IMAGE_INSTANCE (subwindow);
- return make_int ((int) (XIMAGE_INSTANCE_SUBWINDOW_ID (subwindow)));
-}
-
-DEFUN ("resize-subwindow", Fresize_subwindow, 1, 3, 0, /*
-Resize SUBWINDOW to WIDTH x HEIGHT.
-If a value is nil that parameter is not changed.
-*/
- (subwindow, width, height))
-{
- int neww, newh;
-
- CHECK_SUBWINDOW_IMAGE_INSTANCE (subwindow);
-
- if (NILP (width))
- neww = XIMAGE_INSTANCE_SUBWINDOW_WIDTH (subwindow);
- else
- neww = XINT (width);
-
- if (NILP (height))
- newh = XIMAGE_INSTANCE_SUBWINDOW_HEIGHT (subwindow);
- else
- newh = XINT (height);
-
-
- MAYBE_DEVMETH (XDEVICE (XIMAGE_INSTANCE_DEVICE (subwindow)),
- resize_subwindow, (XIMAGE_INSTANCE (subwindow), neww, newh));
-
- XIMAGE_INSTANCE_SUBWINDOW_HEIGHT (subwindow) = newh;
- XIMAGE_INSTANCE_SUBWINDOW_WIDTH (subwindow) = neww;
-
- return subwindow;
-}
-
-DEFUN ("force-subwindow-map", Fforce_subwindow_map, 1, 1, 0, /*
-Generate a Map event for SUBWINDOW.
-*/
- (subwindow))
-{
- CHECK_SUBWINDOW_IMAGE_INSTANCE (subwindow);
-
- map_subwindow (subwindow, 0, 0);
-
- return subwindow;
-}
-
-\f
-/*****************************************************************************
- * display tables *
- *****************************************************************************/
-
-/* Get the display tables for use currently on window W with face
- FACE. #### This will have to be redone. */
-
-void
-get_display_tables (struct window *w, face_index findex,
- Lisp_Object *face_table, Lisp_Object *window_table)
+struct Lisp_Vector *
+get_display_table (struct window *w, face_index findex)
{
Lisp_Object tem;
- tem = WINDOW_FACE_CACHEL_DISPLAY_TABLE (w, findex);
- if (UNBOUNDP (tem))
- tem = Qnil;
- if (!LISTP (tem))
- tem = noseeum_cons (tem, Qnil);
- *face_table = tem;
- tem = w->display_table;
- if (UNBOUNDP (tem))
- tem = Qnil;
- if (!LISTP (tem))
- tem = noseeum_cons (tem, Qnil);
- *window_table = tem;
-}
-Lisp_Object
-display_table_entry (Emchar ch, Lisp_Object face_table,
- Lisp_Object window_table)
-{
- Lisp_Object tail;
+ tem = WINDOW_FACE_CACHEL_DISPLAY_TABLE (w, findex);
+ if (VECTORP (tem) && XVECTOR_LENGTH (tem) == DISP_TABLE_SIZE)
+ return XVECTOR (tem);
- /* Loop over FACE_TABLE, and then over WINDOW_TABLE. */
- for (tail = face_table; 1; tail = XCDR (tail))
- {
- Lisp_Object table;
- if (NILP (tail))
- {
- if (!NILP (window_table))
- {
- tail = window_table;
- window_table = Qnil;
- }
- else
- return Qnil;
- }
- table = XCAR (tail);
+ tem = w->display_table;
+ if (VECTORP (tem) && XVECTOR_LENGTH (tem) == DISP_TABLE_SIZE)
+ return XVECTOR (tem);
- if (VECTORP (table))
- {
- if (ch < XVECTOR_LENGTH (table) && !NILP (XVECTOR_DATA (table)[ch]))
- return XVECTOR_DATA (table)[ch];
- else
- continue;
- }
- else if (CHAR_TABLEP (table)
- && XCHAR_TABLE_TYPE (table) == CHAR_TABLE_TYPE_CHAR)
- {
- return get_char_table (ch, XCHAR_TABLE (table));
- }
- else if (CHAR_TABLEP (table)
- && XCHAR_TABLE_TYPE (table) == CHAR_TABLE_TYPE_GENERIC)
- {
- Lisp_Object gotit = get_char_table (ch, XCHAR_TABLE (table));
- if (!NILP (gotit))
- return gotit;
- else
- continue;
- }
- else if (RANGE_TABLEP (table))
- {
- Lisp_Object gotit = Fget_range_table (make_char (ch), table, Qnil);
- if (!NILP (gotit))
- return gotit;
- else
- continue;
- }
- else
- abort ();
- }
+ return 0;
}
+
\f
/*****************************************************************************
* initialization *
defkeyword (&Q_file, ":file");
defkeyword (&Q_data, ":data");
defkeyword (&Q_face, ":face");
- defkeyword (&Q_pixel_height, ":pixel-height");
- defkeyword (&Q_pixel_width, ":pixel-width");
#ifdef HAVE_XPM
defkeyword (&Q_color_symbols, ":color-symbols");
defsymbol (&Qmono_pixmap_image_instance_p, "mono-pixmap-image-instance-p");
defsymbol (&Qcolor_pixmap_image_instance_p, "color-pixmap-image-instance-p");
defsymbol (&Qpointer_image_instance_p, "pointer-image-instance-p");
- defsymbol (&Qwidget_image_instance_p, "widget-image-instance-p");
defsymbol (&Qsubwindow_image_instance_p, "subwindow-image-instance-p");
DEFSUBR (Fmake_image_instance);
DEFSUBR (Fimage_instance_hotspot_y);
DEFSUBR (Fimage_instance_foreground);
DEFSUBR (Fimage_instance_background);
- DEFSUBR (Fimage_instance_property);
- DEFSUBR (Fset_image_instance_property);
DEFSUBR (Fcolorize_image_instance);
- /* subwindows */
- DEFSUBR (Fsubwindowp);
- DEFSUBR (Fimage_instance_subwindow_id);
- DEFSUBR (Fresize_subwindow);
- DEFSUBR (Fforce_subwindow_map);
/* Qnothing defined as part of the "nothing" image-instantiator
type. */
defsymbol (&Qmono_pixmap, "mono-pixmap");
defsymbol (&Qcolor_pixmap, "color-pixmap");
/* Qpointer defined in general.c */
+ defsymbol (&Qsubwindow, "subwindow");
/* glyphs */
IIFORMAT_HAS_METHOD (formatted_string, validate);
IIFORMAT_HAS_METHOD (formatted_string, possible_dest_types);
IIFORMAT_HAS_METHOD (formatted_string, instantiate);
- IIFORMAT_VALID_KEYWORD (formatted_string, Q_data, check_valid_string);
- /* subwindows */
- INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (subwindow, "subwindow");
- IIFORMAT_HAS_METHOD (subwindow, possible_dest_types);
- IIFORMAT_HAS_METHOD (subwindow, instantiate);
- IIFORMAT_VALID_KEYWORD (subwindow, Q_pixel_width, check_valid_int);
- IIFORMAT_VALID_KEYWORD (subwindow, Q_pixel_height, check_valid_int);
+ IIFORMAT_VALID_KEYWORD (formatted_string, Q_data, check_valid_string);
#ifdef HAVE_WINDOW_SYSTEM
INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (xbm, "xbm");
IIFORMAT_HAS_METHOD (xbm, validate);
IIFORMAT_HAS_METHOD (xbm, normalize);
IIFORMAT_HAS_METHOD (xbm, possible_dest_types);
+ IIFORMAT_HAS_METHOD (xbm, instantiate);
IIFORMAT_VALID_KEYWORD (xbm, Q_data, check_valid_xbm_inline);
IIFORMAT_VALID_KEYWORD (xbm, Q_file, check_valid_string);
IIFORMAT_VALID_KEYWORD (xbm, Q_background, check_valid_string);
#endif /* HAVE_WINDOW_SYSTEM */
-#ifdef HAVE_XFACE
- INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (xface, "xface");
-
- IIFORMAT_HAS_METHOD (xface, validate);
- IIFORMAT_HAS_METHOD (xface, normalize);
- IIFORMAT_HAS_METHOD (xface, possible_dest_types);
-
- IIFORMAT_VALID_KEYWORD (xface, Q_data, check_valid_string);
- IIFORMAT_VALID_KEYWORD (xface, Q_file, check_valid_string);
- IIFORMAT_VALID_KEYWORD (xface, Q_hotspot_x, check_valid_int);
- IIFORMAT_VALID_KEYWORD (xface, Q_hotspot_y, check_valid_int);
- IIFORMAT_VALID_KEYWORD (xface, Q_foreground, check_valid_string);
- IIFORMAT_VALID_KEYWORD (xface, Q_background, check_valid_string);
-#endif
-
#ifdef HAVE_XPM
INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (xpm, "xpm");
IIFORMAT_HAS_METHOD (xpm, validate);
IIFORMAT_HAS_METHOD (xpm, normalize);
IIFORMAT_HAS_METHOD (xpm, possible_dest_types);
+ IIFORMAT_HAS_METHOD (xpm, instantiate);
IIFORMAT_VALID_KEYWORD (xpm, Q_data, check_valid_string);
IIFORMAT_VALID_KEYWORD (xpm, Q_file, check_valid_string);
/* image instances */
- Vimage_instance_type_list = Fcons (Qnothing,
- list6 (Qtext, Qmono_pixmap, Qcolor_pixmap,
- Qpointer, Qsubwindow, Qwidget));
+ Vimage_instance_type_list = list6 (Qnothing, Qtext, Qmono_pixmap,
+ Qcolor_pixmap, Qpointer, Qsubwindow);
staticpro (&Vimage_instance_type_list);
/* glyphs */
What to display at the beginning of horizontally scrolled lines.
*/);
Vhscroll_glyph = allocate_glyph (GLYPH_BUFFER, redisplay_glyph_changed);
-#ifdef HAVE_WINDOW_SYSTEM
- Fprovide (Qxbm);
-#endif
+
#ifdef HAVE_XPM
Fprovide (Qxpm);
*/ );
Vxpm_color_symbols = Qnil; /* initialized in x-faces.el */
#endif /* HAVE_XPM */
-#ifdef HAVE_XFACE
- Fprovide (Qxface);
-#endif
}
void
if (NILP (window))
window = Fselected_window (Qnil);
- CHECK_LIVE_WINDOW (window);
+ CHECK_WINDOW (window);
CHECK_INT (lines);
selected = (EQ (window, Fselected_window (Qnil)));
if (NILP (window))
window = Fselected_window (Qnil);
- CHECK_LIVE_WINDOW (window);
+ CHECK_WINDOW (window);
w = XWINDOW (window);
eobuf = BUF_ZV (XBUFFER (w->buffer));
if (NILP (window))
window = Fselected_window (Qnil);
- CHECK_LIVE_WINDOW (window);
+ CHECK_WINDOW (window);
CHECK_INT (pixels);
selected = (EQ (window, Fselected_window (Qnil)));
--- /dev/null
+/* input-method-xfs.c provides just only locale initialize
+ for non Motif people. (stoled from input-method-xlib.c)
+ Why I made this code is to initialize X locale environment for
+ the purpose of use XFontSet correctly in lwlib/xlwmenu.c.
+ And this code donot provides input methods under Xlib while they
+ prefer to use Canna, Wnn, skk or something like that.
+ This code has been tested on FreeBSD 2.2.1 and Solaris2.5.
+
+ Copyright (C) 1997 Kazuyuki IENAGA.
+
+This file is a part of XEmacs.
+
+XEmacs is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+XEmacs is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with XEmacs; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+#include <config.h>
+#include <X11/Xlocale.h> /* More portable than <locale.h> ? */
+#include "lisp.h"
+#include "frame.h"
+#include "device.h"
+#include "window.h"
+#include "buffer.h"
+#include "console-x.h"
+#include "EmacsFrame.h"
+#include "events.h"
+
+#ifdef USE_XFONTSET
+void
+Initialize_Locale (void)
+{
+ char *locale;
+
+ XtSetLanguageProc (NULL, (XtLanguageProc) NULL, NULL);
+ if ((locale = setlocale (LC_ALL, "")) == NULL)
+ {
+ stderr_out ("Can't set locale.\n");
+ stderr_out ("Using C locale instead.\n");
+ putenv ("LANG=C");
+ putenv ("LC_ALL=C");
+ if ((locale = setlocale (LC_ALL, "C")) == NULL)
+ {
+ stderr_out ("Can't even set locale to `C'!\n");
+ return;
+ }
+ }
+
+ if (!XSupportsLocale ())
+ {
+ stderr_out ("X Windows does not support locale `%s'\n", locale);
+ stderr_out ("Using C Locale instead\n");
+ putenv ("LANG=C");
+ putenv ("LC_ALL=C");
+ if ((locale = setlocale (LC_ALL, "C")) == NULL)
+ {
+ stderr_out ("Can't even set locale to `C'!\n");
+ return;
+ }
+ if (!XSupportsLocale ())
+ {
+ stderr_out ("X Windows does not even support locale `C'!\n");
+ return;
+ }
+ }
+
+ setlocale(LC_NUMERIC, "C");
+ setlocale(LC_CTYPE, ""); /* take back CTYPE to previous state */
+
+ if (XSetLocaleModifiers ("") == NULL)
+ {
+ stderr_out ("XSetLocaleModifiers(\"\") failed\n");
+ stderr_out ("Check the value of the XMODIFIERS environment variable.\n");
+ }
+}
+#endif /* USE_XFONTSET */
Bufbyte *to, *from;
Bytecount i;
Bytind new_s1;
- struct buffer *mbuf;
- Lisp_Object bufcons;
from = BUF_GPT_ADDR (buf);
to = from + BUF_GAP_SIZE (buf);
/* Adjust markers, and buffer data structure, to put the gap at POS.
POS is where the loop above stopped, which may be what was specified
or may be where a quit was detected. */
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- adjust_markers (mbuf, pos, BI_BUF_GPT (mbuf), BUF_GAP_SIZE (mbuf));
- }
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- adjust_extents (make_buffer (mbuf), pos, BI_BUF_GPT (mbuf),
- BUF_GAP_SIZE (mbuf));
- }
+ adjust_markers (buf, pos, BI_BUF_GPT (buf), BUF_GAP_SIZE (buf));
+ adjust_extents (make_buffer (buf), pos, BI_BUF_GPT (buf),
+ BUF_GAP_SIZE (buf));
SET_BI_BUF_GPT (buf, pos);
SET_GAP_SENTINEL (buf);
#ifdef ERROR_CHECK_EXTENTS
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- sledgehammer_extent_check (make_buffer (mbuf));
- }
+ sledgehammer_extent_check (make_buffer (buf));
#endif
QUIT;
}
Bufbyte *to, *from;
Bytecount i;
Bytind new_s1;
- struct buffer *mbuf;
- Lisp_Object bufcons;
to = BUF_GPT_ADDR (buf);
from = to + BUF_GAP_SIZE (buf);
{
int gsize = BUF_GAP_SIZE (buf);
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- adjust_markers (mbuf, BI_BUF_GPT (mbuf) + gsize, pos + gsize, - gsize);
- }
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- adjust_extents (make_buffer (mbuf), BI_BUF_GPT (mbuf) + gsize,
- pos + gsize, - gsize);
- }
+ adjust_markers (buf, BI_BUF_GPT (buf) + gsize, pos + gsize, - gsize);
+ adjust_extents (make_buffer (buf), BI_BUF_GPT (buf) + gsize, pos + gsize,
+ - gsize);
SET_BI_BUF_GPT (buf, pos);
SET_GAP_SENTINEL (buf);
#ifdef ERROR_CHECK_EXTENTS
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- sledgehammer_extent_check (make_buffer (mbuf));
- }
+ sledgehammer_extent_check (make_buffer (buf));
#endif
}
if (pos == BI_BUF_Z (buf))
Bytecount old_gap_size;
/* If we have to get more space, get enough to last a while. We use
- a geometric progression that saves on realloc space. */
+ a geometric progession that saves on realloc space. */
increment += 2000 + ((BI_BUF_Z (buf) - BI_BUF_BEG (buf)) / 8);
if (increment > BUF_END_GAP_SIZE (buf))
static Lisp_Object
change_function_restore (Lisp_Object buffer)
{
- /* We should first reset the variable and then change the buffer,
- because Fset_buffer() can throw. */
- inside_change_hook = 0;
Fset_buffer (buffer);
+ inside_change_hook = 0;
return Qnil;
}
static Lisp_Object
first_change_hook_restore (Lisp_Object buffer)
{
- in_first_change = 0;
Fset_buffer (buffer);
+ in_first_change = 0;
return Qnil;
}
if (!in_first_change)
{
- if (!NILP (symbol_value_in_buffer (Qfirst_change_hook, buffer)))
+ if (!preparing_for_armageddon &&
+ !NILP (symbol_value_in_buffer (Qfirst_change_hook, buffer)))
{
int speccount = specpdl_depth ();
record_unwind_protect (first_change_hook_restore, buffer);
signal_before_change (struct buffer *buf, Bufpos start, Bufpos end)
{
/* This function can GC */
- struct buffer *mbuf;
- Lisp_Object bufcons;
+ Lisp_Object buffer;
+ XSETBUFFER (buffer, buf);
if (!inside_change_hook)
{
- Lisp_Object buffer;
-
/* Are we in a multiple-change session? */
if (buf->text->changes->in_multiple_change &&
buf->text->changes->mc_begin != 0)
/* If buffer is unmodified, run a special hook for that case. */
if (BUF_SAVE_MODIFF (buf) >= BUF_MODIFF (buf))
- {
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- signal_first_change (mbuf);
- }
- }
+ signal_first_change (buf);
/* Now in any case run the before-change-functions if any. */
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
+ if (!preparing_for_armageddon &&
+ (!NILP (symbol_value_in_buffer (Qbefore_change_functions, buffer)) ||
+ /* Obsolete, for compatibility */
+ !NILP (symbol_value_in_buffer (Qbefore_change_function, buffer))))
{
- XSETBUFFER (buffer, mbuf);
- if (!NILP (symbol_value_in_buffer (Qbefore_change_functions, buffer))
- /* Obsolete, for compatibility */
- || !NILP (symbol_value_in_buffer (Qbefore_change_function, buffer)))
- {
- int speccount = specpdl_depth ();
- record_unwind_protect (change_function_restore, Fcurrent_buffer ());
- set_buffer_internal (buf);
- inside_change_hook = 1;
- va_run_hook_with_args (Qbefore_change_functions, 2,
- make_int (start), make_int (end));
- /* Obsolete, for compatibility */
- va_run_hook_with_args (Qbefore_change_function, 2,
- make_int (start), make_int (end));
- unbind_to (speccount, Qnil);
- }
- }
-
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- XSETBUFFER (buffer, mbuf);
- report_extent_modification (buffer, start, end,
- &inside_change_hook, 0);
+ int speccount = specpdl_depth ();
+ record_unwind_protect (change_function_restore, Fcurrent_buffer ());
+ set_buffer_internal (buf);
+ inside_change_hook = 1;
+ va_run_hook_with_args (Qbefore_change_functions, 2,
+ make_int (start), make_int (end));
+ /* Obsolete, for compatibility */
+ va_run_hook_with_args (Qbefore_change_function, 2,
+ make_int (start), make_int (end));
+ unbind_to (speccount, Qnil);
}
/* Only now do we indicate that the before-change-functions have
been called, in case some function throws out. */
buf->text->changes->mc_begin_signaled = 1;
}
+
+ /* #### At this point we should map over extents calling
+ modification-hooks, insert-before-hooks and insert-after-hooks
+ of relevant extents */
}
/* Signal a change immediately after it happens.
Bufpos new_end)
{
/* This function can GC */
- struct buffer *mbuf;
- Lisp_Object bufcons;
+ Lisp_Object buffer;
+ XSETBUFFER (buffer, buf);
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- /* always do this. */
- buffer_signal_changed_region (mbuf, start, new_end);
- }
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- /* #### This seems inefficient. Wouldn't it be better to just
- keep one cache per base buffer? */
- font_lock_maybe_update_syntactic_caches (mbuf, start, orig_end, new_end);
- }
+ /* always do this. */
+ buffer_signal_changed_region (buf, start, new_end);
+ font_lock_maybe_update_syntactic_caches (buf, start, orig_end, new_end);
if (!inside_change_hook)
{
- Lisp_Object buffer;
-
if (buf->text->changes->in_multiple_change &&
buf->text->changes->mc_begin != 0)
{
return; /* after-change-functions signalled when all changes done */
}
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- XSETBUFFER (buffer, mbuf);
-
- if (!NILP (symbol_value_in_buffer (Qafter_change_functions, buffer))
- /* Obsolete, for compatibility */
- || !NILP (symbol_value_in_buffer (Qafter_change_function, buffer)))
- {
- int speccount = specpdl_depth ();
- record_unwind_protect (change_function_restore, Fcurrent_buffer ());
- set_buffer_internal (buf);
- inside_change_hook = 1;
- /* The actual after-change functions take slightly
- different arguments than what we were passed. */
- va_run_hook_with_args (Qafter_change_functions, 3,
- make_int (start), make_int (new_end),
- make_int (orig_end - start));
- /* Obsolete, for compatibility */
- va_run_hook_with_args (Qafter_change_function, 3,
- make_int (start), make_int (new_end),
- make_int (orig_end - start));
- unbind_to (speccount, Qnil);
- }
- }
-
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
+ if (!preparing_for_armageddon &&
+ (!NILP (symbol_value_in_buffer (Qafter_change_functions, buffer)) ||
+ /* Obsolete, for compatibility */
+ !NILP (symbol_value_in_buffer (Qafter_change_function, buffer))))
{
- XSETBUFFER (buffer, mbuf);
- report_extent_modification (buffer, start, new_end,
- &inside_change_hook, 1);
+ int speccount = specpdl_depth ();
+ record_unwind_protect (change_function_restore, Fcurrent_buffer ());
+ set_buffer_internal (buf);
+ inside_change_hook = 1;
+ /* The actual after-change functions take slightly
+ different arguments than what we were passed. */
+ va_run_hook_with_args (Qafter_change_functions, 3,
+ make_int (start), make_int (new_end),
+ make_int (orig_end - start));
+ /* Obsolete, for compatibility */
+ va_run_hook_with_args (Qafter_change_function, 3,
+ make_int (start), make_int (new_end),
+ make_int (orig_end - start));
+ unbind_to (speccount, Qnil);
}
}
+
+ /* #### At this point we should map over extents calling
+ some sort of modification hooks of relevant extents */
}
/* Call this if you're about to change the region of BUFFER from START
/* dmoore - This function can also kill the buffer buf, the current
buffer, and do anything it pleases. So if you call it, be
careful. */
- struct buffer *mbuf;
- Lisp_Object buffer, bufcons;
+ Lisp_Object buffer;
struct gcpro gcpro1;
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- barf_if_buffer_read_only (mbuf, start, end);
- }
+ barf_if_buffer_read_only (buf, start, end);
/* if this is the first modification, see about locking the buffer's
file */
Vdeactivate_mark = Qt;
#endif
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- mbuf->point_before_scroll = Qnil;
- }
+ buf->point_before_scroll = Qnil;
}
\f
Bytind ind;
Charcount cclen;
int move_point = 0;
- struct buffer *mbuf;
- Lisp_Object bufcons;
/* Defensive steps just in case a buffer gets deleted and a calling
function doesn't notice it. */
if ((length + BUF_Z (buf)) > EMACS_INT_MAX)
error ("Maximum buffer size exceeded");
- /* theoretically not necessary -- caller should GCPRO.
- #### buffer_insert_from_buffer_1() doesn't! */
+ /* theoretically not necessary -- caller should GCPRO */
GCPRO1 (reloc);
prepare_to_modify_buffer (buf, pos, pos, !(flags & INSDEL_NO_LOCKING));
insert_invalidate_line_number_cache (buf, pos, nonreloc + offset, length);
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- record_insert (mbuf, pos, cclen);
- }
-
+ record_insert (buf, pos, cclen);
BUF_MODIFF (buf)++;
MARK_BUFFERS_CHANGED;
SET_BUF_GAP_SIZE (buf, BUF_GAP_SIZE (buf) - length);
SET_BI_BUF_GPT (buf, BI_BUF_GPT (buf) + length);
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- SET_BOTH_BUF_ZV (mbuf, BUF_ZV (mbuf) + cclen, BI_BUF_ZV (mbuf) + length);
- }
+ SET_BOTH_BUF_ZV (buf, BUF_ZV (buf) + cclen, BI_BUF_ZV (buf) + length);
SET_BOTH_BUF_Z (buf, BUF_Z (buf) + cclen, BI_BUF_Z (buf) + length);
SET_GAP_SENTINEL (buf);
buffer_mule_signal_inserted_region (buf, pos, length, cclen);
#endif
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- process_extents_for_insertion (make_buffer (mbuf), ind, length);
- }
-
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- /* We know the gap is at IND so the cast is OK. */
- adjust_markers_for_insert (mbuf, (Memind) ind, length);
- }
+ process_extents_for_insertion (make_buffer (buf), ind, length);
+ /* We know the gap is at IND so the cast is OK. */
+ adjust_markers_for_insert (buf, (Memind) ind, length);
/* Point logically doesn't move, but may need to be adjusted because
it's a byte index. point-marker doesn't change because it's a
memory index. */
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- if (BI_BUF_PT (mbuf) > ind)
- JUST_SET_POINT (mbuf, BUF_PT (mbuf) + cclen,
- BI_BUF_PT (mbuf) + length);
- }
+ if (BI_BUF_PT (buf) > ind)
+ JUST_SET_POINT (buf, BUF_PT (buf) + cclen, BI_BUF_PT (buf) + length);
/* Well, point might move. */
if (move_point)
BI_BUF_SET_PT (buf, ind + length);
if (STRINGP (reloc))
- {
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- splice_in_string_extents (reloc, mbuf, ind, length, offset);
- }
- }
+ splice_in_string_extents (reloc, buf, ind, length, offset);
if (flags & INSDEL_BEFORE_MARKERS)
{
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- /* ind - 1 is correct because the FROM argument is exclusive.
- I formerly used DEC_BYTIND() but that caused problems at the
- beginning of the buffer. */
- adjust_markers (mbuf, ind - 1, ind, length);
- }
+ /* ind - 1 is correct because the FROM argument is exclusive.
+ I formerly used DEC_BYTIND() but that caused problems at the
+ beginning of the buffer. */
+ adjust_markers (buf, ind - 1, ind, length);
}
signal_after_change (buf, pos, pos, pos + cclen);
int flags)
{
/* This function can GC */
-#ifdef ERROR_CHECK_TYPECHECK
assert (STRINGP (str));
-#endif
return buffer_insert_string_1 (buf, pos, 0, str, 0,
XSTRING_LENGTH (str),
flags);
int flags)
{
/* This function can GC */
+
CONST char *translated = GETTEXT (s);
return buffer_insert_string_1 (buf, pos, (CONST Bufbyte *) translated, Qnil,
0, strlen (translated), flags);
{
/* This function can GC */
Bufbyte str[MAX_EMCHAR_LEN];
- Bytecount len = set_charptr_emchar (str, ch);
+ Bytecount len;
+
+ len = set_charptr_emchar (str, ch);
return buffer_insert_string_1 (buf, pos, str, Qnil, 0, len, flags);
}
Bytind bi_from, bi_to;
Bytecount bc_numdel;
EMACS_INT shortage;
- struct buffer *mbuf;
- Lisp_Object bufcons;
+ Lisp_Object bufobj;
/* Defensive steps just in case a buffer gets deleted and a calling
function doesn't notice it. */
if ((numdel = to - from) <= 0)
return;
+ XSETBUFFER (bufobj, buf);
+
/* Redisplay needs to know if a newline was in the deleted region.
If we've already marked the changed region as having a deleted
newline there is no use in performing the check. */
{
scan_buffer (buf, '\n', from, to, 1, &shortage, 1);
if (!shortage)
- {
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- mbuf->changes->newline_was_deleted = 1;
- }
- }
+ buf->changes->newline_was_deleted = 1;
}
bi_from = bufpos_to_bytind (buf, from);
{
/* avoid moving the gap just to delete from the bottom. */
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- record_delete (mbuf, from, numdel);
- }
+ record_delete (buf, from, numdel);
BUF_MODIFF (buf)++;
MARK_BUFFERS_CHANGED;
- /* #### Point used to be modified here, but this causes problems
- with MULE, as point is used to calculate bytinds, and if the
- offset in bc_numdel causes point to move to a non first-byte
- location, causing some other function to throw an assertion
- in ASSERT_VALID_BYTIND. I've moved the code to right after
- the other movements and adjustments, but before the gap is
- moved. -- jh 970813 */
+ /* ### Point used to be modified here, but this causes problems with MULE,
+ as point is used to calculate bytinds, and if the offset in bc_numdel causes
+ point to move to a non first-byte location, causing some other function to
+ throw an assertion in ASSERT_VALID_BYTIND. I've moved the code to right after
+ the other movements and adjustments, but before the gap is moved.
+ -- jh 970813 */
/* Detach any extents that are completely within the range [FROM, TO],
if the extents are detachable.
- This must come AFTER record_delete(), so that the appropriate
- extents will be present to be recorded, and BEFORE the gap
- size is increased, as otherwise we will be confused about
- where the extents end. */
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- process_extents_for_deletion (make_buffer (mbuf), bi_from, bi_to, 0);
- }
+ This must come AFTER record_delete(), so that the appropriate extents
+ will be present to be recorded, and BEFORE the gap size is increased,
+ as otherwise we will be confused about where the extents end. */
+ process_extents_for_deletion (bufobj, bi_from, bi_to, 0);
- /* Relocate all markers pointing into the new, larger gap to
- point at the end of the text before the gap. */
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- adjust_markers (mbuf,
- (bi_to + BUF_GAP_SIZE (mbuf)),
- (bi_to + BUF_GAP_SIZE (mbuf)),
- (- bc_numdel));
- }
+ /* Relocate all markers pointing into the new, larger gap
+ to point at the end of the text before the gap. */
+ adjust_markers (buf,
+ (bi_to + BUF_GAP_SIZE (buf)),
+ (bi_to + BUF_GAP_SIZE (buf)),
+ (- bc_numdel));
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- /* Relocate any extent endpoints just like markers. */
- adjust_extents_for_deletion (make_buffer (mbuf), bi_from, bi_to,
- BUF_GAP_SIZE (mbuf), bc_numdel, 0);
- }
+ /* Relocate any extent endpoints just like markers. */
+ adjust_extents_for_deletion (bufobj, bi_from, bi_to,
+ BUF_GAP_SIZE (buf), bc_numdel, 0);
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
+ /* Relocate point as if it were a marker. */
+ if (bi_from < BI_BUF_PT (buf))
{
- /* Relocate point as if it were a marker. */
- if (bi_from < BI_BUF_PT (mbuf))
- {
- if (BI_BUF_PT (mbuf) < bi_to)
- JUST_SET_POINT (mbuf, from, bi_from);
- else
- JUST_SET_POINT (mbuf, BUF_PT (mbuf) - numdel,
- BI_BUF_PT (mbuf) - bc_numdel);
- }
+ if (BI_BUF_PT (buf) < bi_to)
+ JUST_SET_POINT (buf, from, bi_from);
+ else
+ JUST_SET_POINT (buf, BUF_PT (buf) - numdel,
+ BI_BUF_PT (buf) - bc_numdel);
}
SET_BUF_END_GAP_SIZE (buf, BUF_END_GAP_SIZE (buf) + bc_numdel);
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- SET_BOTH_BUF_ZV (mbuf, BUF_ZV (mbuf) - numdel,
- BI_BUF_ZV (mbuf) - bc_numdel);
- }
+ SET_BOTH_BUF_ZV (buf, BUF_ZV (buf) - numdel, BI_BUF_ZV (buf) - bc_numdel);
SET_BOTH_BUF_Z (buf, BUF_Z (buf) - numdel, BI_BUF_Z (buf) - bc_numdel);
SET_GAP_SENTINEL (buf);
}
if (bi_from > BI_BUF_GPT (buf))
gap_right (buf, bi_from);
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- record_delete (mbuf, from, numdel);
- }
+ record_delete (buf, from, numdel);
BUF_MODIFF (buf)++;
MARK_BUFFERS_CHANGED;
- /* #### Point used to be modified here, but this causes problems
- with MULE, as point is used to calculate bytinds, and if the
- offset in bc_numdel causes point to move to a non first-byte
- location, causing some other function to throw an assertion
- in ASSERT_VALID_BYTIND. I've moved the code to right after
- the other movements and adjustments, but before the gap is
- moved. -- jh 970813 */
+ /* ### Point used to be modified here, but this causes problems with MULE,
+ as point is used to calculate bytinds, and if the offset in bc_numdel causes
+ point to move to a non first-byte location, causing some other function to
+ throw an assertion in ASSERT_VALID_BYTIND. I've moved the code to right after
+ the other movements and adjustments, but before the gap is moved.
+ -- jh 970813 */
/* Detach any extents that are completely within the range [FROM, TO],
if the extents are detachable.
This must come AFTER record_delete(), so that the appropriate extents
will be present to be recorded, and BEFORE the gap size is increased,
as otherwise we will be confused about where the extents end. */
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- process_extents_for_deletion (make_buffer (mbuf), bi_from, bi_to, 0);
- }
+ process_extents_for_deletion (bufobj, bi_from, bi_to, 0);
- /* Relocate all markers pointing into the new, larger gap to
- point at the end of the text before the gap. */
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- adjust_markers (mbuf,
- (bi_to + BUF_GAP_SIZE (mbuf)),
- (bi_to + BUF_GAP_SIZE (mbuf)),
- (- bc_numdel - BUF_GAP_SIZE (mbuf)));
- }
+ /* Relocate all markers pointing into the new, larger gap
+ to point at the end of the text before the gap. */
+ adjust_markers (buf,
+ (bi_to + BUF_GAP_SIZE (buf)),
+ (bi_to + BUF_GAP_SIZE (buf)),
+ (- bc_numdel - BUF_GAP_SIZE (buf)));
/* Relocate any extent endpoints just like markers. */
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- adjust_extents_for_deletion (make_buffer (mbuf), bi_from, bi_to,
- BUF_GAP_SIZE (mbuf),
- bc_numdel, BUF_GAP_SIZE (mbuf));
- }
+ adjust_extents_for_deletion (bufobj, bi_from, bi_to, BUF_GAP_SIZE (buf),
+ bc_numdel, BUF_GAP_SIZE (buf));
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
+ /* Relocate point as if it were a marker. */
+ if (bi_from < BI_BUF_PT (buf))
{
- /* Relocate point as if it were a marker. */
- if (bi_from < BI_BUF_PT (mbuf))
- {
- if (BI_BUF_PT (mbuf) < bi_to)
- JUST_SET_POINT (mbuf, from, bi_from);
- else
- JUST_SET_POINT (mbuf, BUF_PT (mbuf) - numdel,
- BI_BUF_PT (mbuf) - bc_numdel);
- }
+ if (BI_BUF_PT (buf) < bi_to)
+ JUST_SET_POINT (buf, from, bi_from);
+ else
+ JUST_SET_POINT (buf, BUF_PT (buf) - numdel,
+ BI_BUF_PT (buf) - bc_numdel);
}
SET_BUF_GAP_SIZE (buf, BUF_GAP_SIZE (buf) + bc_numdel);
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- SET_BOTH_BUF_ZV (mbuf, BUF_ZV (mbuf) - numdel,
- BI_BUF_ZV (mbuf) - bc_numdel);
- }
+ SET_BOTH_BUF_ZV (buf, BUF_ZV (buf) - numdel, BI_BUF_ZV (buf) - bc_numdel);
SET_BOTH_BUF_Z (buf, BUF_Z (buf) - numdel, BI_BUF_Z (buf) - bc_numdel);
SET_BI_BUF_GPT (buf, bi_from);
SET_GAP_SENTINEL (buf);
#endif
#ifdef ERROR_CHECK_EXTENTS
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- sledgehammer_extent_check (make_buffer (mbuf));
- }
+ sledgehammer_extent_check (bufobj);
#endif
signal_after_change (buf, from, to, from);
/* Replace the character at POS in buffer B with CH. */
void
-buffer_replace_char (struct buffer *buf, Bufpos pos, Emchar ch,
+buffer_replace_char (struct buffer *b, Bufpos pos, Emchar ch,
int not_real_change, int force_lock_check)
{
/* This function can GC */
/* Defensive steps just in case a buffer gets deleted and a calling
function doesn't notice it. */
- if (!BUFFER_LIVE_P (buf))
+ if (!BUFFER_LIVE_P (b))
return;
- curlen = BUF_CHARPTR_COPY_CHAR (buf, pos, curstr);
+ curlen = BUF_CHARPTR_COPY_CHAR (b, pos, curstr);
newlen = set_charptr_emchar (newstr, ch);
if (curlen == newlen)
{
- struct buffer *mbuf;
- Lisp_Object bufcons;
-
/* then we can just replace the text. */
- prepare_to_modify_buffer (buf, pos, pos + 1,
+ prepare_to_modify_buffer (b, pos, pos + 1,
!not_real_change || force_lock_check);
/* Defensive steps in case the before-change-functions fuck around */
- if (!BUFFER_LIVE_P (buf))
+ if (!BUFFER_LIVE_P (b))
/* Bad bad pre-change function. */
return;
/* Make args be valid again. prepare_to_modify_buffer() might have
modified the buffer. */
- if (pos < BUF_BEGV (buf))
- pos = BUF_BEGV (buf);
- if (pos >= BUF_ZV (buf))
- pos = BUF_ZV (buf) - 1;
- if (pos < BUF_BEGV (buf))
+ if (pos < BUF_BEGV (b))
+ pos = BUF_BEGV (b);
+ if (pos >= BUF_ZV (b))
+ pos = BUF_ZV (b) - 1;
+ if (pos < BUF_BEGV (b))
/* no more characters in buffer! */
return;
- if (BUF_FETCH_CHAR (buf, pos) == '\n')
- {
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- mbuf->changes->newline_was_deleted = 1;
- }
- }
+ if (BUF_FETCH_CHAR (b, pos) == '\n')
+ b->changes->newline_was_deleted = 1;
MARK_BUFFERS_CHANGED;
if (!not_real_change)
{
- MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
- {
- record_change (mbuf, pos, 1);
- }
- BUF_MODIFF (buf)++;
+ record_change (b, pos, 1);
+ BUF_MODIFF (b)++;
}
- memcpy (BUF_BYTE_ADDRESS (buf, pos), newstr, newlen);
-
- signal_after_change (buf, pos, pos + 1, pos + 1);
+ memcpy (BUF_BYTE_ADDRESS (b, pos), newstr, newlen);
+ signal_after_change (b, pos, pos + 1, pos + 1);
/* We do not have to adjust the Mule data; we just replaced a
character with another of the same number of bytes. */
* point. Point will drift backward by one position and stay
* there otherwise.
*/
- int movepoint = (pos == BUF_PT (buf) - 1);
+ int movepoint = (pos == BUF_PT (b) - 1);
- buffer_delete_range (buf, pos, pos + 1, 0);
+ buffer_delete_range (b, pos, pos + 1, 0);
/* Defensive steps in case the before-change-functions fuck around */
- if (!BUFFER_LIVE_P (buf))
+ if (!BUFFER_LIVE_P (b))
/* Bad bad pre-change function. */
return;
/* Make args be valid again. prepare_to_modify_buffer() might have
modified the buffer. */
- if (pos < BUF_BEGV (buf))
- pos = BUF_BEGV (buf);
- if (pos >= BUF_ZV (buf))
- pos = BUF_ZV (buf) - 1;
- if (pos < BUF_BEGV (buf))
+ if (pos < BUF_BEGV (b))
+ pos = BUF_BEGV (b);
+ if (pos >= BUF_ZV (b))
+ pos = BUF_ZV (b) - 1;
+ if (pos < BUF_BEGV (b))
/* no more characters in buffer! */
return;
/*
* insertion, which we must do if the deletion moved point
* backward so that it now equals the insertion point.
*/
- buffer_insert_string_1 (buf, (movepoint ? -1 : pos),
+ buffer_insert_string_1 (b, (movepoint ? -1 : pos),
newstr, Qnil, 0, newlen, 0);
}
}
/* Make a string from a buffer. This needs to take into account the gap,
and add any necessary extents from the buffer. */
-static Lisp_Object
-make_string_from_buffer_1 (struct buffer *buf, Bufpos pos, Charcount length,
- int no_extents)
+Lisp_Object
+make_string_from_buffer (struct buffer *buf, Bufpos pos, Charcount length)
{
/* This function can GC */
- Bytind bi_ind = bufpos_to_bytind (buf, pos);
- Bytecount bi_len = bufpos_to_bytind (buf, pos + length) - bi_ind;
- Lisp_Object val = make_uninit_string (bi_len);
-
+ Lisp_Object val;
struct gcpro gcpro1;
+ Bytind bi_ind;
+ Bytecount bi_len;
+
+ bi_ind = bufpos_to_bytind (buf, pos);
+ bi_len = bufpos_to_bytind (buf, pos + length) - bi_ind;
+
+ val = make_uninit_string (bi_len);
GCPRO1 (val);
- if (!no_extents)
- add_string_extents (val, buf, bi_ind, bi_len);
+ add_string_extents (val, buf, bi_ind, bi_len);
{
Bytecount len1 = BI_BUF_GPT (buf) - bi_ind;
return val;
}
-Lisp_Object
-make_string_from_buffer (struct buffer *buf, Bufpos pos, Charcount length)
-{
- return make_string_from_buffer_1 (buf, pos, length, 0);
-}
-
-Lisp_Object
-make_string_from_buffer_no_extents (struct buffer *buf, Bufpos pos,
- Charcount length)
-{
- return make_string_from_buffer_1 (buf, pos, length, 1);
-}
-
void
barf_if_buffer_read_only (struct buffer *buf, Bufpos from, Bufpos to)
{
}
}
-Charcount
+int
convert_bufbyte_string_into_emchar_string (CONST Bufbyte *str, Bytecount len,
Emchar *arr)
{
}
void
-init_buffer_text (struct buffer *b)
+init_buffer_text (struct buffer *b, int indirect_p)
{
- if (!b->base_buffer)
+ if (!indirect_p)
{
SET_BUF_GAP_SIZE (b, 20);
BUFFER_ALLOC (b->text->beg, BUF_GAP_SIZE (b) + BUF_END_SENTINEL_SIZE);
}
}
#endif /* MULE */
- b->text->line_number_cache = Qnil;
BUF_MODIFF (b) = 1;
BUF_SAVE_MODIFF (b) = 1;
}
void
-uninit_buffer_text (struct buffer *b)
+uninit_buffer_text (struct buffer *b, int indirect_p)
{
- if (!b->base_buffer)
+ if (!indirect_p)
{
BUFFER_FREE (b->text->beg);
xfree (b->text->changes);
/*
Format of a non-union-type Lisp Object
+ For the USE_MINIMAL_TAGBITS implementation:
+
3 2 1 0
bit 10987654321098765432109876543210
--------------------------------
--------------------------------
VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVT
+ For the non-USE_MINIMAL_TAGBITS implementation:
+
+ 3 2 1 0
+ bit 10987654321098765432109876543210
+ --------------------------------
+ TTTMVVVVVVVVVVVVVVVVVVVVVVVVVVVV
+
+ V = value bits
+ T = type bits
+ M = mark bits
+
For integral Lisp types, i.e. integers and characters, the value
bits are the Lisp object.
- The object is obtained by masking off the type and mark bits.
- Bit 1 is used as a value bit by splitting the Lisp integer type
- into two subtypes, Lisp_Type_Int_Even and Lisp_Type_Int_Odd. By
+ The object is obtained by masking off the type and mark
+ bits. In the USE_MINIMAL_TAGBITS implementation, bit 1 is
+ used as a value bit by splitting the Lisp integer type into
+ two subtypes, Lisp_Type_Int_Even and Lisp_Type_Int_Odd. By
this trickery we get 31 bits for integers instead of 30.
+ In the non-USE_MINIMAL_TAGBITS world, Lisp integers are 28 bits,
+ or more properly (BITS_PER_EMACS_INT - GCTYPEBITS - 1) bits.
+
For non-integral types, the value bits of a Lisp_Object contain
a pointer to a structure containing the object. The pointer is
obtained by masking off the type and mark bits.
- All pointer-based types are coalesced under a single type called
+ In the USE_MINIMAL_TAGBITS implementation, all
+ pointer-based types are coalesced under a single type called
Lisp_Type_Record. The type bits for this type are required
by the implementation to be 00, just like the least
significant bits of word-aligned struct pointers on 32-bit
hardware. Because of this, Lisp_Object pointers don't have
to be masked and are full-sized.
- There are no mark bits.
+ In the non-USE_MINIMAL_TAGBITS implementation, the type and
+ mark bits must be masked off and pointers are limited to 28
+ bits (really BITS_PER_EMACS_INT - GCTYPEBITS - 1 bits).
+
+ There are no mark bits in the USE_MINIMAL_TAGBITS implementation.
Integers and characters don't need to be marked. All other types
are lrecord-based, which means they get marked by incrementing
their ->implementation pointer.
+ In the non-USE_MINIMAL_TAGBITS implementation, the markbit is stored
+ in the Lisp_Object itself. It is stored in the middle so that the
+ type bits can be obtained by simply shifting them.
+
+ Outside of garbage collection, all mark bits are always zero.
+
Here is a brief description of the following macros:
+ XMARKBIT Extract the mark bit (non-USE_MINIMAL_TAGBITS)
+ XMARK Set the mark bit of this Lisp_Object (non-USE_MINIMAL_TAGBITS)
+ XUNMARK Clear the mark bit of this Lisp_Object (non-USE_MINIMAL_TAGBITS)
XTYPE The type bits of a Lisp_Object
XPNTRVAL The value bits of a Lisp_Object storing a pointer
XCHARVAL The value bits of a Lisp_Object storing a Emchar
INTP Non-zero if this Lisp_Object an integer?
Qzero Lisp Integer 0
EQ Non-zero if two Lisp_Objects are identical
- GC_EQ Version of EQ used during garbage collection */
+ GC_EQ Version of EQ used during garbage collection
+*/
typedef EMACS_INT Lisp_Object;
-#define Lisp_Type_Int_Bit (Lisp_Type_Int_Even & Lisp_Type_Int_Odd)
-#define make_obj(vartype, x) ((Lisp_Object) (x))
-#define make_int(x) ((Lisp_Object) (((x) << INT_GCBITS) | Lisp_Type_Int_Bit))
-#define make_char(x) ((Lisp_Object) (((x) << GCBITS) | Lisp_Type_Char))
-#define VALMASK (((1UL << VALBITS) - 1UL) << GCTYPEBITS)
-#define XTYPE(x) ((enum Lisp_Type) (((EMACS_UINT)(x)) & ~VALMASK))
-#define XPNTRVAL(x) (x) /* This depends on Lisp_Type_Record == 0 */
-#define XCHARVAL(x) ((x) >> GCBITS)
-#define GC_EQ(x,y) EQ (x,y)
-#define XREALINT(x) ((x) >> INT_GCBITS)
-#define XUINT(x) ((EMACS_UINT)(x) >> INT_GCBITS)
-#define INTP(x) ((EMACS_UINT)(x) & Lisp_Type_Int_Bit)
-
-#define Qzero make_int (0)
-#define Qnull_pointer ((Lisp_Object) 0)
+#ifdef USE_MINIMAL_TAGBITS
+
+# define XUNMARK(x) DO_NOTHING
+# define make_obj(vartype, x) ((Lisp_Object) (x))
+# define make_int(x) ((Lisp_Object) (((x) << INT_GCBITS) + 1))
+# define make_char(x) ((Lisp_Object) (((x) << GCBITS) + Lisp_Type_Char))
+# define VALMASK (((1UL << VALBITS) - 1UL) << GCTYPEBITS)
+# define XTYPE(x) ((enum Lisp_Type) (((EMACS_UINT)(x)) & ~VALMASK))
+# define XPNTRVAL(x) (x) /* This depends on Lisp_Type_Record == 0 */
+# define XCHARVAL(x) ((x) >> GCBITS)
+# define GC_EQ(x,y) EQ (x,y)
+# define XREALINT(x) ((x) >> INT_GCBITS)
+# define XUINT(x) ((EMACS_UINT)(x) >> INT_GCBITS)
+# define INTP(x) ((EMACS_UINT)(x) & 1)
+# define Qzero ((Lisp_Object) 1UL)
+
+#else /* !USE_MINIMAL_TAGBITS */
+
+# define MARKBIT (1UL << VALBITS)
+# define XMARKBIT(x) (((x) & MARKBIT) != 0)
+# define XMARK(x) ((void) ((x) |= MARKBIT))
+# define XUNMARK(x) ((void) ((x) &= ~MARKBIT))
+# define make_obj(vartype, value) \
+ ((Lisp_Object) (((EMACS_UINT) (vartype) << (VALBITS + GCMARKBITS)) \
+ + ((EMACS_UINT) (value) & VALMASK)))
+# define make_int(value) make_obj (Lisp_Type_Int, value)
+# define make_char(value) make_obj (Lisp_Type_Char, value)
+# define VALMASK ((1UL << VALBITS) - 1UL)
+# define XTYPE(x) ((enum Lisp_Type) (((EMACS_UINT)(x)) >> (VALBITS + GCMARKBITS)))
+# define XPNTRVAL(x) ((x) & VALMASK)
+# define XCHARVAL(x) XPNTRVAL(x)
+# define GC_EQ(x,y) (((x) & ~MARKBIT) == ((y) & ~MARKBIT))
+# define XREALINT(x) (((x) << INT_GCBITS) >> INT_GCBITS)
+# define XUINT(x) ((EMACS_UINT) ((x) & VALMASK))
+# define INTP(x) (XTYPE (x) == Lisp_Type_Int)
+# define Qzero ((Lisp_Object) Lisp_Type_Int)
+
+#endif /* !USE_MINIMAL_TAGBITS */
+
+#define Qnull_pointer 0
#define XGCTYPE(x) XTYPE(x)
#define EQ(x,y) ((x) == (y))
#define XSETINT(var, value) ((void) ((var) = make_int (value)))
#define _XEMACS_LISP_H_
/************************************************************************/
-/* general definitions */
+/* general definitions */
/************************************************************************/
/* We include the following generally useful header files so that you
#include <stdio.h> /* NULL, etc. */
#include <ctype.h>
#include <stdarg.h>
-#include <stddef.h> /* offsetof */
#ifdef __lucid
# include <sysent.h>
# define DOESNT_RETURN void volatile
# define DECLARE_DOESNT_RETURN(decl) \
extern void volatile decl __attribute__ ((noreturn))
-# define DECLARE_DOESNT_RETURN_GCC_ATTRIBUTE_SYNTAX_SUCKS(decl,str,idx) \
+# define DECLARE_DOESNT_RETURN_GCC__ATTRIBUTE__SYNTAX_SUCKS(decl,str,idx) \
/* Should be able to state multiple independent __attribute__s, but \
the losing syntax doesn't work that way, and screws losing cpp */ \
extern void volatile decl \
# else
# define DOESNT_RETURN void volatile
# define DECLARE_DOESNT_RETURN(decl) extern void volatile decl
-# define DECLARE_DOESNT_RETURN_GCC_ATTRIBUTE_SYNTAX_SUCKS(decl,str,idx) \
+# define DECLARE_DOESNT_RETURN_GCC__ATTRIBUTE__SYNTAX_SUCKS(decl,str,idx) \
extern void volatile decl PRINTF_ARGS(str,idx)
# endif /* GNUC 2.5 */
# else
# define DOESNT_RETURN void
# define DECLARE_DOESNT_RETURN(decl) extern void decl
-# define DECLARE_DOESNT_RETURN_GCC_ATTRIBUTE_SYNTAX_SUCKS(decl,str,idx) \
+# define DECLARE_DOESNT_RETURN_GCC__ATTRIBUTE__SYNTAX_SUCKS(decl,str,idx) \
extern void decl PRINTF_ARGS(str,idx)
# endif /* GNUC */
#endif
#define ALIGN_PTR(ptr, unit) \
((void *) ALIGN_SIZE ((long) (ptr), unit))
+#ifdef QUANTIFY
+#include "quantify.h"
+#define QUANTIFY_START_RECORDING quantify_start_recording_data ()
+#define QUANTIFY_STOP_RECORDING quantify_stop_recording_data ()
+#else /* !QUANTIFY */
+#define QUANTIFY_START_RECORDING
+#define QUANTIFY_STOP_RECORDING
+#endif /* !QUANTIFY */
+
#ifndef DO_NOTHING
#define DO_NOTHING do {} while (0)
#endif
\f
/************************************************************************/
-/* typedefs */
+/* typedefs */
/************************************************************************/
/* We put typedefs here so that prototype declarations don't choke.
struct frame; /* "frame.h" */
struct window; /* "window.h" */
struct Lisp_Event; /* "events.h" */
-typedef struct Lisp_Event Lisp_Event;
struct Lisp_Face;
-typedef struct Lisp_Face Lisp_Face;
struct Lisp_Process; /* "process.c" */
-typedef struct Lisp_Process Lisp_Process;
struct stat; /* <sys/stat.h> */
struct Lisp_Color_Instance;
-typedef struct Lisp_Color_Instance Lisp_Color_Instance;
struct Lisp_Font_Instance;
-typedef struct Lisp_Font_Instance Lisp_Font_Instance;
struct Lisp_Image_Instance;
-typedef struct Lisp_Image_Instance Lisp_Image_Instance;
-struct Lisp_Gui_Item;
-typedef struct Lisp_Gui_Item Lisp_Gui_Item;
struct display_line;
struct redisplay_info;
struct window_mirror;
\f
/************************************************************************/
-/* Definition of Lisp_Object data type */
+/* Definition of Lisp_Object data type */
/************************************************************************/
+#ifdef USE_MINIMAL_TAGBITS
+# define LRECORD_CONS
+# define LRECORD_VECTOR
+# define LRECORD_SYMBOL
+# define LRECORD_STRING
+#endif
+
/* Define the fundamental Lisp data structures */
/* This is the set of Lisp data types */
+#ifndef USE_MINIMAL_TAGBITS
+
+enum Lisp_Type
+{
+ /* Integer. XINT(obj) is the integer value. */
+ Lisp_Type_Int,
+
+ /* XRECORD_LHEADER (object) points to a struct lrecord_header
+ lheader->implementation determines the type (and GC behaviour)
+ of the object. */
+ Lisp_Type_Record,
+
+#ifndef LRECORD_CONS
+ /* Cons. XCONS (object) points to a struct Lisp_Cons. */
+ Lisp_Type_Cons,
+#endif
+
+#ifndef LRECORD_STRING
+ /* String. XSTRING (object) points to a struct Lisp_String.
+ The length of the string, and its contents, are stored therein. */
+ Lisp_Type_String,
+#endif
+
+#ifndef LRECORD_VECTOR
+ /* Vector of Lisp objects. XVECTOR(object) points to a struct Lisp_Vector.
+ The length of the vector, and its contents, are stored therein. */
+ Lisp_Type_Vector,
+#endif /* !LRECORD_VECTOR */
+
+#ifndef LRECORD_SYMBOL
+ /* Symbol. XSYMBOL (object) points to a struct Lisp_Symbol. */
+ Lisp_Type_Symbol,
+#endif /* !LRECORD_SYMBOL */
+
+ Lisp_Type_Char
+};
+
+# define POINTER_TYPE_P(type) \
+ ((type) != Lisp_Type_Int && (type) != Lisp_Type_Char)
+
+#else /* USE_MINIMAL_TAGBITS */
+
enum Lisp_Type
{
Lisp_Type_Record,
#define POINTER_TYPE_P(type) ((type) == Lisp_Type_Record)
-/* EMACS_INT is the underlying integral type into which a Lisp_Object must fit.
- In particular, it must be large enough to contain a pointer.
- config.h can override this, e.g. to use `long long' for bigger lisp ints. */
-
-#ifndef SIZEOF_EMACS_INT
-# define SIZEOF_EMACS_INT SIZEOF_VOID_P
-#endif
-
-#ifndef EMACS_INT
-# if SIZEOF_EMACS_INT == SIZEOF_LONG
-# define EMACS_INT long
-# elif SIZEOF_EMACS_INT == SIZEOF_INT
-# define EMACS_INT int
-# elif SIZEOF_EMACS_INT == SIZEOF_LONG_LONG
-# define EMACS_INT long long
-# else
-# error Unable to determine suitable type for EMACS_INT
-# endif
-#endif
-
-#ifndef EMACS_UINT
-# define EMACS_UINT unsigned EMACS_INT
+#endif /* USE_MINIMAL_TAGBITS */
+
+/* This should be the underlying type into which a Lisp_Object must fit.
+ In a strict ANSI world, this must be `int', since ANSI says you can't
+ use bitfields on any type other than `int'. However, on a machine
+ where `int' and `long' are not the same size, this should be the
+ longer of the two. (This also must be something into which a pointer
+ to an arbitrary object will fit, modulo any DATA_SEG_BITS cruft.)
+ */
+/* ### We should be using uintptr_t and SIZEOF_VOID_P here */
+#if (LONGBITS > INTBITS)
+# define EMACS_INT long
+# define EMACS_UINT unsigned long
+# define SIZEOF_EMACS_INT SIZEOF_LONG
+#else
+# define EMACS_INT int
+# define EMACS_UINT unsigned int
+# define SIZEOF_EMACS_INT SIZEOF_INT
#endif
#define BITS_PER_EMACS_INT (SIZEOF_EMACS_INT * BITS_PER_CHAR)
# define ASSERT_VALID_POINTER(pnt) (assert ((((EMACS_UINT) pnt) & 3) == 0))
#endif
-#define GCMARKBITS 0
-#define GCTYPEBITS 2
-#define GCBITS 2
-#define INT_GCBITS 1
+#ifdef USE_MINIMAL_TAGBITS
+# define GCMARKBITS 0
+# define GCTYPEBITS 2
+# define GCBITS 2
+# define INT_GCBITS 1
+#else
+# define GCMARKBITS 1
+# define GCTYPEBITS 3
+# define GCBITS 4
+# define INT_GCBITS GCBITS
+#endif
#define INT_VALBITS (BITS_PER_EMACS_INT - INT_GCBITS)
#define VALBITS (BITS_PER_EMACS_INT - GCBITS)
# include "lisp-disunion.h"
#endif /* !USE_UNION_TYPE */
-#define XPNTR(x) ((void *) (XPNTRVAL(x)))
+#ifdef HAVE_SHM
+/* In this representation, data is found in two widely separated segments. */
+extern int pure_size;
+# define XPNTR(x) \
+ ((void *)(XPNTRVAL(x)) | (XPNTRVAL(x) > pure_size ? DATA_SEG_BITS : PURE_SEG_BITS)))
+#else /* not HAVE_SHM */
+# ifdef DATA_SEG_BITS
+/* This case is used for the rt-pc and hp-pa.
+ In the diffs I was given, it checked for ptr = 0
+ and did not adjust it in that case.
+ But I don't think that zero should ever be found
+ in a Lisp object whose data type says it points to something.
+ */
+# define XPNTR(x) ((void *)((XPNTRVAL(x)) | DATA_SEG_BITS))
+# else /* not DATA_SEG_BITS */
+# define XPNTR(x) ((void *) (XPNTRVAL(x)))
+# endif /* not DATA_SEG_BITS */
+#endif /* not HAVE_SHM */
+
/* WARNING WARNING WARNING. You must ensure on your own that proper
GC protection is provided for the elements in this array. */
\f
/************************************************************************/
-/* Definitions of basic Lisp objects */
+/* Definitions of basic Lisp objects */
/************************************************************************/
#include "lrecord.h"
-/*********** unbound ***********/
+/********** unbound ***********/
/* Qunbound is a special Lisp_Object (actually of type
symbol-value-forward), that can never be visible to
struct Lisp_Cons
{
+#ifdef LRECORD_CONS
struct lrecord_header lheader;
+#endif
Lisp_Object car, cdr;
};
-typedef struct Lisp_Cons Lisp_Cons;
#if 0 /* FSFmacs */
/* Like a cons, but records info on where the text lives that it was read from */
};
#endif
-DECLARE_LRECORD (cons, Lisp_Cons);
-#define XCONS(x) XRECORD (x, cons, Lisp_Cons)
+#ifdef LRECORD_CONS
+
+DECLARE_LRECORD (cons, struct Lisp_Cons);
+#define XCONS(x) XRECORD (x, cons, struct Lisp_Cons)
#define XSETCONS(x, p) XSETRECORD (x, p, cons)
#define CONSP(x) RECORDP (x, cons)
#define GC_CONSP(x) GC_RECORDP (x, cons)
#define CONS_MARKED_P(c) MARKED_RECORD_HEADER_P(&((c)->lheader))
#define MARK_CONS(c) MARK_RECORD_HEADER (&((c)->lheader))
-extern Lisp_Object Qnil;
+#else /* ! LRECORD_CONS */
+
+DECLARE_NONRECORD (cons, Lisp_Type_Cons, struct Lisp_Cons);
+#define XCONS(a) XNONRECORD (a, cons, Lisp_Type_Cons, struct Lisp_Cons)
+#define XSETCONS(c, p) XSETOBJ (c, Lisp_Type_Cons, p)
+#define CONSP(x) (XTYPE (x) == Lisp_Type_Cons)
+#define GC_CONSP(x) (XGCTYPE (x) == Lisp_Type_Cons)
+#define CHECK_CONS(x) CHECK_NONRECORD (x, Lisp_Type_Cons, Qconsp)
+#define CONCHECK_CONS(x) CONCHECK_NONRECORD (x, Lisp_Type_Cons, Qconsp)
+
+/* Define these because they're used in a few places, inside and
+ out of alloc.c */
+#define CONS_MARKED_P(c) XMARKBIT (c->car)
+#define MARK_CONS(c) XMARK (c->car)
+
+#endif /* ! LRECORD_CONS */
#define NILP(x) EQ (x, Qnil)
#define GC_NILP(x) GC_EQ (x, Qnil)
/* For a list that's known to be in valid list format --
will abort() if the list is not in valid format */
-#define LIST_LOOP(tail, list) \
- for (tail = list; \
- !NILP (tail); \
- tail = XCDR (tail))
-
-#define LIST_LOOP_2(elt, list) \
- Lisp_Object tail##elt; \
- LIST_LOOP_3(elt, list, tail##elt)
-
-#define LIST_LOOP_3(elt, list, tail) \
- for (tail = list; \
- NILP (tail) ? \
- 0 : (elt = XCAR (tail), 1); \
- tail = XCDR (tail))
-
-#define GET_LIST_LENGTH(list, len) do { \
- Lisp_Object GLL_tail; \
- for (GLL_tail = list, len = 0; \
- !NILP (GLL_tail); \
- GLL_tail = XCDR (GLL_tail), ++len) \
- DO_NOTHING; \
-} while (0)
-
-#define GET_EXTERNAL_LIST_LENGTH(list, len) \
-do { \
- Lisp_Object GELL_elt, GELL_tail; \
- EXTERNAL_LIST_LOOP_4 (GELL_elt, list, GELL_tail, len) \
- ; \
-} while (0)
+#define LIST_LOOP(consvar, list) \
+ for (consvar = list; !NILP (consvar); consvar = XCDR (consvar))
/* For a list that's known to be in valid list format, where we may
be deleting the current element out of the list --
will abort() if the list is not in valid format */
-#define LIST_LOOP_DELETING(consvar, nextconsvar, list) \
- for (consvar = list; \
- !NILP (consvar) ? (nextconsvar = XCDR (consvar), 1) :0; \
+#define LIST_LOOP_DELETING(consvar, nextconsvar, list) \
+ for (consvar = list; \
+ !NILP (consvar) ? (nextconsvar = XCDR (consvar), 1) : 0; \
consvar = nextconsvar)
-/* Delete all elements of external list LIST
- satisfying CONDITION, an expression referring to variable ELT */
-#define EXTERNAL_LIST_LOOP_DELETE_IF(elt, list, condition) do { \
- Lisp_Object prev_tail_##list = Qnil; \
- Lisp_Object tail_##list; \
- int len_##list; \
- EXTERNAL_LIST_LOOP_4 (elt, list, tail_##list, len_##list) \
- { \
- if (condition) \
- { \
- if (NILP (prev_tail_##list)) \
- list = XCDR (tail_##list); \
- else \
- XCDR (prev_tail_##list) = XCDR (tail_##list); \
- /* Keep tortoise from ever passing hare. */ \
- len_##list = 0; \
- } \
- else \
- prev_tail_##list = tail_##list; \
- } \
-} while (0)
-
-/* Delete all elements of true non-circular list LIST
- satisfying CONDITION, an expression referring to variable ELT */
-#define LIST_LOOP_DELETE_IF(elt, list, condition) do { \
- Lisp_Object prev_tail_##list = Qnil; \
- Lisp_Object tail_##list; \
- LIST_LOOP_3 (elt, list, tail_##list) \
- { \
- if (condition) \
- { \
- if (NILP (prev_tail_##list)) \
- list = XCDR (tail_##list); \
- else \
- XCDR (prev_tail_##list) = XCDR (tail_##list); \
- } \
- else \
- prev_tail_##list = tail_##list; \
- } \
-} while (0)
-
/* For a list that may not be in valid list format --
will signal an error if the list is not in valid format */
-#define EXTERNAL_LIST_LOOP(tail, list) \
- for (tail = list; !NILP (tail); tail = XCDR (tail)) \
- if (!CONSP (tail)) \
- signal_malformed_list_error (list); \
+#define EXTERNAL_LIST_LOOP(consvar, listp) \
+ for (consvar = listp; !NILP (consvar); consvar = XCDR (consvar)) \
+ if (!CONSP (consvar)) \
+ signal_simple_error ("Invalid list format", listp); \
else
+extern Lisp_Object Qnil;
-/* The following macros are for traversing lisp lists.
- Signal an error if LIST is not properly acyclic and nil-terminated.
-
- Use tortoise/hare algorithm to check for cycles, but only if it
- looks like the list is getting too long. Not only is the hare
- faster than the tortoise; it even gets a head start! */
-
-/* Optimized and safe macros for looping over external lists. */
-#define CIRCULAR_LIST_SUSPICION_LENGTH 1024
-
-#define EXTERNAL_LIST_LOOP_1(list) \
-Lisp_Object ELL1_elt, ELL1_hare, ELL1_tortoise; \
-int ELL1_len; \
-EXTERNAL_LIST_LOOP_6(ELL1_elt, list, ELL1_len, ELL1_hare, \
- ELL1_tortoise, CIRCULAR_LIST_SUSPICION_LENGTH)
-
-#define EXTERNAL_LIST_LOOP_2(elt, list) \
-Lisp_Object hare_##elt, tortoise_##elt; \
-int len_##elt; \
-EXTERNAL_LIST_LOOP_6(elt, list, len_##elt, hare_##elt, \
- tortoise_##elt, CIRCULAR_LIST_SUSPICION_LENGTH)
-
-#define EXTERNAL_LIST_LOOP_3(elt, list, tail) \
-Lisp_Object tortoise_##elt; \
-int len_##elt; \
-EXTERNAL_LIST_LOOP_6(elt, list, len_##elt, tail, \
- tortoise_##elt, CIRCULAR_LIST_SUSPICION_LENGTH)
-
-#define EXTERNAL_LIST_LOOP_4(elt, list, tail, len) \
-Lisp_Object tortoise_##elt; \
-EXTERNAL_LIST_LOOP_6(elt, list, len, tail, \
- tortoise_##elt, CIRCULAR_LIST_SUSPICION_LENGTH)
-
-
-#define EXTERNAL_LIST_LOOP_6(elt, list, len, hare, \
- tortoise, suspicion_length) \
- for (tortoise = hare = list, len = 0; \
- \
- (CONSP (hare) ? ((elt = XCAR (hare)), 1) : \
- (NILP (hare) ? 0 : \
- (signal_malformed_list_error (list), 0))); \
- \
- hare = XCDR (hare), \
- ((++len < suspicion_length) ? \
- ((void) 0) : \
- (((len & 1) ? \
- ((void) (tortoise = XCDR (tortoise))) : \
- ((void) 0)) \
- , \
- (EQ (hare, tortoise) ? \
- ((void) signal_circular_list_error (list)) : \
- ((void) 0)))))
-
-
-
-/* Optimized and safe macros for looping over external alists. */
-#define EXTERNAL_ALIST_LOOP_4(elt, elt_car, elt_cdr, list) \
-Lisp_Object hare_##elt, tortoise_##elt; \
-int len_##elt; \
-EXTERNAL_ALIST_LOOP_8 (elt, elt_car, elt_cdr, list, \
- len_##elt, hare_##elt, tortoise_##elt, \
- CIRCULAR_LIST_SUSPICION_LENGTH)
-
-#define EXTERNAL_ALIST_LOOP_5(elt, elt_car, elt_cdr, list, tail) \
-Lisp_Object tortoise_##elt; \
-int len_##elt; \
-EXTERNAL_ALIST_LOOP_8(elt, elt_car, elt_cdr, list, \
- len_##elt, tail, tortoise_##elt, \
- CIRCULAR_LIST_SUSPICION_LENGTH)
-
-#define EXTERNAL_ALIST_LOOP_6(elt, elt_car, elt_cdr, list, tail, len) \
-Lisp_Object tortoise_##elt; \
-EXTERNAL_ALIST_LOOP_8(elt, elt_car, elt_cdr, list, \
- len, tail, tortoise_##elt, \
- CIRCULAR_LIST_SUSPICION_LENGTH)
-
-
-#define EXTERNAL_ALIST_LOOP_8(elt, elt_car, elt_cdr, list, len, hare, \
- tortoise, suspicion_length) \
-EXTERNAL_LIST_LOOP_6(elt, list, len, hare, tortoise, suspicion_length) \
- if (CONSP (elt) ? (elt_car = XCAR (elt), elt_cdr = XCDR (elt), 0) :1) \
- continue; \
- else
-
+INLINE int TRUE_LIST_P (Lisp_Object object);
+INLINE int
+TRUE_LIST_P (Lisp_Object object)
+{
+ while (CONSP (object))
+ object = XCDR (object);
+ return NILP (object);
+}
-/* Optimized and safe macros for looping over external property lists. */
-#define EXTERNAL_PROPERTY_LIST_LOOP_3(key, value, list) \
-Lisp_Object key, value, hare_##key, tortoise_##key; \
-int len_##key; \
-EXTERNAL_PROPERTY_LIST_LOOP_7(key, value, list, len_##key, hare_##key,\
- tortoise_##key, CIRCULAR_LIST_SUSPICION_LENGTH)
-
-#define EXTERNAL_PROPERTY_LIST_LOOP_4(key, value, list, tail) \
-Lisp_Object key, value, tail, tortoise_##key; \
-int len_##key; \
-EXTERNAL_PROPERTY_LIST_LOOP_7(key, value, list, len_##key, tail, \
- tortoise_##key, CIRCULAR_LIST_SUSPICION_LENGTH)
-
-#define EXTERNAL_PROPERTY_LIST_LOOP_5(key, value, list, tail, len) \
-Lisp_Object key, value, tail, tortoise_##key; \
-int len; \
-EXTERNAL_PROPERTY_LIST_LOOP_7(key, value, list, len, tail, \
- tortoise_##key, CIRCULAR_LIST_SUSPICION_LENGTH)
-
-
-#define EXTERNAL_PROPERTY_LIST_LOOP_7(key, value, list, len, hare, \
- tortoise, suspicion_length) \
- for (tortoise = hare = list, len = 0; \
- \
- ((CONSP (hare) && \
- (key = XCAR (hare), \
- hare = XCDR (hare), \
- CONSP (hare))) ? \
- (value = XCAR (hare), 1) : \
- (NILP (hare) ? 0 : \
- (signal_malformed_property_list_error (list), 0))); \
- \
- hare = XCDR (hare), \
- ((++len < suspicion_length) ? \
- ((void) 0) : \
- (((len & 1) ? \
- ((void) (tortoise = XCDR (XCDR (tortoise)))) : \
- ((void) 0)) \
- , \
- (EQ (hare, tortoise) ? \
- ((void) signal_circular_property_list_error (list)) : \
- ((void) 0)))))
+#define CHECK_TRUE_LIST(object) do { \
+ if (!TRUE_LIST_P (object)) \
+ dead_wrong_type_argument (Qtrue_list_p, object); \
+} while (0)
/* For a property list (alternating keywords/values) that may not be
in valid list format -- will signal an error if the list is not in
valid format. CONSVAR is used to keep track of the iterations
- without modifying PLIST.
+ without modifying LISTP.
We have to be tricky to still keep the same C format.*/
-#define EXTERNAL_PROPERTY_LIST_LOOP(tail, key, value, plist) \
- for (tail = plist; \
- (CONSP (tail) && CONSP (XCDR (tail)) ? \
- (key = XCAR (tail), value = XCAR (XCDR (tail))) : \
- (key = Qunbound, value = Qunbound)), \
- !NILP (tail); \
- tail = XCDR (XCDR (tail))) \
- if (UNBOUNDP (key)) \
- Fsignal (Qmalformed_property_list, list1 (plist)); \
+#define EXTERNAL_PROPERTY_LIST_LOOP(consvar, keyword, value, listp) \
+ for (consvar = listp; \
+ (CONSP (consvar) && CONSP (XCDR (consvar)) ? \
+ (keyword = XCAR (consvar), value = XCAR (XCDR (consvar))) : \
+ (keyword = Qunbound, value = Qunbound)), \
+ !NILP (consvar); \
+ consvar = XCDR (XCDR (consvar))) \
+ if (UNBOUNDP (keyword)) \
+ signal_simple_error ("Invalid property list format", listp); \
else
-#define PROPERTY_LIST_LOOP(tail, key, value, plist) \
- for (tail = plist; \
- NILP (tail) ? 0 : \
- (key = XCAR (tail), tail = XCDR (tail), \
- value = XCAR (tail), tail = XCDR (tail), 1); \
- )
-
-/* Return 1 if LIST is properly acyclic and nil-terminated, else 0. */
-INLINE int TRUE_LIST_P (Lisp_Object object);
-INLINE int
-TRUE_LIST_P (Lisp_Object object)
-{
- Lisp_Object hare, tortoise;
- int len;
-
- for (hare = tortoise = object, len = 0;
- CONSP (hare);
- hare = XCDR (hare), len++)
- {
- if (len < CIRCULAR_LIST_SUSPICION_LENGTH)
- continue;
-
- if (len & 1)
- tortoise = XCDR (tortoise);
- else if (EQ (hare, tortoise))
- return 0;
- }
-
- return NILP (hare);
-}
-
-/* Signal an error if LIST is not properly acyclic and nil-terminated. */
-#define CHECK_TRUE_LIST(list) do { \
- Lisp_Object CTL_list = (list); \
- Lisp_Object CTL_hare, CTL_tortoise; \
- int CTL_len; \
- \
- for (CTL_hare = CTL_tortoise = CTL_list, CTL_len = 0; \
- CONSP (CTL_hare); \
- CTL_hare = XCDR (CTL_hare), CTL_len++) \
- { \
- if (CTL_len < CIRCULAR_LIST_SUSPICION_LENGTH) \
- continue; \
- \
- if (CTL_len & 1) \
- CTL_tortoise = XCDR (CTL_tortoise); \
- else if (EQ (CTL_hare, CTL_tortoise)) \
- Fsignal (Qcircular_list, list1 (CTL_list)); \
- } \
- \
- if (! NILP (CTL_hare)) \
- signal_malformed_list_error (CTL_list); \
-} while (0)
-
/*********** string ***********/
+/* In a string or vector, the sign bit of the `size' is the gc mark bit */
+
+/* (The size and data fields have underscores prepended to catch old
+ code that attempts to reference the fields directly) */
struct Lisp_String
{
+#ifdef LRECORD_STRING
struct lrecord_header lheader;
- Bytecount size;
- Bufbyte *data;
+#endif
+ Bytecount _size;
+ Bufbyte *_data;
Lisp_Object plist;
};
-typedef struct Lisp_String Lisp_String;
-DECLARE_LRECORD (string, Lisp_String);
-#define XSTRING(x) XRECORD (x, string, Lisp_String)
+#ifdef LRECORD_STRING
+
+DECLARE_LRECORD (string, struct Lisp_String);
+#define XSTRING(x) XRECORD (x, string, struct Lisp_String)
#define XSETSTRING(x, p) XSETRECORD (x, p, string)
#define STRINGP(x) RECORDP (x, string)
#define GC_STRINGP(x) GC_RECORDP (x, string)
#define CHECK_STRING(x) CHECK_RECORD (x, string)
#define CONCHECK_STRING(x) CONCHECK_RECORD (x, string)
+#else /* ! LRECORD_STRING */
+
+DECLARE_NONRECORD (string, Lisp_Type_String, struct Lisp_String);
+#define XSTRING(x) XNONRECORD (x, string, Lisp_Type_String, struct Lisp_String)
+#define XSETSTRING(x, p) XSETOBJ (x, Lisp_Type_String, p)
+#define STRINGP(x) (XTYPE (x) == Lisp_Type_String)
+#define GC_STRINGP(x) (XGCTYPE (x) == Lisp_Type_String)
+#define CHECK_STRING(x) CHECK_NONRECORD (x, Lisp_Type_String, Qstringp)
+#define CONCHECK_STRING(x) CONCHECK_NONRECORD (x, Lisp_Type_String, Qstringp)
+
+#endif /* ! LRECORD_STRING */
+
#ifdef MULE
Charcount bytecount_to_charcount (CONST Bufbyte *ptr, Bytecount len);
#endif /* not MULE */
-#define string_length(s) ((s)->size)
+#define string_length(s) ((s)->_size)
#define XSTRING_LENGTH(s) string_length (XSTRING (s))
#define XSTRING_CHAR_LENGTH(s) string_char_length (XSTRING (s))
-#define string_data(s) ((s)->data + 0)
+#define string_data(s) ((s)->_data + 0)
#define XSTRING_DATA(s) string_data (XSTRING (s))
-#define string_byte(s, i) ((s)->data[i] + 0)
+#define string_byte(s, i) ((s)->_data[i] + 0)
#define XSTRING_BYTE(s, i) string_byte (XSTRING (s), i)
-#define string_byte_addr(s, i) (&((s)->data[i]))
-#define set_string_length(s, len) ((void) ((s)->size = (len)))
-#define set_string_data(s, ptr) ((void) ((s)->data = (ptr)))
-#define set_string_byte(s, i, c) ((void) ((s)->data[i] = (c)))
+#define string_byte_addr(s, i) (&((s)->_data[i]))
+#define set_string_length(s, len) ((void) ((s)->_size = (len)))
+#define set_string_data(s, ptr) ((void) ((s)->_data = (ptr)))
+#define set_string_byte(s, i, c) ((void) ((s)->_data[i] = (c)))
-void resize_string (Lisp_String *s, Bytecount pos, Bytecount delta);
+void resize_string (struct Lisp_String *s, Bytecount pos, Bytecount delta);
#ifdef MULE
-INLINE Charcount string_char_length (Lisp_String *s);
+INLINE Charcount string_char_length (struct Lisp_String *s);
INLINE Charcount
-string_char_length (Lisp_String *s)
+string_char_length (struct Lisp_String *s)
{
return bytecount_to_charcount (string_data (s), string_length (s));
}
# define string_char(s, i) charptr_emchar_n (string_data (s), i)
# define string_char_addr(s, i) charptr_n_addr (string_data (s), i)
-void set_string_char (Lisp_String *s, Charcount i, Emchar c);
+void set_string_char (struct Lisp_String *s, Charcount i, Emchar c);
#else /* not MULE */
struct Lisp_Vector
{
+#ifdef LRECORD_VECTOR
struct lcrecord_header header;
+#endif
long size;
/* next is now chained through v->contents[size], terminated by Qzero.
This means that pure vectors don't need a "next" */
/* struct Lisp_Vector *next; */
Lisp_Object contents[1];
};
-typedef struct Lisp_Vector Lisp_Vector;
-DECLARE_LRECORD (vector, Lisp_Vector);
-#define XVECTOR(x) XRECORD (x, vector, Lisp_Vector)
+#ifdef LRECORD_VECTOR
+
+DECLARE_LRECORD (vector, struct Lisp_Vector);
+#define XVECTOR(x) XRECORD (x, vector, struct Lisp_Vector)
#define XSETVECTOR(x, p) XSETRECORD (x, p, vector)
#define VECTORP(x) RECORDP (x, vector)
#define GC_VECTORP(x) GC_RECORDP (x, vector)
#define CHECK_VECTOR(x) CHECK_RECORD (x, vector)
#define CONCHECK_VECTOR(x) CONCHECK_RECORD (x, vector)
+#else
+
+DECLARE_NONRECORD (vector, Lisp_Type_Vector, struct Lisp_Vector);
+#define XVECTOR(x) XNONRECORD (x, vector, Lisp_Type_Vector, struct Lisp_Vector)
+#define XSETVECTOR(x, p) XSETOBJ (x, Lisp_Type_Vector, p)
+#define VECTORP(x) (XTYPE (x) == Lisp_Type_Vector)
+#define GC_VECTORP(x) (XGCTYPE (x) == Lisp_Type_Vector)
+#define CHECK_VECTOR(x) CHECK_NONRECORD (x, Lisp_Type_Vector, Qvectorp)
+#define CONCHECK_VECTOR(x) CONCHECK_NONRECORD (x, Lisp_Type_Vector, Qvectorp)
+
+#endif
+
#define vector_length(v) ((v)->size)
#define XVECTOR_LENGTH(s) vector_length (XVECTOR (s))
#define vector_data(v) ((v)->contents)
#define XVECTOR_DATA(s) vector_data (XVECTOR (s))
+#ifndef LRECORD_VECTOR
+# define vector_next(v) ((v)->contents[(v)->size])
+#endif
/*********** bit vector ***********/
{
struct lrecord_header lheader;
Lisp_Object next;
- size_t size;
- unsigned long bits[1];
+ long size;
+ unsigned int bits[1];
};
-typedef struct Lisp_Bit_Vector Lisp_Bit_Vector;
-DECLARE_LRECORD (bit_vector, Lisp_Bit_Vector);
-#define XBIT_VECTOR(x) XRECORD (x, bit_vector, Lisp_Bit_Vector)
+DECLARE_LRECORD (bit_vector, struct Lisp_Bit_Vector);
+#define XBIT_VECTOR(x) XRECORD (x, bit_vector, struct Lisp_Bit_Vector)
#define XSETBIT_VECTOR(x, p) XSETRECORD (x, p, bit_vector)
#define BIT_VECTORP(x) RECORDP (x, bit_vector)
#define GC_BIT_VECTORP(x) GC_RECORDP (x, bit_vector)
#define bit_vector_length(v) ((v)->size)
#define bit_vector_next(v) ((v)->next)
-INLINE int bit_vector_bit (Lisp_Bit_Vector *v, int i);
+INLINE int bit_vector_bit (struct Lisp_Bit_Vector *v, int i);
INLINE int
-bit_vector_bit (Lisp_Bit_Vector *v, int i)
+bit_vector_bit (struct Lisp_Bit_Vector *v, int i)
{
unsigned int ui = (unsigned int) i;
& 1);
}
-INLINE void set_bit_vector_bit (Lisp_Bit_Vector *v, int i, int value);
+INLINE void set_bit_vector_bit (struct Lisp_Bit_Vector *v, int i, int value);
INLINE void
-set_bit_vector_bit (Lisp_Bit_Vector *v, int i, int value)
+set_bit_vector_bit (struct Lisp_Bit_Vector *v, int i, int value)
{
unsigned int ui = (unsigned int) i;
if (value)
- (v)->bits[ui >> LONGBITS_LOG2] |= (1UL << (ui & (LONGBITS_POWER_OF_2 - 1)));
+ (v)->bits[ui >> LONGBITS_LOG2] |= (1 << (ui & (LONGBITS_POWER_OF_2 - 1)));
else
- (v)->bits[ui >> LONGBITS_LOG2] &= ~(1UL << (ui & (LONGBITS_POWER_OF_2 - 1)));
+ (v)->bits[ui >> LONGBITS_LOG2] &= ~(1 << (ui & (LONGBITS_POWER_OF_2 - 1)));
}
/* Number of longs required to hold LEN bits */
/*********** symbol ***********/
+/* In a symbol, the markbit of the plist is used as the gc mark bit */
+
struct Lisp_Symbol
{
+#ifdef LRECORD_SYMBOL
struct lrecord_header lheader;
+#endif
/* next symbol in this obarray bucket */
struct Lisp_Symbol *next;
struct Lisp_String *name;
Lisp_Object value;
Lisp_Object function;
+ /* non-nil if the symbol is interned in Vobarray */
+ Lisp_Object obarray;
Lisp_Object plist;
};
-typedef struct Lisp_Symbol Lisp_Symbol;
-#define SYMBOL_IS_KEYWORD(sym) \
- ((string_byte (symbol_name (XSYMBOL (sym)), 0) == ':') \
- && EQ (sym, oblookup (Vobarray, \
- string_data (symbol_name (XSYMBOL (sym))), \
- string_length (symbol_name (XSYMBOL (sym))))))
+#define SYMBOL_IS_KEYWORD(sym) (string_byte (XSYMBOL(sym)->name, 0) == ':')
#define KEYWORDP(obj) (SYMBOLP (obj) && SYMBOL_IS_KEYWORD (obj))
-DECLARE_LRECORD (symbol, Lisp_Symbol);
-#define XSYMBOL(x) XRECORD (x, symbol, Lisp_Symbol)
+#ifdef LRECORD_SYMBOL
+
+DECLARE_LRECORD (symbol, struct Lisp_Symbol);
+#define XSYMBOL(x) XRECORD (x, symbol, struct Lisp_Symbol)
#define XSETSYMBOL(x, p) XSETRECORD (x, p, symbol)
#define SYMBOLP(x) RECORDP (x, symbol)
#define GC_SYMBOLP(x) GC_RECORDP (x, symbol)
#define CHECK_SYMBOL(x) CHECK_RECORD (x, symbol)
#define CONCHECK_SYMBOL(x) CONCHECK_RECORD (x, symbol)
+#else
+
+DECLARE_NONRECORD (symbol, Lisp_Type_Symbol, struct Lisp_Symbol);
+#define XSYMBOL(x) XNONRECORD (x, symbol, Lisp_Type_Symbol, struct Lisp_Symbol)
+#define XSETSYMBOL(s, p) XSETOBJ ((s), Lisp_Type_Symbol, (p))
+#define SYMBOLP(x) (XTYPE (x) == Lisp_Type_Symbol)
+#define GC_SYMBOLP(x) (XGCTYPE (x) == Lisp_Type_Symbol)
+#define CHECK_SYMBOL(x) CHECK_NONRECORD (x, Lisp_Type_Symbol, Qsymbolp)
+#define CONCHECK_SYMBOL(x) CONCHECK_NONRECORD (x, Lisp_Type_Symbol, Qsymbolp)
+
+#endif
+
#define symbol_next(s) ((s)->next)
#define symbol_name(s) ((s)->name)
#define symbol_value(s) ((s)->value)
CONST char *name;
lisp_fn_t subr_fn;
};
-typedef struct Lisp_Subr Lisp_Subr;
-DECLARE_LRECORD (subr, Lisp_Subr);
-#define XSUBR(x) XRECORD (x, subr, Lisp_Subr)
+DECLARE_LRECORD (subr, struct Lisp_Subr);
+#define XSUBR(x) XRECORD (x, subr, struct Lisp_Subr)
#define XSETSUBR(x, p) XSETRECORD (x, p, subr)
#define SUBRP(x) RECORDP (x, subr)
#define GC_SUBRP(x) GC_RECORDP (x, subr)
Memind memind;
char insertion_type;
};
-typedef struct Lisp_Marker Lisp_Marker;
-DECLARE_LRECORD (marker, Lisp_Marker);
-#define XMARKER(x) XRECORD (x, marker, Lisp_Marker)
+DECLARE_LRECORD (marker, struct Lisp_Marker);
+#define XMARKER(x) XRECORD (x, marker, struct Lisp_Marker)
#define XSETMARKER(x, p) XSETRECORD (x, p, marker)
#define MARKERP(x) RECORDP (x, marker)
#define GC_MARKERP(x) GC_RECORDP (x, marker)
#ifdef LISP_FLOAT_TYPE
-/* Note: the 'unused_next_' field exists only to ensure that the
+/* Note: the 'unused__next__' field exists only to ensure that the
`next' pointer fits within the structure, for the purposes of the
free list. This makes a difference in the unlikely case of
sizeof(double) being smaller than sizeof(void *). */
struct Lisp_Float
{
struct lrecord_header lheader;
- union { double d; struct Lisp_Float *unused_next_; } data;
+ union { double d; struct Lisp_Float *unused__next__; } data;
};
-typedef struct Lisp_Float Lisp_Float;
-DECLARE_LRECORD (float, Lisp_Float);
-#define XFLOAT(x) XRECORD (x, float, Lisp_Float)
+DECLARE_LRECORD (float, struct Lisp_Float);
+#define XFLOAT(x) XRECORD (x, float, struct Lisp_Float)
#define XSETFLOAT(x, p) XSETRECORD (x, p, float)
#define FLOATP(x) RECORDP (x, float)
#define GC_FLOATP(x) GC_RECORDP (x, float)
#define CONCHECK_FLOAT(x) CONCHECK_RECORD (x, float)
#define float_data(f) ((f)->data.d)
-#define XFLOAT_DATA(x) float_data (XFLOAT (x))
#define XFLOATINT(n) extract_float (n)
x = wrong_type_argument (Qnumberp, x); \
} while (0)
+/* These are always continuable because they change their arguments
+ even when no error is signalled. */
+
+#define CHECK_INT_OR_FLOAT_COERCE_MARKER(x) do { \
+ if (INT_OR_FLOATP (x)) \
+ ; \
+ else if (MARKERP (x)) \
+ x = make_int (marker_position (x)); \
+ else \
+ x = wrong_type_argument (Qnumber_or_marker_p, x); \
+} while (0)
+
+#define CHECK_INT_OR_FLOAT_COERCE_CHAR_OR_MARKER(x) do { \
+ if (INT_OR_FLOATP (x)) \
+ ; \
+ else if (CHARP (x)) \
+ x = make_int (XCHAR (x)); \
+ else if (MARKERP (x)) \
+ x = make_int (marker_position (x)); \
+ else \
+ x = wrong_type_argument (Qnumber_char_or_marker_p, x); \
+} while (0)
+
# define INT_OR_FLOATP(x) (INTP (x) || FLOATP (x))
# define GC_INT_OR_FLOATP(x) (GC_INTP (x) || GC_FLOATP (x))
#define XFLOATINT(n) XINT(n)
#define CHECK_INT_OR_FLOAT CHECK_INT
#define CONCHECK_INT_OR_FLOAT CONCHECK_INT
+#define CHECK_INT_OR_FLOAT_COERCE_MARKER CHECK_INT_COERCE_MARKER
+#define CHECK_INT_OR_FLOAT_COERCE_CHAR_OR_MARKER \
+ CHECK_INT_COERCE_CHAR_OR_MARKER
#define INT_OR_FLOATP(x) (INTP (x))
# define GC_INT_OR_FLOATP(x) (GC_INTP (x))
x = wrong_type_argument (Qinteger_char_or_marker_p, x); \
} while (0)
+/*********** pure space ***********/
-/*********** readonly objects ***********/
-
-#define CHECK_C_WRITEABLE(obj) \
- do { if (c_readonly (obj)) c_write_error (obj); } while (0)
-
-#define CHECK_LISP_WRITEABLE(obj) \
- do { if (lisp_readonly (obj)) lisp_write_error (obj); } while (0)
-
-#define C_READONLY(obj) (C_READONLY_RECORD_HEADER_P(XRECORD_LHEADER (obj)))
-#define LISP_READONLY(obj) (LISP_READONLY_RECORD_HEADER_P(XRECORD_LHEADER (obj)))
+#define CHECK_IMPURE(obj) \
+ do { if (purified (obj)) pure_write_error (obj); } while (0)
/*********** structures ***********/
\f
/************************************************************************/
-/* Definitions of primitive Lisp functions and variables */
+/* Definitions of primitive Lisp functions and variables */
/************************************************************************/
valid in a C identifier, with an "F" prepended.
The name of the C constant structure that records information
on this function for internal use is "S" concatenated with Fname.
- `min_args' should be a number, the minimum number of arguments allowed.
- `max_args' should be a number, the maximum number of arguments allowed,
+ `minargs' should be a number, the minimum number of arguments allowed.
+ `maxargs' should be a number, the maximum number of arguments allowed,
or else MANY or UNEVALLED.
MANY means pass a vector of evaluated arguments,
in the form of an integer number-of-arguments
Lisp_Object,Lisp_Object,Lisp_Object
#define EXFUN_MANY int, Lisp_Object*
#define EXFUN_UNEVALLED Lisp_Object
-#define EXFUN(sym, max_args) Lisp_Object sym (EXFUN_##max_args)
+#define EXFUN(sym, maxargs) Lisp_Object sym (EXFUN_##maxargs)
#define SUBR_MAX_ARGS 8
#define MANY -2
/* Can't be const, because then subr->doc is read-only and
Snarf_documentation chokes */
-#define subr_lheader_initializer { 0, 0, 0, 0 }
+#ifdef USE_INDEXED_LRECORD_IMPLEMENTATION
+# define subr_lheader_initializer { 0, 0, 0 }
+#else
+# define subr_lheader_initializer { lrecord_subr }
+#endif
-#define DEFUN(lname, Fname, min_args, max_args, prompt, arglist) \
- Lisp_Object Fname (EXFUN_##max_args); \
+#define DEFUN(lname, Fname, minargs, maxargs, prompt, arglist) \
+ Lisp_Object Fname (EXFUN_##maxargs); \
static struct Lisp_Subr S##Fname = { subr_lheader_initializer, \
- min_args, max_args, prompt, 0, lname, (lisp_fn_t) Fname }; \
- Lisp_Object Fname (DEFUN_##max_args arglist)
+ minargs, maxargs, prompt, 0, lname, (lisp_fn_t) Fname }; \
+ Lisp_Object Fname (DEFUN_##maxargs arglist)
/* Heavy ANSI C preprocessor hackery to get DEFUN to declare a
- prototype that matches max_args, and add the obligatory
+ prototype that matches maxargs, and add the obligatory
`Lisp_Object' type declaration to the formal C arguments. */
#define DEFUN_MANY(named_int, named_Lisp_Object) named_int, named_Lisp_Object
#define DEFUN_7(a,b,c,d,e,f,g) DEFUN_6(a,b,c,d,e,f), Lisp_Object g
#define DEFUN_8(a,b,c,d,e,f,g,h) DEFUN_7(a,b,c,d,e,f,g),Lisp_Object h
-/* WARNING: If you add defines here for higher values of max_args,
- make sure to also fix the clauses in PRIMITIVE_FUNCALL(),
+/* WARNING: If you add defines here for higher values of maxargs,
+ make sure to also fix the clauses in inline_funcall_fn(),
and change the define of SUBR_MAX_ARGS above. */
#include "symeval.h"
-/* `specpdl' is the special binding/unwind-protect stack.
-
- Knuth says (see the Jargon File):
- At MIT, `pdl' [abbreviation for `Push Down List'] used to
- be a more common synonym for `stack'.
- Everywhere else `stack' seems to be the preferred term.
-
- specpdl_depth is the current depth of `specpdl'.
- Save this for use later as arg to `unbind_to'. */
-extern int specpdl_depth_counter;
-#define specpdl_depth() specpdl_depth_counter
+/* Depth of special binding/unwind-protect stack. Use as arg to `unbind_to' */
+int specpdl_depth (void);
\f
/************************************************************************/
-/* Checking for QUIT */
+/* Checking for QUIT */
/************************************************************************/
/* Asynchronous events set something_happened, and then are processed
\f
/************************************************************************/
-/* hashing */
+/* hashing */
/************************************************************************/
/* #### for a 64-bit machine, we should substitute a prime just over 2^32 */
#define HASH8(a,b,c,d,e,f,g,h) (GOOD_HASH * HASH7 (a,b,c,d,e,f,g) + (h))
#define HASH9(a,b,c,d,e,f,g,h,i) (GOOD_HASH * HASH8 (a,b,c,d,e,f,g,h) + (i))
+/* Enough already! */
+
#define LISP_HASH(obj) ((unsigned long) LISP_TO_VOID (obj))
unsigned long string_hash (CONST void *xv);
unsigned long memory_hash (CONST void *xv, size_t size);
\f
/************************************************************************/
-/* String translation */
+/* String translation */
/************************************************************************/
#ifdef I18N3
\f
/************************************************************************/
-/* Garbage collection / GC-protection */
+/* Garbage collection / GC-protection */
/************************************************************************/
/* number of bytes of structure consed since last GC */
#define NNGCPRO5(v1,v2,v3,v4,v5) \
debug_gcpro5 (__FILE__, __LINE__,&nngcpro1,&nngcpro2,&nngcpro3,&nngcpro4,\
&nngcpro5,&v1,&v2,&v3,&v4,&v5)
-#define NNUNGCPRO \
+#define NUNNGCPRO \
debug_ungcpro(__FILE__, __LINE__,&nngcpro1)
#else /* ! DEBUG_GCPRO */
-#define GCPRO1(var1) ((void) ( \
- gcpro1.next = gcprolist, gcpro1.var = &var1, gcpro1.nvars = 1, \
- gcprolist = &gcpro1 ))
-
-#define GCPRO2(var1, var2) ((void) ( \
- gcpro1.next = gcprolist, gcpro1.var = &var1, gcpro1.nvars = 1, \
- gcpro2.next = &gcpro1, gcpro2.var = &var2, gcpro2.nvars = 1, \
- gcprolist = &gcpro2 ))
-
-#define GCPRO3(var1, var2, var3) ((void) ( \
- gcpro1.next = gcprolist, gcpro1.var = &var1, gcpro1.nvars = 1, \
- gcpro2.next = &gcpro1, gcpro2.var = &var2, gcpro2.nvars = 1, \
- gcpro3.next = &gcpro2, gcpro3.var = &var3, gcpro3.nvars = 1, \
- gcprolist = &gcpro3 ))
-
-#define GCPRO4(var1, var2, var3, var4) ((void) ( \
- gcpro1.next = gcprolist, gcpro1.var = &var1, gcpro1.nvars = 1, \
- gcpro2.next = &gcpro1, gcpro2.var = &var2, gcpro2.nvars = 1, \
- gcpro3.next = &gcpro2, gcpro3.var = &var3, gcpro3.nvars = 1, \
- gcpro4.next = &gcpro3, gcpro4.var = &var4, gcpro4.nvars = 1, \
- gcprolist = &gcpro4 ))
-
-#define GCPRO5(var1, var2, var3, var4, var5) \
- ((void) ( \
- gcpro1.next = gcprolist, gcpro1.var = &var1, gcpro1.nvars = 1, \
- gcpro2.next = &gcpro1, gcpro2.var = &var2, gcpro2.nvars = 1, \
- gcpro3.next = &gcpro2, gcpro3.var = &var3, gcpro3.nvars = 1, \
- gcpro4.next = &gcpro3, gcpro4.var = &var4, gcpro4.nvars = 1, \
- gcpro5.next = &gcpro4, gcpro5.var = &var5, gcpro5.nvars = 1, \
- gcprolist = &gcpro5 ))
-
-#define UNGCPRO ((void) (gcprolist = gcpro1.next))
-
-#define NGCPRO1(var1) ((void) ( \
- ngcpro1.next = gcprolist, ngcpro1.var = &var1, ngcpro1.nvars = 1, \
- gcprolist = &ngcpro1 ))
-
-#define NGCPRO2(var1, var2) ((void) ( \
- ngcpro1.next = gcprolist, ngcpro1.var = &var1, ngcpro1.nvars = 1, \
- ngcpro2.next = &ngcpro1, ngcpro2.var = &var2, ngcpro2.nvars = 1, \
- gcprolist = &ngcpro2 ))
-
-#define NGCPRO3(var1, var2, var3) ((void) ( \
- ngcpro1.next = gcprolist, ngcpro1.var = &var1, ngcpro1.nvars = 1, \
- ngcpro2.next = &ngcpro1, ngcpro2.var = &var2, ngcpro2.nvars = 1, \
- ngcpro3.next = &ngcpro2, ngcpro3.var = &var3, ngcpro3.nvars = 1, \
- gcprolist = &ngcpro3 ))
-
-#define NGCPRO4(var1, var2, var3, var4) ((void) ( \
- ngcpro1.next = gcprolist, ngcpro1.var = &var1, ngcpro1.nvars = 1, \
- ngcpro2.next = &ngcpro1, ngcpro2.var = &var2, ngcpro2.nvars = 1, \
- ngcpro3.next = &ngcpro2, ngcpro3.var = &var3, ngcpro3.nvars = 1, \
- ngcpro4.next = &ngcpro3, ngcpro4.var = &var4, ngcpro4.nvars = 1, \
- gcprolist = &ngcpro4 ))
-
-#define NGCPRO5(var1, var2, var3, var4, var5) \
- ((void) ( \
- ngcpro1.next = gcprolist, ngcpro1.var = &var1, ngcpro1.nvars = 1, \
- ngcpro2.next = &ngcpro1, ngcpro2.var = &var2, ngcpro2.nvars = 1, \
- ngcpro3.next = &ngcpro2, ngcpro3.var = &var3, ngcpro3.nvars = 1, \
- ngcpro4.next = &ngcpro3, ngcpro4.var = &var4, ngcpro4.nvars = 1, \
- ngcpro5.next = &ngcpro4, ngcpro5.var = &var5, ngcpro5.nvars = 1, \
- gcprolist = &ngcpro5 ))
-
-#define NUNGCPRO ((void) (gcprolist = ngcpro1.next))
-
-#define NNGCPRO1(var1) ((void) ( \
- nngcpro1.next = gcprolist, nngcpro1.var = &var1, nngcpro1.nvars = 1, \
- gcprolist = &nngcpro1 ))
-
-#define NNGCPRO2(var1, var2) ((void) ( \
- nngcpro1.next = gcprolist, nngcpro1.var = &var1, nngcpro1.nvars = 1, \
- nngcpro2.next = &nngcpro1, nngcpro2.var = &var2, nngcpro2.nvars = 1, \
- gcprolist = &nngcpro2 ))
-
-#define NNGCPRO3(var1, var2, var3) ((void) ( \
- nngcpro1.next = gcprolist, nngcpro1.var = &var1, nngcpro1.nvars = 1, \
- nngcpro2.next = &nngcpro1, nngcpro2.var = &var2, nngcpro2.nvars = 1, \
- nngcpro3.next = &nngcpro2, nngcpro3.var = &var3, nngcpro3.nvars = 1, \
- gcprolist = &nngcpro3 ))
-
-#define NNGCPRO4(var1, var2, var3, var4) ((void) ( \
- nngcpro1.next = gcprolist, nngcpro1.var = &var1, nngcpro1.nvars = 1, \
- nngcpro2.next = &nngcpro1, nngcpro2.var = &var2, nngcpro2.nvars = 1, \
- nngcpro3.next = &nngcpro2, nngcpro3.var = &var3, nngcpro3.nvars = 1, \
- nngcpro4.next = &nngcpro3, nngcpro4.var = &var4, nngcpro4.nvars = 1, \
- gcprolist = &nngcpro4 ))
-
-#define NNGCPRO5(var1, var2, var3, var4, var5) \
- ((void) ( \
- nngcpro1.next = gcprolist, nngcpro1.var = &var1, nngcpro1.nvars = 1, \
- nngcpro2.next = &nngcpro1, nngcpro2.var = &var2, nngcpro2.nvars = 1, \
- nngcpro3.next = &nngcpro2, nngcpro3.var = &var3, nngcpro3.nvars = 1, \
- nngcpro4.next = &nngcpro3, nngcpro4.var = &var4, nngcpro4.nvars = 1, \
- nngcpro5.next = &nngcpro4, nngcpro5.var = &var5, nngcpro5.nvars = 1, \
- gcprolist = &nngcpro5 ))
-
-#define NNUNGCPRO ((void) (gcprolist = nngcpro1.next))
+#define GCPRO1(varname) \
+ {gcpro1.next = gcprolist; gcpro1.var = &varname; gcpro1.nvars = 1; \
+ gcprolist = &gcpro1; }
+
+#define GCPRO2(varname1, varname2) \
+ {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
+ gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
+ gcprolist = &gcpro2; }
+
+#define GCPRO3(varname1, varname2, varname3) \
+ {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
+ gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
+ gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
+ gcprolist = &gcpro3; }
+
+#define GCPRO4(varname1, varname2, varname3, varname4) \
+ {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
+ gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
+ gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
+ gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \
+ gcprolist = &gcpro4; }
+
+#define GCPRO5(varname1, varname2, varname3, varname4, varname5) \
+ {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
+ gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
+ gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
+ gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \
+ gcpro5.next = &gcpro4; gcpro5.var = &varname5; gcpro5.nvars = 1; \
+ gcprolist = &gcpro5; }
+
+#define UNGCPRO (gcprolist = gcpro1.next)
+
+#define NGCPRO1(varname) \
+ {ngcpro1.next = gcprolist; ngcpro1.var = &varname; ngcpro1.nvars = 1; \
+ gcprolist = &ngcpro1; }
+
+#define NGCPRO2(varname1, varname2) \
+ {ngcpro1.next = gcprolist; ngcpro1.var = &varname1; ngcpro1.nvars = 1; \
+ ngcpro2.next = &ngcpro1; ngcpro2.var = &varname2; ngcpro2.nvars = 1; \
+ gcprolist = &ngcpro2; }
+
+#define NGCPRO3(varname1, varname2, varname3) \
+ {ngcpro1.next = gcprolist; ngcpro1.var = &varname1; ngcpro1.nvars = 1; \
+ ngcpro2.next = &ngcpro1; ngcpro2.var = &varname2; ngcpro2.nvars = 1; \
+ ngcpro3.next = &ngcpro2; ngcpro3.var = &varname3; ngcpro3.nvars = 1; \
+ gcprolist = &ngcpro3; }
+
+#define NGCPRO4(varname1, varname2, varname3, varname4) \
+ {ngcpro1.next = gcprolist; ngcpro1.var = &varname1; ngcpro1.nvars = 1; \
+ ngcpro2.next = &ngcpro1; ngcpro2.var = &varname2; ngcpro2.nvars = 1; \
+ ngcpro3.next = &ngcpro2; ngcpro3.var = &varname3; ngcpro3.nvars = 1; \
+ ngcpro4.next = &ngcpro3; ngcpro4.var = &varname4; ngcpro4.nvars = 1; \
+ gcprolist = &ngcpro4; }
+
+#define NGCPRO5(varname1, varname2, varname3, varname4, varname5) \
+ {ngcpro1.next = gcprolist; ngcpro1.var = &varname1; ngcpro1.nvars = 1; \
+ ngcpro2.next = &ngcpro1; ngcpro2.var = &varname2; ngcpro2.nvars = 1; \
+ ngcpro3.next = &ngcpro2; ngcpro3.var = &varname3; ngcpro3.nvars = 1; \
+ ngcpro4.next = &ngcpro3; ngcpro4.var = &varname4; ngcpro4.nvars = 1; \
+ ngcpro5.next = &ngcpro4; ngcpro5.var = &varname5; ngcpro5.nvars = 1; \
+ gcprolist = &ngcpro5; }
+
+#define NUNGCPRO (gcprolist = ngcpro1.next)
+
+#define NNGCPRO1(varname) \
+ {nngcpro1.next = gcprolist; nngcpro1.var = &varname; nngcpro1.nvars = 1; \
+ gcprolist = &nngcpro1; }
+
+#define NNGCPRO2(varname1, varname2) \
+ {nngcpro1.next = gcprolist; nngcpro1.var = &varname1; nngcpro1.nvars = 1; \
+ nngcpro2.next = &nngcpro1; nngcpro2.var = &varname2; nngcpro2.nvars = 1; \
+ gcprolist = &nngcpro2; }
+
+#define NNGCPRO3(varname1, varname2, varname3) \
+ {nngcpro1.next = gcprolist; nngcpro1.var = &varname1; nngcpro1.nvars = 1; \
+ nngcpro2.next = &nngcpro1; nngcpro2.var = &varname2; nngcpro2.nvars = 1; \
+ nngcpro3.next = &nngcpro2; nngcpro3.var = &varname3; nngcpro3.nvars = 1; \
+ gcprolist = &nngcpro3; }
+
+#define NNGCPRO4(varname1, varname2, varname3, varname4) \
+ {nngcpro1.next = gcprolist; nngcpro1.var = &varname1; nngcpro1.nvars = 1; \
+ nngcpro2.next = &nngcpro1; nngcpro2.var = &varname2; nngcpro2.nvars = 1; \
+ nngcpro3.next = &nngcpro2; nngcpro3.var = &varname3; nngcpro3.nvars = 1; \
+ nngcpro4.next = &nngcpro3; nngcpro4.var = &varname4; nngcpro4.nvars = 1; \
+ gcprolist = &nngcpro4; }
+
+#define NNGCPRO5(varname1, varname2, varname3, varname4, varname5) \
+ {nngcpro1.next = gcprolist; nngcpro1.var = &varname1; nngcpro1.nvars = 1; \
+ nngcpro2.next = &nngcpro1; nngcpro2.var = &varname2; nngcpro2.nvars = 1; \
+ nngcpro3.next = &nngcpro2; nngcpro3.var = &varname3; nngcpro3.nvars = 1; \
+ nngcpro4.next = &nngcpro3; nngcpro4.var = &varname4; nngcpro4.nvars = 1; \
+ nngcpro5.next = &nngcpro4; nngcpro5.var = &varname5; nngcpro5.nvars = 1; \
+ gcprolist = &nngcpro5; }
+
+#define NNUNGCPRO (gcprolist = nngcpro1.next)
#endif /* ! DEBUG_GCPRO */
/* "end-of-loop code not reached" */
/* "statement not reached */
#ifdef __SUNPRO_C
-#define RETURN_SANS_WARNINGS if (1) return
+#define RETURN__ if (1) return
#define RETURN_NOT_REACHED(value)
#else
-#define RETURN_SANS_WARNINGS return
+#define RETURN__ return
#define RETURN_NOT_REACHED(value) return value;
#endif
{ \
Lisp_Object ret_ungc_val = (expr); \
UNGCPRO; \
- RETURN_SANS_WARNINGS ret_ungc_val; \
+ RETURN__ ret_ungc_val; \
} while (0)
/* Evaluate expr, NUNGCPRO, UNGCPRO, and then return the value of expr. */
Lisp_Object ret_ungc_val = (expr); \
NUNGCPRO; \
UNGCPRO; \
- RETURN_SANS_WARNINGS ret_ungc_val; \
+ RETURN__ ret_ungc_val; \
} while (0)
/* Evaluate expr, NNUNGCPRO, NUNGCPRO, UNGCPRO, and then return the
NNUNGCPRO; \
NUNGCPRO; \
UNGCPRO; \
- RETURN_SANS_WARNINGS ret_ungc_val; \
+ RETURN__ ret_ungc_val; \
} while (0)
/* Evaluate expr, return it if it's not Qunbound. */
{ \
Lisp_Object ret_nunb_val = (expr); \
if (!UNBOUNDP (ret_nunb_val)) \
- RETURN_SANS_WARNINGS ret_nunb_val; \
+ RETURN__ ret_nunb_val; \
} while (0)
/* Call staticpro (&var) to protect static variable `var'. */
#define DIRECTORY_SEP '/'
#endif
#ifndef IS_DIRECTORY_SEP
-#define IS_DIRECTORY_SEP(c) ((c) == DIRECTORY_SEP)
+#define IS_DIRECTORY_SEP(_c_) ((_c_) == DIRECTORY_SEP)
#endif
#ifndef IS_DEVICE_SEP
#ifndef DEVICE_SEP
-#define IS_DEVICE_SEP(c) 0
+#define IS_DEVICE_SEP(_c_) 0
#else
-#define IS_DEVICE_SEP(c) ((c) == DEVICE_SEP)
+#define IS_DEVICE_SEP(_c_) ((_c_) == DEVICE_SEP)
#endif
#endif
#ifndef IS_ANY_SEP
-#define IS_ANY_SEP(c) (IS_DIRECTORY_SEP (c))
+#define IS_ANY_SEP(_c_) (IS_DIRECTORY_SEP (_c_))
#endif
#ifdef HAVE_INTTYPES_H
/* Defined in alloc.c */
void release_breathing_space (void);
Lisp_Object noseeum_cons (Lisp_Object, Lisp_Object);
-Lisp_Object make_vector (size_t, Lisp_Object);
+Lisp_Object make_vector (EMACS_INT, Lisp_Object);
Lisp_Object vector1 (Lisp_Object);
Lisp_Object vector2 (Lisp_Object, Lisp_Object);
Lisp_Object vector3 (Lisp_Object, Lisp_Object, Lisp_Object);
-Lisp_Object make_bit_vector (size_t, Lisp_Object);
-Lisp_Object make_bit_vector_from_byte_vector (unsigned char *, size_t);
+Lisp_Object make_bit_vector (EMACS_INT, Lisp_Object);
+Lisp_Object make_bit_vector_from_byte_vector (unsigned char *, EMACS_INT);
Lisp_Object noseeum_make_marker (void);
void garbage_collect_1 (void);
Lisp_Object acons (Lisp_Object, Lisp_Object, Lisp_Object);
extern int gc_currently_forbidden;
Lisp_Object restore_gc_inhibit (Lisp_Object);
extern EMACS_INT gc_generation_number[1];
-int c_readonly (Lisp_Object);
-int lisp_readonly (Lisp_Object);
+int purified (Lisp_Object);
Lisp_Object build_string (CONST char *);
Lisp_Object build_ext_string (CONST char *, enum external_data_format);
Lisp_Object build_translated_string (CONST char *);
enum external_data_format);
Lisp_Object make_uninit_string (Bytecount);
Lisp_Object make_float (double);
-Lisp_Object make_string_nocopy (CONST Bufbyte *, Bytecount);
-void free_cons (Lisp_Cons *);
+size_t purespace_usage (void);
+void report_pure_usage (int, int);
+Lisp_Object make_pure_string (CONST Bufbyte *, Bytecount, Lisp_Object, int);
+Lisp_Object make_pure_pname (CONST Bufbyte *, Bytecount, int);
+Lisp_Object pure_cons (Lisp_Object, Lisp_Object);
+Lisp_Object pure_list (int, Lisp_Object *);
+Lisp_Object make_pure_vector (size_t, Lisp_Object);
+void free_cons (struct Lisp_Cons *);
void free_list (Lisp_Object);
void free_alist (Lisp_Object);
void mark_conses_in_list (Lisp_Object);
-void free_marker (Lisp_Marker *);
+void free_marker (struct Lisp_Marker *);
int object_dead_p (Lisp_Object);
#ifdef MEMORY_USAGE_STATS
void stuff_buffered_input (Lisp_Object);
/* Defined in data.c */
-DECLARE_DOESNT_RETURN (c_write_error (Lisp_Object));
-DECLARE_DOESNT_RETURN (lisp_write_error (Lisp_Object));
+DECLARE_DOESNT_RETURN (pure_write_error (Lisp_Object));
DECLARE_DOESNT_RETURN (args_out_of_range (Lisp_Object, Lisp_Object));
DECLARE_DOESNT_RETURN (args_out_of_range_3 (Lisp_Object, Lisp_Object,
Lisp_Object));
Bytind bytind_clip_to_bounds (Bytind, Bytind, Bytind);
void buffer_insert1 (struct buffer *, Lisp_Object);
Lisp_Object make_string_from_buffer (struct buffer *, int, int);
-Lisp_Object make_string_from_buffer_no_extents (struct buffer *, int, int);
Lisp_Object save_excursion_save (void);
Lisp_Object save_restriction_save (void);
Lisp_Object save_excursion_restore (Lisp_Object);
Lisp_Object save_current_buffer_restore (Lisp_Object);
/* Defined in emacs.c */
-DECLARE_DOESNT_RETURN_GCC_ATTRIBUTE_SYNTAX_SUCKS (fatal (CONST char *,
+DECLARE_DOESNT_RETURN_GCC__ATTRIBUTE__SYNTAX_SUCKS (fatal (CONST char *,
...), 1, 2);
int stderr_out (CONST char *, ...) PRINTF_ARGS (1, 2);
int stdout_out (CONST char *, ...) PRINTF_ARGS (1, 2);
void maybe_signal_error (Lisp_Object, Lisp_Object, Lisp_Object, Error_behavior);
Lisp_Object maybe_signal_continuable_error (Lisp_Object, Lisp_Object,
Lisp_Object, Error_behavior);
-DECLARE_DOESNT_RETURN_GCC_ATTRIBUTE_SYNTAX_SUCKS (error (CONST char *,
+DECLARE_DOESNT_RETURN_GCC__ATTRIBUTE__SYNTAX_SUCKS (error (CONST char *,
...), 1, 2);
void maybe_error (Lisp_Object, Error_behavior, CONST char *,
...) PRINTF_ARGS (3, 4);
Lisp_Object signal_simple_continuable_error (CONST char *, Lisp_Object);
Lisp_Object maybe_signal_simple_continuable_error (CONST char *, Lisp_Object,
Lisp_Object, Error_behavior);
-DECLARE_DOESNT_RETURN_GCC_ATTRIBUTE_SYNTAX_SUCKS (error_with_frob
+DECLARE_DOESNT_RETURN_GCC__ATTRIBUTE__SYNTAX_SUCKS (error_with_frob
(Lisp_Object, CONST char *,
...), 2, 3);
void maybe_error_with_frob (Lisp_Object, Lisp_Object, Error_behavior,
Lisp_Object maybe_signal_simple_continuable_error_2 (CONST char *, Lisp_Object,
Lisp_Object, Lisp_Object,
Error_behavior);
-void signal_malformed_list_error (Lisp_Object);
-void signal_malformed_property_list_error (Lisp_Object);
-void signal_circular_list_error (Lisp_Object);
-void signal_circular_property_list_error (Lisp_Object);
-void signal_void_function_error (Lisp_Object);
+Lisp_Object funcall_recording_as (Lisp_Object, int, Lisp_Object *);
Lisp_Object run_hook_with_args_in_buffer (struct buffer *, int, Lisp_Object *,
enum run_hooks_condition);
Lisp_Object run_hook_with_args (int, Lisp_Object *, enum run_hooks_condition);
/* Defined in events.c */
void clear_event_resource (void);
Lisp_Object allocate_event (void);
-int event_to_character (Lisp_Event *, int, int, int);
+int event_to_character (struct Lisp_Event *, int, int, int);
/* Defined in fileio.c */
void record_auto_save (void);
Lisp_Object vconcat2 (Lisp_Object, Lisp_Object);
Lisp_Object vconcat3 (Lisp_Object, Lisp_Object, Lisp_Object);
Lisp_Object nconc2 (Lisp_Object, Lisp_Object);
-Lisp_Object bytecode_nconc2 (Lisp_Object *);
void check_losing_bytecode (CONST char *, Lisp_Object);
/* Defined in getloadavg.c */
/* Defined in lread.c */
void ebolify_bytecode_constants (Lisp_Object);
void close_load_descs (void);
-int locate_file (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object *, int);
-EXFUN (Flocate_file_clear_hashing, 1);
+int locate_file (Lisp_Object, Lisp_Object, CONST char *, Lisp_Object *, int);
int isfloat_string (CONST char *);
/* Well, I've decided to enable this. -- ben */
enum external_data_format);
void debug_print (Lisp_Object);
void debug_short_backtrace (int);
-void temp_output_buffer_setup (Lisp_Object);
+void temp_output_buffer_setup (CONST char *);
void temp_output_buffer_show (Lisp_Object, Lisp_Object);
/* NOTE: Do not call this with the data of a Lisp_String. Use princ.
* Note: stream should be defaulted before calling
void print_internal (Lisp_Object, Lisp_Object, int);
void print_symbol (Lisp_Object, Lisp_Object, int);
void print_float (Lisp_Object, Lisp_Object, int);
+void print_compiled_function (Lisp_Object, Lisp_Object, int);
extern int print_escape_newlines;
extern int print_readably;
-Lisp_Object internal_with_output_to_temp_buffer (Lisp_Object,
+Lisp_Object internal_with_output_to_temp_buffer (CONST char *,
Lisp_Object (*) (Lisp_Object),
Lisp_Object, Lisp_Object);
void float_to_string (char *, double);
Lisp_Object find_symbol_value (Lisp_Object);
Lisp_Object find_symbol_value_quickly (Lisp_Object, int);
Lisp_Object top_level_value (Lisp_Object);
-void reject_constant_symbols (Lisp_Object sym, Lisp_Object newval,
- int function_p,
- Lisp_Object follow_past_lisp_magic);
/* Defined in syntax.c */
int scan_words (struct buffer *, int, int);
EXFUN (Fchar_to_string, 1);
EXFUN (Fcheck_valid_plist, 1);
EXFUN (Fclear_range_table, 1);
+EXFUN (Fclrhash, 1);
EXFUN (Fcoding_category_list, 0);
EXFUN (Fcoding_category_system, 1);
EXFUN (Fcoding_priority_list, 0);
EXFUN (Fcoding_system_type, 1);
EXFUN (Fcommand_execute, 3);
EXFUN (Fcommandp, 1);
+EXFUN (Fcompiled_function_domain, 1);
EXFUN (Fconcat, MANY);
EXFUN (Fcons, 2);
EXFUN (Fcopy_alist, 1);
EXFUN (Fcopy_coding_system, 2);
EXFUN (Fcopy_event, 2);
-EXFUN (Fcopy_list, 1);
EXFUN (Fcopy_marker, 2);
EXFUN (Fcopy_sequence, 1);
EXFUN (Fcopy_tree, 2);
EXFUN (Fget_coding_system, 1);
EXFUN (Fget_process, 1);
EXFUN (Fget_range_table, 3);
+EXFUN (Fgethash, 3);
EXFUN (Fgettext, 1);
EXFUN (Fgoto_char, 2);
EXFUN (Fgtr, MANY);
+EXFUN (Fhashtablep, 1);
EXFUN (Findent_to, 3);
EXFUN (Findirect_function, 1);
EXFUN (Finsert, MANY);
EXFUN (Fleq, MANY);
EXFUN (Flist, MANY);
EXFUN (Flistp, 1);
-#ifdef HAVE_SHLIB
-EXFUN (Flist_modules, 0);
-EXFUN (Fload_module, 3);
-#endif
EXFUN (Flss, MANY);
EXFUN (Fmake_byte_code, MANY);
EXFUN (Fmake_coding_system, 4);
EXFUN (Fmake_glyph_internal, 1);
+EXFUN (Fmake_hashtable, 2);
EXFUN (Fmake_list, 2);
EXFUN (Fmake_marker, 0);
EXFUN (Fmake_range_table, 0);
EXFUN (Fold_member, 2);
EXFUN (Fold_memq, 2);
EXFUN (Fplist_get, 3);
-EXFUN (Fplist_member, 2);
EXFUN (Fplist_put, 3);
EXFUN (Fplus, MANY);
EXFUN (Fpoint, 1);
EXFUN (Fput, 3);
EXFUN (Fput_range_table, 4);
EXFUN (Fput_text_property, 5);
+EXFUN (Fputhash, 3);
EXFUN (Fquo, MANY);
EXFUN (Frassq, 2);
EXFUN (Fread, 1);
EXFUN (Fsymbol_name, 1);
EXFUN (Fsymbol_plist, 1);
EXFUN (Fsymbol_value, 1);
-EXFUN (Fsystem_name, 0);
EXFUN (Fthrow, 2);
EXFUN (Ftimes, MANY);
EXFUN (Ftruncate, 1);
extern Lisp_Object Qcategory_designator_p, Qcategory_table_value_p, Qccl, Qcdr;
extern Lisp_Object Qchannel, Qchar, Qchar_or_string_p, Qcharacter, Qcharacterp;
extern Lisp_Object Qchars, Qcharset_g0, Qcharset_g1, Qcharset_g2, Qcharset_g3;
-extern Lisp_Object Qcircular_list, Qcircular_property_list;
-extern Lisp_Object Qcoding_system_error, Qcoding_system_p;
-extern Lisp_Object Qcolor, Qcolor_pixmap_image_instance_p;
+extern Lisp_Object Qcircular_property_list, Qcoding_system_error;
+extern Lisp_Object Qcoding_system_p, Qcolor, Qcolor_pixmap_image_instance_p;
extern Lisp_Object Qcolumns, Qcommand, Qcommandp, Qcompletion_ignore_case;
extern Lisp_Object Qconsole, Qconsole_live_p, Qconst_specifier, Qcr, Qcritical;
extern Lisp_Object Qcrlf, Qctext, Qcurrent_menubar, Qcursor;
extern Lisp_Object Qinvalid_function, Qinvalid_read_syntax, Qio_error;
extern Lisp_Object Qiso2022, Qkey, Qkey_assoc, Qkeymap, Qlambda, Qleft, Qlf;
extern Lisp_Object Qlist, Qlistp, Qload, Qlock_shift, Qmacro, Qmagic;
-extern Lisp_Object Qmalformed_list, Qmalformed_property_list;
-extern Lisp_Object Qmalloc_overhead, Qmark, Qmarkers;
+extern Lisp_Object Qmalformed_property_list, Qmalloc_overhead, Qmark, Qmarkers;
extern Lisp_Object Qmax, Qmemory, Qmessage, Qminus, Qmnemonic, Qmodifiers;
extern Lisp_Object Qmono_pixmap_image_instance_p, Qmotion;
extern Lisp_Object Qmouse_leave_buffer_hook, Qmswindows, Qname, Qnas, Qnatnump;
-extern Lisp_Object Qno_ascii_cntl, Qno_ascii_eol, Qno_catch;
+extern Lisp_Object Qnil, Qno_ascii_cntl, Qno_ascii_eol, Qno_catch;
extern Lisp_Object Qno_conversion, Qno_iso6429, Qnone, Qnot, Qnothing;
extern Lisp_Object Qnothing_image_instance_p, Qnotice;
extern Lisp_Object Qnumber_char_or_marker_p, Qnumber_or_marker_p, Qnumberp;
extern Lisp_Object Qread_from_minibuffer, Qreally_early_error_handler;
extern Lisp_Object Qregion_beginning, Qregion_end, Qrequire, Qresource;
extern Lisp_Object Qreturn, Qreverse, Qright, Qrun_hooks, Qsans_modifiers;
-extern Lisp_Object Qsave_buffers_kill_emacs, Qsearch, Qselected, Qself_insert_command;
+extern Lisp_Object Qsave_buffers_kill_emacs, Qsearch, Qself_insert_command;
extern Lisp_Object Qsequencep, Qsetting_constant, Qseven, Qshift_jis, Qshort;
extern Lisp_Object Qsignal, Qsimple, Qsingularity_error, Qsize, Qspace;
extern Lisp_Object Qspecifier, Qstandard_input, Qstandard_output, Qstart_open;
-extern Lisp_Object Qstream, Qstring, Qstring_lessp, Qsubwindow;
+extern Lisp_Object Qstream, Qstring, Qstring_lessp;
extern Lisp_Object Qsubwindow_image_instance_p, Qsymbol, Qsyntax, Qt, Qtest;
extern Lisp_Object Qtext, Qtext_image_instance_p, Qtimeout, Qtimestamp;
extern Lisp_Object Qtoolbar, Qtop, Qtop_level, Qtrue_list_p, Qtty, Qtype;
extern Lisp_Object Qunderline, Qunimplemented, Quser_files_and_directories;
extern Lisp_Object Qvalue_assoc, Qvalues;
extern Lisp_Object Qvariable_documentation, Qvariable_domain, Qvector;
-extern Lisp_Object Qvoid_function, Qvoid_variable, Qwarning, Qwidth, Qwidget, Qwindow;
+extern Lisp_Object Qvoid_function, Qvoid_variable, Qwarning, Qwidth, Qwindow;
extern Lisp_Object Qwindow_live_p, Qwindow_system, Qwrong_number_of_arguments;
extern Lisp_Object Qwrong_type_argument, Qx, Qy, Qyes_or_no_p;
extern Lisp_Object Vactivate_menubar_hook, Vascii_canon_table;
extern Lisp_Object Vbinary_process_output, Vblank_menubar;
extern Lisp_Object Vcharset_ascii, Vcharset_composite, Vcharset_control_1;
extern Lisp_Object Vcoding_system_for_read, Vcoding_system_for_write;
-extern Lisp_Object Vcoding_system_hash_table, Vcommand_history;
+extern Lisp_Object Vcoding_system_hashtable, Vcommand_history;
extern Lisp_Object Vcommand_line_args, Vconfigure_info_directory;
-extern Lisp_Object Vconfigure_site_directory, Vconfigure_site_module_directory;
extern Lisp_Object Vconsole_list, Vcontrolling_terminal;
extern Lisp_Object Vcurrent_compiled_function_annotation, Vcurrent_load_list;
extern Lisp_Object Vcurrent_mouse_event, Vcurrent_prefix_arg, Vdata_directory;
extern Lisp_Object Vminibuf_preprompt, Vminibuf_prompt, Vminibuffer_zero;
extern Lisp_Object Vmirror_ascii_canon_table, Vmirror_ascii_downcase_table;
extern Lisp_Object Vmirror_ascii_eqv_table, Vmirror_ascii_upcase_table;
-extern Lisp_Object Vmodule_directory, Vmswindows_downcase_file_names;
+extern Lisp_Object Vmswindows_downcase_file_names;
extern Lisp_Object Vmswindows_get_true_file_attributes, Vobarray;
extern Lisp_Object Vprint_length, Vprint_level, Vprocess_environment;
-extern Lisp_Object Vquit_flag;
+extern Lisp_Object Vpure_uninterned_symbol_table, Vquit_flag;
extern Lisp_Object Vrecent_keys_ring, Vshell_file_name, Vsite_directory;
-extern Lisp_Object Vsite_module_directory;
extern Lisp_Object Vstandard_input, Vstandard_output, Vstdio_str;
extern Lisp_Object Vsynchronous_sounds, Vsystem_name, Vterminal_coding_system;
extern Lisp_Object Vthis_command_keys, Vunread_command_event;
extern Lisp_Object Vwin32_generate_fake_inodes, Vwin32_pipe_read_delay;
extern Lisp_Object Vx_initial_argv_list;
-extern Lisp_Object Qmakunbound, Qset;
#endif /* _XEMACS_LISP_H_ */
#include "buffer.h"
#include "bytecode.h"
-#include "elhash.h"
+#include "commands.h"
+#include "insdel.h"
#include "lstream.h"
#include "opaque.h"
+#include <paths.h>
#ifdef FILE_CODING
#include "file-coding.h"
#endif
Lisp_Object Vvalues, Vstandard_input, Vafter_load_alist;
Lisp_Object Qcurrent_load_list;
Lisp_Object Qload, Qload_file_name;
+Lisp_Object Qlocate_file_hash_table;
Lisp_Object Qfset;
-/* Hash-table that maps directory names to hashes of their contents. */
-static Lisp_Object Vlocate_file_hash_table;
-
-Lisp_Object Qexists, Qreadable, Qwritable, Qexecutable;
-
/* See read_escape() for an explanation of this. */
#if 0
int fail_on_bucky_bit_character_escapes;
/* Whether Fload_internal() should ignore .elc files when no suffix is given */
int load_ignore_elc_files;
+/* Directory in which the sources were found. */
+Lisp_Object Vsource_directory;
+
/* Search path for files to be loaded. */
Lisp_Object Vload_path;
Each member of the list has the form (n . object), and is used to
look up the object for the corresponding #n# construct.
It must be set to nil before all top-level calls to read0. */
-Lisp_Object Vread_objects;
+Lisp_Object read_objects;
/* Nonzero means load should forcibly load all dynamic doc strings. */
/* Note that this always happens (with some special behavior) when
something to `funcall', but who would really do that? As
they say in law, we've made a "good-faith effort" to
unfuckify ourselves. And doing it this way avoids screwing
- up args to `make-hash-table' and such. As it is, we have to
+ up args to `make-hashtable' and such. As it is, we have to
add an extra Ebola check in decode_weak_list_type(). --ben */
- if (EQ (el, Qassoc)) el = Qold_assoc;
- else if (EQ (el, Qdelq)) el = Qold_delq;
+ if (EQ (el, Qassoc))
+ el = Qold_assoc;
+ if (EQ (el, Qdelq))
+ el = Qold_delq;
#if 0
/* I think this is a bad idea because it will probably mess
with keymap code. */
- else if (EQ (el, Qdelete)) el = Qold_delete;
+ if (EQ (el, Qdelete))
+ el = Qold_delete;
#endif
- else if (EQ (el, Qrassq)) el = Qold_rassq;
- else if (EQ (el, Qrassoc)) el = Qold_rassoc;
-
+ if (EQ (el, Qrassq))
+ el = Qold_rassq;
+ if (EQ (el, Qrassoc))
+ el = Qold_rassoc;
XVECTOR_DATA (vector)[i] = el;
}
}
Lisp_Object doc;
assert (COMPILED_FUNCTIONP (john));
- if (CONSP (XCOMPILED_FUNCTION (john)->instructions))
+ if (CONSP (XCOMPILED_FUNCTION (john)->bytecodes))
{
struct gcpro ngcpro1;
Lisp_Object juan = (pas_de_lache_ici
- (fd, XCOMPILED_FUNCTION (john)->instructions));
+ (fd, XCOMPILED_FUNCTION (john)->bytecodes));
Lisp_Object ivan;
NGCPRO1 (juan);
if (!CONSP (ivan))
signal_simple_error ("invalid lazy-loaded byte code", ivan);
/* Remember to purecopy; see above. */
- XCOMPILED_FUNCTION (john)->instructions = Fpurecopy (XCAR (ivan));
+ XCOMPILED_FUNCTION (john)->bytecodes = Fpurecopy (XCAR (ivan));
/* v18 or v19 bytecode file. Need to Ebolify. */
if (XCOMPILED_FUNCTION (john)->flags.ebolified
&& VECTORP (XCDR (ivan)))
int message_p = NILP (nomessage);
/*#ifdef DEBUG_XEMACS*/
static Lisp_Object last_file_loaded;
+ size_t pure_usage = 0;
/*#endif*/
struct stat s1, s2;
GCPRO3 (file, newer, found);
{
message_p = 1;
last_file_loaded = file;
+ pure_usage = purespace_usage ();
}
/*#endif / * DEBUG_XEMACS */
int foundlen;
fd = locate_file (Vload_path, file,
- ((!NILP (nosuffix)) ? Qnil :
- build_string (load_ignore_elc_files ? ".el:" :
- ".elc:.el:")),
+ ((!NILP (nosuffix)) ? "" :
+ load_ignore_elc_files ? ".el:" :
+ ".elc:.el:"),
&found,
-1);
/*#ifdef DEBUG_XEMACS*/
if (purify_flag && noninteractive)
{
- if (!EQ (last_file_loaded, file))
- message ("Loading %s ...done", XSTRING_DATA (file));
+ if (EQ (last_file_loaded, file))
+ message_append (" (%d)", purespace_usage() - pure_usage);
+ else
+ message ("Loading %s ...done (%d)", XSTRING_DATA (file),
+ purespace_usage() - pure_usage);
}
/*#endif / * DEBUG_XEMACS */
}
\f
-/* ------------------------------- */
-/* locate_file */
-/* ------------------------------- */
-
-static int
-decode_mode_1 (Lisp_Object mode)
-{
- if (EQ (mode, Qexists))
- return F_OK;
- else if (EQ (mode, Qexecutable))
- return X_OK;
- else if (EQ (mode, Qwritable))
- return W_OK;
- else if (EQ (mode, Qreadable))
- return R_OK;
- else if (INTP (mode))
- {
- check_int_range (XINT (mode), 0, 7);
- return XINT (mode);
- }
- else
- signal_simple_error ("Invalid value", mode);
- return 0; /* unreached */
-}
-
+#if 0 /* FSFmacs */
+/* not used */
static int
-decode_mode (Lisp_Object mode)
+complete_filename_p (Lisp_Object pathname)
{
- if (NILP (mode))
- return R_OK;
- else if (CONSP (mode))
- {
- Lisp_Object tail;
- int mask = 0;
- EXTERNAL_LIST_LOOP (tail, mode)
- mask |= decode_mode_1 (XCAR (tail));
- return mask;
- }
- else
- return decode_mode_1 (mode);
+ REGISTER unsigned char *s = XSTRING_DATA (pathname);
+ return (IS_DIRECTORY_SEP (s[0])
+ || (XSTRING_LENGTH (pathname) > 2
+ && IS_DEVICE_SEP (s[1]) && IS_DIRECTORY_SEP (s[2]))
+#ifdef ALTOS
+ || *s == '@'
+#endif
+ );
}
+#endif /* 0 */
DEFUN ("locate-file", Flocate_file, 2, 4, 0, /*
-Search for FILENAME through PATH-LIST.
-
-If SUFFIXES is non-nil, it should be a list of suffixes to append to
-file name when searching.
-
-If MODE is non-nil, it should be a symbol or a list of symbol representing
-requirements. Allowed symbols are `exists', `executable', `writable', and
-`readable'. If MODE is nil, it defaults to `readable'.
+Search for FILENAME through PATH-LIST, expanded by one of the optional
+SUFFIXES (string of suffixes separated by ":"s), checking for access
+MODE (0|1|2|4 = exists|executable|writeable|readable), default readable.
`locate-file' keeps hash tables of the directories it searches through,
in order to speed things up. It tries valiantly to not get confused in
Lisp_Object tp;
CHECK_STRING (filename);
-
- if (LISTP (suffixes))
- {
- Lisp_Object tail;
- EXTERNAL_LIST_LOOP (tail, suffixes)
- CHECK_STRING (XCAR (tail));
- }
- else
+ if (!NILP (suffixes))
CHECK_STRING (suffixes);
+ if (!NILP (mode))
+ CHECK_NATNUM (mode);
- locate_file (path_list, filename, suffixes, &tp, decode_mode (mode));
+ locate_file (path_list, filename,
+ ((NILP (suffixes)) ? "" :
+ (char *) (XSTRING_DATA (suffixes))),
+ &tp, (NILP (mode) ? R_OK : XINT (mode)));
return tp;
}
-/* Recalculate the hash table for the given string. DIRECTORY should
- better have been through Fexpand_file_name() by now. */
+/* recalculate the hash table for the given string */
static Lisp_Object
-locate_file_refresh_hashing (Lisp_Object directory)
+locate_file_refresh_hashing (Lisp_Object str)
{
Lisp_Object hash =
- make_directory_hash_table ((char *) XSTRING_DATA (directory));
-
- if (!NILP (hash))
- Fputhash (directory, hash, Vlocate_file_hash_table);
+ make_directory_hash_table ((char *) XSTRING_DATA (str));
+ Fput (str, Qlocate_file_hash_table, hash);
return hash;
}
-/* find the hash table for the given directory, recalculating if necessary */
+/* find the hash table for the given string, recalculating if necessary */
static Lisp_Object
-locate_file_find_directory_hash_table (Lisp_Object directory)
-{
- Lisp_Object hash = Fgethash (directory, Vlocate_file_hash_table, Qnil);
- if (NILP (hash))
- return locate_file_refresh_hashing (directory);
- else
- return hash;
-}
-
-/* The SUFFIXES argument in any of the locate_file* functions can be
- nil, a list, or a string (for backward compatibility), with the
- following semantics:
-
- a) nil - no suffix, just search for file name intact (semantically
- different from "empty suffix list")
- b) list - list of suffixes to append to file name. Each of these
- must be a string.
- c) string - colon-separated suffixes to append to file name (backward
- compatibility).
-
- All of this got hairy, so I decided to use write a mapper. Calling
- a function for each suffix shouldn't slow things down, since
- locate_file is rarely call with enough suffixes for it to make a
- difference. */
-
-/* Map FUN over SUFFIXES, as described above. FUN will be called with a
- char * containing the current file name, and ARG. Mapping stops when
- FUN returns non-zero. */
-void
-locate_file_map_suffixes (Lisp_Object filename, Lisp_Object suffixes,
- int (*fun) (char *, void *),
- void *arg)
-{
- /* This function can GC */
- char *fn;
- int fn_len, max;
-
- /* Calculate maximum size of any filename made from
- this path element/specified file name and any possible suffix. */
- if (CONSP (suffixes))
- {
- /* We must traverse the list, so why not do it right. */
- Lisp_Object tail;
- max = 0;
- LIST_LOOP (tail, suffixes)
- {
- if (XSTRING_LENGTH (XCAR (tail)) > max)
- max = XSTRING_LENGTH (XCAR (tail));
- }
- }
- else if (NILP (suffixes))
- max = 0;
- else
- /* Just take the easy way out */
- max = XSTRING_LENGTH (suffixes);
-
- fn_len = XSTRING_LENGTH (filename);
- fn = (char *) alloca (max + fn_len + 1);
- memcpy (fn, (char *) XSTRING_DATA (filename), fn_len);
-
- /* Loop over suffixes. */
- if (!STRINGP (suffixes))
- {
- if (NILP (suffixes))
- {
- /* Case a) discussed in the comment above. */
- fn[fn_len] = 0;
- if ((*fun) (fn, arg))
- return;
- }
- else
- {
- /* Case b) */
- Lisp_Object tail;
- LIST_LOOP (tail, suffixes)
- {
- memcpy (fn + fn_len, XSTRING_DATA (XCAR (tail)),
- XSTRING_LENGTH (XCAR (tail)));
- fn[fn_len + XSTRING_LENGTH (XCAR (tail))] = 0;
- if ((*fun) (fn, arg))
- return;
- }
- }
- }
- else
- {
- /* Case c) */
- CONST char *nsuffix = XSTRING_DATA (suffixes);
-
- while (1)
- {
- char *esuffix = (char *) strchr (nsuffix, ':');
- int lsuffix = ((esuffix) ? (esuffix - nsuffix) : strlen (nsuffix));
-
- /* Concatenate path element/specified name with the suffix. */
- strncpy (fn + fn_len, nsuffix, lsuffix);
- fn[fn_len + lsuffix] = 0;
-
- if ((*fun) (fn, arg))
- return;
-
- /* Advance to next suffix. */
- if (esuffix == 0)
- break;
- nsuffix += lsuffix + 1;
- }
- }
-}
-
-struct locate_file_in_directory_mapper_closure {
- int fd;
- Lisp_Object *storeptr;
- int mode;
-};
-
-static int
-locate_file_in_directory_mapper (char *fn, void *arg)
+locate_file_find_directory_hash_table (Lisp_Object str)
{
- struct locate_file_in_directory_mapper_closure *closure =
- (struct locate_file_in_directory_mapper_closure *)arg;
- struct stat st;
-
- /* Ignore file if it's a directory. */
- if (stat (fn, &st) >= 0
- && (st.st_mode & S_IFMT) != S_IFDIR)
- {
- /* Check that we can access or open it. */
- if (closure->mode >= 0)
- closure->fd = access (fn, closure->mode);
- else
- closure->fd = open (fn, O_RDONLY | OPEN_BINARY, 0);
-
- if (closure->fd >= 0)
- {
- /* We succeeded; return this descriptor and filename. */
- if (closure->storeptr)
- *closure->storeptr = build_string (fn);
-
-#ifndef WINDOWSNT
- /* If we actually opened the file, set close-on-exec flag
- on the new descriptor so that subprocesses can't whack
- at it. */
- if (closure->mode < 0)
- (void) fcntl (closure->fd, F_SETFD, FD_CLOEXEC);
-#endif
-
- return 1;
- }
- }
- /* Keep mapping. */
- return 0;
+ Lisp_Object hash = Fget (str, Qlocate_file_hash_table, Qnil);
+ if (NILP (Fhashtablep (hash)))
+ return locate_file_refresh_hashing (str);
+ return hash;
}
-
-/* look for STR in PATH, optionally adding SUFFIXES. DIRECTORY need
- not have been expanded. */
+/* look for STR in PATH, optionally adding suffixes in SUFFIX */
static int
-locate_file_in_directory (Lisp_Object directory, Lisp_Object str,
- Lisp_Object suffixes, Lisp_Object *storeptr,
+locate_file_in_directory (Lisp_Object path, Lisp_Object str,
+ CONST char *suffix, Lisp_Object *storeptr,
int mode)
{
/* This function can GC */
- struct locate_file_in_directory_mapper_closure closure;
+ int fd;
+ int fn_size = 100;
+ char buf[100];
+ char *fn = buf;
+ int want_size;
+ struct stat st;
Lisp_Object filename = Qnil;
struct gcpro gcpro1, gcpro2, gcpro3;
+ CONST char *nsuffix;
- GCPRO3 (directory, str, filename);
+ GCPRO3 (path, str, filename);
- filename = Fexpand_file_name (str, directory);
+ filename = Fexpand_file_name (str, path);
if (NILP (filename) || NILP (Ffile_name_absolute_p (filename)))
/* If there are non-absolute elts in PATH (eg ".") */
/* Of course, this could conceivably lose if luser sets
default-directory to be something non-absolute ... */
{
if (NILP (filename))
- /* NIL means current directory */
+ /* NIL means current dirctory */
filename = current_buffer->directory;
else
filename = Fexpand_file_name (filename,
current_buffer->directory);
if (NILP (Ffile_name_absolute_p (filename)))
{
- /* Give up on this directory! */
+ /* Give up on this path element! */
UNGCPRO;
return -1;
}
}
+ /* Calculate maximum size of any filename made from
+ this path element/specified file name and any possible suffix. */
+ want_size = strlen (suffix) + XSTRING_LENGTH (filename) + 1;
+ if (fn_size < want_size)
+ fn = (char *) alloca (fn_size = 100 + want_size);
- closure.fd = -1;
- closure.storeptr = storeptr;
- closure.mode = mode;
+ nsuffix = suffix;
- locate_file_map_suffixes (filename, suffixes, locate_file_in_directory_mapper,
- &closure);
+ /* Loop over suffixes. */
+ while (1)
+ {
+ char *esuffix = (char *) strchr (nsuffix, ':');
+ int lsuffix = ((esuffix) ? (esuffix - nsuffix) : strlen (nsuffix));
+
+ /* Concatenate path element/specified name with the suffix. */
+ strncpy (fn, (char *) XSTRING_DATA (filename),
+ XSTRING_LENGTH (filename));
+ fn[XSTRING_LENGTH (filename)] = 0;
+ if (lsuffix != 0) /* Bug happens on CCI if lsuffix is 0. */
+ strncat (fn, nsuffix, lsuffix);
+
+ /* Ignore file if it's a directory. */
+ if (stat (fn, &st) >= 0
+ && (st.st_mode & S_IFMT) != S_IFDIR)
+ {
+ /* Check that we can access or open it. */
+ if (mode >= 0)
+ fd = access (fn, mode);
+ else
+ fd = open (fn, O_RDONLY | OPEN_BINARY, 0);
+
+ if (fd >= 0)
+ {
+ /* We succeeded; return this descriptor and filename. */
+ if (storeptr)
+ *storeptr = build_string (fn);
+ UNGCPRO;
+
+#ifndef WINDOWSNT
+ /* If we actually opened the file, set close-on-exec flag
+ on the new descriptor so that subprocesses can't whack
+ at it. */
+ if (mode < 0)
+ (void) fcntl (fd, F_SETFD, FD_CLOEXEC);
+#endif
+
+ return fd;
+ }
+ }
+
+ /* Advance to next suffix. */
+ if (esuffix == 0)
+ break;
+ nsuffix += lsuffix + 1;
+ }
UNGCPRO;
- return closure.fd;
+ return -1;
}
/* do the same as locate_file() but don't use any hash tables. */
static int
locate_file_without_hash (Lisp_Object path, Lisp_Object str,
- Lisp_Object suffixes, Lisp_Object *storeptr,
+ CONST char *suffix, Lisp_Object *storeptr,
int mode)
{
/* This function can GC */
- int absolute = !NILP (Ffile_name_absolute_p (str));
+ int absolute;
+ struct gcpro gcpro1;
+
+ /* is this necessary? */
+ GCPRO1 (path);
+
+ absolute = !NILP (Ffile_name_absolute_p (str));
- EXTERNAL_LIST_LOOP (path, path)
+ for (; !NILP (path); path = Fcdr (path))
{
- int val = locate_file_in_directory (XCAR (path), str, suffixes, storeptr,
- mode);
+ int val = locate_file_in_directory (Fcar (path), str, suffix,
+ storeptr, mode);
if (val >= 0)
- return val;
+ {
+ UNGCPRO;
+ return val;
+ }
if (absolute)
break;
}
- return -1;
-}
-static int
-locate_file_construct_suffixed_files_mapper (char *fn, void *arg)
-{
- Lisp_Object *tail = (Lisp_Object *)arg;
- *tail = Fcons (build_string (fn), *tail);
- return 0;
+ UNGCPRO;
+ return -1;
}
-/* Construct a list of all files to search for.
- It makes sense to have this despite locate_file_map_suffixes()
- because we need Lisp strings to access the hash-table, and it would
- be inefficient to create them on the fly, again and again for each
- path component. See locate_file(). */
+/* Construct a list of all files to search for. */
static Lisp_Object
-locate_file_construct_suffixed_files (Lisp_Object filename,
- Lisp_Object suffixes)
+locate_file_construct_suffixed_files (Lisp_Object str, CONST char *suffix)
{
- Lisp_Object tail = Qnil;
- struct gcpro gcpro1;
- GCPRO1 (tail);
+ int want_size;
+ int fn_size = 100;
+ char buf[100];
+ char *fn = buf;
+ CONST char *nsuffix;
+ Lisp_Object suffixtab = Qnil;
- locate_file_map_suffixes (filename, suffixes,
- locate_file_construct_suffixed_files_mapper,
- &tail);
+ /* Calculate maximum size of any filename made from
+ this path element/specified file name and any possible suffix. */
+ want_size = strlen (suffix) + XSTRING_LENGTH (str) + 1;
+ if (fn_size < want_size)
+ fn = (char *) alloca (fn_size = 100 + want_size);
- UNGCPRO;
- return Fnreverse (tail);
+ nsuffix = suffix;
+
+ while (1)
+ {
+ char *esuffix = (char *) strchr (nsuffix, ':');
+ int lsuffix = ((esuffix) ? (esuffix - nsuffix) : strlen (nsuffix));
+
+ /* Concatenate path element/specified name with the suffix. */
+ strncpy (fn, (char *) XSTRING_DATA (str), XSTRING_LENGTH (str));
+ fn[XSTRING_LENGTH (str)] = 0;
+ if (lsuffix != 0) /* Bug happens on CCI if lsuffix is 0. */
+ strncat (fn, nsuffix, lsuffix);
+
+ suffixtab = Fcons (build_string (fn), suffixtab);
+ /* Advance to next suffix. */
+ if (esuffix == 0)
+ break;
+ nsuffix += lsuffix + 1;
+ }
+ return Fnreverse (suffixtab);
}
DEFUN ("locate-file-clear-hashing", Flocate_file_clear_hashing, 1, 1, 0, /*
`locate-file' will primarily get confused if you add a file that shadows
\(i.e. has the same name as) another file further down in the directory list.
In this case, you must call `locate-file-clear-hashing'.
-
-If PATH is t, it means to fully clear all the accumulated hashes. This
-can be used if the internal tables grow too large, or when dumping.
*/
(path))
{
- if (EQ (path, Qt))
- Fclrhash (Vlocate_file_hash_table);
- else
+ Lisp_Object pathtail;
+
+ for (pathtail = path; !NILP (pathtail); pathtail = Fcdr (pathtail))
{
- Lisp_Object pathtail;
- EXTERNAL_LIST_LOOP (pathtail, path)
- {
- Lisp_Object pathel = Fexpand_file_name (XCAR (pathtail), Qnil);
- Fremhash (pathel, Vlocate_file_hash_table);
- }
+ Lisp_Object pathel = Fcar (pathtail);
+ if (!purified (pathel))
+ Fput (pathel, Qlocate_file_hash_table, Qnil);
}
return Qnil;
}
/* Search for a file whose name is STR, looking in directories
- in the Lisp list PATH, and trying suffixes from SUFFIXES.
- SUFFIXES is a list of possible suffixes, or (for backward
- compatibility) a string containing possible suffixes separated by
- colons.
+ in the Lisp list PATH, and trying suffixes from SUFFIX.
+ SUFFIX is a string containing possible suffixes separated by colons.
On success, returns a file descriptor. On failure, returns -1.
MODE nonnegative means don't open the files,
Called openp() in FSFmacs. */
int
-locate_file (Lisp_Object path, Lisp_Object str, Lisp_Object suffixes,
+locate_file (Lisp_Object path, Lisp_Object str, CONST char *suffix,
Lisp_Object *storeptr, int mode)
{
/* This function can GC */
Lisp_Object suffixtab = Qnil;
- Lisp_Object pathtail, pathel_expanded;
+ Lisp_Object pathtail;
int val;
- struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+ struct gcpro gcpro1, gcpro2, gcpro3;
if (storeptr)
*storeptr = Qnil;
- /* Is it really necessary to gcpro path and str? It shouldn't be
- unless some caller has fucked up. There are known instances that
- call us with build_string("foo:bar") as SUFFIXES, though. */
- GCPRO4 (path, str, suffixes, suffixtab);
-
/* if this filename has directory components, it's too complicated
to try and use the hash tables. */
if (!NILP (Ffile_name_directory (str)))
- {
- val = locate_file_without_hash (path, str, suffixes, storeptr, mode);
- UNGCPRO;
- return val;
- }
+ return locate_file_without_hash (path, str, suffix, storeptr,
+ mode);
+
+ /* Is it really necessary to gcpro path and str? It shouldn't be
+ unless some caller has fucked up. */
+ GCPRO3 (path, str, suffixtab);
- suffixtab = locate_file_construct_suffixed_files (str, suffixes);
+ suffixtab = locate_file_construct_suffixed_files (str, suffix);
- EXTERNAL_LIST_LOOP (pathtail, path)
+ for (pathtail = path; !NILP (pathtail); pathtail = Fcdr (pathtail))
{
- Lisp_Object pathel = XCAR (pathtail);
- Lisp_Object hash_table;
+ Lisp_Object pathel = Fcar (pathtail);
+ Lisp_Object hashtab;
Lisp_Object tail;
- int found = 0;
+ int found;
- /* If this path element is relative, we have to look by hand. */
- if (NILP (Ffile_name_absolute_p (pathel)))
+ /* If this path element is relative, we have to look by hand.
+ Can't set string property in a pure string. */
+ if (NILP (pathel) || NILP (Ffile_name_absolute_p (pathel)) ||
+ purified (pathel))
{
- val = locate_file_in_directory (pathel, str, suffixes, storeptr,
+ val = locate_file_in_directory (pathel, str, suffix, storeptr,
mode);
if (val >= 0)
{
continue;
}
- pathel_expanded = Fexpand_file_name (pathel, Qnil);
- hash_table = locate_file_find_directory_hash_table (pathel_expanded);
+ hashtab = locate_file_find_directory_hash_table (pathel);
- if (!NILP (hash_table))
+ /* Loop over suffixes. */
+ for (tail = suffixtab, found = 0; !found && CONSP (tail);
+ tail = XCDR (tail))
{
- /* Loop over suffixes. */
- LIST_LOOP (tail, suffixtab)
- if (!NILP (Fgethash (XCAR (tail), hash_table, Qnil)))
- {
- found = 1;
- break;
- }
+ if (!NILP (Fgethash (XCAR (tail), hashtab, Qnil)))
+ found = 1;
}
if (found)
{
/* This is a likely candidate. Look by hand in this directory
so we don't get thrown off if someone byte-compiles a file. */
- val = locate_file_in_directory (pathel, str, suffixes, storeptr,
+ val = locate_file_in_directory (pathel, str, suffix, storeptr,
mode);
if (val >= 0)
{
/* Hmm ... the file isn't actually there. (Or possibly it's
a directory ...) So refresh our hashing. */
- locate_file_refresh_hashing (pathel_expanded);
+ locate_file_refresh_hashing (pathel);
}
}
/* File is probably not there, but check the hard way just in case. */
- val = locate_file_without_hash (path, str, suffixes, storeptr, mode);
+ val = locate_file_without_hash (path, str, suffix, storeptr,
+ mode);
if (val >= 0)
{
/* Sneaky user added a file without telling us. */
{
/* This function can GC */
REGISTER Emchar c;
- REGISTER Lisp_Object val = Qnil;
+ REGISTER Lisp_Object val;
int speccount = specpdl_depth ();
- struct gcpro gcpro1, gcpro2;
+ struct gcpro gcpro1;
struct buffer *b = 0;
if (BUFFERP (readcharfun))
#ifdef COMPILED_FUNCTION_ANNOTATION_HACK
Vcurrent_compiled_function_annotation = Qnil;
#endif
- GCPRO2 (val, sourcename);
+ GCPRO1 (sourcename);
LOADHIST_ATTACH (sourcename);
#else /* No "defun hack" -- Emacs 19 uses read-time syntax for bytecodes */
{
unreadchar (readcharfun, c);
- Vread_objects = Qnil;
+ read_objects = Qnil;
if (NILP (Vload_read_function))
val = read0 (readcharfun);
else
if (EQ (stream, Qt))
stream = Qread_char;
- Vread_objects = Qnil;
+ read_objects = Qnil;
#ifdef COMPILED_FUNCTION_ANNOTATION_HACK
Vcurrent_compiled_function_annotation = Qnil;
lispstream = make_lisp_string_input_stream (string, startval,
endval - startval);
- Vread_objects = Qnil;
+ read_objects = Qnil;
tem = read0 (lispstream);
/* Yeah, it's ugly. Gonna make something of it?
static Lisp_Object
read0 (Lisp_Object readcharfun)
{
- Lisp_Object val = read1 (readcharfun);
+ Lisp_Object val;
+ val = read1 (readcharfun);
if (CONSP (val) && UNBOUNDP (XCAR (val)))
{
Emchar c = XCHAR (XCDR (val));
}
case 'x':
- /* A hex escape, as in ANSI C, except that we only allow latin-1
- characters to be read this way. What is "\x4e03" supposed to
- mean, anyways, if the internal representation is hidden?
- This is also consistent with the treatment of octal escapes. */
+ /* A hex escape, as in ANSI C. */
{
REGISTER Emchar i = 0;
- REGISTER int count = 0;
- while (++count <= 2)
+ while (1)
{
c = readchar (readcharfun);
/* Remember, can't use isdigit(), isalpha() etc. on Emchars */
{
Lisp_Object sym;
if (uninterned_symbol)
- sym = Fmake_symbol ( make_string ((Bufbyte *) read_ptr, len));
+ sym = (Fmake_symbol ((purify_flag)
+ ? make_pure_pname ((Bufbyte *) read_ptr, len, 0)
+ : make_string ((Bufbyte *) read_ptr, len)));
else
{
/* intern will purecopy pname if necessary */
Lisp_Object name = make_string ((Bufbyte *) read_ptr, len);
sym = Fintern (name, Qnil);
+
+ if (SYMBOL_IS_KEYWORD (sym))
+ {
+ /* the LISP way is to put keywords in their own package,
+ but we don't have packages, so we do something simpler.
+ Someday, maybe we'll have packages and then this will
+ be reworked. --Stig. */
+ XSYMBOL (sym)->value = sym;
+ }
}
return sym;
}
obj = read0(readcharfun);
/* the call to `featurep' may GC. */
- GCPRO2 (fexp, obj);
- tem = call1 (Qfeaturep, fexp);
+ GCPRO2(fexp, obj);
+ tem = call1(Qfeaturep, fexp);
UNGCPRO;
- if (c == '+' && NILP(tem)) goto retry;
+ if (c == '+' && NILP(tem)) goto retry;
if (c == '-' && !NILP(tem)) goto retry;
return obj;
}
n += c - '0';
c = readchar (readcharfun);
}
- found = assq_no_quit (make_int (n), Vread_objects);
+ found = assq_no_quit (make_int (n), read_objects);
if (c == '=')
{
/* #n=object returns object, but associates it with
("Multiply defined symbol label"),
make_int (n)));
obj = read0 (readcharfun);
- Vread_objects = Fcons (Fcons (make_int (n), obj),
- Vread_objects);
+ read_objects = Fcons (Fcons (make_int (n), obj), read_objects);
return obj;
}
else if (c == '#')
return Qzero;
Lstream_flush (XLSTREAM (Vread_buffer_stream));
- return
- make_string
- (resizing_buffer_stream_ptr (XLSTREAM (Vread_buffer_stream)),
- Lstream_byte_count (XLSTREAM (Vread_buffer_stream)));
+#if 0 /* FSFmacs defun hack */
+ if (read_pure)
+ return
+ make_pure_string
+ (resizing_buffer_stream_ptr (XLSTREAM (Vread_buffer_stream)),
+ Lstream_byte_count (XLSTREAM (Vread_buffer_stream)));
+ else
+#endif
+ return
+ make_string
+ (resizing_buffer_stream_ptr (XLSTREAM (Vread_buffer_stream)),
+ Lstream_byte_count (XLSTREAM (Vread_buffer_stream)));
}
default:
Vvalues = Qnil;
load_in_progress = 0;
-
+
Vload_descriptor_list = Qnil;
/* kludge: locate-file does not work for a null load-path, even if
defsymbol (&Qcurrent_load_list, "current-load-list");
defsymbol (&Qload, "load");
defsymbol (&Qload_file_name, "load-file-name");
+ defsymbol (&Qlocate_file_hash_table, "locate-file-hash-table");
defsymbol (&Qfset, "fset");
#ifdef LISP_BACKQUOTES
defsymbol (&Qcomma_at, ",@");
defsymbol (&Qcomma_dot, ",.");
#endif
-
- defsymbol (&Qexists, "exists");
- defsymbol (&Qreadable, "readable");
- defsymbol (&Qwritable, "writable");
- defsymbol (&Qexecutable, "executable");
}
void
*/ );
load_force_doc_strings = 0;
+ DEFVAR_LISP ("source-directory", &Vsource_directory /*
+Directory in which XEmacs sources were found when XEmacs was built.
+You cannot count on them to still be there!
+*/ );
+ Vsource_directory = Qnil;
+
/* See read_escape(). */
#if 0
/* Used to be named `puke-on-fsf-keys' */
Vfile_domain = Qnil;
#endif
- Vread_objects = Qnil;
- staticpro (&Vread_objects);
-
- Vlocate_file_hash_table = make_lisp_hash_table (200,
- HASH_TABLE_NON_WEAK,
- HASH_TABLE_EQUAL);
- staticpro (&Vlocate_file_hash_table);
-#ifdef DEBUG_XEMACS
- symbol_value (XSYMBOL (intern ("Vlocate-file-hash-table")))
- = Vlocate_file_hash_table;
-#endif
+ read_objects = Qnil;
+ staticpro (&read_objects);
}
a `next' pointer, and are allocated using alloc_lcrecord().
Creating a new lcrecord type is fairly easy; just follow the
- lead of some existing type (e.g. hash tables). Note that you
+ lead of some existing type (e.g. hashtables). Note that you
do not need to supply all the methods (see below); reasonable
defaults are provided for many of them. Alternatively, if you're
just looking for a way of encapsulating data (which possibly
struct lrecord_header
{
+ /* It would be better to put the mark-bit together with the
+ following datatype identification field in an 8- or 16-bit
+ integer rather than playing funny games with changing
+ header->implementation and "wasting" 32 bits on the below
+ pointer. The type-id would then be a 7 or 15 bit index into a
+ table of lrecord-implementations rather than a direct pointer.
+ There would be 24 (or 16) bits left over for datatype-specific
+ per-instance flags.
+
+ The below is the simplest thing to do for the present,
+ and doesn't incur that much overhead as most Emacs records
+ are of such a size that the overhead isn't too bad.
+ (The marker datatype is the worst case.)
+
+ It also has the very very very slight advantage that type-checking
+ involves one memory read (of the "implementation" slot) and a
+ comparison against a link-time constant address rather than a
+ read and a comparison against a variable value. (Variable since
+ it is a very good idea to assign the indices into the hypothetical
+ type-code table dynamically rather that pre-defining them.)
+ I think I remember that Elk Lisp does something like this.
+ Gee, I wonder if some cretin has patented it? */
+
+ /*
+ * If USE_INDEXED_LRECORD_IMPLEMENTATION is defined, we are
+ * implementing the scheme described in the 'It would be better
+ * ...' paragraph above.
+ */
+#ifdef USE_INDEXED_LRECORD_IMPLEMENTATION
/* index into lrecord_implementations_table[] */
- unsigned type :8;
- /* 1 if the object is marked during GC. */
- unsigned mark :1;
- /* 1 if the object resides in read-only space */
- unsigned c_readonly : 1;
- /* 1 if the object is readonly from lisp */
- unsigned lisp_readonly : 1;
+ unsigned type:8;
+ /* 1 if the object is marked during GC, 0 otherwise. */
+ unsigned mark:1;
+ /* 1 if the object resides in pure (read-only) space */
+ unsigned pure:1;
+#else
+ CONST struct lrecord_implementation *implementation;
+#endif
};
struct lrecord_implementation;
int lrecord_type_index (CONST struct lrecord_implementation *implementation);
-# define set_lheader_implementation(header,imp) do { \
- struct lrecord_header* SLI_header = (header); \
- (SLI_header)->type = lrecord_type_index (imp); \
- (SLI_header)->mark = 0; \
- (SLI_header)->c_readonly = 0; \
- (SLI_header)->lisp_readonly = 0; \
+#ifdef USE_INDEXED_LRECORD_IMPLEMENTATION
+# define set_lheader_implementation(header,imp) do \
+{ \
+ (header)->type = lrecord_type_index (imp); \
+ (header)->mark = 0; \
+ (header)->pure = 0; \
} while (0)
+#else
+# define set_lheader_implementation(header,imp) \
+ ((void) ((header)->implementation = (imp)))
+#endif
struct lcrecord_header
{
struct lrecord_header lheader;
-
- /* The `next' field is normally used to chain all lrecords together
+ /* The "next" field is normally used to chain all lrecords together
so that the GC can find (and free) all of them.
- `alloc_lcrecord' threads records together.
-
- The `next' field may be used for other purposes as long as some
- other mechanism is provided for letting the GC do its work.
+ "alloc_lcrecord" threads records together.
- For example, the event and marker object types allocate members
- out of memory chunks, and are able to find all unmarked members
- by sweeping through the elements of the list of chunks. */
+ The "next" field may be used for other purposes as long as some
+ other mechanism is provided for letting the GC do its work. (For
+ example, the event and marker datatypes allocate members out of
+ memory chunks, and are able to find all unmarked members by
+ sweeping through the elements of the list of chunks) */
struct lcrecord_header *next;
-
- /* The `uid' field is just for debugging/printing convenience.
- Having this slot doesn't hurt us much spacewise, since an
- lcrecord already has the above slots plus malloc overhead. */
+ /* This is just for debugging/printing convenience.
+ Having this slot doesn't hurt us much spacewise, since an lcrecord
+ already has the above slots together with malloc overhead. */
unsigned int uid :31;
-
- /* The `free' field is a flag that indicates whether this lcrecord
- is on a "free list". Free lists are used to minimize the number
- of calls to malloc() when we're repeatedly allocating and freeing
- a number of the same sort of lcrecord. Lcrecords on a free list
- always get marked in a different fashion, so we can use this flag
- as a sanity check to make sure that free lists only have freed
- lcrecords and there are no freed lcrecords elsewhere. */
+ /* A flag that indicates whether this lcrecord is on a "free list".
+ Free lists are used to minimize the number of calls to malloc()
+ when we're repeatedly allocating and freeing a number of the
+ same sort of lcrecord. Lcrecords on a free list always get
+ marked in a different fashion, so we can use this flag as a
+ sanity check to make sure that free lists only have freed lcrecords
+ and there are no freed lcrecords elsewhere. */
unsigned int free :1;
};
Lisp_Object chain;
};
+/* This as the value of lheader->implementation->finalizer
+ * means that this record is already marked */
+void this_marks_a_marked_record (void *, int);
+
/* see alloc.c for an explanation */
Lisp_Object this_one_is_unmarkable (Lisp_Object obj,
void (*markobj) (Lisp_Object));
`equal', they *must* hash to the same value or the hashing won't
work). */
unsigned long (*hash) (Lisp_Object, int);
-
- /* External data layout description */
- const struct lrecord_description *description;
-
Lisp_Object (*getprop) (Lisp_Object obj, Lisp_Object prop);
int (*putprop) (Lisp_Object obj, Lisp_Object prop, Lisp_Object val);
int (*remprop) (Lisp_Object obj, Lisp_Object prop);
int basic_p;
};
+#ifdef USE_INDEXED_LRECORD_IMPLEMENTATION
extern CONST struct lrecord_implementation *lrecord_implementations_table[];
-#define XRECORD_LHEADER_IMPLEMENTATION(obj) \
+# define XRECORD_LHEADER_IMPLEMENTATION(obj) \
(lrecord_implementations_table[XRECORD_LHEADER (obj)->type])
-#define LHEADER_IMPLEMENTATION(lh) (lrecord_implementations_table[(lh)->type])
+# define LHEADER_IMPLEMENTATION(lh) (lrecord_implementations_table[(lh)->type])
+#else
+# define XRECORD_LHEADER_IMPLEMENTATION(obj) \
+ (XRECORD_LHEADER (obj)->implementation)
+# define LHEADER_IMPLEMENTATION(lh) ((lh)->implementation)
+#endif
extern int gc_in_progress;
-#define MARKED_RECORD_P(obj) (gc_in_progress && XRECORD_LHEADER (obj)->mark)
-#define MARKED_RECORD_HEADER_P(lheader) ((lheader)->mark)
-#define MARK_RECORD_HEADER(lheader) ((void) ((lheader)->mark = 1))
-#define UNMARK_RECORD_HEADER(lheader) ((void) ((lheader)->mark = 0))
+#ifdef USE_INDEXED_LRECORD_IMPLEMENTATION
+# define MARKED_RECORD_P(obj) (gc_in_progress && XRECORD_LHEADER (obj)->mark)
+#else
+# define MARKED_RECORD_P(obj) (gc_in_progress && \
+ XRECORD_LHEADER (obj)->implementation->finalizer == \
+ this_marks_a_marked_record)
+#endif
-#define UNMARKABLE_RECORD_HEADER_P(lheader) \
- (LHEADER_IMPLEMENTATION (lheader)->marker == this_one_is_unmarkable)
-
-#define C_READONLY_RECORD_HEADER_P(lheader) ((lheader)->c_readonly)
-#define LISP_READONLY_RECORD_HEADER_P(lheader) ((lheader)->lisp_readonly)
-#define SET_C_READONLY_RECORD_HEADER(lheader) \
- ((void) ((lheader)->c_readonly = (lheader)->lisp_readonly = 1))
-#define SET_LISP_READONLY_RECORD_HEADER(lheader) \
- ((void) ((lheader)->lisp_readonly = 1))
-
-/* External description stuff
-
- A lrecord external description is an array of values. The first
- value of each line is a type, the second the offset in the lrecord
- structure. Following values are parameters, their presence, type
- and number is type-dependant.
-
- The description ends with a "XD_END" record.
-
- Some example descriptions :
- static const struct lrecord_description cons_description[] = {
- { XD_LISP_OBJECT, offsetof(struct Lisp_Cons, car), 2 },
- { XD_END }
- };
-
- Which means "two lisp objects starting at the 'car' element"
-
- static const struct lrecord_description string_description[] = {
- { XD_STRING_DATA, offsetof(Lisp_String, data) },
- { XD_LISP_OBJECT, offsetof(Lisp_String, plist), 1 },
- { XD_END }
- };
- "A string data pointer at 'data', one lisp object at 'plist'"
-
- The existing types :
- XD_LISP_OBJECT
- Lisp objects. The third element is the count. This is also the type to use
- for pointers to other lrecords.
-
- XD_STRING_DATA
- Pointer to string data.
-
- XD_OPAQUE_PTR
- Pointer to undumpable data. Must be NULL when dumping.
-
- XD_STRUCT_PTR
- Pointer to described struct. Parameters are number of structures and
- struct_description.
-
- XD_OPAQUE_DATA_PTR
- Pointer to dumpable opaque data. Parameter is the size of the data.
- Pointed data must be relocatable without changes.
-
- XD_SIZE_T
- size_t value. Used for counts.
-
- XD_INT
- int value. Used for counts.
-
- XD_LONG
- long value. Used for counts.
-
- XD_END
- Special type indicating the end of the array.
-
-
- Special macros:
- XD_INDIRECT(line)
- Usable where a "count" or "size" is requested. Gives the value of the element
- which is at line number 'line' in the description (count starts at zero).
-
- XD_PARENT_INDIRECT(line)
- Same as XD_INDIRECT but the element number refers to the parent structure.
- Usable only in struct descriptions.
-*/
-
-enum lrecord_description_type {
- XD_LISP_OBJECT,
- XD_STRING_DATA,
- XD_OPAQUE_PTR,
- XD_STRUCT_PTR,
- XD_OPAQUE_DATA_PTR,
- XD_SIZE_T,
- XD_INT,
- XD_LONG,
- XD_END
-};
+#ifdef USE_INDEXED_LRECORD_IMPLEMENTATION
-struct lrecord_description {
- enum lrecord_description_type type;
- int offset;
- EMACS_INT data1;
- const struct struct_description *data2;
-};
+# define MARKED_RECORD_HEADER_P(lheader) (lheader)->mark
+# define MARK_RECORD_HEADER(lheader) (lheader)->mark = 1
+# define UNMARK_RECORD_HEADER(lheader) (lheader)->mark = 0
-struct struct_description {
- size_t size;
- const struct lrecord_description *description;
-};
+#else /* ! USE_INDEXED_LRECORD_IMPLEMENTATION */
+
+# define MARKED_RECORD_HEADER_P(lheader) \
+ (((lheader)->implementation->finalizer) == this_marks_a_marked_record)
+# define MARK_RECORD_HEADER(lheader) \
+ do { (((lheader)->implementation)++); } while (0)
+# define UNMARK_RECORD_HEADER(lheader) \
+ do { (((lheader)->implementation)--); } while (0)
-#define XD_INDIRECT(count) (-1-(count))
-#define XD_PARENT_INDIRECT(count) (-1000-(count))
+#endif /* ! USE_INDEXED_LRECORD_IMPLEMENTATION */
-#define XD_DYNARR_DESC(base_type, sub_desc) \
- { XD_STRUCT_PTR, offsetof(base_type, base), XD_INDIRECT(1), sub_desc }, \
- { XD_INT, offsetof(base_type, max) }
+#define UNMARKABLE_RECORD_HEADER_P(lheader) \
+ ((LHEADER_IMPLEMENTATION (lheader)->marker) \
+ == this_one_is_unmarkable)
/* Declaring the following structures as const puts them in the
text (read-only) segment, which makes debugging inconvenient
# define DECLARE_ERROR_CHECK_TYPECHECK(c_name, structtype)
#endif
-#define DEFINE_BASIC_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,structtype) \
-DEFINE_BASIC_LRECORD_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,structtype)
+#define DEFINE_BASIC_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,structtype) \
+DEFINE_BASIC_LRECORD_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,0,0,0,0,structtype)
-#define DEFINE_BASIC_LRECORD_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,props,structtype) \
-MAKE_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,props,sizeof(structtype),0,1,structtype)
+#define DEFINE_BASIC_LRECORD_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,getprop,putprop,remprop,props,structtype) \
+MAKE_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,getprop,putprop,remprop,props,sizeof(structtype),0,1,structtype)
-#define DEFINE_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,structtype) \
-DEFINE_LRECORD_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,structtype)
+#define DEFINE_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,structtype) \
+DEFINE_LRECORD_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,0,0,0,0,structtype)
-#define DEFINE_LRECORD_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,props,structtype) \
-MAKE_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,props,sizeof (structtype),0,0,structtype)
+#define DEFINE_LRECORD_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,getprop,putprop,remprop,props,structtype) \
+MAKE_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,getprop,putprop,remprop,props,sizeof (structtype),0,0,structtype)
-#define DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,sizer,structtype) \
-DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,sizer,structtype)
+#define DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,sizer,structtype) \
+DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,0,0,0,0,sizer,structtype)
-#define DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,props,sizer,structtype) \
-MAKE_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,props,0,sizer,0,structtype) \
+#define DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,getprop,putprop,remprop,props,sizer,structtype) \
+MAKE_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,getprop,putprop,remprop,props,0,sizer,0,structtype) \
-#define MAKE_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,props,size,sizer,basic_p,structtype) \
+#define MAKE_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,getprop,putprop,remprop,props,size,sizer,basic_p,structtype) \
DECLARE_ERROR_CHECK_TYPECHECK(c_name, structtype) \
static int lrecord_##c_name##_lrecord_type_index; \
-CONST_IF_NOT_DEBUG struct lrecord_implementation lrecord_##c_name = \
- { name, marker, printer, nuker, equal, hash, desc, \
- getprop, putprop, remprop, props, size, sizer, \
- &(lrecord_##c_name##_lrecord_type_index), basic_p } \
+CONST_IF_NOT_DEBUG struct lrecord_implementation lrecord_##c_name[2] = \
+ { { name, marker, printer, nuker, equal, hash, \
+ getprop, putprop, remprop, props, size, sizer, \
+ &(lrecord_##c_name##_lrecord_type_index), basic_p }, \
+ { 0, 0, 0, this_marks_a_marked_record, 0, 0, 0, 0, 0, 0, 0, 0, 0, basic_p } }
#define LRECORDP(a) (XTYPE ((a)) == Lisp_Type_Record)
#define XRECORD_LHEADER(a) ((struct lrecord_header *) XPNTR (a))
-#define RECORD_TYPEP(x, ty) \
+#ifdef USE_INDEXED_LRECORD_IMPLEMENTATION
+# define RECORD_TYPEP(x, ty) \
(LRECORDP (x) && \
lrecord_implementations_table[XRECORD_LHEADER (x)->type] == (ty))
+#else
+# define RECORD_TYPEP(x, ty) \
+ (LRECORDP (x) && XRECORD_LHEADER (x)->implementation == (ty))
+#endif
/* NOTE: the DECLARE_LRECORD() must come before the associated
DEFINE_LRECORD_*() or you will get compile errors.
# define DECLARE_LRECORD(c_name, structtype) \
extern CONST_IF_NOT_DEBUG struct lrecord_implementation \
- lrecord_##c_name; \
-INLINE structtype *error_check_##c_name (Lisp_Object obj); \
+ lrecord_##c_name[]; \
+INLINE structtype *error_check_##c_name (Lisp_Object _obj); \
INLINE structtype * \
-error_check_##c_name (Lisp_Object obj) \
+error_check_##c_name (Lisp_Object _obj) \
{ \
- assert (RECORD_TYPEP (obj, &lrecord_##c_name) || \
- MARKED_RECORD_P (obj)); \
- return (structtype *) XPNTR (obj); \
+ XUNMARK (_obj); \
+ assert (RECORD_TYPEP (_obj, lrecord_##c_name) || \
+ MARKED_RECORD_P (_obj)); \
+ return (structtype *) XPNTR (_obj); \
} \
extern Lisp_Object Q##c_name##p
# define DECLARE_NONRECORD(c_name, type_enum, structtype) \
-INLINE structtype *error_check_##c_name (Lisp_Object obj); \
+INLINE structtype *error_check_##c_name (Lisp_Object _obj); \
INLINE structtype * \
-error_check_##c_name (Lisp_Object obj) \
+error_check_##c_name (Lisp_Object _obj) \
{ \
- assert (XGCTYPE (obj) == type_enum); \
- return (structtype *) XPNTR (obj); \
+ XUNMARK (_obj); \
+ assert (XGCTYPE (_obj) == type_enum); \
+ return (structtype *) XPNTR (_obj); \
} \
extern Lisp_Object Q##c_name##p
# define XSETRECORD(var, p, c_name) do \
{ \
XSETOBJ (var, Lisp_Type_Record, p); \
- assert (RECORD_TYPEP (var, &lrecord_##c_name) || \
+ assert (RECORD_TYPEP (var, lrecord_##c_name) || \
MARKED_RECORD_P (var)); \
} while (0)
# define DECLARE_LRECORD(c_name, structtype) \
extern Lisp_Object Q##c_name##p; \
extern CONST_IF_NOT_DEBUG struct lrecord_implementation \
- lrecord_##c_name
+ lrecord_##c_name[]
# define DECLARE_NONRECORD(c_name, type_enum, structtype) \
extern Lisp_Object Q##c_name##p
# define XRECORD(x, c_name, structtype) ((structtype *) XPNTR (x))
#endif /* not ERROR_CHECK_TYPECHECK */
-#define RECORDP(x, c_name) RECORD_TYPEP (x, &lrecord_##c_name)
-#define GC_RECORDP(x, c_name) gc_record_type_p (x, &lrecord_##c_name)
+#define RECORDP(x, c_name) RECORD_TYPEP (x, lrecord_##c_name)
+#define GC_RECORDP(x, c_name) gc_record_type_p (x, lrecord_##c_name)
/* Note: we now have two different kinds of type-checking macros.
The "old" kind has now been renamed CONCHECK_foo. The reason for
way out and disabled returning from a signal entirely. */
#define CONCHECK_RECORD(x, c_name) do { \
- if (!RECORD_TYPEP (x, &lrecord_##c_name)) \
+ if (!RECORD_TYPEP (x, lrecord_##c_name)) \
x = wrong_type_argument (Q##c_name##p, x); \
} while (0)
#define CONCHECK_NONRECORD(x, lisp_enum, predicate) do {\
x = wrong_type_argument (predicate, x); \
} while (0)
#define CHECK_RECORD(x, c_name) do { \
- if (!RECORD_TYPEP (x, &lrecord_##c_name)) \
+ if (!RECORD_TYPEP (x, lrecord_##c_name)) \
dead_wrong_type_argument (Q##c_name##p, x); \
} while (0)
#define CHECK_NONRECORD(x, lisp_enum, predicate) do { \
static unsigned char buf[KEYTOSTRSIZE];
static char **warning;
-static int canna_empty_info, canna_through_info;
-static int canna_underline;
-static int canna_inhibit_hankakukana;
+static int Vcanna_empty_info, Vcanna_through_info;
+static int Vcanna_underline;
+static int Vcanna_inhibit_hankakukana;
static Lisp_Object Vcanna_kakutei_string;
static Lisp_Object Vcanna_kakutei_yomi;
static Lisp_Object Vcanna_kakutei_romaji;
static Lisp_Object Vcanna_henkan_string;
-static int canna_henkan_length;
-static int canna_henkan_revPos;
-static int canna_henkan_revLen;
+static int Vcanna_henkan_length;
+static int Vcanna_henkan_revPos;
+static int Vcanna_henkan_revLen;
static Lisp_Object Vcanna_ichiran_string;
-static int canna_ichiran_length;
-static int canna_ichiran_revPos;
-static int canna_ichiran_revLen;
+static int Vcanna_ichiran_length;
+static int Vcanna_ichiran_revPos;
+static int Vcanna_ichiran_revLen;
static Lisp_Object Vcanna_mode_string;
static int IRCP_context;
{
Vcanna_henkan_string = make_string (ks->echoStr, ks->length);
#ifndef CANNA_MULE
- canna_henkan_length = ks->length;
- canna_henkan_revPos = ks->revPos;
- canna_henkan_revLen = ks->revLen;
+ Vcanna_henkan_length = ks->length;
+ Vcanna_henkan_revPos = ks->revPos;
+ Vcanna_henkan_revLen = ks->revLen;
#else /* CANNA_MULE */
- if (canna_underline)
+ if (Vcanna_underline)
{
- canna_henkan_length = mule_strlen (ks->echoStr,ks->length);
- canna_henkan_revPos = mule_strlen (ks->echoStr,ks->revPos);
- canna_henkan_revLen = mule_strlen (ks->echoStr+ks->revPos,ks->revLen);
+ Vcanna_henkan_length = mule_strlen (ks->echoStr,ks->length);
+ Vcanna_henkan_revPos = mule_strlen (ks->echoStr,ks->revPos);
+ Vcanna_henkan_revLen = mule_strlen (ks->echoStr+ks->revPos,ks->revLen);
}
else
{
count_char (ks->echoStr, ks->length, ks->revPos, ks->revLen,
- &canna_henkan_length, &canna_henkan_revPos,
- &canna_henkan_revLen);
+ &Vcanna_henkan_length, &Vcanna_henkan_revPos,
+ &Vcanna_henkan_revLen);
}
#endif /* CANNA_MULE */
}
{
Vcanna_ichiran_string = make_string (ks->gline.line, ks->gline.length);
#ifndef CANNA_MULE
- canna_ichiran_length = ks->gline.length;
- canna_ichiran_revPos = ks->gline.revPos;
- canna_ichiran_revLen = ks->gline.revLen;
+ Vcanna_ichiran_length = ks->gline.length;
+ Vcanna_ichiran_revPos = ks->gline.revPos;
+ Vcanna_ichiran_revLen = ks->gline.revLen;
#else /* CANNA_MULE */
count_char (ks->gline.line, ks->gline.length,
- ks->gline.revPos, ks->gline.revLen, &canna_ichiran_length,
- &canna_ichiran_revPos, &canna_ichiran_revLen);
+ ks->gline.revPos, ks->gline.revLen, &Vcanna_ichiran_length,
+ &Vcanna_ichiran_revPos, &Vcanna_ichiran_revLen);
#endif /* CANNA_MULE */
}
}
/* ¤½¤Î¾¤Î¾ðÊó */
- canna_empty_info = (ks->info & KanjiEmptyInfo) ? 1 : 0;
- canna_through_info = (ks->info & KanjiThroughInfo) ? 1 : 0;
+ Vcanna_empty_info = (ks->info & KanjiEmptyInfo) ? 1 : 0;
+ Vcanna_through_info = (ks->info & KanjiThroughInfo) ? 1 : 0;
}
return val;
char servername[256];
CHECK_STRING (server);
- strncpy (servername, XSTRING_DATA (server), XSTRING_LENGTH (server));
- servername[XSTRING_LENGTH (server)] = '\0';
+ strncpy (servername, XSTRING (server)->_data, XSTRING (server)->_size);
+ servername[XSTRING (server)->_size] = '\0';
jrKanjiControl (0, KC_SETSERVERNAME, servername);
}
char rcname[256];
CHECK_STRING (rcfile);
- strncpy (rcname, XSTRING_DATA (rcfile), XSTRING_LENGTH (rcfile));
- rcname[XSTRING_LENGTH (rcfile)] = '\0';
+ strncpy (rcname, XSTRING (rcfile)->_data, XSTRING (rcfile)->_size);
+ rcname[XSTRING (rcfile)->_size] = '\0';
jrKanjiControl (0, KC_SETINITFILENAME, rcname);
}
if (res == -1)
{
- val = Fcons (make_string ((unsigned char*) jrKanjiError,
+ val = Fcons (make_string ((unsigned char*) jrKanjiError,
strlen (jrKanjiError)), val);
/* ¥¤¥Ë¥·¥ã¥é¥¤¥º¤Ç¼ºÇÔ¤·¤¿¾ì¹ç¡£ */
return Fcons (Qnil, val);
jrKanjiControl (0, KC_INHIBITHANKAKUKANA, (char *) 1);
#else
/* mule ¤À¤Ã¤¿¤éȾ³Ñ¥«¥¿¥«¥Ê¤â»È¤¨¤ë */
- if (canna_inhibit_hankakukana)
+ if (Vcanna_inhibit_hankakukana)
jrKanjiControl (0, KC_INHIBITHANKAKUKANA, (char *) 1);
#endif
jrKanjiControl (0, KC_YOMIINFO, (char *) 2); /* ¢¨£²: ¥á¼¥Þ»ú¤Þ¤ÇÊÖ¤¹ */
ksv.buffer = (unsigned char *) buf;
ksv.bytes_buffer = KEYTOSTRSIZE;
#ifndef CANNA_MULE
- ks.echoStr = XSTRING_DATA (str);
- ks.length = XSTRING_LENGTH (str);
+ ks.echoStr = XSTRING (str)->_data;
+ ks.length = XSTRING (str)->_size;
#else /* CANNA_MULE */
- m2c (XSTRING_DATA (str), XSTRING_LENGTH (str), cbuf);
+ m2c (XSTRING (str)->_data, XSTRING (str)->_size, cbuf);
ks.echoStr = cbuf;
ks.length = strlen (cbuf);
#endif /* CANNA_MULE */
}
DEFUN ("canna-set-width", Fcanna_set_width, 1, 1, 0, /*
-Set status-line width information, which is used to display
+Set status-line width information, which is used to display
kanji candidates.
*/
(num))
CHECK_STRING (yomi);
#ifndef CANNA_MULE
- strncpy (buf, XSTRING_DATA (yomi), XSTRING_LENGTH (yomi));
- ks.length = XSTRING_LENGTH (yomi);
+ strncpy (buf, XSTRING (yomi)->_data, XSTRING (yomi)->_size);
+ ks.length = XSTRING (yomi)->_size;
buf[ks.length] = '\0';
#else /* CANNA_MULE */
- m2c (XSTRING_DATA (yomi), XSTRING_LENGTH (yomi), buf);
+ m2c (XSTRING (yomi)->_data, XSTRING (yomi)->_size, buf);
ks.length = strlen (buf);
#endif /* CANNA_MULE */
CHECK_STRING (roma);
#ifndef CANNA_MULE
- strncpy (buf + XSTRING_LENGTH (yomi) + 1, XSTRING_DATA (roma),
- XSTRING_LENGTH (roma));
- buf[XSTRING_LENGTH (yomi) + 1 + XSTRING_LENGTH (roma)] = '\0';
- ks.mode = (unsigned char *)(buf + XSTRING_LENGTH (yomi) + 1);
+ strncpy (buf + XSTRING (yomi)->_size + 1, XSTRING (roma)->_data,
+ XSTRING (roma)->_size);
+ buf[XSTRING (yomi)->_size + 1 + XSTRING (roma)->_size] = '\0';
+ ks.mode = (unsigned char *)(buf + XSTRING (yomi)->_size + 1);
#else /* CANNA_MULE */
ks.mode = (unsigned char *)(buf + ks.length + 1);
- m2c (XSTRING_DATA (roma), XSTRING_LENGTH (roma), ks.mode);
+ m2c (XSTRING (roma)->_data, XSTRING (roma)->_size, ks.mode);
#endif /* CANNA_MULE */
}
CHECK_STRING (str);
#ifndef CANNA_MULE
- strncpy (buf, XSTRING_DATA (str), XSTRING_LENGTH (str));
- buf[XSTRING_LENGTH (str)] = '\0';
+ strncpy (buf, XSTRING (str)->_data, XSTRING (str)->_size);
+ buf[XSTRING (str)->_size] = '\0';
#else /* CANNA_MULE */
- m2c (XSTRING_DATA (str), XSTRING_LENGTH (str), buf);
+ m2c (XSTRING (str)->_data, XSTRING (str)->_size, buf);
#endif /* CANNA_MULE */
p = (unsigned char**) buf;
n = jrKanjiControl (0, KC_PARSE, (char *) &p);
return Qnil;
}
#ifndef CANNA_MULE
- strncpy (yomibuf, XSTRING_DATA (yomi), XSTRING_LENGTH (yomi));
- yomibuf[XSTRING_LENGTH (yomi)] = '\0';
- nbun = RkBgnBun (IRCP_context, XSTRING_DATA (yomi), XSTRING_LENGTH (yomi),
+ strncpy (yomibuf, XSTRING (yomi)->_data, XSTRING (yomi)->_size);
+ yomibuf[XSTRING (yomi)->_size] = '\0';
+ nbun = RkBgnBun (IRCP_context, XSTRING (yomi)->_data, XSTRING (yomi)->_size,
(RK_XFER << RK_XFERBITS) | RK_KFER);
#else /* CANNA_MULE */
- m2c (XSTRING_DATA (yomi), XSTRING_LENGTH (yomi), yomibuf);
+ m2c (XSTRING (yomi)->_data, XSTRING (yomi)->_size, yomibuf);
nbun = RkBgnBun (IRCP_context, (char *) yomibuf, strlen (yomibuf),
(RK_XFER << RK_XFERBITS) | RK_KFER);
#endif /* CANNA_MULE */
CHECK_INT (bunsetsu);
CHECK_INT (bunlen);
-
+
nbun = XINT (bunsetsu);
if (confirmContext () == 0)
{
/* variables below this line is constants of Canna */
-static int canna_mode_AlphaMode;
-static int canna_mode_EmptyMode;
-static int canna_mode_KigoMode;
-static int canna_mode_YomiMode;
-static int canna_mode_JishuMode;
-static int canna_mode_TankouhoMode;
-static int canna_mode_IchiranMode;
-static int canna_mode_YesNoMode;
-static int canna_mode_OnOffMode;
+static int Vcanna_mode_AlphaMode = IROHA_MODE_AlphaMode;
+static int Vcanna_mode_EmptyMode = IROHA_MODE_EmptyMode;
+static int Vcanna_mode_KigoMode = IROHA_MODE_KigoMode;
+static int Vcanna_mode_YomiMode = IROHA_MODE_YomiMode;
+static int Vcanna_mode_JishuMode = IROHA_MODE_JishuMode;
+static int Vcanna_mode_TankouhoMode = IROHA_MODE_TankouhoMode;
+static int Vcanna_mode_IchiranMode = IROHA_MODE_IchiranMode;
+static int Vcanna_mode_YesNoMode = IROHA_MODE_YesNoMode;
+static int Vcanna_mode_OnOffMode = IROHA_MODE_OnOffMode;
#ifdef CANNA_MODE_AdjustBunsetsuMode
-static int canna_mode_AdjustBunsetsuMode;
+static int Vcanna_mode_AdjustBunsetsuMode = CANNA_MODE_AdjustBunsetsuMode;
#endif
#ifdef CANNA_MODE_ChikujiYomiMode
-static int canna_mode_ChikujiYomiMode;
-static int canna_mode_ChikujiTanMode;
+static int Vcanna_mode_ChikujiYomiMode = CANNA_MODE_ChikujiYomiMode;
+static int Vcanna_mode_ChikujiTanMode = CANNA_MODE_ChikujiTanMode;
#endif
-static int canna_mode_HenkanMode;
+static int Vcanna_mode_HenkanMode = IROHA_MODE_HenkanMode;
#ifdef CANNA_MODE_HenkanNyuryokuMode
-static int canna_mode_HenkanNyuryokuMode;
+static int Vcanna_mode_HenkanNyuryokuMode = CANNA_MODE_HenkanNyuryokuMode;
#endif
#ifdef CANNA_MODE_ZenHiraHenkanMode
-static int canna_mode_ZenHiraHenkanMode;
+static int Vcanna_mode_ZenHiraHenkanMode = CANNA_MODE_ZenHiraHenkanMode;
#ifdef CANNA_MODE_HanHiraHenkanMode
-static int canna_mode_HanHiraHenkanMode;
+static int Vcanna_mode_HanHiraHenkanMode = CANNA_MODE_HanHiraHenkanMode;
#endif
-static int canna_mode_ZenKataHenkanMode;
-static int canna_mode_HanKataHenkanMode;
-static int canna_mode_ZenAlphaHenkanMode;
-static int canna_mode_HanAlphaHenkanMode;
+static int Vcanna_mode_ZenKataHenkanMode = CANNA_MODE_ZenKataHenkanMode;
+static int Vcanna_mode_HanKataHenkanMode = CANNA_MODE_HanKataHenkanMode;
+static int Vcanna_mode_ZenAlphaHenkanMode = CANNA_MODE_ZenAlphaHenkanMode;
+static int Vcanna_mode_HanAlphaHenkanMode = CANNA_MODE_HanAlphaHenkanMode;
#endif
-static int canna_mode_ZenHiraKakuteiMode;
+static int Vcanna_mode_ZenHiraKakuteiMode = IROHA_MODE_ZenHiraKakuteiMode;
#ifdef CANNA_MODE_HanHiraKakuteiMode
-static int canna_mode_HanHiraKakuteiMode;
+static int Vcanna_mode_HanHiraKakuteiMode = CANNA_MODE_HanHiraKakuteiMode;
#endif
-static int canna_mode_ZenKataKakuteiMode;
-static int canna_mode_HanKataKakuteiMode;
-static int canna_mode_ZenAlphaKakuteiMode;
-static int canna_mode_HanAlphaKakuteiMode;
-static int canna_mode_HexMode;
-static int canna_mode_BushuMode;
-static int canna_mode_ExtendMode;
-static int canna_mode_RussianMode;
-static int canna_mode_GreekMode;
-static int canna_mode_LineMode;
-static int canna_mode_ChangingServerMode;
-static int canna_mode_HenkanMethodMode;
-static int canna_mode_DeleteDicMode;
-static int canna_mode_TourokuMode;
-static int canna_mode_TourokuEmptyMode;
-static int canna_mode_TourokuHinshiMode;
-static int canna_mode_TourokuDicMode;
-static int canna_mode_QuotedInsertMode;
-static int canna_mode_BubunMuhenkanMode;
-static int canna_mode_MountDicMode;
-
-static int canna_fn_SelfInsert;
-static int canna_fn_FunctionalInsert;
-static int canna_fn_QuotedInsert;
-static int canna_fn_JapaneseMode;
-static int canna_fn_AlphaMode;
-static int canna_fn_HenkanNyuryokuMode;
-static int canna_fn_Forward;
-static int canna_fn_Backward;
-static int canna_fn_Next;
-static int canna_fn_Prev;
-static int canna_fn_BeginningOfLine;
-static int canna_fn_EndOfLine;
-static int canna_fn_DeleteNext;
-static int canna_fn_DeletePrevious;
-static int canna_fn_KillToEndOfLine;
-static int canna_fn_Henkan;
-static int canna_fn_Kakutei;
-static int canna_fn_Extend;
-static int canna_fn_Shrink;
+static int Vcanna_mode_ZenKataKakuteiMode = IROHA_MODE_ZenKataKakuteiMode;
+static int Vcanna_mode_HanKataKakuteiMode = IROHA_MODE_HanKataKakuteiMode;
+static int Vcanna_mode_ZenAlphaKakuteiMode = IROHA_MODE_ZenAlphaKakuteiMode;
+static int Vcanna_mode_HanAlphaKakuteiMode = IROHA_MODE_HanAlphaKakuteiMode;
+static int Vcanna_mode_HexMode = IROHA_MODE_HexMode;
+static int Vcanna_mode_BushuMode = IROHA_MODE_BushuMode;
+static int Vcanna_mode_ExtendMode = IROHA_MODE_ExtendMode;
+static int Vcanna_mode_RussianMode = IROHA_MODE_RussianMode;
+static int Vcanna_mode_GreekMode = IROHA_MODE_GreekMode;
+static int Vcanna_mode_LineMode = IROHA_MODE_LineMode;
+static int Vcanna_mode_ChangingServerMode = IROHA_MODE_ChangingServerMode;
+static int Vcanna_mode_HenkanMethodMode = IROHA_MODE_HenkanMethodMode;
+static int Vcanna_mode_DeleteDicMode = IROHA_MODE_DeleteDicMode;
+static int Vcanna_mode_TourokuMode = IROHA_MODE_TourokuMode;
+static int Vcanna_mode_TourokuEmptyMode = IROHA_MODE_TourokuEmptyMode;
+static int Vcanna_mode_TourokuHinshiMode = IROHA_MODE_TourokuHinshiMode;
+static int Vcanna_mode_TourokuDicMode = IROHA_MODE_TourokuDicMode;
+static int Vcanna_mode_QuotedInsertMode = IROHA_MODE_QuotedInsertMode;
+static int Vcanna_mode_BubunMuhenkanMode = IROHA_MODE_BubunMuhenkanMode;
+static int Vcanna_mode_MountDicMode = IROHA_MODE_MountDicMode;
+
+static int Vcanna_fn_SelfInsert = IROHA_FN_SelfInsert;
+static int Vcanna_fn_FunctionalInsert = IROHA_FN_FunctionalInsert;
+static int Vcanna_fn_QuotedInsert = IROHA_FN_QuotedInsert;
+static int Vcanna_fn_JapaneseMode = IROHA_FN_JapaneseMode;
+static int Vcanna_fn_AlphaMode = IROHA_FN_AlphaMode;
+static int Vcanna_fn_HenkanNyuryokuMode = IROHA_FN_HenkanNyuryokuMode;
+static int Vcanna_fn_Forward = IROHA_FN_Forward;
+static int Vcanna_fn_Backward = IROHA_FN_Backward;
+static int Vcanna_fn_Next = IROHA_FN_Next;
+static int Vcanna_fn_Prev = IROHA_FN_Prev;
+static int Vcanna_fn_BeginningOfLine = IROHA_FN_BeginningOfLine;
+static int Vcanna_fn_EndOfLine = IROHA_FN_EndOfLine;
+static int Vcanna_fn_DeleteNext = IROHA_FN_DeleteNext;
+static int Vcanna_fn_DeletePrevious = IROHA_FN_DeletePrevious;
+static int Vcanna_fn_KillToEndOfLine = IROHA_FN_KillToEndOfLine;
+static int Vcanna_fn_Henkan = IROHA_FN_Henkan;
+static int Vcanna_fn_Kakutei = IROHA_FN_Kakutei;
+static int Vcanna_fn_Extend = IROHA_FN_Extend;
+static int Vcanna_fn_Shrink = IROHA_FN_Shrink;
#ifdef CANNA_FN_AdjustBunsetsu
-static int canna_fn_AdjustBunsetsu;
+static int Vcanna_fn_AdjustBunsetsu = CANNA_FN_AdjustBunsetsu;
#endif
-static int canna_fn_Quit;
-static int canna_fn_ConvertAsHex;
-static int canna_fn_ConvertAsBushu;
-static int canna_fn_KouhoIchiran;
-static int canna_fn_BubunMuhenkan;
-static int canna_fn_Zenkaku;
-static int canna_fn_Hankaku;
-static int canna_fn_ToUpper;
-static int canna_fn_Capitalize;
-static int canna_fn_ToLower;
-static int canna_fn_Hiragana;
-static int canna_fn_Katakana;
-static int canna_fn_Romaji;
+static int Vcanna_fn_Quit = IROHA_FN_Quit;
+static int Vcanna_fn_ConvertAsHex = IROHA_FN_ConvertAsHex;
+static int Vcanna_fn_ConvertAsBushu = IROHA_FN_ConvertAsBushu;
+static int Vcanna_fn_KouhoIchiran = IROHA_FN_KouhoIchiran;
+static int Vcanna_fn_BubunMuhenkan = IROHA_FN_BubunMuhenkan;
+static int Vcanna_fn_Zenkaku = IROHA_FN_Zenkaku;
+static int Vcanna_fn_Hankaku = IROHA_FN_Hankaku;
+static int Vcanna_fn_ToUpper = IROHA_FN_ToUpper;
+static int Vcanna_fn_Capitalize = IROHA_FN_Capitalize;
+static int Vcanna_fn_ToLower = IROHA_FN_ToLower;
+static int Vcanna_fn_Hiragana = IROHA_FN_Hiragana;
+static int Vcanna_fn_Katakana = IROHA_FN_Katakana;
+static int Vcanna_fn_Romaji = IROHA_FN_Romaji;
#ifdef CANNA_FN_BaseHiragana
-static int canna_fn_BaseHiragana;
-static int canna_fn_BaseKatakana;
-static int canna_fn_BaseEisu;
-static int canna_fn_BaseZenkaku;
-static int canna_fn_BaseHankaku;
-static int canna_fn_BaseKana;
-static int canna_fn_BaseKakutei;
-static int canna_fn_BaseHenkan;
-static int canna_fn_BaseHiraKataToggle;
-static int canna_fn_BaseZenHanToggle;
-static int canna_fn_BaseKanaEisuToggle;
-static int canna_fn_BaseKakuteiHenkanToggle;
-static int canna_fn_BaseRotateForward;
-static int canna_fn_BaseRotateBackward;
+static int Vcanna_fn_BaseHiragana = CANNA_FN_BaseHiragana;
+static int Vcanna_fn_BaseKatakana = CANNA_FN_BaseKatakana;
+static int Vcanna_fn_BaseEisu = CANNA_FN_BaseEisu;
+static int Vcanna_fn_BaseZenkaku = CANNA_FN_BaseZenkaku;
+static int Vcanna_fn_BaseHankaku = CANNA_FN_BaseHankaku;
+static int Vcanna_fn_BaseKana = CANNA_FN_BaseKana;
+static int Vcanna_fn_BaseKakutei = CANNA_FN_BaseKakutei;
+static int Vcanna_fn_BaseHenkan = CANNA_FN_BaseHenkan;
+static int Vcanna_fn_BaseHiraKataToggle = CANNA_FN_BaseHiraKataToggle;
+static int Vcanna_fn_BaseZenHanToggle = CANNA_FN_BaseZenHanToggle;
+static int Vcanna_fn_BaseKanaEisuToggle = CANNA_FN_BaseKanaEisuToggle;
+static int Vcanna_fn_BaseKakuteiHenkanToggle =
+ CANNA_FN_BaseKakuteiHenkanToggle;
+static int Vcanna_fn_BaseRotateForward = CANNA_FN_BaseRotateForward;
+static int Vcanna_fn_BaseRotateBackward = CANNA_FN_BaseRotateBackward;
#endif
-static int canna_fn_ExtendMode;
-static int canna_fn_Touroku;
-static int canna_fn_HexMode;
-static int canna_fn_BushuMode;
-static int canna_fn_KigouMode;
+static int Vcanna_fn_ExtendMode = IROHA_FN_ExtendMode;
+static int Vcanna_fn_Touroku = IROHA_FN_Touroku;
+static int Vcanna_fn_HexMode = IROHA_FN_HexMode;
+static int Vcanna_fn_BushuMode = IROHA_FN_BushuMode;
+static int Vcanna_fn_KigouMode = IROHA_FN_KigouMode;
#ifdef CANNA_FN_Mark
-static int canna_fn_Mark;
+static int Vcanna_fn_Mark = CANNA_FN_Mark;
#endif
#ifdef CANNA_FN_TemporalMode
-static int canna_fn_TemporalMode;
+static int Vcanna_fn_TemporalMode = CANNA_FN_TemporalMode;
#endif
-static int canna_key_Nfer;
-static int canna_key_Xfer;
-static int canna_key_Up;
-static int canna_key_Left;
-static int canna_key_Right;
-static int canna_key_Down;
-static int canna_key_Insert;
-static int canna_key_Rollup;
-static int canna_key_Rolldown;
-static int canna_key_Home;
-static int canna_key_Help;
-static int canna_key_KP_Key;
-static int canna_key_Shift_Nfer;
-static int canna_key_Shift_Xfer;
-static int canna_key_Shift_Up;
-static int canna_key_Shift_Left;
-static int canna_key_Shift_Right;
-static int canna_key_Shift_Down;
-static int canna_key_Cntrl_Nfer;
-static int canna_key_Cntrl_Xfer;
-static int canna_key_Cntrl_Up;
-static int canna_key_Cntrl_Left;
-static int canna_key_Cntrl_Right;
-static int canna_key_Cntrl_Down;
+static int Vcanna_key_Nfer = IROHA_KEY_Nfer;
+static int Vcanna_key_Xfer = IROHA_KEY_Xfer;
+static int Vcanna_key_Up = IROHA_KEY_Up;
+static int Vcanna_key_Left = IROHA_KEY_Left;
+static int Vcanna_key_Right = IROHA_KEY_Right;
+static int Vcanna_key_Down = IROHA_KEY_Down;
+static int Vcanna_key_Insert = IROHA_KEY_Insert;
+static int Vcanna_key_Rollup = IROHA_KEY_Rollup;
+static int Vcanna_key_Rolldown = IROHA_KEY_Rolldown;
+static int Vcanna_key_Home = IROHA_KEY_Home;
+static int Vcanna_key_Help = IROHA_KEY_Help;
+static int Vcanna_key_KP_Key = IROHA_KEY_KP_Key;
+static int Vcanna_key_Shift_Nfer = IROHA_KEY_Shift_Nfer;
+static int Vcanna_key_Shift_Xfer = IROHA_KEY_Shift_Xfer;
+static int Vcanna_key_Shift_Up = IROHA_KEY_Shift_Up;
+static int Vcanna_key_Shift_Left = IROHA_KEY_Shift_Left;
+static int Vcanna_key_Shift_Right = IROHA_KEY_Shift_Right;
+static int Vcanna_key_Shift_Down = IROHA_KEY_Shift_Down;
+static int Vcanna_key_Cntrl_Nfer = IROHA_KEY_Cntrl_Nfer;
+static int Vcanna_key_Cntrl_Xfer = IROHA_KEY_Cntrl_Xfer;
+static int Vcanna_key_Cntrl_Up = IROHA_KEY_Cntrl_Up;
+static int Vcanna_key_Cntrl_Left = IROHA_KEY_Cntrl_Left;
+static int Vcanna_key_Cntrl_Right = IROHA_KEY_Cntrl_Right;
+static int Vcanna_key_Cntrl_Down = IROHA_KEY_Cntrl_Down;
Lisp_Object VCANNA; /* by MORIOKA Tomohiko <morioka@jaist.ac.jp>
1996/6/7 */
void
syms_of_mule_canna (void)
{
+ DEFVAR_LISP ("CANNA", &VCANNA); /* hir@nec, 1992.5.21 */
+ VCANNA = Qt; /* hir@nec, 1992.5.21 */
+
DEFSUBR (Fcanna_key_proc);
DEFSUBR (Fcanna_initialize);
DEFSUBR (Fcanna_finalize);
void
vars_of_mule_canna (void)
{
- DEFVAR_LISP ("CANNA", &VCANNA); /* hir@nec, 1992.5.21 */
- VCANNA = Qt; /* hir@nec, 1992.5.21 */
-
DEFVAR_LISP ("canna-kakutei-string", &Vcanna_kakutei_string /*
*/ );
- Vcanna_kakutei_string = Qnil;
-
DEFVAR_LISP ("canna-kakutei-yomi", &Vcanna_kakutei_yomi /*
*/ );
- Vcanna_kakutei_yomi = Qnil;
-
DEFVAR_LISP ("canna-kakutei-romaji", &Vcanna_kakutei_romaji /*
*/ );
- Vcanna_kakutei_romaji = Qnil;
-
DEFVAR_LISP ("canna-henkan-string", &Vcanna_henkan_string /*
*/ );
- Vcanna_henkan_string = Qnil;
-
- DEFVAR_INT ("canna-henkan-length", &canna_henkan_length /*
+ DEFVAR_INT ("canna-henkan-length", &Vcanna_henkan_length /*
*/ );
- canna_henkan_length = 0;
-
- DEFVAR_INT ("canna-henkan-revpos", &canna_henkan_revPos /*
+ DEFVAR_INT ("canna-henkan-revpos", &Vcanna_henkan_revPos /*
*/ );
- canna_henkan_revPos = 0;
-
- DEFVAR_INT ("canna-henkan-revlen", &canna_henkan_revLen /*
+ DEFVAR_INT ("canna-henkan-revlen", &Vcanna_henkan_revLen /*
*/ );
- canna_henkan_revLen = 0;
-
DEFVAR_LISP ("canna-ichiran-string", &Vcanna_ichiran_string /*
*/ );
- Vcanna_ichiran_string = Qnil;
-
- DEFVAR_INT ("canna-ichiran-length", &canna_ichiran_length /*
+ DEFVAR_INT ("canna-ichiran-length", &Vcanna_ichiran_length /*
*/ );
- canna_ichiran_length = 0;
-
- DEFVAR_INT ("canna-ichiran-revpos", &canna_ichiran_revPos /*
+ DEFVAR_INT ("canna-ichiran-revpos", &Vcanna_ichiran_revPos /*
*/ );
- canna_ichiran_revPos = 0;
-
- DEFVAR_INT ("canna-ichiran-revlen", &canna_ichiran_revLen /*
+ DEFVAR_INT ("canna-ichiran-revlen", &Vcanna_ichiran_revLen /*
*/ );
- canna_ichiran_revLen = 0;
-
DEFVAR_LISP ("canna-mode-string", &Vcanna_mode_string /*
*/ );
- Vcanna_mode_string = Qnil;
- DEFVAR_BOOL ("canna-empty-info", &canna_empty_info /*
+ DEFVAR_BOOL ("canna-empty-info", &Vcanna_empty_info /*
For canna
*/ );
- canna_empty_info = 0;
-
- DEFVAR_BOOL ("canna-through-info", &canna_through_info /*
+ DEFVAR_BOOL ("canna-through-info", &Vcanna_through_info /*
For canna
*/ );
- canna_through_info = 0;
-
- DEFVAR_BOOL ("canna-underline", &canna_underline /*
+ DEFVAR_BOOL ("canna-underline", &Vcanna_underline /*
For canna
*/ );
- canna_underline = 0;
-
- DEFVAR_BOOL ("canna-inhibit-hankakukana", &canna_inhibit_hankakukana /*
+ DEFVAR_BOOL ("canna-inhibit-hankakukana", &Vcanna_inhibit_hankakukana /*
For canna
*/ );
- canna_inhibit_hankakukana = 0;
- DEFVAR_INT ("canna-mode-alpha-mode", &canna_mode_AlphaMode /*
+ DEFVAR_INT ("canna-mode-alpha-mode", &Vcanna_mode_AlphaMode /*
*/ );
- canna_mode_AlphaMode = IROHA_MODE_AlphaMode;
-
- DEFVAR_INT ("canna-mode-empty-mode", &canna_mode_EmptyMode /*
+ DEFVAR_INT ("canna-mode-empty-mode", &Vcanna_mode_EmptyMode /*
*/ );
- canna_mode_EmptyMode = IROHA_MODE_EmptyMode;
-
- DEFVAR_INT ("canna-mode-kigo-mode", &canna_mode_KigoMode /*
+ DEFVAR_INT ("canna-mode-kigo-mode", &Vcanna_mode_KigoMode /*
*/ );
- canna_mode_KigoMode = IROHA_MODE_KigoMode;
-
- DEFVAR_INT ("canna-mode-yomi-mode", &canna_mode_YomiMode /*
+ DEFVAR_INT ("canna-mode-yomi-mode", &Vcanna_mode_YomiMode /*
*/ );
- canna_mode_YomiMode = IROHA_MODE_YomiMode;
-
- DEFVAR_INT ("canna-mode-jishu-mode", &canna_mode_JishuMode /*
+ DEFVAR_INT ("canna-mode-jishu-mode", &Vcanna_mode_JishuMode /*
*/ );
- canna_mode_JishuMode = IROHA_MODE_JishuMode;
-
- DEFVAR_INT ("canna-mode-tankouho-mode", &canna_mode_TankouhoMode /*
+ DEFVAR_INT ("canna-mode-tankouho-mode", &Vcanna_mode_TankouhoMode /*
*/ );
- canna_mode_TankouhoMode = IROHA_MODE_TankouhoMode;
-
- DEFVAR_INT ("canna-mode-ichiran-mode", &canna_mode_IchiranMode /*
+ DEFVAR_INT ("canna-mode-ichiran-mode", &Vcanna_mode_IchiranMode /*
*/ );
- canna_mode_IchiranMode = IROHA_MODE_IchiranMode;
-
- DEFVAR_INT ("canna-mode-yes-no-mode", &canna_mode_YesNoMode /*
+ DEFVAR_INT ("canna-mode-yes-no-mode", &Vcanna_mode_YesNoMode /*
*/ );
- canna_mode_YesNoMode = IROHA_MODE_YesNoMode;
-
- DEFVAR_INT ("canna-mode-on-off-mode", &canna_mode_OnOffMode /*
+ DEFVAR_INT ("canna-mode-on-off-mode", &Vcanna_mode_OnOffMode /*
*/ );
- canna_mode_OnOffMode = IROHA_MODE_OnOffMode;
-
#ifdef CANNA_MODE_AdjustBunsetsuMode
DEFVAR_INT ("canna-mode-adjust-bunsetsu-mode",
- &canna_mode_AdjustBunsetsuMode /*
+ &Vcanna_mode_AdjustBunsetsuMode /*
*/ );
- canna_mode_AdjustBunsetsuMode = CANNA_MODE_AdjustBunsetsuMode;
#endif
#ifdef CANNA_MODE_ChikujiYomiMode
- DEFVAR_INT ("canna-mode-chikuji-yomi-mode", &canna_mode_ChikujiYomiMode /*
+ DEFVAR_INT ("canna-mode-chikuji-yomi-mode", &Vcanna_mode_ChikujiYomiMode /*
*/ );
- canna_mode_ChikujiYomiMode = CANNA_MODE_ChikujiYomiMode;
-
DEFVAR_INT ("canna-mode-chikuji-bunsetsu-mode",
- &canna_mode_ChikujiTanMode /*
+ &Vcanna_mode_ChikujiTanMode /*
*/ );
- canna_mode_ChikujiTanMode = CANNA_MODE_ChikujiTanMode;
#endif
- DEFVAR_INT ("canna-mode-henkan-mode", &canna_mode_HenkanMode /*
+ DEFVAR_INT ("canna-mode-henkan-mode", &Vcanna_mode_HenkanMode /*
*/ );
- canna_mode_HenkanMode = IROHA_MODE_HenkanMode;
-
#ifdef CANNA_MODE_HenkanNyuryokuMode
DEFVAR_INT ("canna-mode-henkan-nyuuryoku-mode",
- &canna_mode_HenkanNyuryokuMode /*
+ &Vcanna_mode_HenkanNyuryokuMode /*
*/ );
- canna_mode_HenkanNyuryokuMode = CANNA_MODE_HenkanNyuryokuMode;
#endif
#ifdef CANNA_MODE_ZenHiraHenkanMode
DEFVAR_INT ("canna-mode-zen-hira-henkan-mode",
- &canna_mode_ZenHiraHenkanMode /*
+ &Vcanna_mode_ZenHiraHenkanMode /*
*/ );
- canna_mode_ZenHiraHenkanMode = CANNA_MODE_ZenHiraHenkanMode;
#ifdef CANNA_MODE_HanHiraHenkanMode
DEFVAR_INT ("canna-mode-han-hira-henkan-mode",
- &canna_mode_HanHiraHenkanMode /*
+ &Vcanna_mode_HanHiraHenkanMode /*
*/ );
- canna_mode_HanHiraHenkanMode = CANNA_MODE_HanHiraHenkanMode;
#endif
DEFVAR_INT ("canna-mode-zen-kata-henkan-mode",
- &canna_mode_ZenKataHenkanMode /*
+ &Vcanna_mode_ZenKataHenkanMode /*
*/ );
- canna_mode_ZenKataHenkanMode = CANNA_MODE_ZenKataHenkanMode;
-
DEFVAR_INT ("canna-mode-han-kata-henkan-mode",
- &canna_mode_HanKataHenkanMode /*
+ &Vcanna_mode_HanKataHenkanMode /*
*/ );
- canna_mode_HanKataHenkanMode = CANNA_MODE_HanKataHenkanMode;
-
DEFVAR_INT ("canna-mode-zen-alpha-henkan-mode",
- &canna_mode_ZenAlphaHenkanMode /*
+ &Vcanna_mode_ZenAlphaHenkanMode /*
*/ );
- canna_mode_ZenAlphaHenkanMode = CANNA_MODE_ZenAlphaHenkanMode;
-
DEFVAR_INT ("canna-mode-han-alpha-henkan-mode",
- &canna_mode_HanAlphaHenkanMode /*
+ &Vcanna_mode_HanAlphaHenkanMode /*
*/ );
- canna_mode_HanAlphaHenkanMode = CANNA_MODE_HanAlphaHenkanMode;
#endif
DEFVAR_INT ("canna-mode-zen-hira-kakutei-mode",
- &canna_mode_ZenHiraKakuteiMode /*
+ &Vcanna_mode_ZenHiraKakuteiMode /*
*/ );
- canna_mode_ZenHiraKakuteiMode = IROHA_MODE_ZenHiraKakuteiMode;
#ifdef CANNA_MODE_HanHiraKakuteiMode
DEFVAR_INT ("canna-mode-han-hira-kakutei-mode",
- &canna_mode_HanHiraKakuteiMode /*
+ &Vcanna_mode_HanHiraKakuteiMode /*
*/ );
- canna_mode_HanHiraKakuteiMode = CANNA_MODE_HanHiraKakuteiMode;
#endif
DEFVAR_INT ("canna-mode-zen-kata-kakutei-mode",
- &canna_mode_ZenKataKakuteiMode /*
+ &Vcanna_mode_ZenKataKakuteiMode /*
*/ );
- canna_mode_ZenKataKakuteiMode = IROHA_MODE_ZenKataKakuteiMode;
-
DEFVAR_INT ("canna-mode-han-kata-kakutei-mode",
- &canna_mode_HanKataKakuteiMode /*
+ &Vcanna_mode_HanKataKakuteiMode /*
*/ );
- canna_mode_HanKataKakuteiMode = IROHA_MODE_HanKataKakuteiMode;
-
DEFVAR_INT ("canna-mode-zen-alpha-kakutei-mode",
- &canna_mode_ZenAlphaKakuteiMode /*
+ &Vcanna_mode_ZenAlphaKakuteiMode /*
*/ );
- canna_mode_ZenAlphaKakuteiMode = IROHA_MODE_ZenAlphaKakuteiMode;
-
DEFVAR_INT ("canna-mode-han-alpha-kakutei-mode",
- &canna_mode_HanAlphaKakuteiMode /*
+ &Vcanna_mode_HanAlphaKakuteiMode /*
*/ );
- canna_mode_HanAlphaKakuteiMode = IROHA_MODE_HanAlphaKakuteiMode;
-
- DEFVAR_INT ("canna-mode-hex-mode", &canna_mode_HexMode /*
+ DEFVAR_INT ("canna-mode-hex-mode", &Vcanna_mode_HexMode /*
*/ );
- canna_mode_HexMode = IROHA_MODE_HexMode;
-
- DEFVAR_INT ("canna-mode-bushu-mode", &canna_mode_BushuMode /*
+ DEFVAR_INT ("canna-mode-bushu-mode", &Vcanna_mode_BushuMode /*
*/ );
- canna_mode_BushuMode = IROHA_MODE_BushuMode;
-
- DEFVAR_INT ("canna-mode-extend-mode", &canna_mode_ExtendMode /*
+ DEFVAR_INT ("canna-mode-extend-mode", &Vcanna_mode_ExtendMode /*
*/ );
- canna_mode_ExtendMode = IROHA_MODE_ExtendMode;
-
- DEFVAR_INT ("canna-mode-russian-mode", &canna_mode_RussianMode /*
+ DEFVAR_INT ("canna-mode-russian-mode", &Vcanna_mode_RussianMode /*
*/ );
- canna_mode_RussianMode = IROHA_MODE_RussianMode;
-
- DEFVAR_INT ("canna-mode-greek-mode", &canna_mode_GreekMode /*
+ DEFVAR_INT ("canna-mode-greek-mode", &Vcanna_mode_GreekMode /*
*/ );
- canna_mode_GreekMode = IROHA_MODE_GreekMode;
-
- DEFVAR_INT ("canna-mode-line-mode", &canna_mode_LineMode /*
+ DEFVAR_INT ("canna-mode-line-mode", &Vcanna_mode_LineMode /*
*/ );
- canna_mode_LineMode = IROHA_MODE_LineMode;
-
DEFVAR_INT ("canna-mode-changing-server-mode",
- &canna_mode_ChangingServerMode /*
+ &Vcanna_mode_ChangingServerMode /*
*/ );
- canna_mode_ChangingServerMode = IROHA_MODE_ChangingServerMode;
-
DEFVAR_INT ("canna-mode-henkan-method-mode",
- &canna_mode_HenkanMethodMode /*
+ &Vcanna_mode_HenkanMethodMode /*
*/ );
- canna_mode_HenkanMethodMode = IROHA_MODE_HenkanMethodMode;
-
- DEFVAR_INT ("canna-mode-delete-dic-mode", &canna_mode_DeleteDicMode /*
+ DEFVAR_INT ("canna-mode-delete-dic-mode", &Vcanna_mode_DeleteDicMode /*
*/ );
- canna_mode_DeleteDicMode = IROHA_MODE_DeleteDicMode;
-
- DEFVAR_INT ("canna-mode-touroku-mode", &canna_mode_TourokuMode /*
+ DEFVAR_INT ("canna-mode-touroku-mode", &Vcanna_mode_TourokuMode /*
*/ );
- canna_mode_TourokuMode = IROHA_MODE_TourokuMode;
-
DEFVAR_INT ("canna-mode-touroku-empty-mode",
- &canna_mode_TourokuEmptyMode /*
+ &Vcanna_mode_TourokuEmptyMode /*
*/ );
- canna_mode_TourokuEmptyMode = IROHA_MODE_TourokuEmptyMode;
-
DEFVAR_INT ("canna-mode-touroku-hinshi-mode",
- &canna_mode_TourokuHinshiMode /*
+ &Vcanna_mode_TourokuHinshiMode /*
*/ );
- canna_mode_TourokuHinshiMode = IROHA_MODE_TourokuHinshiMode;
-
- DEFVAR_INT ("canna-mode-touroku-dic-mode", &canna_mode_TourokuDicMode /*
+ DEFVAR_INT ("canna-mode-touroku-dic-mode", &Vcanna_mode_TourokuDicMode /*
*/ );
- canna_mode_TourokuDicMode = IROHA_MODE_TourokuDicMode;
-
DEFVAR_INT ("canna-mode-quoted-insert-mode",
- &canna_mode_QuotedInsertMode /*
+ &Vcanna_mode_QuotedInsertMode /*
*/ );
- canna_mode_QuotedInsertMode = IROHA_MODE_QuotedInsertMode;
-
DEFVAR_INT ("canna-mode-bubun-muhenkan-mode",
- &canna_mode_BubunMuhenkanMode /*
+ &Vcanna_mode_BubunMuhenkanMode /*
*/ );
- canna_mode_BubunMuhenkanMode = IROHA_MODE_BubunMuhenkanMode;
-
- DEFVAR_INT ("canna-mode-mount-dic-mode", &canna_mode_MountDicMode /*
+ DEFVAR_INT ("canna-mode-mount-dic-mode", &Vcanna_mode_MountDicMode /*
*/ );
- canna_mode_MountDicMode = IROHA_MODE_MountDicMode;
- DEFVAR_INT ("canna-func-self-insert", &canna_fn_SelfInsert /*
+ DEFVAR_INT ("canna-func-self-insert", &Vcanna_fn_SelfInsert /*
*/ );
- canna_fn_SelfInsert = IROHA_FN_SelfInsert;
-
- DEFVAR_INT ("canna-func-functional-insert", &canna_fn_FunctionalInsert /*
+ DEFVAR_INT ("canna-func-functional-insert", &Vcanna_fn_FunctionalInsert /*
*/ );
- canna_fn_FunctionalInsert = IROHA_FN_FunctionalInsert;
-
- DEFVAR_INT ("canna-func-quoted-insert", &canna_fn_QuotedInsert /*
+ DEFVAR_INT ("canna-func-quoted-insert", &Vcanna_fn_QuotedInsert /*
*/ );
- canna_fn_QuotedInsert = IROHA_FN_QuotedInsert;
-
- DEFVAR_INT ("canna-func-japanese-mode", &canna_fn_JapaneseMode /*
+ DEFVAR_INT ("canna-func-japanese-mode", &Vcanna_fn_JapaneseMode /*
*/ );
- canna_fn_JapaneseMode = IROHA_FN_JapaneseMode;
-
- DEFVAR_INT ("canna-func-alpha-mode", &canna_fn_AlphaMode /*
+ DEFVAR_INT ("canna-func-alpha-mode", &Vcanna_fn_AlphaMode /*
*/ );
- canna_fn_AlphaMode = IROHA_FN_AlphaMode;
-
DEFVAR_INT ("canna-func-henkan-nyuryoku-mode",
- &canna_fn_HenkanNyuryokuMode /*
+ &Vcanna_fn_HenkanNyuryokuMode /*
*/ );
- canna_fn_HenkanNyuryokuMode = IROHA_FN_HenkanNyuryokuMode;
-
- DEFVAR_INT ("canna-func-forward", &canna_fn_Forward /*
+ DEFVAR_INT ("canna-func-forward", &Vcanna_fn_Forward /*
*/ );
- canna_fn_Forward = IROHA_FN_Forward;
-
- DEFVAR_INT ("canna-func-backward", &canna_fn_Backward /*
+ DEFVAR_INT ("canna-func-backward", &Vcanna_fn_Backward /*
*/ );
- canna_fn_Backward = IROHA_FN_Backward;
-
- DEFVAR_INT ("canna-func-next", &canna_fn_Next /*
+ DEFVAR_INT ("canna-func-next", &Vcanna_fn_Next /*
*/ );
- canna_fn_Next = IROHA_FN_Next;
-
- DEFVAR_INT ("canna-func-previous", &canna_fn_Prev /*
+ DEFVAR_INT ("canna-func-previous", &Vcanna_fn_Prev /*
*/ );
- canna_fn_Prev = IROHA_FN_Prev;
-
- DEFVAR_INT ("canna-func-beginning-of-line", &canna_fn_BeginningOfLine /*
+ DEFVAR_INT ("canna-func-beginning-of-line", &Vcanna_fn_BeginningOfLine /*
*/ );
- canna_fn_BeginningOfLine = IROHA_FN_BeginningOfLine;
-
- DEFVAR_INT ("canna-func-end-of-line", &canna_fn_EndOfLine /*
+ DEFVAR_INT ("canna-func-end-of-line", &Vcanna_fn_EndOfLine /*
*/ );
- canna_fn_EndOfLine = IROHA_FN_EndOfLine;
-
- DEFVAR_INT ("canna-func-delete-next", &canna_fn_DeleteNext /*
+ DEFVAR_INT ("canna-func-delete-next", &Vcanna_fn_DeleteNext /*
*/ );
- canna_fn_DeleteNext = IROHA_FN_DeleteNext;
-
- DEFVAR_INT ("canna-func-delete_previous", &canna_fn_DeletePrevious /*
+ DEFVAR_INT ("canna-func-delete_previous", &Vcanna_fn_DeletePrevious /*
*/ );
- canna_fn_DeletePrevious = IROHA_FN_DeletePrevious;
-
- DEFVAR_INT ("canna-func-kill-to-end-of-line", &canna_fn_KillToEndOfLine /*
+ DEFVAR_INT ("canna-func-kill-to-end-of-line", &Vcanna_fn_KillToEndOfLine /*
*/ );
- canna_fn_KillToEndOfLine = IROHA_FN_KillToEndOfLine;
-
- DEFVAR_INT ("canna-func-henkan", &canna_fn_Henkan /*
+ DEFVAR_INT ("canna-func-henkan", &Vcanna_fn_Henkan /*
*/ );
- canna_fn_Henkan = IROHA_FN_Henkan;
-
- DEFVAR_INT ("canna-func-kakutei", &canna_fn_Kakutei /*
+ DEFVAR_INT ("canna-func-kakutei", &Vcanna_fn_Kakutei /*
*/ );
- canna_fn_Kakutei = IROHA_FN_Kakutei;
-
- DEFVAR_INT ("canna-func-extend", &canna_fn_Extend /*
+ DEFVAR_INT ("canna-func-extend", &Vcanna_fn_Extend /*
*/ );
- canna_fn_Extend = IROHA_FN_Extend;
-
- DEFVAR_INT ("canna-func-shrink", &canna_fn_Shrink /*
+ DEFVAR_INT ("canna-func-shrink", &Vcanna_fn_Shrink /*
*/ );
- canna_fn_Shrink = IROHA_FN_Shrink;
-
#ifdef CANNA_FN_AdjustBunsetsu
- DEFVAR_INT ("canna-func-adjust-bunsetsu", &canna_fn_AdjustBunsetsu /*
+ DEFVAR_INT ("canna-func-adjust-bunsetsu", &Vcanna_fn_AdjustBunsetsu /*
*/ );
- canna_fn_AdjustBunsetsu = CANNA_FN_AdjustBunsetsu;
#endif
- DEFVAR_INT ("canna-func-quit", &canna_fn_Quit /*
+ DEFVAR_INT ("canna-func-quit", &Vcanna_fn_Quit /*
*/ );
- canna_fn_Quit = IROHA_FN_Quit;
-
- DEFVAR_INT ("canna-func-convert-as-hex", &canna_fn_ConvertAsHex /*
+ DEFVAR_INT ("canna-func-convert-as-hex", &Vcanna_fn_ConvertAsHex /*
*/ );
- canna_fn_ConvertAsHex = IROHA_FN_ConvertAsHex;
-
- DEFVAR_INT ("canna-func-convert-as-bushu", &canna_fn_ConvertAsBushu /*
+ DEFVAR_INT ("canna-func-convert-as-bushu", &Vcanna_fn_ConvertAsBushu /*
*/ );
- canna_fn_ConvertAsBushu = IROHA_FN_ConvertAsBushu;
-
- DEFVAR_INT ("canna-func-kouho-ichiran", &canna_fn_KouhoIchiran /*
+ DEFVAR_INT ("canna-func-kouho-ichiran", &Vcanna_fn_KouhoIchiran /*
*/ );
- canna_fn_KouhoIchiran = IROHA_FN_KouhoIchiran;
-
- DEFVAR_INT ("canna-func-bubun-muhenkan", &canna_fn_BubunMuhenkan /*
+ DEFVAR_INT ("canna-func-bubun-muhenkan", &Vcanna_fn_BubunMuhenkan /*
*/ );
- canna_fn_BubunMuhenkan = IROHA_FN_BubunMuhenkan;
-
- DEFVAR_INT ("canna-func-zenkaku", &canna_fn_Zenkaku /*
+ DEFVAR_INT ("canna-func-zenkaku", &Vcanna_fn_Zenkaku /*
*/ );
- canna_fn_Zenkaku = IROHA_FN_Zenkaku;
-
- DEFVAR_INT ("canna-func-hankaku", &canna_fn_Hankaku /*
+ DEFVAR_INT ("canna-func-hankaku", &Vcanna_fn_Hankaku /*
*/ );
- canna_fn_Hankaku = IROHA_FN_Hankaku;
-
- DEFVAR_INT ("canna-func-to-upper", &canna_fn_ToUpper /*
+ DEFVAR_INT ("canna-func-to-upper", &Vcanna_fn_ToUpper /*
*/ );
- canna_fn_ToUpper = IROHA_FN_ToUpper;
-
- DEFVAR_INT ("canna-func-capitalize", &canna_fn_Capitalize /*
+ DEFVAR_INT ("canna-func-capitalize", &Vcanna_fn_Capitalize /*
*/ );
- canna_fn_Capitalize = IROHA_FN_Capitalize;
-
- DEFVAR_INT ("canna-func-to-lower", &canna_fn_ToLower /*
+ DEFVAR_INT ("canna-func-to-lower", &Vcanna_fn_ToLower /*
*/ );
- canna_fn_ToLower = IROHA_FN_ToLower;
-
- DEFVAR_INT ("canna-func-hiragana", &canna_fn_Hiragana /*
+ DEFVAR_INT ("canna-func-hiragana", &Vcanna_fn_Hiragana /*
*/ );
- canna_fn_Hiragana = IROHA_FN_Hiragana;
-
- DEFVAR_INT ("canna-func-katakana", &canna_fn_Katakana /*
+ DEFVAR_INT ("canna-func-katakana", &Vcanna_fn_Katakana /*
*/ );
- canna_fn_Katakana = IROHA_FN_Katakana;
-
- DEFVAR_INT ("canna-func-romaji", &canna_fn_Romaji /*
+ DEFVAR_INT ("canna-func-romaji", &Vcanna_fn_Romaji /*
*/ );
- canna_fn_Romaji = IROHA_FN_Romaji;
-
#ifdef CANNA_FN_BaseHiragana
- DEFVAR_INT ("canna-func-base-hiragana", &canna_fn_BaseHiragana /*
+ DEFVAR_INT ("canna-func-base-hiragana", &Vcanna_fn_BaseHiragana /*
*/ );
- canna_fn_BaseHiragana = CANNA_FN_BaseHiragana;
-
- DEFVAR_INT ("canna-func-base-katakana", &canna_fn_BaseKatakana /*
+ DEFVAR_INT ("canna-func-base-katakana", &Vcanna_fn_BaseKatakana /*
*/ );
- canna_fn_BaseKatakana = CANNA_FN_BaseKatakana;
-
- DEFVAR_INT ("canna-func-base-eisu", &canna_fn_BaseEisu /*
+ DEFVAR_INT ("canna-func-base-eisu", &Vcanna_fn_BaseEisu /*
*/ );
- canna_fn_BaseEisu = CANNA_FN_BaseEisu;
-
- DEFVAR_INT ("canna-func-base-zenkaku", &canna_fn_BaseZenkaku /*
+ DEFVAR_INT ("canna-func-base-zenkaku", &Vcanna_fn_BaseZenkaku /*
*/ );
- canna_fn_BaseZenkaku = CANNA_FN_BaseZenkaku;
-
- DEFVAR_INT ("canna-func-base-hankaku", &canna_fn_BaseHankaku /*
+ DEFVAR_INT ("canna-func-base-hankaku", &Vcanna_fn_BaseHankaku /*
*/ );
- canna_fn_BaseHankaku = CANNA_FN_BaseHankaku;
-
- DEFVAR_INT ("canna-func-base-kana", &canna_fn_BaseKana /*
+ DEFVAR_INT ("canna-func-base-kana", &Vcanna_fn_BaseKana /*
*/ );
- canna_fn_BaseKana = CANNA_FN_BaseKana;
-
- DEFVAR_INT ("canna-func-base-kakutei", &canna_fn_BaseKakutei /*
+ DEFVAR_INT ("canna-func-base-kakutei", &Vcanna_fn_BaseKakutei /*
*/ );
- canna_fn_BaseKakutei = CANNA_FN_BaseKakutei;
-
- DEFVAR_INT ("canna-func-base-henkan", &canna_fn_BaseHenkan /*
+ DEFVAR_INT ("canna-func-base-henkan", &Vcanna_fn_BaseHenkan /*
*/ );
- canna_fn_BaseHenkan = CANNA_FN_BaseHenkan;
-
DEFVAR_INT ("canna-func-base-hiragana-katakana-toggle",
- &canna_fn_BaseHiraKataToggle /*
+ &Vcanna_fn_BaseHiraKataToggle /*
*/ );
- canna_fn_BaseHiraKataToggle = CANNA_FN_BaseHiraKataToggle;
-
DEFVAR_INT ("canna-func-base-zenkaku-hankaku-toggle",
- &canna_fn_BaseZenHanToggle /*
+ &Vcanna_fn_BaseZenHanToggle /*
*/ );
- canna_fn_BaseZenHanToggle = CANNA_FN_BaseZenHanToggle;
-
DEFVAR_INT ("canna-func-base-kana-eisu-toggle",
- &canna_fn_BaseKanaEisuToggle /*
+ &Vcanna_fn_BaseKanaEisuToggle /*
*/ );
- canna_fn_BaseKanaEisuToggle = CANNA_FN_BaseKanaEisuToggle;
-
DEFVAR_INT ("canna-func-base-kakutei-henkan-toggle",
- &canna_fn_BaseKakuteiHenkanToggle /*
+ &Vcanna_fn_BaseKakuteiHenkanToggle /*
*/ );
- canna_fn_BaseKakuteiHenkanToggle = CANNA_FN_BaseKakuteiHenkanToggle;
-
DEFVAR_INT ("canna-func-base-rotate-forward",
- &canna_fn_BaseRotateForward /*
+ &Vcanna_fn_BaseRotateForward /*
*/ );
- canna_fn_BaseRotateForward = CANNA_FN_BaseRotateForward;
-
DEFVAR_INT ("canna-func-base-rotate-backward",
- &canna_fn_BaseRotateBackward /*
+ &Vcanna_fn_BaseRotateBackward /*
*/ );
- canna_fn_BaseRotateBackward = CANNA_FN_BaseRotateBackward;
-
#endif
- DEFVAR_INT ("canna-func-extend-mode", &canna_fn_ExtendMode /*
+ DEFVAR_INT ("canna-func-extend-mode", &Vcanna_fn_ExtendMode /*
*/ );
- canna_fn_ExtendMode = IROHA_FN_ExtendMode;
-
- DEFVAR_INT ("canna-func-touroku", &canna_fn_Touroku /*
+ DEFVAR_INT ("canna-func-touroku", &Vcanna_fn_Touroku /*
*/ );
- canna_fn_Touroku = IROHA_FN_Touroku;
-
- DEFVAR_INT ("canna-func-hex-mode", &canna_fn_HexMode /*
+ DEFVAR_INT ("canna-func-hex-mode", &Vcanna_fn_HexMode /*
*/ );
- canna_fn_HexMode = IROHA_FN_HexMode;
-
- DEFVAR_INT ("canna-func-bushu-mode", &canna_fn_BushuMode /*
+ DEFVAR_INT ("canna-func-bushu-mode", &Vcanna_fn_BushuMode /*
*/ );
- canna_fn_BushuMode = IROHA_FN_BushuMode;
-
- DEFVAR_INT ("canna-func-kigo-mode", &canna_fn_KigouMode /*
+ DEFVAR_INT ("canna-func-kigo-mode", &Vcanna_fn_KigouMode /*
*/ );
- canna_fn_KigouMode = IROHA_FN_KigouMode;
-
#ifdef CANNA_FN_Mark
- DEFVAR_INT ("canna-func-mark", &canna_fn_Mark /*
+ DEFVAR_INT ("canna-func-mark", &Vcanna_fn_Mark /*
*/ );
- canna_fn_Mark = CANNA_FN_Mark;
#endif
#ifdef CANNA_FN_TemporalMode
- DEFVAR_INT ("canna-func-temporal-mode", &canna_fn_TemporalMode /*
+ DEFVAR_INT ("canna-func-temporal-mode", &Vcanna_fn_TemporalMode /*
*/ );
- canna_fn_TemporalMode = CANNA_FN_TemporalMode;
#endif
- DEFVAR_INT ("canna-key-nfer", &canna_key_Nfer /*
+ DEFVAR_INT ("canna-key-nfer", &Vcanna_key_Nfer /*
*/ );
- canna_key_Nfer = IROHA_KEY_Nfer;
-
- DEFVAR_INT ("canna-key-xfer", &canna_key_Xfer /*
+ DEFVAR_INT ("canna-key-xfer", &Vcanna_key_Xfer /*
*/ );
- canna_key_Xfer = IROHA_KEY_Xfer;
-
- DEFVAR_INT ("canna-key-up", &canna_key_Up /*
+ DEFVAR_INT ("canna-key-up", &Vcanna_key_Up /*
*/ );
- canna_key_Up = IROHA_KEY_Up;
-
- DEFVAR_INT ("canna-key-left", &canna_key_Left /*
+ DEFVAR_INT ("canna-key-left", &Vcanna_key_Left /*
*/ );
- canna_key_Left = IROHA_KEY_Left;
-
- DEFVAR_INT ("canna-key-right", &canna_key_Right /*
+ DEFVAR_INT ("canna-key-right", &Vcanna_key_Right /*
*/ );
- canna_key_Right = IROHA_KEY_Right;
-
- DEFVAR_INT ("canna-key-down", &canna_key_Down /*
+ DEFVAR_INT ("canna-key-down", &Vcanna_key_Down /*
*/ );
- canna_key_Down = IROHA_KEY_Down;
-
- DEFVAR_INT ("canna-key-insert", &canna_key_Insert /*
+ DEFVAR_INT ("canna-key-insert", &Vcanna_key_Insert /*
*/ );
- canna_key_Insert = IROHA_KEY_Insert;
-
- DEFVAR_INT ("canna-key-rollup", &canna_key_Rollup /*
+ DEFVAR_INT ("canna-key-rollup", &Vcanna_key_Rollup /*
*/ );
- canna_key_Rollup = IROHA_KEY_Rollup;
-
- DEFVAR_INT ("canna-key-rolldown", &canna_key_Rolldown /*
+ DEFVAR_INT ("canna-key-rolldown", &Vcanna_key_Rolldown /*
*/ );
- canna_key_Rolldown = IROHA_KEY_Rolldown;
-
- DEFVAR_INT ("canna-key-home", &canna_key_Home /*
+ DEFVAR_INT ("canna-key-home", &Vcanna_key_Home /*
*/ );
- canna_key_Home = IROHA_KEY_Home;
-
- DEFVAR_INT ("canna-key-help", &canna_key_Help /*
+ DEFVAR_INT ("canna-key-help", &Vcanna_key_Help /*
*/ );
- canna_key_Help = IROHA_KEY_Help;
-
- DEFVAR_INT ("canna-key-kp-key", &canna_key_KP_Key /*
+ DEFVAR_INT ("canna-key-kp-key", &Vcanna_key_KP_Key /*
*/ );
- canna_key_KP_Key = IROHA_KEY_KP_Key;
-
- DEFVAR_INT ("canna-key-shift-nfer", &canna_key_Shift_Nfer /*
+ DEFVAR_INT ("canna-key-shift-nfer", &Vcanna_key_Shift_Nfer /*
*/ );
- canna_key_Shift_Nfer = IROHA_KEY_Shift_Nfer;
-
- DEFVAR_INT ("canna-key-shift-xfer", &canna_key_Shift_Xfer /*
+ DEFVAR_INT ("canna-key-shift-xfer", &Vcanna_key_Shift_Xfer /*
*/ );
- canna_key_Shift_Xfer = IROHA_KEY_Shift_Xfer;
-
- DEFVAR_INT ("canna-key-shift-up", &canna_key_Shift_Up /*
+ DEFVAR_INT ("canna-key-shift-up", &Vcanna_key_Shift_Up /*
*/ );
- canna_key_Shift_Up = IROHA_KEY_Shift_Up;
-
- DEFVAR_INT ("canna-key-shift-left", &canna_key_Shift_Left /*
+ DEFVAR_INT ("canna-key-shift-left", &Vcanna_key_Shift_Left /*
*/ );
- canna_key_Shift_Left = IROHA_KEY_Shift_Left;
-
- DEFVAR_INT ("canna-key-shift-right", &canna_key_Shift_Right /*
+ DEFVAR_INT ("canna-key-shift-right", &Vcanna_key_Shift_Right /*
*/ );
- canna_key_Shift_Right = IROHA_KEY_Shift_Right;
-
- DEFVAR_INT ("canna-key-shift-down", &canna_key_Shift_Down /*
+ DEFVAR_INT ("canna-key-shift-down", &Vcanna_key_Shift_Down /*
*/ );
- canna_key_Shift_Down = IROHA_KEY_Shift_Down;
-
- DEFVAR_INT ("canna-key-control-nfer", &canna_key_Cntrl_Nfer /*
+ DEFVAR_INT ("canna-key-control-nfer", &Vcanna_key_Cntrl_Nfer /*
*/ );
- canna_key_Cntrl_Nfer = IROHA_KEY_Cntrl_Nfer;
-
- DEFVAR_INT ("canna-key-control-xfer", &canna_key_Cntrl_Xfer /*
+ DEFVAR_INT ("canna-key-control-xfer", &Vcanna_key_Cntrl_Xfer /*
*/ );
- canna_key_Cntrl_Xfer = IROHA_KEY_Cntrl_Xfer;
-
- DEFVAR_INT ("canna-key-control-up", &canna_key_Cntrl_Up /*
+ DEFVAR_INT ("canna-key-control-up", &Vcanna_key_Cntrl_Up /*
*/ );
- canna_key_Cntrl_Up = IROHA_KEY_Cntrl_Up;
-
- DEFVAR_INT ("canna-key-control-left", &canna_key_Cntrl_Left /*
+ DEFVAR_INT ("canna-key-control-left", &Vcanna_key_Cntrl_Left /*
*/ );
- canna_key_Cntrl_Left = IROHA_KEY_Cntrl_Left;
-
- DEFVAR_INT ("canna-key-control-right", &canna_key_Cntrl_Right /*
+ DEFVAR_INT ("canna-key-control-right", &Vcanna_key_Cntrl_Right /*
*/ );
- canna_key_Cntrl_Right = IROHA_KEY_Cntrl_Right;
-
- DEFVAR_INT ("canna-key-control-down", &canna_key_Cntrl_Down /*
+ DEFVAR_INT ("canna-key-control-down", &Vcanna_key_Cntrl_Down /*
*/ );
- canna_key_Cntrl_Down = IROHA_KEY_Cntrl_Down;
Fprovide(intern("CANNA"));
}
c2mu (char *cp, int l, char *mp)
{
char ch, *ep = cp+l;
-
+
while ((cp < ep) && (ch = *cp))
{
if ((unsigned char) ch == ISO_CODE_SS2)
static void
m2c (unsigned char *mp, int l, unsigned char *cp)
{
- unsigned char ch, *ep = mp + l;
-
+ unsigned char ch, *ep = mp + l;;
+
while ((mp < ep) && (ch = *mp++))
{
switch (ch)
*cp++ = ch;
break;
}
- }
+ }
*cp = 0;
}
mule_make_string (unsigned char *p, int l)
{
unsigned char cbuf[4096];
-
+
c2mu (p,l,cbuf);
return (make_string (cbuf,strlen (cbuf)));
-}
+}
/* return the MULE internal string length of EUC string */
/* Modified by sb to return a character count not byte count. */
{
unsigned char ch, *cp = p;
int len = 0;
-
+
while ((cp < p + l) && (ch = *cp))
{
if ((unsigned char) ch == ISO_CODE_SS2)
else
{
len++;
- cp++;
+ cp++;
}
}
return (len);
int *crev)
{
unsigned char *q = p;
-
+
*clen = *cpos = *crev = 0;
if (len == 0) return;
while (q < p + pos)
(*clen)++;
(*crev)++;
if (*q++ & 0x80) q++;
- }
+ }
while (q < p + len)
{
(*clen)++;
else \
{ \
Bufbyte work[MAX_EMCHAR_LEN]; \
- int len = ( ch < ( conversion_mode == CCL_MODE_ENCODING ? \
- 256 : 128 ) ) ? \
+ int len = ( ch < 256 ) ? \
simple_set_charptr_emchar (work, ch) : \
non_ascii_set_charptr_emchar (work, ch); \
Dynarr_add_many (destination, work, len); \
};
int
-ccl_driver (struct ccl_program *ccl, CONST unsigned char *source, unsigned_char_dynarr *destination, int src_bytes, int *consumed, int conversion_mode)
+ccl_driver (struct ccl_program *ccl, CONST unsigned char *source, unsigned_char_dynarr *destination, int src_bytes, int *consumed)
{
int *reg = ccl->reg;
int ic = ccl->ic;
case CCL_MOD: reg[rrr] = i % j; break;
case CCL_AND: reg[rrr] = i & j; break;
case CCL_OR: reg[rrr] = i | j; break;
- case CCL_XOR: reg[rrr] = i ^ j; break;
+ case CCL_XOR: reg[rrr] = i ^ j;; break;
case CCL_LSH: reg[rrr] = i << j; break;
case CCL_RSH: reg[rrr] = i >> j; break;
case CCL_LSH8: reg[rrr] = (i << 8) | j; break;
: 0);
ccl_driver (&ccl, (CONST unsigned char *)0, (unsigned_char_dynarr *)0,
- 0, (int *)0, CCL_MODE_ENCODING);
+ 0, (int *)0);
QUIT;
if (ccl.status != CCL_STAT_SUCCESS)
error ("Error in CCL program at %dth code", ccl.ic);
outbuf = Dynarr_new (unsigned_char);
ccl.last_block = NILP (contin);
produced = ccl_driver (&ccl, XSTRING_DATA (str), outbuf,
- XSTRING_LENGTH (str), (int *)0, CCL_MODE_ENCODING);
+ XSTRING_LENGTH (str), (int *)0);
for (i = 0; i < 8; i++)
XVECTOR_DATA (status)[i] = make_int(ccl.reg[i]);
XSETINT (XVECTOR_DATA (status)[8], ccl.ic);
void
syms_of_mule_ccl (void)
{
- DEFSUBR (Fccl_execute);
- DEFSUBR (Fccl_execute_on_string);
- DEFSUBR (Fregister_ccl_program);
-}
-
-void
-vars_of_mule_ccl (void)
-{
staticpro (&Vccl_program_table);
Vccl_program_table = Fmake_vector (make_int (32), Qnil);
If the font is single-byte font, the register R2 is not used.
*/ );
Vfont_ccl_encoder_alist = Qnil;
+
+ DEFSUBR (Fccl_execute);
+ DEFSUBR (Fccl_execute_on_string);
+ DEFSUBR (Fregister_ccl_program);
}
#endif /* emacs */
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
-/* Synched up with: FSF 20.3. Not in FSF. */
+/* Synched up with: Mule 2.3. Not in FSF. */
/* Rewritten by Ben Wing <ben@xemacs.org>. */
Lisp_Object Vcharset_latin_iso8859_2;
Lisp_Object Vcharset_latin_iso8859_3;
Lisp_Object Vcharset_latin_iso8859_4;
-Lisp_Object Vcharset_thai_tis620;
-Lisp_Object Vcharset_greek_iso8859_7;
+Lisp_Object Vcharset_cyrillic_iso8859_5;
Lisp_Object Vcharset_arabic_iso8859_6;
+Lisp_Object Vcharset_greek_iso8859_7;
Lisp_Object Vcharset_hebrew_iso8859_8;
+Lisp_Object Vcharset_latin_iso8859_9;
+Lisp_Object Vcharset_thai_tis620;
Lisp_Object Vcharset_katakana_jisx0201;
Lisp_Object Vcharset_latin_jisx0201;
-Lisp_Object Vcharset_cyrillic_iso8859_5;
-Lisp_Object Vcharset_latin_iso8859_9;
Lisp_Object Vcharset_japanese_jisx0208_1978;
-Lisp_Object Vcharset_chinese_gb2312;
Lisp_Object Vcharset_japanese_jisx0208;
-Lisp_Object Vcharset_korean_ksc5601;
Lisp_Object Vcharset_japanese_jisx0212;
-Lisp_Object Vcharset_chinese_cns11643_1;
-Lisp_Object Vcharset_chinese_cns11643_2;
+Lisp_Object Vcharset_chinese_gb2312;
Lisp_Object Vcharset_chinese_big5_1;
Lisp_Object Vcharset_chinese_big5_2;
-
-#ifdef ENABLE_COMPOSITE_CHARS
+Lisp_Object Vcharset_chinese_cns11643_1;
+Lisp_Object Vcharset_chinese_cns11643_2;
+Lisp_Object Vcharset_korean_ksc5601;
Lisp_Object Vcharset_composite;
-/* Hash tables for composite chars. One maps string representing
+/* Hashtables for composite chars. One maps string representing
composed chars to their equivalent chars; one goes the
other way. */
-Lisp_Object Vcomposite_char_char2string_hash_table;
-Lisp_Object Vcomposite_char_string2char_hash_table;
-
-static int composite_char_row_next;
-static int composite_char_col_next;
-
-#endif /* ENABLE_COMPOSITE_CHARS */
+Lisp_Object Vcomposite_char_char2string_hashtable;
+Lisp_Object Vcomposite_char_string2char_hashtable;
/* Table of charsets indexed by leading byte. */
Lisp_Object charset_by_leading_byte[128];
/* Table of charsets indexed by type/final-byte/direction. */
Lisp_Object charset_by_attributes[4][128][2];
+static int composite_char_row_next;
+static int composite_char_col_next;
+
/* Table of number of bytes in the string representation of a character
indexed by the first byte of that representation.
Lisp_Object Qdirection;
Lisp_Object Qreverse_direction_charset;
Lisp_Object Qccl_program;
-Lisp_Object Qleading_byte;
-Lisp_Object Qshort_name, Qlong_name;
-Lisp_Object Qascii,
- Qcontrol_1,
+Lisp_Object Qascii, Qcontrol_1,
+
Qlatin_iso8859_1,
Qlatin_iso8859_2,
Qlatin_iso8859_3,
Qlatin_iso8859_4,
- Qthai_tis620,
- Qgreek_iso8859_7,
+ Qcyrillic_iso8859_5,
Qarabic_iso8859_6,
+ Qgreek_iso8859_7,
Qhebrew_iso8859_8,
- Qkatakana_jisx0201,
- Qlatin_jisx0201,
- Qcyrillic_iso8859_5,
Qlatin_iso8859_9,
+
+ Qthai_tis620,
+
+ Qkatakana_jisx0201, Qlatin_jisx0201,
Qjapanese_jisx0208_1978,
- Qchinese_gb2312,
Qjapanese_jisx0208,
- Qkorean_ksc5601,
Qjapanese_jisx0212,
- Qchinese_cns11643_1,
- Qchinese_cns11643_2,
- Qchinese_big5_1,
- Qchinese_big5_2,
- Qcomposite;
+
+ Qchinese_gb2312,
+ Qchinese_big5_1, Qchinese_big5_2,
+ Qchinese_cns11643_1, Qchinese_cns11643_2,
+
+ Qkorean_ksc5601, Qcomposite;
Lisp_Object Ql2r, Qr2l;
-Lisp_Object Vcharset_hash_table;
+Lisp_Object Vcharset_hashtable;
static Bufbyte next_allocated_1_byte_leading_byte;
static Bufbyte next_allocated_2_byte_leading_byte;
if (f2 < 0x20 || f3 < 0x20)
return 0;
-#ifdef ENABLE_COMPOSITE_CHARS
if (f1 + FIELD1_TO_OFFICIAL_LEADING_BYTE == LEADING_BYTE_COMPOSITE)
{
if (UNBOUNDP (Fgethash (make_int (ch),
- Vcomposite_char_char2string_hash_table,
+ Vcomposite_char_char2string_hashtable,
Qunbound)))
return 0;
return 1;
}
-#endif /* ENABLE_COMPOSITE_CHARS */
if (f2 != 0x20 && f2 != 0x7F && f3 != 0x20 && f3 != 0x7F)
return 1;
{
struct Lisp_Charset *cs = XCHARSET (obj);
- markobj (cs->short_name);
- markobj (cs->long_name);
- markobj (cs->doc_string);
- markobj (cs->registry);
- markobj (cs->ccl_program);
+ (markobj) (cs->doc_string);
+ (markobj) (cs->registry);
+ (markobj) (cs->ccl_program);
return cs->name;
}
write_c_string ("#<charset ", printcharfun);
print_internal (CHARSET_NAME (cs), printcharfun, 0);
write_c_string (" ", printcharfun);
- print_internal (CHARSET_SHORT_NAME (cs), printcharfun, 1);
- write_c_string (" ", printcharfun);
- print_internal (CHARSET_LONG_NAME (cs), printcharfun, 1);
- write_c_string (" ", printcharfun);
print_internal (CHARSET_DOC_STRING (cs), printcharfun, 1);
sprintf (buf, " %s %s cols=%d g%d final='%c' reg=",
CHARSET_TYPE (cs) == CHARSET_TYPE_94 ? "94" :
write_c_string (buf, printcharfun);
}
-static const struct lrecord_description charset_description[] = {
- { XD_LISP_OBJECT, offsetof(struct Lisp_Charset, name), 7 },
- { XD_END }
-};
-
DEFINE_LRECORD_IMPLEMENTATION ("charset", charset,
- mark_charset, print_charset, 0, 0, 0, charset_description,
+ mark_charset, print_charset, 0, 0, 0,
struct Lisp_Charset);
/* Make a new charset. */
static Lisp_Object
-make_charset (int id, Lisp_Object name, unsigned char rep_bytes,
+make_charset (int id, Lisp_Object name, Bufbyte leading_byte, unsigned char rep_bytes,
unsigned char type, unsigned char columns, unsigned char graphic,
- Bufbyte final, unsigned char direction, Lisp_Object short_name,
- Lisp_Object long_name, Lisp_Object doc,
+ Bufbyte final, unsigned char direction, Lisp_Object doc,
Lisp_Object reg)
{
Lisp_Object obj;
struct Lisp_Charset *cs =
- alloc_lcrecord_type (struct Lisp_Charset, &lrecord_charset);
+ alloc_lcrecord_type (struct Lisp_Charset, lrecord_charset);
XSETCHARSET (obj, cs);
CHARSET_ID (cs) = id;
CHARSET_NAME (cs) = name;
- CHARSET_SHORT_NAME (cs) = short_name;
- CHARSET_LONG_NAME (cs) = long_name;
+ CHARSET_LEADING_BYTE (cs) = leading_byte;
CHARSET_REP_BYTES (cs) = rep_bytes;
CHARSET_DIRECTION (cs) = direction;
CHARSET_TYPE (cs) = type;
CHARSET_TYPE (cs) == CHARSET_TYPE_96) ? 1 : 2;
CHARSET_CHARS (cs) = (CHARSET_TYPE (cs) == CHARSET_TYPE_94 ||
CHARSET_TYPE (cs) == CHARSET_TYPE_94X94) ? 94 : 96;
-
+
if (final)
{
/* some charsets do not have final characters. This includes
charset_by_attributes[type][final][direction] = obj;
}
- assert (NILP (charset_by_leading_byte[id - 128]));
- charset_by_leading_byte[id - 128] = obj;
- if (id < 0xA0)
+ assert (NILP (charset_by_leading_byte[leading_byte - 128]));
+ charset_by_leading_byte[leading_byte - 128] = obj;
+ if (leading_byte < 0xA0)
/* official leading byte */
- rep_bytes_by_first_byte[id] = rep_bytes;
+ rep_bytes_by_first_byte[leading_byte] = rep_bytes;
/* Some charsets are "faux" and don't have names or really exist at
all except in the leading-byte table. */
if (!NILP (name))
- Fputhash (name, obj, Vcharset_hash_table);
+ Fputhash (name, obj, Vcharset_hashtable);
return obj;
}
return charset_or_name;
CHECK_SYMBOL (charset_or_name);
- return Fgethash (charset_or_name, Vcharset_hash_table, Qnil);
+ return Fgethash (charset_or_name, Vcharset_hashtable, Qnil);
}
DEFUN ("get-charset", Fget_charset, 1, 1, 0, /*
};
static int
-add_charset_to_list_mapper (Lisp_Object key, Lisp_Object value,
+add_charset_to_list_mapper (CONST void *hash_key, void *hash_contents,
void *charset_list_closure)
{
/* This function can GC */
+ Lisp_Object key, contents;
+ Lisp_Object *charset_list;
struct charset_list_closure *chcl =
(struct charset_list_closure*) charset_list_closure;
- Lisp_Object *charset_list = chcl->charset_list;
+ CVOID_TO_LISP (key, hash_key);
+ VOID_TO_LISP (contents, hash_contents);
+ charset_list = chcl->charset_list;
- *charset_list = Fcons (XCHARSET_NAME (value), *charset_list);
+ *charset_list = Fcons (XCHARSET_NAME (contents), *charset_list);
return 0;
}
GCPRO1 (charset_list);
charset_list_closure.charset_list = &charset_list;
- elisp_maphash (add_charset_to_list_mapper, Vcharset_hash_table,
+ elisp_maphash (add_charset_to_list_mapper, Vcharset_hashtable,
&charset_list_closure);
UNGCPRO;
PROPS is a property list, describing the specific nature of the
character set. Recognized properties are:
-'short-name Short version of the charset name (ex: Latin-1)
-'long-name Long version of the charset name (ex: ISO8859-1 (Latin-1))
'registry A regular expression matching the font registry field for
this character set.
'dimension Number of octets used to index a character in this charset.
*/
(name, doc_string, props))
{
- int id, dimension = 1, chars = 94, graphic = 0, final = 0, columns = -1;
+ int lb, dimension = 1, chars = 94, graphic = 0, final = 0, columns = -1;
int direction = CHARSET_LEFT_TO_RIGHT;
int type;
Lisp_Object registry = Qnil;
Lisp_Object charset;
Lisp_Object rest, keyword, value;
Lisp_Object ccl_program = Qnil;
- Lisp_Object short_name = Qnil, long_name = Qnil;
CHECK_SYMBOL (name);
if (!NILP (doc_string))
EXTERNAL_PROPERTY_LIST_LOOP (rest, keyword, value, props)
{
- if (EQ (keyword, Qshort_name))
- {
- CHECK_STRING (value);
- short_name = value;
- }
-
- if (EQ (keyword, Qlong_name))
- {
- CHECK_STRING (value);
- long_name = value;
- }
-
- else if (EQ (keyword, Qdimension))
+ if (EQ (keyword, Qdimension))
{
CHECK_INT (value);
dimension = XINT (value);
error
("Character set already defined for this DIMENSION/CHARS/FINAL combo");
- id = get_unallocated_leading_byte (dimension);
+ lb = get_unallocated_leading_byte (dimension);
if (NILP (doc_string))
doc_string = build_string ("");
if (NILP (registry))
registry = build_string ("");
- if (NILP (short_name))
- XSETSTRING (short_name, XSYMBOL (name)->name);
-
- if (NILP (long_name))
- long_name = doc_string;
-
if (columns == -1)
columns = dimension;
- charset = make_charset (id, name, dimension + 2, type, columns, graphic,
- final, direction, short_name, long_name, doc_string, registry);
+ charset = make_charset (-1, name, lb, dimension + 2, type, columns, graphic,
+ final, direction, doc_string, registry);
if (!NILP (ccl_program))
XCHARSET_CCL_PROGRAM (charset) = ccl_program;
return charset;
(charset, new_name))
{
Lisp_Object new_charset = Qnil;
- int id, dimension, columns, graphic, final;
+ int lb, dimension, columns, graphic, final;
int direction, type;
- Lisp_Object registry, doc_string, short_name, long_name;
+ Lisp_Object registry, doc_string;
struct Lisp_Charset *cs;
charset = Fget_charset (charset);
type = CHARSET_TYPE (cs);
columns = CHARSET_COLUMNS (cs);
dimension = CHARSET_DIMENSION (cs);
- id = get_unallocated_leading_byte (dimension);
+ lb = get_unallocated_leading_byte (dimension);
graphic = CHARSET_GRAPHIC (cs);
final = CHARSET_FINAL (cs);
if (CHARSET_DIRECTION (cs) == CHARSET_RIGHT_TO_LEFT)
direction = CHARSET_LEFT_TO_RIGHT;
doc_string = CHARSET_DOC_STRING (cs);
- short_name = CHARSET_SHORT_NAME (cs);
- long_name = CHARSET_LONG_NAME (cs);
registry = CHARSET_REGISTRY (cs);
- new_charset = make_charset (id, new_name, dimension + 2, type, columns,
- graphic, final, direction, short_name, long_name,
- doc_string, registry);
+ new_charset = make_charset (-1, new_name, lb, dimension + 2, type, columns,
+ graphic, final, direction, doc_string, registry);
CHARSET_REVERSE_DIRECTION_CHARSET (cs) = new_charset;
XCHARSET_REVERSE_DIRECTION_CHARSET (new_charset) = charset;
return obj;
}
-DEFUN ("charset-short-name", Fcharset_short_name, 1, 1, 0, /*
-Return short name of CHARSET.
-*/
- (charset))
-{
- return XCHARSET_SHORT_NAME (Fget_charset (charset));
-}
-
-DEFUN ("charset-long-name", Fcharset_long_name, 1, 1, 0, /*
-Return long name of CHARSET.
-*/
- (charset))
-{
- return XCHARSET_LONG_NAME (Fget_charset (charset));
-}
-
-DEFUN ("charset-description", Fcharset_description, 1, 1, 0, /*
-Return description of CHARSET.
+DEFUN ("charset-doc-string", Fcharset_doc_string, 1, 1, 0, /*
+Return doc string of CHARSET.
*/
(charset))
{
CHECK_SYMBOL (prop);
if (EQ (prop, Qname)) return CHARSET_NAME (cs);
- if (EQ (prop, Qshort_name)) return CHARSET_SHORT_NAME (cs);
- if (EQ (prop, Qlong_name)) return CHARSET_LONG_NAME (cs);
if (EQ (prop, Qdoc_string)) return CHARSET_DOC_STRING (cs);
if (EQ (prop, Qdimension)) return make_int (CHARSET_DIMENSION (cs));
if (EQ (prop, Qcolumns)) return make_int (CHARSET_COLUMNS (cs));
*/
(charset))
{
- return make_int(XCHARSET_LEADING_BYTE (Fget_charset (charset)));
+ return make_int(XCHARSET_ID (Fget_charset (charset)));
}
/* #### We need to figure out which properties we really want to
invalidate_charset_font_caches (Lisp_Object charset)
{
/* Invalidate font cache entries for charset on all devices. */
- Lisp_Object devcons, concons, hash_table;
+ Lisp_Object devcons, concons, hashtab;
DEVICE_LOOP_NO_BREAK (devcons, concons)
{
struct device *d = XDEVICE (XCAR (devcons));
- hash_table = Fgethash (charset, d->charset_font_cache, Qunbound);
- if (!UNBOUNDP (hash_table))
- Fclrhash (hash_table);
+ hashtab = Fgethash (charset, d->charset_font_cache, Qunbound);
+ if (!UNBOUNDP (hashtab))
+ Fclrhash (hashtab);
}
}
/************************************************************************/
DEFUN ("make-char", Fmake_char, 2, 3, 0, /*
-Make a character from CHARSET and octets ARG1 and ARG2.
-ARG2 is required only for characters from two-dimensional charsets.
-For example, (make-char 'latin-iso8859-2 185) will return the Latin 2
-character s with caron.
+Make a multi-byte character from CHARSET and octets ARG1 and ARG2.
*/
(charset, arg1, arg2))
{
else /* CHARSET_CHARS (cs) == 96) */ lowlim = 32, highlim = 127;
CHECK_INT (arg1);
- /* It is useful (and safe, according to Olivier Galibert) to strip
- the 8th bit off ARG1 and ARG2 becaue it allows programmers to
- write (make-char 'latin-iso8859-2 CODE) where code is the actual
- Latin 2 code of the character. */
- a1 = XINT (arg1) & 0x7f;
+ a1 = XINT (arg1);
if (a1 < lowlim || a1 > highlim)
args_out_of_range_3 (arg1, make_int (lowlim), make_int (highlim));
}
CHECK_INT (arg2);
- a2 = XINT (arg2) & 0x7f;
+ a2 = XINT (arg2);
if (a2 < lowlim || a2 > highlim)
args_out_of_range_3 (arg2, make_int (lowlim), make_int (highlim));
(CHAR_LEADING_BYTE (XCHAR (ch))));
}
-DEFUN ("split-char", Fsplit_char, 1, 1, 0, /*
-Return list of charset and one or two position-codes of CHAR.
+DEFUN ("char-octet", Fchar_octet, 1, 2, 0, /*
+Return the octet numbered N (should be 0 or 1) of char CH.
+N defaults to 0 if omitted.
*/
- (character))
+ (ch, n))
{
- /* This function can GC */
- struct gcpro gcpro1, gcpro2;
- Lisp_Object charset = Qnil;
- Lisp_Object rc = Qnil;
- int c1, c2;
-
- GCPRO2 (charset, rc);
- CHECK_CHAR_COERCE_INT (character);
-
- BREAKUP_CHAR (XCHAR (character), charset, c1, c2);
+ Lisp_Object charset;
+ int c1, c2, int_n;
- if (XCHARSET_DIMENSION (Fget_charset (charset)) == 2)
- {
- rc = list3 (XCHARSET_NAME (charset), make_int (c1), make_int (c2));
- }
+ CHECK_CHAR_COERCE_INT (ch);
+ if (NILP (n))
+ int_n = 0;
else
{
- rc = list2 (XCHARSET_NAME (charset), make_int (c1));
+ CHECK_INT (n);
+ int_n = XINT (n);
+ if (int_n != 0 && int_n != 1)
+ signal_simple_error ("Octet number must be 0 or 1", n);
}
- UNGCPRO;
-
- return rc;
+ BREAKUP_CHAR (XCHAR (ch), charset, c1, c2);
+ return make_int (int_n == 0 ? c1 : c2);
}
\f
-#ifdef ENABLE_COMPOSITE_CHARS
/************************************************************************/
/* composite character functions */
/************************************************************************/
{
Lisp_Object lispstr = make_string (str, len);
Lisp_Object ch = Fgethash (lispstr,
- Vcomposite_char_string2char_hash_table,
+ Vcomposite_char_string2char_hashtable,
Qunbound);
Emchar emch;
emch = MAKE_CHAR (Vcharset_composite, composite_char_row_next,
composite_char_col_next);
Fputhash (make_char (emch), lispstr,
- Vcomposite_char_char2string_hash_table);
+ Vcomposite_char_char2string_hashtable);
Fputhash (lispstr, make_char (emch),
- Vcomposite_char_string2char_hash_table);
+ Vcomposite_char_string2char_hashtable);
composite_char_col_next++;
if (composite_char_col_next >= 128)
{
composite_char_string (Emchar ch)
{
Lisp_Object str = Fgethash (make_char (ch),
- Vcomposite_char_char2string_hash_table,
+ Vcomposite_char_char2string_hashtable,
Qunbound);
assert (!UNBOUNDP (str));
return str;
}
-xxDEFUN ("make-composite-char", Fmake_composite_char, 1, 1, 0, /*
+DEFUN ("make-composite-char", Fmake_composite_char, 1, 1, 0, /*
Convert a string into a single composite character.
The character is the result of overstriking all the characters in
the string.
XSTRING_LENGTH (string)));
}
-xxDEFUN ("composite-char-string", Fcomposite_char_string, 1, 1, 0, /*
+DEFUN ("composite-char-string", Fcomposite_char_string, 1, 1, 0, /*
Return a string of the characters comprising a composite character.
*/
(ch))
signal_simple_error ("Must be composite char", ch);
return composite_char_string (emch);
}
-#endif /* ENABLE_COMPOSITE_CHARS */
\f
/************************************************************************/
DEFSUBR (Fmake_reverse_direction_charset);
/* DEFSUBR (Freverse_direction_charset); */
DEFSUBR (Fcharset_from_attributes);
- DEFSUBR (Fcharset_short_name);
- DEFSUBR (Fcharset_long_name);
- DEFSUBR (Fcharset_description);
+ DEFSUBR (Fcharset_doc_string);
DEFSUBR (Fcharset_dimension);
DEFSUBR (Fcharset_property);
DEFSUBR (Fcharset_id);
DEFSUBR (Fmake_char);
DEFSUBR (Fchar_charset);
- DEFSUBR (Fsplit_char);
+ DEFSUBR (Fchar_octet);
-#ifdef ENABLE_COMPOSITE_CHARS
DEFSUBR (Fmake_composite_char);
DEFSUBR (Fcomposite_char_string);
-#endif
defsymbol (&Qcharsetp, "charsetp");
defsymbol (&Qregistry, "registry");
defsymbol (&Qdirection, "direction");
defsymbol (&Qreverse_direction_charset, "reverse-direction-charset");
defsymbol (&Qccl_program, "ccl-program");
- defsymbol (&Qshort_name, "short-name");
- defsymbol (&Qlong_name, "long-name");
defsymbol (&Ql2r, "l2r");
defsymbol (&Qr2l, "r2l");
- /* Charsets, compatible with FSF 20.3
+ /* Charsets, compatible with Emacs/Mule 19.33-delta
Naming convention is Script-Charset[-Edition] */
defsymbol (&Qascii, "ascii");
defsymbol (&Qcontrol_1, "control-1");
defsymbol (&Qlatin_iso8859_2, "latin-iso8859-2");
defsymbol (&Qlatin_iso8859_3, "latin-iso8859-3");
defsymbol (&Qlatin_iso8859_4, "latin-iso8859-4");
- defsymbol (&Qthai_tis620, "thai-tis620");
- defsymbol (&Qgreek_iso8859_7, "greek-iso8859-7");
+ defsymbol (&Qcyrillic_iso8859_5, "cyrillic-iso8859-5");
defsymbol (&Qarabic_iso8859_6, "arabic-iso8859-6");
+ defsymbol (&Qgreek_iso8859_7, "greek-iso8859-7");
defsymbol (&Qhebrew_iso8859_8, "hebrew-iso8859-8");
+ defsymbol (&Qlatin_iso8859_9, "latin-iso8859-9");
+ defsymbol (&Qthai_tis620, "thai-tis620");
+
defsymbol (&Qkatakana_jisx0201, "katakana-jisx0201");
defsymbol (&Qlatin_jisx0201, "latin-jisx0201");
- defsymbol (&Qcyrillic_iso8859_5, "cyrillic-iso8859-5");
- defsymbol (&Qlatin_iso8859_9, "latin-iso8859-9");
defsymbol (&Qjapanese_jisx0208_1978, "japanese-jisx0208-1978");
- defsymbol (&Qchinese_gb2312, "chinese-gb2312");
defsymbol (&Qjapanese_jisx0208, "japanese-jisx0208");
- defsymbol (&Qkorean_ksc5601, "korean-ksc5601");
defsymbol (&Qjapanese_jisx0212, "japanese-jisx0212");
- defsymbol (&Qchinese_cns11643_1, "chinese-cns11643-1");
- defsymbol (&Qchinese_cns11643_2, "chinese-cns11643-2");
+
+ defsymbol (&Qchinese_gb2312, "chinese-gb2312");
defsymbol (&Qchinese_big5_1, "chinese-big5-1");
defsymbol (&Qchinese_big5_2, "chinese-big5-2");
+ defsymbol (&Qchinese_cns11643_1, "chinese-cns11643-1");
+ defsymbol (&Qchinese_cns11643_2, "chinese-cns11643-2");
+ defsymbol (&Qkorean_ksc5601, "korean-ksc5601");
defsymbol (&Qcomposite, "composite");
}
void
complex_vars_of_mule_charset (void)
{
- staticpro (&Vcharset_hash_table);
- Vcharset_hash_table =
- make_lisp_hash_table (50, HASH_TABLE_NON_WEAK, HASH_TABLE_EQ);
+ staticpro (&Vcharset_hashtable);
+ Vcharset_hashtable = make_lisp_hashtable (50, HASHTABLE_NONWEAK,
+ HASHTABLE_EQ);
/* Predefined character sets. We store them into variables for
ease of access. */
Vcharset_ascii =
- make_charset (LEADING_BYTE_ASCII, Qascii, 1,
+ make_charset (0, Qascii, LEADING_BYTE_ASCII, 1,
CHARSET_TYPE_94, 1, 0, 'B',
CHARSET_LEFT_TO_RIGHT,
- build_string ("ASCII"),
- build_string ("ASCII)"),
- build_string ("ASCII (ISO646 IRV)"),
- build_string ("\\(iso8859-[0-9]*\\|-ascii\\)"));
+ build_string ("ASCII (ISO 646 IRV)"),
+ build_string ("iso8859-1"));
Vcharset_control_1 =
- make_charset (LEADING_BYTE_CONTROL_1, Qcontrol_1, 2,
- CHARSET_TYPE_94, 1, 1, 0,
+ make_charset (-1, Qcontrol_1, LEADING_BYTE_CONTROL_1, 2,
+ CHARSET_TYPE_94, 1, 0, 0,
CHARSET_LEFT_TO_RIGHT,
- build_string ("C1"),
build_string ("Control characters"),
- build_string ("Control characters 128-191"),
build_string (""));
Vcharset_latin_iso8859_1 =
- make_charset (LEADING_BYTE_LATIN_ISO8859_1, Qlatin_iso8859_1, 2,
+ make_charset (129, Qlatin_iso8859_1, LEADING_BYTE_LATIN_ISO8859_1, 2,
CHARSET_TYPE_96, 1, 1, 'A',
CHARSET_LEFT_TO_RIGHT,
- build_string ("Latin-1"),
- build_string ("ISO8859-1 (Latin-1)"),
- build_string ("ISO8859-1 (Latin-1)"),
+ build_string ("ISO 8859-1 (Latin-1)"),
build_string ("iso8859-1"));
Vcharset_latin_iso8859_2 =
- make_charset (LEADING_BYTE_LATIN_ISO8859_2, Qlatin_iso8859_2, 2,
+ make_charset (130, Qlatin_iso8859_2, LEADING_BYTE_LATIN_ISO8859_2, 2,
CHARSET_TYPE_96, 1, 1, 'B',
CHARSET_LEFT_TO_RIGHT,
- build_string ("Latin-2"),
- build_string ("ISO8859-2 (Latin-2)"),
- build_string ("ISO8859-2 (Latin-2)"),
+ build_string ("ISO 8859-2 (Latin-2)"),
build_string ("iso8859-2"));
Vcharset_latin_iso8859_3 =
- make_charset (LEADING_BYTE_LATIN_ISO8859_3, Qlatin_iso8859_3, 2,
+ make_charset (131, Qlatin_iso8859_3, LEADING_BYTE_LATIN_ISO8859_3, 2,
CHARSET_TYPE_96, 1, 1, 'C',
CHARSET_LEFT_TO_RIGHT,
- build_string ("Latin-3"),
- build_string ("ISO8859-3 (Latin-3)"),
- build_string ("ISO8859-3 (Latin-3)"),
+ build_string ("ISO 8859-3 (Latin-3)"),
build_string ("iso8859-3"));
Vcharset_latin_iso8859_4 =
- make_charset (LEADING_BYTE_LATIN_ISO8859_4, Qlatin_iso8859_4, 2,
+ make_charset (132, Qlatin_iso8859_4, LEADING_BYTE_LATIN_ISO8859_4, 2,
CHARSET_TYPE_96, 1, 1, 'D',
CHARSET_LEFT_TO_RIGHT,
- build_string ("Latin-4"),
- build_string ("ISO8859-4 (Latin-4)"),
- build_string ("ISO8859-4 (Latin-4)"),
+ build_string ("ISO 8859-4 (Latin-4)"),
build_string ("iso8859-4"));
- Vcharset_thai_tis620 =
- make_charset (LEADING_BYTE_THAI_TIS620, Qthai_tis620, 2,
- CHARSET_TYPE_96, 1, 1, 'T',
- CHARSET_LEFT_TO_RIGHT,
- build_string ("TIS620"),
- build_string ("TIS620 (Thai)"),
- build_string ("TIS620.2529 (Thai)"),
- build_string ("tis620"));
- Vcharset_greek_iso8859_7 =
- make_charset (LEADING_BYTE_GREEK_ISO8859_7, Qgreek_iso8859_7, 2,
- CHARSET_TYPE_96, 1, 1, 'F',
+ Vcharset_cyrillic_iso8859_5 =
+ make_charset (140, Qcyrillic_iso8859_5, LEADING_BYTE_CYRILLIC_ISO8859_5, 2,
+ CHARSET_TYPE_96, 1, 1, 'L',
CHARSET_LEFT_TO_RIGHT,
- build_string ("ISO8859-7"),
- build_string ("ISO8859-7 (Greek)"),
- build_string ("ISO8859-7 (Greek)"),
- build_string ("iso8859-7"));
+ build_string ("ISO 8859-5 (Cyrillic)"),
+ build_string ("iso8859-5"));
Vcharset_arabic_iso8859_6 =
- make_charset (LEADING_BYTE_ARABIC_ISO8859_6, Qarabic_iso8859_6, 2,
+ make_charset (135, Qarabic_iso8859_6, LEADING_BYTE_ARABIC_ISO8859_6, 2,
CHARSET_TYPE_96, 1, 1, 'G',
CHARSET_RIGHT_TO_LEFT,
- build_string ("ISO8859-6"),
- build_string ("ISO8859-6 (Arabic)"),
- build_string ("ISO8859-6 (Arabic)"),
+ build_string ("ISO 8859-6 (Arabic)"),
build_string ("iso8859-6"));
+ Vcharset_greek_iso8859_7 =
+ make_charset (134, Qgreek_iso8859_7, LEADING_BYTE_GREEK_ISO8859_7, 2,
+ CHARSET_TYPE_96, 1, 1, 'F',
+ CHARSET_LEFT_TO_RIGHT,
+ build_string ("ISO 8859-7 (Greek)"),
+ build_string ("iso8859-7"));
Vcharset_hebrew_iso8859_8 =
- make_charset (LEADING_BYTE_HEBREW_ISO8859_8, Qhebrew_iso8859_8, 2,
+ make_charset (136, Qhebrew_iso8859_8, LEADING_BYTE_HEBREW_ISO8859_8, 2,
CHARSET_TYPE_96, 1, 1, 'H',
CHARSET_RIGHT_TO_LEFT,
- build_string ("ISO8859-8"),
- build_string ("ISO8859-8 (Hebrew)"),
- build_string ("ISO8859-8 (Hebrew)"),
+ build_string ("ISO 8859-8 (Hebrew)"),
build_string ("iso8859-8"));
+ Vcharset_latin_iso8859_9 =
+ make_charset (141, Qlatin_iso8859_9, LEADING_BYTE_LATIN_ISO8859_9, 2,
+ CHARSET_TYPE_96, 1, 1, 'M',
+ CHARSET_LEFT_TO_RIGHT,
+ build_string ("ISO 8859-9 (Latin-5)"),
+ build_string ("iso8859-9"));
+ Vcharset_thai_tis620 =
+ make_charset (133, Qthai_tis620, LEADING_BYTE_THAI_TIS620, 2,
+ CHARSET_TYPE_96, 1, 1, 'T',
+ CHARSET_LEFT_TO_RIGHT,
+ build_string ("TIS 620.2529 (Thai)"),
+ build_string ("tis620"));
+
+ /* Japanese */
Vcharset_katakana_jisx0201 =
- make_charset (LEADING_BYTE_KATAKANA_JISX0201, Qkatakana_jisx0201, 2,
+ make_charset (137, Qkatakana_jisx0201,
+ LEADING_BYTE_KATAKANA_JISX0201, 2,
CHARSET_TYPE_94, 1, 1, 'I',
CHARSET_LEFT_TO_RIGHT,
- build_string ("JISX0201 Kana"),
- build_string ("JISX0201.1976 (Japanese Kana)"),
- build_string ("JISX0201.1976 Japanese Kana"),
+ build_string ("JIS X0201-Katakana"),
build_string ("jisx0201.1976"));
Vcharset_latin_jisx0201 =
- make_charset (LEADING_BYTE_LATIN_JISX0201, Qlatin_jisx0201, 2,
+ make_charset (138, Qlatin_jisx0201,
+ LEADING_BYTE_LATIN_JISX0201, 2,
CHARSET_TYPE_94, 1, 0, 'J',
CHARSET_LEFT_TO_RIGHT,
- build_string ("JISX0201 Roman"),
- build_string ("JISX0201.1976 (Japanese Roman)"),
- build_string ("JISX0201.1976 Japanese Roman"),
+ build_string ("JIS X0201-Latin"),
build_string ("jisx0201.1976"));
- Vcharset_cyrillic_iso8859_5 =
- make_charset (LEADING_BYTE_CYRILLIC_ISO8859_5, Qcyrillic_iso8859_5, 2,
- CHARSET_TYPE_96, 1, 1, 'L',
- CHARSET_LEFT_TO_RIGHT,
- build_string ("ISO8859-5"),
- build_string ("ISO8859-5 (Cyrillic)"),
- build_string ("ISO8859-5 (Cyrillic)"),
- build_string ("iso8859-5"));
- Vcharset_latin_iso8859_9 =
- make_charset (LEADING_BYTE_LATIN_ISO8859_9, Qlatin_iso8859_9, 2,
- CHARSET_TYPE_96, 1, 1, 'M',
- CHARSET_LEFT_TO_RIGHT,
- build_string ("Latin-5"),
- build_string ("ISO8859-9 (Latin-5)"),
- build_string ("ISO8859-9 (Latin-5)"),
- build_string ("iso8859-9"));
Vcharset_japanese_jisx0208_1978 =
- make_charset (LEADING_BYTE_JAPANESE_JISX0208_1978, Qjapanese_jisx0208_1978, 3,
+ make_charset (144, Qjapanese_jisx0208_1978,
+ LEADING_BYTE_JAPANESE_JISX0208_1978, 3,
CHARSET_TYPE_94X94, 2, 0, '@',
CHARSET_LEFT_TO_RIGHT,
- build_string ("JISX0208.1978"),
- build_string ("JISX0208.1978 (Japanese)"),
build_string
- ("JISX0208.1978 Japanese Kanji (so called \"old JIS\")"),
- build_string ("\\(jisx0208\\|jisc6226\\)\\.1978"));
- Vcharset_chinese_gb2312 =
- make_charset (LEADING_BYTE_CHINESE_GB2312, Qchinese_gb2312, 3,
- CHARSET_TYPE_94X94, 2, 0, 'A',
- CHARSET_LEFT_TO_RIGHT,
- build_string ("GB2312"),
- build_string ("GB2312)"),
- build_string ("GB2312 Chinese simplified"),
- build_string ("gb2312"));
+ ("JIS X0208-1978 (Japanese Kanji; Old Version)"),
+ build_string ("\\(jisx0208\\|jisc6226\\).19"));
Vcharset_japanese_jisx0208 =
- make_charset (LEADING_BYTE_JAPANESE_JISX0208, Qjapanese_jisx0208, 3,
+ make_charset (146, Qjapanese_jisx0208,
+ LEADING_BYTE_JAPANESE_JISX0208, 3,
CHARSET_TYPE_94X94, 2, 0, 'B',
CHARSET_LEFT_TO_RIGHT,
- build_string ("JISX0208"),
- build_string ("JISX0208.1983/1990 (Japanese)"),
- build_string ("JISX0208.1983/1990 Japanese Kanji"),
+ build_string ("JIS X0208-1983 (Japanese Kanji)"),
build_string ("jisx0208.19\\(83\\|90\\)"));
- Vcharset_korean_ksc5601 =
- make_charset (LEADING_BYTE_KOREAN_KSC5601, Qkorean_ksc5601, 3,
- CHARSET_TYPE_94X94, 2, 0, 'C',
- CHARSET_LEFT_TO_RIGHT,
- build_string ("KSC5601"),
- build_string ("KSC5601 (Korean"),
- build_string ("KSC5601 Korean Hangul and Hanja"),
- build_string ("ksc5601"));
Vcharset_japanese_jisx0212 =
- make_charset (LEADING_BYTE_JAPANESE_JISX0212, Qjapanese_jisx0212, 3,
+ make_charset (148, Qjapanese_jisx0212,
+ LEADING_BYTE_JAPANESE_JISX0212, 3,
CHARSET_TYPE_94X94, 2, 0, 'D',
CHARSET_LEFT_TO_RIGHT,
- build_string ("JISX0212"),
- build_string ("JISX0212 (Japanese)"),
- build_string ("JISX0212 Japanese Supplement"),
+ build_string ("JIS X0212 (Japanese Supplement)"),
build_string ("jisx0212"));
+ /* Chinese */
+ Vcharset_chinese_gb2312 =
+ make_charset (145, Qchinese_gb2312, LEADING_BYTE_CHINESE_GB2312, 3,
+ CHARSET_TYPE_94X94, 2, 0, 'A',
+ CHARSET_LEFT_TO_RIGHT,
+ build_string ("GB 2312 (Simplified Chinese)"),
+ build_string ("gb2312"));
#define CHINESE_CNS_PLANE_RE(n) "cns11643[.-]\\(.*[.-]\\)?" n "$"
Vcharset_chinese_cns11643_1 =
- make_charset (LEADING_BYTE_CHINESE_CNS11643_1, Qchinese_cns11643_1, 3,
+ make_charset (149, Qchinese_cns11643_1,
+ LEADING_BYTE_CHINESE_CNS11643_1, 3,
CHARSET_TYPE_94X94, 2, 0, 'G',
CHARSET_LEFT_TO_RIGHT,
- build_string ("CNS11643-1"),
- build_string ("CNS11643-1 (Chinese traditional)"),
build_string
- ("CNS 11643 Plane 1 Chinese traditional"),
+ ("CNS 11643 Plane 1 (Traditional Chinese for daily use)"),
build_string (CHINESE_CNS_PLANE_RE("1")));
Vcharset_chinese_cns11643_2 =
- make_charset (LEADING_BYTE_CHINESE_CNS11643_2, Qchinese_cns11643_2, 3,
+ make_charset (150, Qchinese_cns11643_2,
+ LEADING_BYTE_CHINESE_CNS11643_2, 3,
CHARSET_TYPE_94X94, 2, 0, 'H',
CHARSET_LEFT_TO_RIGHT,
- build_string ("CNS11643-2"),
- build_string ("CNS11643-2 (Chinese traditional)"),
build_string
- ("CNS 11643 Plane 2 Chinese traditional"),
+ ("CNS 11643 Plane 2 (Traditional Chinese for daily use)"),
build_string (CHINESE_CNS_PLANE_RE("2")));
Vcharset_chinese_big5_1 =
- make_charset (LEADING_BYTE_CHINESE_BIG5_1, Qchinese_big5_1, 3,
+ make_charset (152, Qchinese_big5_1, LEADING_BYTE_CHINESE_BIG5_1, 3,
CHARSET_TYPE_94X94, 2, 0, '0',
CHARSET_LEFT_TO_RIGHT,
- build_string ("Big5"),
- build_string ("Big5 (Level-1)"),
build_string
- ("Big5 Level-1 Chinese traditional"),
+ ("Big5 Level 1 (Traditional Chinese for daily use)"),
build_string ("big5"));
Vcharset_chinese_big5_2 =
- make_charset (LEADING_BYTE_CHINESE_BIG5_2, Qchinese_big5_2, 3,
+ make_charset (153, Qchinese_big5_2, LEADING_BYTE_CHINESE_BIG5_2, 3,
CHARSET_TYPE_94X94, 2, 0, '1',
CHARSET_LEFT_TO_RIGHT,
- build_string ("Big5"),
- build_string ("Big5 (Level-2)"),
build_string
- ("Big5 Level-2 Chinese traditional"),
+ ("Big5 Level 2 (Traditional Chinese for daily use)"),
build_string ("big5"));
-
-#ifdef ENABLE_COMPOSITE_CHARS
+ Vcharset_korean_ksc5601 =
+ make_charset (147, Qkorean_ksc5601, LEADING_BYTE_KOREAN_KSC5601, 3,
+ CHARSET_TYPE_94X94, 2, 0, 'C',
+ CHARSET_LEFT_TO_RIGHT,
+ build_string ("KS C5601 (Hangul and Korean Hanja)"),
+ build_string ("ksc5601"));
/* #### For simplicity, we put composite chars into a 96x96 charset.
This is going to lead to problems because you can run out of
room, esp. as we don't yet recycle numbers. */
Vcharset_composite =
- make_charset (LEADING_BYTE_COMPOSITE, Qcomposite, 3,
+ make_charset (-1, Qcomposite, LEADING_BYTE_COMPOSITE, 3,
CHARSET_TYPE_96X96, 2, 0, 0,
CHARSET_LEFT_TO_RIGHT,
- build_string ("Composite"),
- build_string ("Composite characters"),
build_string ("Composite characters"),
build_string (""));
composite_char_row_next = 32;
composite_char_col_next = 32;
- Vcomposite_char_string2char_hash_table =
- make_lisp_hash_table (500, HASH_TABLE_NON_WEAK, HASH_TABLE_EQUAL);
- Vcomposite_char_char2string_hash_table =
- make_lisp_hash_table (500, HASH_TABLE_NON_WEAK, HASH_TABLE_EQ);
- staticpro (&Vcomposite_char_string2char_hash_table);
- staticpro (&Vcomposite_char_char2string_hash_table);
-#endif /* ENABLE_COMPOSITE_CHARS */
+ Vcomposite_char_string2char_hashtable =
+ make_lisp_hashtable (500, HASHTABLE_NONWEAK, HASHTABLE_EQUAL);
+ Vcomposite_char_char2string_hashtable =
+ make_lisp_hashtable (500, HASHTABLE_NONWEAK, HASHTABLE_EQ);
+ staticpro (&Vcomposite_char_string2char_hashtable);
+ staticpro (&Vcomposite_char_char2string_hashtable);
}
#define MIN_LEADING_BYTE 0x80
/* These need special treatment in a string and/or character */
#define LEADING_BYTE_ASCII 0x8E /* Omitted in a buffer */
-#ifdef ENABLE_COMPOSITE_CHARS
-#endif
#define LEADING_BYTE_COMPOSITE 0x80 /* for a composite character */
#define LEADING_BYTE_CONTROL_1 0x8F /* represent normal 80-9F */
int id;
Lisp_Object name;
- Lisp_Object doc_string, registry, short_name, long_name;
+ Lisp_Object doc_string, registry;
Lisp_Object reverse_direction_charset;
Lisp_Object ccl_program;
+ Bufbyte leading_byte;
+
/* Final byte of this character set in ISO2022 designating escape sequence */
Bufbyte final;
#define CHARSET_LEFT_TO_RIGHT 0
#define CHARSET_RIGHT_TO_LEFT 1
-/* Leading byte and id have been regrouped. -- OG */
#define CHARSET_ID(cs) ((cs)->id)
-#define CHARSET_LEADING_BYTE(cs) ((Bufbyte)(CHARSET_ID(cs)))
#define CHARSET_NAME(cs) ((cs)->name)
-#define CHARSET_SHORT_NAME(cs) ((cs)->short_name)
-#define CHARSET_LONG_NAME(cs) ((cs)->long_name)
+#define CHARSET_LEADING_BYTE(cs) ((cs)->leading_byte)
#define CHARSET_REP_BYTES(cs) ((cs)->rep_bytes)
#define CHARSET_COLUMNS(cs) ((cs)->columns)
#define CHARSET_GRAPHIC(cs) ((cs)->graphic)
#define XCHARSET_ID(cs) CHARSET_ID (XCHARSET (cs))
#define XCHARSET_NAME(cs) CHARSET_NAME (XCHARSET (cs))
-#define XCHARSET_SHORT_NAME(cs) CHARSET_SHORT_NAME (XCHARSET (cs))
-#define XCHARSET_LONG_NAME(cs) CHARSET_LONG_NAME (XCHARSET (cs))
#define XCHARSET_REP_BYTES(cs) CHARSET_REP_BYTES (XCHARSET (cs))
#define XCHARSET_COLUMNS(cs) CHARSET_COLUMNS (XCHARSET (cs))
#define XCHARSET_GRAPHIC(cs) CHARSET_GRAPHIC (XCHARSET (cs))
else if (c < MIN_CHAR_COMPOSITION)
return CHAR_FIELD1 (c) + FIELD1_TO_PRIVATE_LEADING_BYTE;
else
- {
-#ifdef ENABLE_COMPOSITE_CHARS
- return LEADING_BYTE_COMPOSITE;
-#else
- abort();
- return 0;
-#endif /* ENABLE_COMPOSITE_CHARS */
- }
+ return LEADING_BYTE_COMPOSITE;
}
#define CHAR_CHARSET(c) CHARSET_BY_LEADING_BYTE (CHAR_LEADING_BYTE (c))
return c1;
else if (EQ (charset, Vcharset_control_1))
return c1 | 0x80;
-#ifdef ENABLE_COMPOSITE_CHARS
else if (EQ (charset, Vcharset_composite))
return (0x1F << 14) | ((c1) << 7) | (c2);
-#endif
else if (XCHARSET_DIMENSION (charset) == 1)
return ((XCHARSET_LEADING_BYTE (charset) -
FIELD2_TO_OFFICIAL_LEADING_BYTE) << 7) | (c1);
\f
-#ifdef ENABLE_COMPOSITE_CHARS
/************************************************************************/
/* Composite characters */
/************************************************************************/
Emchar lookup_composite_char (Bufbyte *str, int len);
Lisp_Object composite_char_string (Emchar ch);
-#endif /* ENABLE_COMPOSITE_CHARS */
\f
/************************************************************************/
--- /dev/null
+/* Code conversion functions.
+ Copyright (C) 1991, 1995 Free Software Foundation, Inc.
+ Copyright (C) 1995 Sun Microsystems, Inc.
+
+This file is part of XEmacs.
+
+XEmacs is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+XEmacs is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with XEmacs; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/* Synched up with: Mule 2.3. Not in FSF. */
+
+/* Rewritten by Ben Wing <ben@xemacs.org>. */
+
+#if 0 /* while file-coding not split up */
+
+#include <config.h>
+#include "lisp.h"
+
+#include "buffer.h"
+#include "elhash.h"
+#include "insdel.h"
+#include "lstream.h"
+#include "mule-ccl.h"
+#include "mule-coding.h"
+
+Lisp_Object Qbuffer_file_coding_system, Qcoding_system_error;
+
+Lisp_Object Vkeyboard_coding_system;
+Lisp_Object Vterminal_coding_system;
+Lisp_Object Vcoding_system_for_read;
+Lisp_Object Vcoding_system_for_write;
+Lisp_Object Vfile_name_coding_system;
+
+/* Table of symbols identifying each coding category. */
+Lisp_Object coding_category_symbol[CODING_CATEGORY_LAST + 1];
+
+/* Coding system currently associated with each coding category. */
+Lisp_Object coding_category_system[CODING_CATEGORY_LAST + 1];
+
+/* Table of all coding categories in decreasing order of priority.
+ This describes a permutation of the possible coding categories. */
+int coding_category_by_priority[CODING_CATEGORY_LAST + 1];
+
+Lisp_Object Qcoding_system_p;
+
+Lisp_Object Qbig5, Qshift_jis, Qno_conversion, Qccl, Qiso2022;
+/* Qinternal in general.c */
+
+Lisp_Object Qmnemonic, Qeol_type;
+Lisp_Object Qcr, Qcrlf, Qlf;
+Lisp_Object Qeol_cr, Qeol_crlf, Qeol_lf;
+Lisp_Object Qpost_read_conversion;
+Lisp_Object Qpre_write_conversion;
+
+Lisp_Object Qcharset_g0, Qcharset_g1, Qcharset_g2, Qcharset_g3;
+Lisp_Object Qforce_g0_on_output, Qforce_g1_on_output;
+Lisp_Object Qforce_g2_on_output, Qforce_g3_on_output;
+Lisp_Object Qshort, Qno_ascii_eol, Qno_ascii_cntl, Qseven, Qlock_shift;
+Lisp_Object Qno_iso6429, Qescape_quoted;
+Lisp_Object Qinput_charset_conversion, Qoutput_charset_conversion;
+
+Lisp_Object Qencode, Qdecode;
+
+Lisp_Object Qctext;
+
+Lisp_Object Vcoding_system_hashtable;
+
+int enable_multibyte_characters;
+
+/* Additional information used by the ISO2022 decoder and detector. */
+struct iso2022_decoder
+{
+ /* CHARSET holds the character sets currently assigned to the G0
+ through G3 variables. It is initialized from the array
+ INITIAL_CHARSET in CODESYS. */
+ Lisp_Object charset[4];
+
+ /* Which registers are currently invoked into the left (GL) and
+ right (GR) halves of the 8-bit encoding space? */
+ int register_left, register_right;
+
+ /* ISO_ESC holds a value indicating part of an escape sequence
+ that has already been seen. */
+ enum iso_esc_flag esc;
+
+ /* This records the bytes we've seen so far in an escape sequence,
+ in case the sequence is invalid (we spit out the bytes unchanged). */
+ unsigned char esc_bytes[8];
+
+ /* Index for next byte to store in ISO escape sequence. */
+ int esc_bytes_index;
+
+ /* Stuff seen so far when composing a string. */
+ unsigned_char_dynarr *composite_chars;
+
+ /* If we saw an invalid designation sequence for a particular
+ register, we flag it here and switch to ASCII. The next time we
+ see a valid designation for this register, we turn off the flag
+ and do the designation normally, but pretend the sequence was
+ invalid. The effect of all this is that (most of the time) the
+ escape sequences for both the switch to the unknown charset, and
+ the switch back to the known charset, get inserted literally into
+ the buffer and saved out as such. The hope is that we can
+ preserve the escape sequences so that the resulting written out
+ file makes sense. If we don't do any of this, the designation
+ to the invalid charset will be preserved but that switch back
+ to the known charset will probably get eaten because it was
+ the same charset that was already present in the register. */
+ unsigned char invalid_designated[4];
+
+ /* We try to do similar things as above for direction-switching
+ sequences. If we encountered a direction switch while an
+ invalid designation was present, or an invalid designation
+ just after a direction switch (i.e. no valid designation
+ encountered yet), we insert the direction-switch escape
+ sequence literally into the output stream, and later on
+ insert the corresponding direction-restoring escape sequence
+ literally also. */
+ unsigned int switched_dir_and_no_valid_charset_yet :1;
+ unsigned int invalid_switch_dir :1;
+
+ /* Tells the decoder to output the escape sequence literally
+ even though it was valid. Used in the games we play to
+ avoid lossage when we encounter invalid designations. */
+ unsigned int output_literally :1;
+ /* We encountered a direction switch followed by an invalid
+ designation. We didn't output the direction switch
+ literally because we didn't know about the invalid designation;
+ but we have to do so now. */
+ unsigned int output_direction_sequence :1;
+};
+
+EXFUN (Fcopy_coding_system, 2);
+struct detection_state;
+static int detect_coding_sjis (struct detection_state *st,
+ CONST unsigned char *src,
+ unsigned int n);
+static void decode_coding_sjis (Lstream *decoding,
+ CONST unsigned char *src,
+ unsigned_char_dynarr *dst,
+ unsigned int n);
+static void encode_coding_sjis (Lstream *encoding,
+ CONST unsigned char *src,
+ unsigned_char_dynarr *dst,
+ unsigned int n);
+static int detect_coding_big5 (struct detection_state *st,
+ CONST unsigned char *src,
+ unsigned int n);
+static void decode_coding_big5 (Lstream *decoding,
+ CONST unsigned char *src,
+ unsigned_char_dynarr *dst, unsigned int n);
+static void encode_coding_big5 (Lstream *encoding,
+ CONST unsigned char *src,
+ unsigned_char_dynarr *dst, unsigned int n);
+static int postprocess_iso2022_mask (int mask);
+static void reset_iso2022 (Lisp_Object coding_system,
+ struct iso2022_decoder *iso);
+static int detect_coding_iso2022 (struct detection_state *st,
+ CONST unsigned char *src,
+ unsigned int n);
+static void decode_coding_iso2022 (Lstream *decoding,
+ CONST unsigned char *src,
+ unsigned_char_dynarr *dst, unsigned int n);
+static void encode_coding_iso2022 (Lstream *encoding,
+ CONST unsigned char *src,
+ unsigned_char_dynarr *dst, unsigned int n);
+static void decode_coding_no_conversion (Lstream *decoding,
+ CONST unsigned char *src,
+ unsigned_char_dynarr *dst,
+ unsigned int n);
+static void encode_coding_no_conversion (Lstream *encoding,
+ CONST unsigned char *src,
+ unsigned_char_dynarr *dst,
+ unsigned int n);
+static void mule_decode (Lstream *decoding, CONST unsigned char *src,
+ unsigned_char_dynarr *dst, unsigned int n);
+static void mule_encode (Lstream *encoding, CONST unsigned char *src,
+ unsigned_char_dynarr *dst, unsigned int n);
+
+typedef struct codesys_prop codesys_prop;
+struct codesys_prop
+{
+ Lisp_Object sym;
+ int prop_type;
+};
+
+typedef struct
+{
+ Dynarr_declare (codesys_prop);
+} codesys_prop_dynarr;
+
+codesys_prop_dynarr *the_codesys_prop_dynarr;
+
+enum codesys_prop_enum
+{
+ CODESYS_PROP_ALL_OK,
+ CODESYS_PROP_ISO2022,
+ CODESYS_PROP_CCL
+};
+
+\f
+/************************************************************************/
+/* Coding system functions */
+/************************************************************************/
+
+static Lisp_Object
+mark_coding_system (Lisp_Object obj, void (*markobj) (Lisp_Object))
+{
+ struct Lisp_Coding_System *codesys = XCODING_SYSTEM (obj);
+
+ (markobj) (CODING_SYSTEM_NAME (codesys));
+ (markobj) (CODING_SYSTEM_DOC_STRING (codesys));
+ (markobj) (CODING_SYSTEM_MNEMONIC (codesys));
+ (markobj) (CODING_SYSTEM_EOL_LF (codesys));
+ (markobj) (CODING_SYSTEM_EOL_CRLF (codesys));
+ (markobj) (CODING_SYSTEM_EOL_CR (codesys));
+
+ switch (CODING_SYSTEM_TYPE (codesys))
+ {
+ int i;
+ case CODESYS_ISO2022:
+ for (i = 0; i < 4; i++)
+ (markobj) (CODING_SYSTEM_ISO2022_INITIAL_CHARSET (codesys, i));
+ if (codesys->iso2022.input_conv)
+ {
+ for (i = 0; i < Dynarr_length (codesys->iso2022.input_conv); i++)
+ {
+ struct charset_conversion_spec *ccs =
+ Dynarr_atp (codesys->iso2022.input_conv, i);
+ (markobj) (ccs->from_charset);
+ (markobj) (ccs->to_charset);
+ }
+ }
+ if (codesys->iso2022.output_conv)
+ {
+ for (i = 0; i < Dynarr_length (codesys->iso2022.output_conv); i++)
+ {
+ struct charset_conversion_spec *ccs =
+ Dynarr_atp (codesys->iso2022.output_conv, i);
+ (markobj) (ccs->from_charset);
+ (markobj) (ccs->to_charset);
+ }
+ }
+ break;
+
+ case CODESYS_CCL:
+ (markobj) (CODING_SYSTEM_CCL_DECODE (codesys));
+ (markobj) (CODING_SYSTEM_CCL_ENCODE (codesys));
+ break;
+ default:
+ break;
+ }
+
+ (markobj) (CODING_SYSTEM_PRE_WRITE_CONVERSION (codesys));
+ return CODING_SYSTEM_POST_READ_CONVERSION (codesys);
+}
+
+static void
+print_coding_system (Lisp_Object obj, Lisp_Object printcharfun,
+ int escapeflag)
+{
+ struct Lisp_Coding_System *c = XCODING_SYSTEM (obj);
+ if (print_readably)
+ error ("printing unreadable object #<coding_system 0x%x>",
+ c->header.uid);
+
+ write_c_string ("#<coding_system ", printcharfun);
+ print_internal (c->name, printcharfun, 1);
+ write_c_string (">", printcharfun);
+}
+
+static void
+finalize_coding_system (void *header, int for_disksave)
+{
+ struct Lisp_Coding_System *c = (struct Lisp_Coding_System *) header;
+ /* Since coding systems never go away, this function is not
+ necessary. But it would be necessary if we changed things
+ so that coding systems could go away. */
+ if (!for_disksave) /* see comment in lstream.c */
+ {
+ switch (CODING_SYSTEM_TYPE (c))
+ {
+ case CODESYS_ISO2022:
+ if (c->iso2022.input_conv)
+ {
+ Dynarr_free (c->iso2022.input_conv);
+ c->iso2022.input_conv = 0;
+ }
+ if (c->iso2022.output_conv)
+ {
+ Dynarr_free (c->iso2022.output_conv);
+ c->iso2022.output_conv = 0;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+DEFINE_LRECORD_IMPLEMENTATION ("coding-system", coding_system,
+ mark_coding_system, print_coding_system,
+ finalize_coding_system,
+ 0, 0, struct Lisp_Coding_System);
+
+static enum eol_type
+symbol_to_eol_type (Lisp_Object symbol)
+{
+ CHECK_SYMBOL (symbol);
+ if (NILP (symbol)) return EOL_AUTODETECT;
+ if (EQ (symbol, Qlf)) return EOL_LF;
+ if (EQ (symbol, Qcrlf)) return EOL_CRLF;
+ if (EQ (symbol, Qcr)) return EOL_CR;
+
+ signal_simple_error ("Unrecognized eol type", symbol);
+ return EOL_AUTODETECT; /* not reached */
+}
+
+static Lisp_Object
+eol_type_to_symbol (enum eol_type type)
+{
+ switch (type)
+ {
+ case EOL_LF: return Qlf;
+ case EOL_CRLF: return Qcrlf;
+ case EOL_CR: return Qcr;
+ case EOL_AUTODETECT: return Qnil;
+ default: abort (); return Qnil; /* not reached */
+ }
+}
+
+static void
+setup_eol_coding_systems (struct Lisp_Coding_System *codesys)
+{
+ Lisp_Object codesys_obj;
+ int len = string_length (XSYMBOL (CODING_SYSTEM_NAME (codesys))->name);
+ char *codesys_name = (char *) alloca (len + 7);
+ Lisp_Object codesys_name_sym, sub_codesys_obj;
+
+ /* kludge */
+
+ XSETCODING_SYSTEM (codesys_obj, codesys);
+
+ memcpy (codesys_name,
+ string_data (XSYMBOL (CODING_SYSTEM_NAME (codesys))->name), len);
+
+#define DEFINE_SUB_CODESYS(op_sys, Type) do { \
+ strcpy (codesys_name + len, "-" op_sys); \
+ codesys_name_sym = intern (codesys_name); \
+ sub_codesys_obj = Fcopy_coding_system (codesys_obj, codesys_name_sym); \
+ XCODING_SYSTEM_EOL_TYPE (sub_codesys_obj) = Type; \
+ CODING_SYSTEM_##Type (codesys) = sub_codesys_obj; \
+} while (0)
+
+ DEFINE_SUB_CODESYS("unix", EOL_LF);
+ DEFINE_SUB_CODESYS("dos", EOL_CRLF);
+ DEFINE_SUB_CODESYS("mac", EOL_CR);
+}
+
+DEFUN ("coding-system-p", Fcoding_system_p, 1, 1, 0, /*
+Return t if OBJECT is a coding system.
+A coding system is an object that defines how text containing multiple
+character sets is encoded into a stream of (typically 8-bit) bytes.
+The coding system is used to decode the stream into a series of
+characters (which may be from multiple charsets) when the text is read
+from a file or process, and is used to encode the text back into the
+same format when it is written out to a file or process.
+
+For example, many ISO2022-compliant coding systems (such as Compound
+Text, which is used for inter-client data under the X Window System)
+use escape sequences to switch between different charsets -- Japanese
+Kanji, for example, is invoked with "ESC $ ( B"; ASCII is invoked
+with "ESC ( B"; and Cyrillic is invoked with "ESC - L". See
+`make-coding-system' for more information.
+
+Coding systems are normally identified using a symbol, and the
+symbol is accepted in place of the actual coding system object whenever
+a coding system is called for. (This is similar to how faces work.)
+*/
+ (object))
+{
+ return CODING_SYSTEMP (object) ? Qt : Qnil;
+}
+
+DEFUN ("find-coding-system", Ffind_coding_system, 1, 1, 0, /*
+Retrieve the coding system of the given name.
+
+If CODING-SYSTEM-OR-NAME is a coding-system object, it is simply
+returned. Otherwise, CODING-SYSTEM-OR-NAME should be a symbol.
+If there is no such coding system, nil is returned. Otherwise the
+associated coding system object is returned.
+*/
+ (coding_system_or_name))
+{
+ if (NILP (coding_system_or_name))
+ coding_system_or_name = Qbinary;
+ if (CODING_SYSTEMP (coding_system_or_name))
+ return coding_system_or_name;
+ CHECK_SYMBOL (coding_system_or_name);
+
+ return Fgethash (coding_system_or_name, Vcoding_system_hashtable, Qnil);
+}
+
+DEFUN ("get-coding-system", Fget_coding_system, 1, 1, 0, /*
+Retrieve the coding system of the given name.
+Same as `find-coding-system' except that if there is no such
+coding system, an error is signaled instead of returning nil.
+*/
+ (name))
+{
+ Lisp_Object coding_system = Ffind_coding_system (name);
+
+ if (NILP (coding_system))
+ signal_simple_error ("No such coding system", name);
+ return coding_system;
+}
+
+/* We store the coding systems in hash tables with the names as the key and the
+ actual coding system object as the value. Occasionally we need to use them
+ in a list format. These routines provide us with that. */
+struct coding_system_list_closure
+{
+ Lisp_Object *coding_system_list;
+};
+
+static int
+add_coding_system_to_list_mapper (CONST void *hash_key, void *hash_contents,
+ void *coding_system_list_closure)
+{
+ /* This function can GC */
+ Lisp_Object key, contents;
+ Lisp_Object *coding_system_list;
+ struct coding_system_list_closure *cscl =
+ (struct coding_system_list_closure *) coding_system_list_closure;
+ CVOID_TO_LISP (key, hash_key);
+ VOID_TO_LISP (contents, hash_contents);
+ coding_system_list = cscl->coding_system_list;
+
+ *coding_system_list = Fcons (XCODING_SYSTEM (contents)->name,
+ *coding_system_list);
+ return 0;
+}
+
+DEFUN ("coding-system-list", Fcoding_system_list, 0, 0, 0, /*
+Return a list of the names of all defined coding systems.
+*/
+ ())
+{
+ Lisp_Object coding_system_list = Qnil;
+ struct gcpro gcpro1;
+ struct coding_system_list_closure coding_system_list_closure;
+
+ GCPRO1 (coding_system_list);
+ coding_system_list_closure.coding_system_list = &coding_system_list;
+ elisp_maphash (add_coding_system_to_list_mapper, Vcoding_system_hashtable,
+ &coding_system_list_closure);
+ UNGCPRO;
+
+ return coding_system_list;
+}
+
+DEFUN ("coding-system-name", Fcoding_system_name, 1, 1, 0, /*
+Return the name of the given coding system.
+*/
+ (coding_system))
+{
+ coding_system = Fget_coding_system (coding_system);
+ return XCODING_SYSTEM_NAME (coding_system);
+}
+
+static struct Lisp_Coding_System *
+allocate_coding_system (enum coding_system_type type, Lisp_Object name)
+{
+ struct Lisp_Coding_System *codesys =
+ alloc_lcrecord_type (struct Lisp_Coding_System, lrecord_coding_system);
+
+ zero_lcrecord (codesys);
+ CODING_SYSTEM_PRE_WRITE_CONVERSION (codesys) = Qnil;
+ CODING_SYSTEM_POST_READ_CONVERSION (codesys) = Qnil;
+ CODING_SYSTEM_EOL_TYPE (codesys) = EOL_AUTODETECT;
+ CODING_SYSTEM_EOL_CRLF (codesys) = Qnil;
+ CODING_SYSTEM_EOL_CR (codesys) = Qnil;
+ CODING_SYSTEM_EOL_LF (codesys) = Qnil;
+ CODING_SYSTEM_TYPE (codesys) = type;
+
+ if (type == CODESYS_ISO2022)
+ {
+ int i;
+ for (i = 0; i < 4; i++)
+ CODING_SYSTEM_ISO2022_INITIAL_CHARSET (codesys, i) = Qnil;
+ }
+ else if (type == CODESYS_CCL)
+ {
+ CODING_SYSTEM_CCL_DECODE (codesys) = Qnil;
+ CODING_SYSTEM_CCL_ENCODE (codesys) = Qnil;
+ }
+
+ CODING_SYSTEM_NAME (codesys) = name;
+
+ return codesys;
+}
+
+/* Given a list of charset conversion specs as specified in a Lisp
+ program, parse it into STORE_HERE. */
+
+static void
+parse_charset_conversion_specs (charset_conversion_spec_dynarr *store_here,
+ Lisp_Object spec_list)
+{
+ Lisp_Object rest;
+
+ EXTERNAL_LIST_LOOP (rest, spec_list)
+ {
+ Lisp_Object car = XCAR (rest);
+ Lisp_Object from, to;
+ struct charset_conversion_spec spec;
+
+ if (!CONSP (car) || !CONSP (XCDR (car)) || !NILP (XCDR (XCDR (car))))
+ signal_simple_error ("Invalid charset conversion spec", car);
+ from = Fget_charset (XCAR (car));
+ to = Fget_charset (XCAR (XCDR (car)));
+ if (XCHARSET_TYPE (from) != XCHARSET_TYPE (to))
+ signal_simple_error_2
+ ("Attempted conversion between different charset types",
+ from, to);
+ spec.from_charset = from;
+ spec.to_charset = to;
+
+ Dynarr_add (store_here, spec);
+ }
+}
+
+/* Given a dynarr LOAD_HERE of internally-stored charset conversion
+ specs, return the equivalent as the Lisp programmer would see it.
+
+ If LOAD_HERE is 0, return Qnil. */
+
+static Lisp_Object
+unparse_charset_conversion_specs (charset_conversion_spec_dynarr *load_here)
+{
+ int i;
+ Lisp_Object result = Qnil;
+
+ if (!load_here)
+ return Qnil;
+ for (i = 0; i < Dynarr_length (load_here); i++)
+ {
+ struct charset_conversion_spec *ccs =
+ Dynarr_atp (load_here, i);
+ result = Fcons (list2 (ccs->from_charset, ccs->to_charset), result);
+ }
+
+ return Fnreverse (result);
+}
+
+DEFUN ("make-coding-system", Fmake_coding_system, 2, 4, 0, /*
+Register symbol NAME as a coding system.
+
+TYPE describes the conversion method used and should be one of
+
+nil or 'undecided
+ Automatic conversion. XEmacs attempts to detect the coding system
+ used in the file.
+'no-conversion
+ No conversion. Use this for binary files and such. On output,
+ graphic characters that are not in ASCII or Latin-1 will be
+ replaced by a ?. (For a no-conversion-encoded buffer, these
+ characters will only be present if you explicitly insert them.)
+'shift-jis
+ Shift-JIS (a Japanese encoding commonly used in PC operating systems).
+'iso2022
+ Any ISO2022-compliant encoding. Among other things, this includes
+ JIS (the Japanese encoding commonly used for e-mail), EUC (the
+ standard Unix encoding for Japanese and other languages), and
+ Compound Text (the encoding used in X11). You can specify more
+ specific information about the conversion with the FLAGS argument.
+'big5
+ Big5 (the encoding commonly used for Taiwanese).
+'ccl
+ The conversion is performed using a user-written pseudo-code
+ program. CCL (Code Conversion Language) is the name of this
+ pseudo-code.
+'internal
+ Write out or read in the raw contents of the memory representing
+ the buffer's text. This is primarily useful for debugging
+ purposes, and is only enabled when XEmacs has been compiled with
+ DEBUG_XEMACS defined (via the --debug configure option).
+ WARNING: Reading in a file using 'internal conversion can result
+ in an internal inconsistency in the memory representing a
+ buffer's text, which will produce unpredictable results and may
+ cause XEmacs to crash. Under normal circumstances you should
+ never use 'internal conversion.
+
+DOC-STRING is a string describing the coding system.
+
+PROPS is a property list, describing the specific nature of the
+character set. Recognized properties are:
+
+'mnemonic
+ String to be displayed in the modeline when this coding system is
+ active.
+
+'eol-type
+ End-of-line conversion to be used. It should be one of
+
+ nil
+ Automatically detect the end-of-line type (LF, CRLF,
+ or CR). Also generate subsidiary coding systems named
+ `NAME-unix', `NAME-dos', and `NAME-mac', that are
+ identical to this coding system but have an EOL-TYPE
+ value of 'lf, 'crlf, and 'cr, respectively.
+ 'lf
+ The end of a line is marked externally using ASCII LF.
+ Since this is also the way that XEmacs represents an
+ end-of-line internally, specifying this option results
+ in no end-of-line conversion. This is the standard
+ format for Unix text files.
+ 'crlf
+ The end of a line is marked externally using ASCII
+ CRLF. This is the standard format for MS-DOS text
+ files.
+ 'cr
+ The end of a line is marked externally using ASCII CR.
+ This is the standard format for Macintosh text files.
+ t
+ Automatically detect the end-of-line type but do not
+ generate subsidiary coding systems. (This value is
+ converted to nil when stored internally, and
+ `coding-system-property' will return nil.)
+
+'post-read-conversion
+ Function called after a file has been read in, to perform the
+ decoding. Called with two arguments, BEG and END, denoting
+ a region of the current buffer to be decoded.
+
+'pre-write-conversion
+ Function called before a file is written out, to perform the
+ encoding. Called with two arguments, BEG and END, denoting
+ a region of the current buffer to be encoded.
+
+
+The following additional properties are recognized if TYPE is 'iso2022:
+
+'charset-g0
+'charset-g1
+'charset-g2
+'charset-g3
+ The character set initially designated to the G0 - G3 registers.
+ The value should be one of
+
+ -- A charset object (designate that character set)
+ -- nil (do not ever use this register)
+ -- t (no character set is initially designated to
+ the register, but may be later on; this automatically
+ sets the corresponding `force-g*-on-output' property)
+
+'force-g0-on-output
+'force-g1-on-output
+'force-g2-on-output
+'force-g2-on-output
+ If non-nil, send an explicit designation sequence on output before
+ using the specified register.
+
+'short
+ If non-nil, use the short forms "ESC $ @", "ESC $ A", and
+ "ESC $ B" on output in place of the full designation sequences
+ "ESC $ ( @", "ESC $ ( A", and "ESC $ ( B".
+
+'no-ascii-eol
+ If non-nil, don't designate ASCII to G0 at each end of line on output.
+ Setting this to non-nil also suppresses other state-resetting that
+ normally happens at the end of a line.
+
+'no-ascii-cntl
+ If non-nil, don't designate ASCII to G0 before control chars on output.
+
+'seven
+ If non-nil, use 7-bit environment on output. Otherwise, use 8-bit
+ environment.
+
+'lock-shift
+ If non-nil, use locking-shift (SO/SI) instead of single-shift
+ or designation by escape sequence.
+
+'no-iso6429
+ If non-nil, don't use ISO6429's direction specification.
+
+'escape-quoted
+ If non-nil, literal control characters that are the same as
+ the beginning of a recognized ISO2022 or ISO6429 escape sequence
+ (in particular, ESC (0x1B), SO (0x0E), SI (0x0F), SS2 (0x8E),
+ SS3 (0x8F), and CSI (0x9B)) are "quoted" with an escape character
+ so that they can be properly distinguished from an escape sequence.
+ (Note that doing this results in a non-portable encoding.) This
+ encoding flag is used for byte-compiled files. Note that ESC
+ is a good choice for a quoting character because there are no
+ escape sequences whose second byte is a character from the Control-0
+ or Control-1 character sets; this is explicitly disallowed by the
+ ISO2022 standard.
+
+'input-charset-conversion
+ A list of conversion specifications, specifying conversion of
+ characters in one charset to another when decoding is performed.
+ Each specification is a list of two elements: the source charset,
+ and the destination charset.
+
+'output-charset-conversion
+ A list of conversion specifications, specifying conversion of
+ characters in one charset to another when encoding is performed.
+ The form of each specification is the same as for
+ 'input-charset-conversion.
+
+
+The following additional properties are recognized (and required)
+if TYPE is 'ccl:
+
+'decode
+ CCL program used for decoding (converting to internal format).
+
+'encode
+ CCL program used for encoding (converting to external format).
+*/
+ (name, type, doc_string, props))
+{
+ struct Lisp_Coding_System *codesys;
+ Lisp_Object rest, key, value;
+ enum coding_system_type ty;
+ int need_to_setup_eol_systems = 1;
+
+ /* Convert type to constant */
+ if (NILP (type) || EQ (type, Qundecided))
+ { ty = CODESYS_AUTODETECT; }
+ else if (EQ (type, Qshift_jis)) { ty = CODESYS_SHIFT_JIS; }
+ else if (EQ (type, Qiso2022)) { ty = CODESYS_ISO2022; }
+ else if (EQ (type, Qbig5)) { ty = CODESYS_BIG5; }
+ else if (EQ (type, Qccl)) { ty = CODESYS_CCL; }
+ else if (EQ (type, Qno_conversion)) { ty = CODESYS_NO_CONVERSION; }
+#ifdef DEBUG_XEMACS
+ else if (EQ (type, Qinternal)) { ty = CODESYS_INTERNAL; }
+#endif
+ else
+ signal_simple_error ("Invalid coding system type", type);
+
+ CHECK_SYMBOL (name);
+
+ codesys = allocate_coding_system (ty, name);
+
+ if (NILP (doc_string))
+ doc_string = build_string ("");
+ else
+ CHECK_STRING (doc_string);
+ CODING_SYSTEM_DOC_STRING (codesys) = doc_string;
+
+ EXTERNAL_PROPERTY_LIST_LOOP (rest, key, value, props)
+ {
+ if (EQ (key, Qmnemonic))
+ {
+ if (!NILP (value))
+ CHECK_STRING (value);
+ CODING_SYSTEM_MNEMONIC (codesys) = value;
+ }
+
+ else if (EQ (key, Qeol_type))
+ {
+ need_to_setup_eol_systems = NILP (value);
+ if (EQ (value, Qt))
+ value = Qnil;
+ CODING_SYSTEM_EOL_TYPE (codesys) = symbol_to_eol_type (value);
+ }
+
+ else if (EQ (key, Qpost_read_conversion)) CODING_SYSTEM_POST_READ_CONVERSION (codesys) = value;
+ else if (EQ (key, Qpre_write_conversion)) CODING_SYSTEM_PRE_WRITE_CONVERSION (codesys) = value;
+ else if (ty == CODESYS_ISO2022)
+ {
+#define FROB_INITIAL_CHARSET(charset_num) \
+ CODING_SYSTEM_ISO2022_INITIAL_CHARSET (codesys, charset_num) = \
+ ((EQ (value, Qt) || EQ (value, Qnil)) ? value : Fget_charset (value))
+
+ if (EQ (key, Qcharset_g0)) FROB_INITIAL_CHARSET (0);
+ else if (EQ (key, Qcharset_g1)) FROB_INITIAL_CHARSET (1);
+ else if (EQ (key, Qcharset_g2)) FROB_INITIAL_CHARSET (2);
+ else if (EQ (key, Qcharset_g3)) FROB_INITIAL_CHARSET (3);
+
+#define FROB_FORCE_CHARSET(charset_num) \
+ CODING_SYSTEM_ISO2022_FORCE_CHARSET_ON_OUTPUT (codesys, charset_num) = !NILP (value)
+
+ else if (EQ (key, Qforce_g0_on_output)) FROB_FORCE_CHARSET (0);
+ else if (EQ (key, Qforce_g1_on_output)) FROB_FORCE_CHARSET (1);
+ else if (EQ (key, Qforce_g2_on_output)) FROB_FORCE_CHARSET (2);
+ else if (EQ (key, Qforce_g3_on_output)) FROB_FORCE_CHARSET (3);
+
+#define FROB_BOOLEAN_PROPERTY(prop) \
+ CODING_SYSTEM_ISO2022_##prop (codesys) = !NILP (value)
+
+ else if (EQ (key, Qshort)) FROB_BOOLEAN_PROPERTY (SHORT);
+ else if (EQ (key, Qno_ascii_eol)) FROB_BOOLEAN_PROPERTY (NO_ASCII_EOL);
+ else if (EQ (key, Qno_ascii_cntl)) FROB_BOOLEAN_PROPERTY (NO_ASCII_CNTL);
+ else if (EQ (key, Qseven)) FROB_BOOLEAN_PROPERTY (SEVEN);
+ else if (EQ (key, Qlock_shift)) FROB_BOOLEAN_PROPERTY (LOCK_SHIFT);
+ else if (EQ (key, Qno_iso6429)) FROB_BOOLEAN_PROPERTY (NO_ISO6429);
+ else if (EQ (key, Qescape_quoted)) FROB_BOOLEAN_PROPERTY (ESCAPE_QUOTED);
+
+ else if (EQ (key, Qinput_charset_conversion))
+ {
+ codesys->iso2022.input_conv =
+ Dynarr_new (charset_conversion_spec);
+ parse_charset_conversion_specs (codesys->iso2022.input_conv,
+ value);
+ }
+ else if (EQ (key, Qoutput_charset_conversion))
+ {
+ codesys->iso2022.output_conv =
+ Dynarr_new (charset_conversion_spec);
+ parse_charset_conversion_specs (codesys->iso2022.output_conv,
+ value);
+ }
+ else
+ signal_simple_error ("Unrecognized property", key);
+ }
+ else if (EQ (type, Qccl))
+ {
+ if (EQ (key, Qdecode))
+ {
+ CHECK_VECTOR (value);
+ CODING_SYSTEM_CCL_DECODE (codesys) = value;
+ }
+ else if (EQ (key, Qencode))
+ {
+ CHECK_VECTOR (value);
+ CODING_SYSTEM_CCL_ENCODE (codesys) = value;
+ }
+ else
+ signal_simple_error ("Unrecognized property", key);
+ }
+ else
+ signal_simple_error ("Unrecognized property", key);
+ }
+
+ if (need_to_setup_eol_systems)
+ setup_eol_coding_systems (codesys);
+
+ {
+ Lisp_Object codesys_obj;
+ XSETCODING_SYSTEM (codesys_obj, codesys);
+ Fputhash (name, codesys_obj, Vcoding_system_hashtable);
+ return codesys_obj;
+ }
+}
+
+DEFUN ("copy-coding-system", Fcopy_coding_system, 2, 2, 0, /*
+Copy OLD-CODING-SYSTEM to NEW-NAME.
+If NEW-NAME does not name an existing coding system, a new one will
+be created.
+*/
+ (old_coding_system, new_name))
+{
+ Lisp_Object new_coding_system;
+ old_coding_system = Fget_coding_system (old_coding_system);
+ new_coding_system = Ffind_coding_system (new_name);
+ if (NILP (new_coding_system))
+ {
+ XSETCODING_SYSTEM (new_coding_system,
+ allocate_coding_system
+ (XCODING_SYSTEM_TYPE (old_coding_system),
+ new_name));
+ Fputhash (new_name, new_coding_system, Vcoding_system_hashtable);
+ }
+
+ {
+ struct Lisp_Coding_System *to = XCODING_SYSTEM (new_coding_system);
+ struct Lisp_Coding_System *from = XCODING_SYSTEM (old_coding_system);
+ memcpy (((char *) to ) + sizeof (to->header),
+ ((char *) from) + sizeof (from->header),
+ sizeof (*from) - sizeof (from->header));
+ to->name = new_name;
+ }
+ return new_coding_system;
+}
+
+static Lisp_Object
+subsidiary_coding_system (Lisp_Object coding_system, enum eol_type type)
+{
+ struct Lisp_Coding_System *cs = XCODING_SYSTEM (coding_system);
+ Lisp_Object new_coding_system;
+
+ if (CODING_SYSTEM_EOL_TYPE (cs) != EOL_AUTODETECT)
+ return coding_system;
+
+ switch (type)
+ {
+ case EOL_AUTODETECT: return coding_system;
+ case EOL_LF: new_coding_system = CODING_SYSTEM_EOL_LF (cs); break;
+ case EOL_CR: new_coding_system = CODING_SYSTEM_EOL_CR (cs); break;
+ case EOL_CRLF: new_coding_system = CODING_SYSTEM_EOL_CRLF (cs); break;
+ default: abort ();
+ }
+
+ return NILP (new_coding_system) ? coding_system : new_coding_system;
+}
+
+DEFUN ("subsidiary-coding-system", Fsubsidiary_coding_system, 2, 2, 0, /*
+Return the subsidiary coding system of CODING-SYSTEM with eol type EOL-TYPE.
+*/
+ (coding_system, eol_type))
+{
+ coding_system = Fget_coding_system (coding_system);
+
+ return subsidiary_coding_system (coding_system,
+ symbol_to_eol_type (eol_type));
+}
+
+\f
+/************************************************************************/
+/* Coding system accessors */
+/************************************************************************/
+
+DEFUN ("coding-system-doc-string", Fcoding_system_doc_string, 1, 1, 0, /*
+Return the doc string for CODING-SYSTEM.
+*/
+ (coding_system))
+{
+ coding_system = Fget_coding_system (coding_system);
+ return XCODING_SYSTEM_DOC_STRING (coding_system);
+}
+
+DEFUN ("coding-system-type", Fcoding_system_type, 1, 1, 0, /*
+Return the type of CODING-SYSTEM.
+*/
+ (coding_system))
+{
+ switch (XCODING_SYSTEM_TYPE (Fget_coding_system (coding_system)))
+ {
+ case CODESYS_AUTODETECT: return Qundecided;
+ case CODESYS_SHIFT_JIS: return Qshift_jis;
+ case CODESYS_ISO2022: return Qiso2022;
+ case CODESYS_BIG5: return Qbig5;
+ case CODESYS_CCL: return Qccl;
+ case CODESYS_NO_CONVERSION: return Qno_conversion;
+#ifdef DEBUG_XEMACS
+ case CODESYS_INTERNAL: return Qinternal;
+#endif
+ default:
+ abort ();
+ }
+
+ return Qnil; /* not reached */
+}
+
+static
+Lisp_Object coding_system_charset (Lisp_Object coding_system, int gnum)
+{
+ Lisp_Object cs
+ = XCODING_SYSTEM_ISO2022_INITIAL_CHARSET (coding_system, gnum);
+
+ return CHARSETP (cs) ? XCHARSET_NAME (cs) : Qnil;
+}
+
+DEFUN ("coding-system-charset", Fcoding_system_charset, 2, 2, 0, /*
+Return initial charset of CODING-SYSTEM designated to GNUM.
+GNUM allows 0 .. 3.
+*/
+ (coding_system, gnum))
+{
+ coding_system = Fget_coding_system (coding_system);
+ CHECK_INT (gnum);
+
+ return coding_system_charset (coding_system, XINT (gnum));
+}
+
+DEFUN ("coding-system-property", Fcoding_system_property, 2, 2, 0, /*
+Return the PROP property of CODING-SYSTEM.
+*/
+ (coding_system, prop))
+{
+ int i, ok = 0;
+ enum coding_system_type type;
+
+ coding_system = Fget_coding_system (coding_system);
+ CHECK_SYMBOL (prop);
+ type = XCODING_SYSTEM_TYPE (coding_system);
+
+ for (i = 0; !ok && i < Dynarr_length (the_codesys_prop_dynarr); i++)
+ if (EQ (Dynarr_at (the_codesys_prop_dynarr, i).sym, prop))
+ {
+ ok = 1;
+ switch (Dynarr_at (the_codesys_prop_dynarr, i).prop_type)
+ {
+ case CODESYS_PROP_ALL_OK:
+ break;
+
+ case CODESYS_PROP_ISO2022:
+ if (type != CODESYS_ISO2022)
+ signal_simple_error
+ ("Property only valid in ISO2022 coding systems",
+ prop);
+ break;
+
+ case CODESYS_PROP_CCL:
+ if (type != CODESYS_CCL)
+ signal_simple_error
+ ("Property only valid in CCL coding systems",
+ prop);
+ break;
+
+ default:
+ abort ();
+ }
+ }
+
+ if (!ok)
+ signal_simple_error ("Unrecognized property", prop);
+
+ if (EQ (prop, Qname))
+ return XCODING_SYSTEM_NAME (coding_system);
+ else if (EQ (prop, Qtype))
+ return Fcoding_system_type (coding_system);
+ else if (EQ (prop, Qdoc_string))
+ return XCODING_SYSTEM_DOC_STRING (coding_system);
+ else if (EQ (prop, Qmnemonic))
+ return XCODING_SYSTEM_MNEMONIC (coding_system);
+ else if (EQ (prop, Qeol_type))
+ return eol_type_to_symbol (XCODING_SYSTEM_EOL_TYPE (coding_system));
+ else if (EQ (prop, Qeol_lf))
+ return XCODING_SYSTEM_EOL_LF (coding_system);
+ else if (EQ (prop, Qeol_crlf))
+ return XCODING_SYSTEM_EOL_CRLF (coding_system);
+ else if (EQ (prop, Qeol_cr))
+ return XCODING_SYSTEM_EOL_CR (coding_system);
+ else if (EQ (prop, Qpost_read_conversion))
+ return XCODING_SYSTEM_POST_READ_CONVERSION (coding_system);
+ else if (EQ (prop, Qpre_write_conversion))
+ return XCODING_SYSTEM_PRE_WRITE_CONVERSION (coding_system);
+ else if (type == CODESYS_ISO2022)
+ {
+ if (EQ (prop, Qcharset_g0))
+ return coding_system_charset (coding_system, 0);
+ else if (EQ (prop, Qcharset_g1))
+ return coding_system_charset (coding_system, 1);
+ else if (EQ (prop, Qcharset_g2))
+ return coding_system_charset (coding_system, 2);
+ else if (EQ (prop, Qcharset_g3))
+ return coding_system_charset (coding_system, 3);
+
+#define FORCE_CHARSET(charset_num) \
+ (XCODING_SYSTEM_ISO2022_FORCE_CHARSET_ON_OUTPUT \
+ (coding_system, charset_num) ? Qt : Qnil)
+
+ else if (EQ (prop, Qforce_g0_on_output)) return FORCE_CHARSET (0);
+ else if (EQ (prop, Qforce_g1_on_output)) return FORCE_CHARSET (1);
+ else if (EQ (prop, Qforce_g2_on_output)) return FORCE_CHARSET (2);
+ else if (EQ (prop, Qforce_g3_on_output)) return FORCE_CHARSET (3);
+
+#define LISP_BOOLEAN(prop) \
+ (XCODING_SYSTEM_ISO2022_##prop (coding_system) ? Qt : Qnil)
+
+ else if (EQ (prop, Qshort)) return LISP_BOOLEAN (SHORT);
+ else if (EQ (prop, Qno_ascii_eol)) return LISP_BOOLEAN (NO_ASCII_EOL);
+ else if (EQ (prop, Qno_ascii_cntl)) return LISP_BOOLEAN (NO_ASCII_CNTL);
+ else if (EQ (prop, Qseven)) return LISP_BOOLEAN (SEVEN);
+ else if (EQ (prop, Qlock_shift)) return LISP_BOOLEAN (LOCK_SHIFT);
+ else if (EQ (prop, Qno_iso6429)) return LISP_BOOLEAN (NO_ISO6429);
+ else if (EQ (prop, Qescape_quoted)) return LISP_BOOLEAN (ESCAPE_QUOTED);
+
+ else if (EQ (prop, Qinput_charset_conversion))
+ return
+ unparse_charset_conversion_specs
+ (XCODING_SYSTEM (coding_system)->iso2022.input_conv);
+ else if (EQ (prop, Qoutput_charset_conversion))
+ return
+ unparse_charset_conversion_specs
+ (XCODING_SYSTEM (coding_system)->iso2022.output_conv);
+ else
+ abort ();
+ }
+ else if (type == CODESYS_CCL)
+ {
+ if (EQ (prop, Qdecode))
+ return XCODING_SYSTEM_CCL_DECODE (coding_system);
+ else if (EQ (prop, Qencode))
+ return XCODING_SYSTEM_CCL_ENCODE (coding_system);
+ else
+ abort ();
+ }
+ else
+ abort ();
+
+ return Qnil; /* not reached */
+}
+
+\f
+/************************************************************************/
+/* Coding category functions */
+/************************************************************************/
+
+static int
+decode_coding_category (Lisp_Object symbol)
+{
+ int i;
+
+ CHECK_SYMBOL (symbol);
+ for (i = 0; i <= CODING_CATEGORY_LAST; i++)
+ if (EQ (coding_category_symbol[i], symbol))
+ return i;
+
+ signal_simple_error ("Unrecognized coding category", symbol);
+ return 0; /* not reached */
+}
+
+DEFUN ("coding-category-list", Fcoding_category_list, 0, 0, 0, /*
+Return a list of all recognized coding categories.
+*/
+ ())
+{
+ int i;
+ Lisp_Object list = Qnil;
+
+ for (i = CODING_CATEGORY_LAST; i >= 0; i--)
+ list = Fcons (coding_category_symbol[i], list);
+ return list;
+}
+
+DEFUN ("set-coding-priority-list", Fset_coding_priority_list, 1, 1, 0, /*
+Change the priority order of the coding categories.
+LIST should be list of coding categories, in descending order of
+priority. Unspecified coding categories will be lower in priority
+than all specified ones, in the same relative order they were in
+previously.
+*/
+ (list))
+{
+ int category_to_priority[CODING_CATEGORY_LAST + 1];
+ int i, j;
+ Lisp_Object rest;
+
+ /* First generate a list that maps coding categories to priorities. */
+
+ for (i = 0; i <= CODING_CATEGORY_LAST; i++)
+ category_to_priority[i] = -1;
+
+ /* Highest priority comes from the specified list. */
+ i = 0;
+ EXTERNAL_LIST_LOOP (rest, list)
+ {
+ int cat = decode_coding_category (XCAR (rest));
+
+ if (category_to_priority[cat] >= 0)
+ signal_simple_error ("Duplicate coding category in list", XCAR (rest));
+ category_to_priority[cat] = i++;
+ }
+
+ /* Now go through the existing categories by priority to retrieve
+ the categories not yet specified and preserve their priority
+ order. */
+ for (j = 0; j <= CODING_CATEGORY_LAST; j++)
+ {
+ int cat = coding_category_by_priority[j];
+ if (category_to_priority[cat] < 0)
+ category_to_priority[cat] = i++;
+ }
+
+ /* Now we need to construct the inverse of the mapping we just
+ constructed. */
+
+ for (i = 0; i <= CODING_CATEGORY_LAST; i++)
+ coding_category_by_priority[category_to_priority[i]] = i;
+
+ /* Phew! That was confusing. */
+ return Qnil;
+}
+
+DEFUN ("coding-priority-list", Fcoding_priority_list, 0, 0, 0, /*
+Return a list of coding categories in descending order of priority.
+*/
+ ())
+{
+ int i;
+ Lisp_Object list = Qnil;
+
+ for (i = CODING_CATEGORY_LAST; i >= 0; i--)
+ list = Fcons (coding_category_symbol[coding_category_by_priority[i]],
+ list);
+ return list;
+}
+
+DEFUN ("set-coding-category-system", Fset_coding_category_system, 2, 2, 0, /*
+Change the coding system associated with a coding category.
+*/
+ (coding_category, coding_system))
+{
+ int cat = decode_coding_category (coding_category);
+
+ coding_system = Fget_coding_system (coding_system);
+ coding_category_system[cat] = coding_system;
+ return Qnil;
+}
+
+DEFUN ("coding-category-system", Fcoding_category_system, 1, 1, 0, /*
+Return the coding system associated with a coding category.
+*/
+ (coding_category))
+{
+ int cat = decode_coding_category (coding_category);
+ Lisp_Object sys = coding_category_system[cat];
+
+ if (!NILP (sys))
+ return XCODING_SYSTEM_NAME (sys);
+ return Qnil;
+}
+
+\f
+/************************************************************************/
+/* Detecting the encoding of data */
+/************************************************************************/
+
+struct detection_state
+{
+ enum eol_type eol_type;
+ int seen_non_ascii;
+ int mask;
+
+ struct
+ {
+ int mask;
+ int in_second_byte;
+ }
+ big5;
+
+ struct
+ {
+ int mask;
+ int in_second_byte;
+ }
+ shift_jis;
+
+ struct
+ {
+ int mask;
+ int initted;
+ struct iso2022_decoder iso;
+ unsigned int flags;
+ int high_byte_count;
+ unsigned int saw_single_shift:1;
+ }
+ iso2022;
+
+ struct
+ {
+ int seen_anything;
+ int just_saw_cr;
+ }
+ eol;
+};
+
+static int
+acceptable_control_char_p (int c)
+{
+ switch (c)
+ {
+ /* Allow and ignore control characters that you might
+ reasonably see in a text file */
+ case '\r':
+ case '\n':
+ case '\t':
+ case 7: /* bell */
+ case 8: /* backspace */
+ case 11: /* vertical tab */
+ case 12: /* form feed */
+ case 26: /* MS-DOS C-z junk */
+ case 31: /* '^_' -- for info */
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+static int
+mask_has_at_most_one_bit_p (int mask)
+{
+ /* Perhaps the only thing useful you learn from intensive Microsoft
+ technical interviews */
+ return (mask & (mask - 1)) == 0;
+}
+
+static enum eol_type
+detect_eol_type (struct detection_state *st, CONST unsigned char *src,
+ unsigned int n)
+{
+ int c;
+
+ while (n--)
+ {
+ c = *src++;
+ if (c == '\r')
+ st->eol.just_saw_cr = 1;
+ else
+ {
+ if (c == '\n')
+ {
+ if (st->eol.just_saw_cr)
+ return EOL_CRLF;
+ else if (st->eol.seen_anything)
+ return EOL_LF;
+ }
+ else if (st->eol.just_saw_cr)
+ return EOL_CR;
+ st->eol.just_saw_cr = 0;
+ }
+ st->eol.seen_anything = 1;
+ }
+
+ return EOL_AUTODETECT;
+}
+
+/* Attempt to determine the encoding and EOL type of the given text.
+ Before calling this function for the first type, you must initialize
+ st->eol_type as appropriate and initialize st->mask to ~0.
+
+ st->eol_type holds the determined EOL type, or EOL_AUTODETECT if
+ not yet known.
+
+ st->mask holds the determined coding category mask, or ~0 if only
+ ASCII has been seen so far.
+
+ Returns:
+
+ 0 == st->eol_type is EOL_AUTODETECT and/or more than coding category
+ is present in st->mask
+ 1 == definitive answers are here for both st->eol_type and st->mask
+*/
+
+static int
+detect_coding_type (struct detection_state *st, CONST unsigned char *src,
+ unsigned int n, int just_do_eol)
+{
+ int c;
+
+ if (st->eol_type == EOL_AUTODETECT)
+ st->eol_type = detect_eol_type (st, src, n);
+
+ if (just_do_eol)
+ return st->eol_type != EOL_AUTODETECT;
+
+ if (!st->seen_non_ascii)
+ {
+ for (; n; n--, src++)
+ {
+ c = *src;
+ if ((c < 0x20 && !acceptable_control_char_p (c)) || c >= 0x80)
+ {
+ st->seen_non_ascii = 1;
+ st->shift_jis.mask = ~0;
+ st->big5.mask = ~0;
+ st->iso2022.mask = ~0;
+ break;
+ }
+ }
+ }
+
+ if (!n)
+ return 0;
+
+ if (!mask_has_at_most_one_bit_p (st->iso2022.mask))
+ st->iso2022.mask = detect_coding_iso2022 (st, src, n);
+ if (!mask_has_at_most_one_bit_p (st->shift_jis.mask))
+ st->shift_jis.mask = detect_coding_sjis (st, src, n);
+ if (!mask_has_at_most_one_bit_p (st->big5.mask))
+ st->big5.mask = detect_coding_big5 (st, src, n);
+
+ st->mask = st->iso2022.mask | st->shift_jis.mask | st->big5.mask;
+
+ {
+ int retval = mask_has_at_most_one_bit_p (st->mask);
+ st->mask |= CODING_CATEGORY_NO_CONVERSION_MASK;
+ return retval && st->eol_type != EOL_AUTODETECT;
+ }
+}
+
+static Lisp_Object
+coding_system_from_mask (int mask)
+{
+ if (mask == ~0)
+ {
+ /* If the file was entirely or basically ASCII, use the
+ default value of `buffer-file-coding-system'. */
+ Lisp_Object retval =
+ XBUFFER (Vbuffer_defaults)->buffer_file_coding_system;
+ if (!NILP (retval))
+ {
+ retval = Ffind_coding_system (retval);
+ if (NILP (retval))
+ {
+ warn_when_safe
+ (Qbad_variable, Qwarning,
+ "Invalid `default-buffer-file-coding-system', set to nil");
+ XBUFFER (Vbuffer_defaults)->buffer_file_coding_system = Qnil;
+ }
+ }
+ if (NILP (retval))
+ retval = Fget_coding_system (Qno_conversion);
+ return retval;
+ }
+ else
+ {
+ int i;
+ int cat = -1;
+
+ mask = postprocess_iso2022_mask (mask);
+
+ /* Look through the coding categories by priority and find
+ the first one that is allowed. */
+ for (i = 0; i <= CODING_CATEGORY_LAST; i++)
+ {
+ cat = coding_category_by_priority[i];
+ if ((mask & (1 << cat)) &&
+ !NILP (coding_category_system[cat]))
+ break;
+ }
+ if (cat >= 0)
+ return coding_category_system[cat];
+ else
+ return Fget_coding_system (Qno_conversion);
+ }
+}
+
+/* Given a seekable read stream and potential coding system and EOL type
+ as specified, do any autodetection that is called for. If the
+ coding system and/or EOL type are not autodetect, they will be left
+ alone; but this function will never return an autodetect coding system
+ or EOL type.
+
+ This function does not automatically fetch subsidiary coding systems;
+ that should be unnecessary with the explicit eol-type argument. */
+
+void
+determine_real_coding_system (Lstream *stream, Lisp_Object *codesys_in_out,
+ enum eol_type *eol_type_in_out)
+{
+ struct detection_state decst;
+
+ if (*eol_type_in_out == EOL_AUTODETECT)
+ *eol_type_in_out = XCODING_SYSTEM_EOL_TYPE (*codesys_in_out);
+
+ xzero (decst);
+ decst.eol_type = *eol_type_in_out;
+ decst.mask = ~0;
+
+ /* If autodetection is called for, do it now. */
+ if (XCODING_SYSTEM_TYPE (*codesys_in_out) == CODESYS_AUTODETECT ||
+ *eol_type_in_out == EOL_AUTODETECT)
+ {
+
+ while (1)
+ {
+ unsigned char random_buffer[4096];
+ int nread;
+
+ nread = Lstream_read (stream, random_buffer, sizeof (random_buffer));
+ if (!nread)
+ break;
+ if (detect_coding_type (&decst, random_buffer, nread,
+ XCODING_SYSTEM_TYPE (*codesys_in_out) !=
+ CODESYS_AUTODETECT))
+ break;
+ }
+
+ *eol_type_in_out = decst.eol_type;
+ if (XCODING_SYSTEM_TYPE (*codesys_in_out) == CODESYS_AUTODETECT)
+ *codesys_in_out = coding_system_from_mask (decst.mask);
+ }
+
+ /* If we absolutely can't determine the EOL type, just assume LF. */
+ if (*eol_type_in_out == EOL_AUTODETECT)
+ *eol_type_in_out = EOL_LF;
+
+ Lstream_rewind (stream);
+}
+
+DEFUN ("detect-coding-region", Fdetect_coding_region, 2, 3, 0, /*
+Detect coding system of the text in the region between START and END.
+Returned a list of possible coding systems ordered by priority.
+If only ASCII characters are found, it returns 'undecided or one of
+its subsidiary coding systems according to a detected end-of-line
+type. Optional arg BUFFER defaults to the current buffer.
+*/
+ (start, end, buffer))
+{
+ Lisp_Object val = Qnil;
+ struct buffer *buf = decode_buffer (buffer, 0);
+ Bufpos b, e;
+ Lisp_Object instream, lb_instream;
+ Lstream *istr, *lb_istr;
+ struct detection_state decst;
+ struct gcpro gcpro1, gcpro2;
+
+ get_buffer_range_char (buf, start, end, &b, &e, 0);
+ lb_instream = make_lisp_buffer_input_stream (buf, b, e, 0);
+ lb_istr = XLSTREAM (lb_instream);
+ instream = make_encoding_input_stream (lb_istr, Fget_coding_system (Qbinary));
+ istr = XLSTREAM (instream);
+ GCPRO2 (instream, lb_instream);
+ xzero (decst);
+ decst.eol_type = EOL_AUTODETECT;
+ decst.mask = ~0;
+ while (1)
+ {
+ unsigned char random_buffer[4096];
+ int nread = Lstream_read (istr, random_buffer, sizeof (random_buffer));
+
+ if (!nread)
+ break;
+ if (detect_coding_type (&decst, random_buffer, nread, 0))
+ break;
+ }
+
+ if (decst.mask == ~0)
+ val = subsidiary_coding_system (Fget_coding_system (Qundecided),
+ decst.eol_type);
+ else
+ {
+ int i;
+
+ val = Qnil;
+
+ decst.mask = postprocess_iso2022_mask (decst.mask);
+
+ for (i = CODING_CATEGORY_LAST; i >= 0; i--)
+ {
+ int sys = coding_category_by_priority[i];
+ if (decst.mask & (1 << sys))
+ {
+ Lisp_Object codesys = coding_category_system[sys];
+ if (!NILP (codesys))
+ codesys = subsidiary_coding_system (codesys, decst.eol_type);
+ val = Fcons (codesys, val);
+ }
+ }
+ }
+ Lstream_close (istr);
+ UNGCPRO;
+ Lstream_delete (istr);
+ Lstream_delete (lb_istr);
+ return val;
+}
+
+\f
+/************************************************************************/
+/* Converting to internal Mule format ("decoding") */
+/************************************************************************/
+
+/* A decoding stream is a stream used for decoding text (i.e.
+ converting from some external format to internal format).
+ The decoding-stream object keeps track of the actual coding
+ stream, the stream that is at the other end, and data that
+ needs to be persistent across the lifetime of the stream. */
+
+/* Handle the EOL stuff related to just-read-in character C.
+ EOL_TYPE is the EOL type of the coding stream.
+ FLAGS is the current value of FLAGS in the coding stream, and may
+ be modified by this macro. (The macro only looks at the
+ CODING_STATE_CR flag.) DST is the Dynarr to which the decoded
+ bytes are to be written. You need to also define a local goto
+ label "label_continue_loop" that is at the end of the main
+ character-reading loop.
+
+ If C is a CR character, then this macro handles it entirely and
+ jumps to label_continue_loop. Otherwise, this macro does not add
+ anything to DST, and continues normally. You should continue
+ processing C normally after this macro. */
+
+#define DECODE_HANDLE_EOL_TYPE(eol_type, c, flags, dst) \
+do { \
+ if (c == '\r') \
+ { \
+ if (eol_type == EOL_CR) \
+ Dynarr_add (dst, '\n'); \
+ else if (eol_type != EOL_CRLF || flags & CODING_STATE_CR) \
+ Dynarr_add (dst, c); \
+ else \
+ flags |= CODING_STATE_CR; \
+ goto label_continue_loop; \
+ } \
+ else if (flags & CODING_STATE_CR) \
+ { /* eol_type == CODING_SYSTEM_EOL_CRLF */ \
+ if (c != '\n') \
+ Dynarr_add (dst, '\r'); \
+ flags &= ~CODING_STATE_CR; \
+ } \
+} while (0)
+
+/* C should be a binary character in the range 0 - 255; convert
+ to internal format and add to Dynarr DST. */
+
+#define DECODE_ADD_BINARY_CHAR(c, dst) \
+do { \
+ if (BYTE_ASCII_P (c)) \
+ Dynarr_add (dst, c); \
+ else if (BYTE_C1_P (c)) \
+ { \
+ Dynarr_add (dst, LEADING_BYTE_CONTROL_1); \
+ Dynarr_add (dst, c + 0x20); \
+ } \
+ else \
+ { \
+ Dynarr_add (dst, LEADING_BYTE_LATIN_ISO8859_1); \
+ Dynarr_add (dst, c); \
+ } \
+} while (0)
+
+#define DECODE_OUTPUT_PARTIAL_CHAR(ch) \
+do { \
+ if (ch) \
+ { \
+ DECODE_ADD_BINARY_CHAR (ch, dst); \
+ ch = 0; \
+ } \
+} while (0)
+
+#define DECODE_HANDLE_END_OF_CONVERSION(flags, ch, dst) \
+do { \
+ DECODE_OUTPUT_PARTIAL_CHAR (ch); \
+ if ((flags & CODING_STATE_END) && \
+ (flags & CODING_STATE_CR)) \
+ Dynarr_add (dst, '\r'); \
+} while (0)
+
+#define DECODING_STREAM_DATA(stream) LSTREAM_TYPE_DATA (stream, decoding)
+
+struct decoding_stream
+{
+ /* Coding system that governs the conversion. */
+ struct Lisp_Coding_System *codesys;
+
+ /* Stream that we read the encoded data from or
+ write the decoded data to. */
+ Lstream *other_end;
+
+ /* If we are reading, then we can return only a fixed amount of
+ data, so if the conversion resulted in too much data, we store it
+ here for retrieval the next time around. */
+ unsigned_char_dynarr *runoff;
+
+ /* FLAGS holds flags indicating the current state of the decoding.
+ Some of these flags are dependent on the coding system. */
+ unsigned int flags;
+
+ /* CH holds a partially built-up character. Since we only deal
+ with one- and two-byte characters at the moment, we only use
+ this to store the first byte of a two-byte character. */
+ unsigned int ch;
+
+ /* EOL_TYPE specifies the type of end-of-line conversion that
+ currently applies. We need to keep this separate from the
+ EOL type stored in CODESYS because the latter might indicate
+ automatic EOL-type detection while the former will always
+ indicate a particular EOL type. */
+ enum eol_type eol_type;
+
+ /* Additional ISO2022 information. We define the structure above
+ because it's also needed by the detection routines. */
+ struct iso2022_decoder iso2022;
+
+ /* Additional information (the state of the running CCL program)
+ used by the CCL decoder. */
+ struct ccl_program ccl;
+
+ struct detection_state decst;
+};
+
+static int decoding_reader (Lstream *stream, unsigned char *data, size_t size);
+static int decoding_writer (Lstream *stream, CONST unsigned char *data, size_t size);
+static int decoding_rewinder (Lstream *stream);
+static int decoding_seekable_p (Lstream *stream);
+static int decoding_flusher (Lstream *stream);
+static int decoding_closer (Lstream *stream);
+static Lisp_Object decoding_marker (Lisp_Object stream,
+ void (*markobj) (Lisp_Object));
+
+DEFINE_LSTREAM_IMPLEMENTATION ("decoding", lstream_decoding,
+ sizeof (struct decoding_stream));
+
+static Lisp_Object
+decoding_marker (Lisp_Object stream, void (*markobj) (Lisp_Object))
+{
+ Lstream *str = DECODING_STREAM_DATA (XLSTREAM (stream))->other_end;
+ Lisp_Object str_obj;
+
+ /* We do not need to mark the coding systems or charsets stored
+ within the stream because they are stored in a global list
+ and automatically marked. */
+
+ XSETLSTREAM (str_obj, str);
+ (markobj) (str_obj);
+ if (str->imp->marker)
+ return (str->imp->marker) (str_obj, markobj);
+ else
+ return Qnil;
+}
+
+/* Read SIZE bytes of data and store it into DATA. We are a decoding stream
+ so we read data from the other end, decode it, and store it into DATA. */
+
+static int
+decoding_reader (Lstream *stream, unsigned char *data, size_t size)
+{
+ struct decoding_stream *str = DECODING_STREAM_DATA (stream);
+ unsigned char *orig_data = data;
+ int read_size;
+ int error_occurred = 0;
+
+ /* We need to interface to mule_decode(), which expects to take some
+ amount of data and store the result into a Dynarr. We have
+ mule_decode() store into str->runoff, and take data from there
+ as necessary. */
+
+ /* We loop until we have enough data, reading chunks from the other
+ end and decoding it. */
+ while (1)
+ {
+ /* Take data from the runoff if we can. Make sure to take at
+ most SIZE bytes, and delete the data from the runoff. */
+ if (Dynarr_length (str->runoff) > 0)
+ {
+ size_t chunk = min (size, (size_t) Dynarr_length (str->runoff));
+ memcpy (data, Dynarr_atp (str->runoff, 0), chunk);
+ Dynarr_delete_many (str->runoff, 0, chunk);
+ data += chunk;
+ size -= chunk;
+ }
+
+ if (size == 0)
+ break; /* No more room for data */
+
+ if (str->flags & CODING_STATE_END)
+ /* This means that on the previous iteration, we hit the EOF on
+ the other end. We loop once more so that mule_decode() can
+ output any final stuff it may be holding, or any "go back
+ to a sane state" escape sequences. (This latter makes sense
+ during encoding.) */
+ break;
+
+ /* Exhausted the runoff, so get some more. DATA has at least
+ SIZE bytes left of storage in it, so it's OK to read directly
+ into it. (We'll be overwriting above, after we've decoded it
+ into the runoff.) */
+ read_size = Lstream_read (str->other_end, data, size);
+ if (read_size < 0)
+ {
+ error_occurred = 1;
+ break;
+ }
+ if (read_size == 0)
+ /* There might be some more end data produced in the translation.
+ See the comment above. */
+ str->flags |= CODING_STATE_END;
+ mule_decode (stream, data, str->runoff, read_size);
+ }
+
+ if (data - orig_data == 0)
+ return error_occurred ? -1 : 0;
+ else
+ return data - orig_data;
+}
+
+static int
+decoding_writer (Lstream *stream, CONST unsigned char *data, size_t size)
+{
+ struct decoding_stream *str = DECODING_STREAM_DATA (stream);
+ int retval;
+
+ /* Decode all our data into the runoff, and then attempt to write
+ it all out to the other end. Remove whatever chunk we succeeded
+ in writing. */
+ mule_decode (stream, data, str->runoff, size);
+ retval = Lstream_write (str->other_end, Dynarr_atp (str->runoff, 0),
+ Dynarr_length (str->runoff));
+ if (retval > 0)
+ Dynarr_delete_many (str->runoff, 0, retval);
+ /* Do NOT return retval. The return value indicates how much
+ of the incoming data was written, not how many bytes were
+ written. */
+ return size;
+}
+
+static void
+reset_decoding_stream (struct decoding_stream *str)
+{
+ if (CODING_SYSTEM_TYPE (str->codesys) == CODESYS_ISO2022)
+ {
+ Lisp_Object coding_system;
+ XSETCODING_SYSTEM (coding_system, str->codesys);
+ reset_iso2022 (coding_system, &str->iso2022);
+ }
+ else if (CODING_SYSTEM_TYPE (str->codesys) == CODESYS_CCL)
+ {
+ setup_ccl_program (&str->ccl, CODING_SYSTEM_CCL_DECODE (str->codesys));
+ }
+
+ str->flags = str->ch = 0;
+}
+
+static int
+decoding_rewinder (Lstream *stream)
+{
+ struct decoding_stream *str = DECODING_STREAM_DATA (stream);
+ reset_decoding_stream (str);
+ Dynarr_reset (str->runoff);
+ return Lstream_rewind (str->other_end);
+}
+
+static int
+decoding_seekable_p (Lstream *stream)
+{
+ struct decoding_stream *str = DECODING_STREAM_DATA (stream);
+ return Lstream_seekable_p (str->other_end);
+}
+
+static int
+decoding_flusher (Lstream *stream)
+{
+ struct decoding_stream *str = DECODING_STREAM_DATA (stream);
+ return Lstream_flush (str->other_end);
+}
+
+static int
+decoding_closer (Lstream *stream)
+{
+ struct decoding_stream *str = DECODING_STREAM_DATA (stream);
+ if (stream->flags & LSTREAM_FL_WRITE)
+ {
+ str->flags |= CODING_STATE_END;
+ decoding_writer (stream, 0, 0);
+ }
+ Dynarr_free (str->runoff);
+ if (str->iso2022.composite_chars)
+ Dynarr_free (str->iso2022.composite_chars);
+ return Lstream_close (str->other_end);
+}
+
+Lisp_Object
+decoding_stream_coding_system (Lstream *stream)
+{
+ Lisp_Object coding_system;
+ struct decoding_stream *str = DECODING_STREAM_DATA (stream);
+
+ XSETCODING_SYSTEM (coding_system, str->codesys);
+ return subsidiary_coding_system (coding_system, str->eol_type);
+}
+
+void
+set_decoding_stream_coding_system (Lstream *lstr, Lisp_Object codesys)
+{
+ struct Lisp_Coding_System *cs = XCODING_SYSTEM (codesys);
+ struct decoding_stream *str = DECODING_STREAM_DATA (lstr);
+ str->codesys = cs;
+ if (CODING_SYSTEM_EOL_TYPE (cs) != EOL_AUTODETECT)
+ str->eol_type = CODING_SYSTEM_EOL_TYPE (cs);
+ reset_decoding_stream (str);
+}
+
+/* WARNING WARNING WARNING WARNING!!!!! If you open up a decoding
+ stream for writing, no automatic code detection will be performed.
+ The reason for this is that automatic code detection requires a
+ seekable input. Things will also fail if you open a decoding
+ stream for reading using a non-fully-specified coding system and
+ a non-seekable input stream. */
+
+static Lisp_Object
+make_decoding_stream_1 (Lstream *stream, Lisp_Object codesys,
+ CONST char *mode)
+{
+ Lstream *lstr = Lstream_new (lstream_decoding, mode);
+ struct decoding_stream *str = DECODING_STREAM_DATA (lstr);
+ Lisp_Object obj;
+
+ xzero (*str);
+ str->other_end = stream;
+ str->runoff = (unsigned_char_dynarr *) Dynarr_new (unsigned_char);
+ str->eol_type = EOL_AUTODETECT;
+ if (!strcmp (mode, "r")
+ && Lstream_seekable_p (stream))
+ /* We can determine the coding system now. */
+ determine_real_coding_system (stream, &codesys, &str->eol_type);
+ set_decoding_stream_coding_system (lstr, codesys);
+ str->decst.eol_type = str->eol_type;
+ str->decst.mask = ~0;
+ XSETLSTREAM (obj, lstr);
+ return obj;
+}
+
+Lisp_Object
+make_decoding_input_stream (Lstream *stream, Lisp_Object codesys)
+{
+ return make_decoding_stream_1 (stream, codesys, "r");
+}
+
+Lisp_Object
+make_decoding_output_stream (Lstream *stream, Lisp_Object codesys)
+{
+ return make_decoding_stream_1 (stream, codesys, "w");
+}
+
+/* Note: the decode_coding_* functions all take the same
+ arguments as mule_decode(), which is to say some SRC data of
+ size N, which is to be stored into dynamic array DST.
+ DECODING is the stream within which the decoding is
+ taking place, but no data is actually read from or
+ written to that stream; that is handled in decoding_reader()
+ or decoding_writer(). This allows the same functions to
+ be used for both reading and writing. */
+
+static void
+mule_decode (Lstream *decoding, CONST unsigned char *src,
+ unsigned_char_dynarr *dst, unsigned int n)
+{
+ struct decoding_stream *str = DECODING_STREAM_DATA (decoding);
+
+ /* If necessary, do encoding-detection now. We do this when
+ we're a writing stream or a non-seekable reading stream,
+ meaning that we can't just process the whole input,
+ rewind, and start over. */
+
+ if (CODING_SYSTEM_TYPE (str->codesys) == CODESYS_AUTODETECT ||
+ str->eol_type == EOL_AUTODETECT)
+ {
+ Lisp_Object codesys;
+
+ XSETCODING_SYSTEM (codesys, str->codesys);
+ detect_coding_type (&str->decst, src, n,
+ CODING_SYSTEM_TYPE (str->codesys) !=
+ CODESYS_AUTODETECT);
+ if (CODING_SYSTEM_TYPE (str->codesys) == CODESYS_AUTODETECT &&
+ str->decst.mask != ~0)
+ /* #### This is cheesy. What we really ought to do is
+ buffer up a certain amount of data so as to get a
+ less random result. */
+ codesys = coding_system_from_mask (str->decst.mask);
+ str->eol_type = str->decst.eol_type;
+ if (XCODING_SYSTEM (codesys) != str->codesys)
+ {
+ /* Preserve the CODING_STATE_END flag in case it was set.
+ If we erase it, bad things might happen. */
+ int was_end = str->flags & CODING_STATE_END;
+ set_decoding_stream_coding_system (decoding, codesys);
+ if (was_end)
+ str->flags |= CODING_STATE_END;
+ }
+ }
+
+ switch (CODING_SYSTEM_TYPE (str->codesys))
+ {
+#ifdef DEBUG_XEMACS
+ case CODESYS_INTERNAL:
+ Dynarr_add_many (dst, src, n);
+ break;
+#endif
+ case CODESYS_AUTODETECT:
+ /* If we got this far and still haven't decided on the coding
+ system, then do no conversion. */
+ case CODESYS_NO_CONVERSION:
+ decode_coding_no_conversion (decoding, src, dst, n);
+ break;
+ case CODESYS_SHIFT_JIS:
+ decode_coding_sjis (decoding, src, dst, n);
+ break;
+ case CODESYS_BIG5:
+ decode_coding_big5 (decoding, src, dst, n);
+ break;
+ case CODESYS_CCL:
+ ccl_driver (&str->ccl, src, dst, n, 0);
+ break;
+ case CODESYS_ISO2022:
+ decode_coding_iso2022 (decoding, src, dst, n);
+ break;
+ default:
+ abort ();
+ }
+}
+
+DEFUN ("decode-coding-region", Fdecode_coding_region, 3, 4, 0, /*
+Decode the text between START and END which is encoded in CODING-SYSTEM.
+This is useful if you've read in encoded text from a file without decoding
+it (e.g. you read in a JIS-formatted file but used the `binary' or
+`no-conversion' coding system, so that it shows up as "^[$B!<!+^[(B").
+Return length of decoded text.
+BUFFER defaults to the current buffer if unspecified.
+*/
+ (start, end, coding_system, buffer))
+{
+ Bufpos b, e;
+ struct buffer *buf = decode_buffer (buffer, 0);
+ Lisp_Object instream, lb_outstream, de_outstream, outstream;
+ Lstream *istr, *ostr;
+ struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+
+ get_buffer_range_char (buf, start, end, &b, &e, 0);
+
+ barf_if_buffer_read_only (buf, b, e);
+
+ coding_system = Fget_coding_system (coding_system);
+ instream = make_lisp_buffer_input_stream (buf, b, e, 0);
+ lb_outstream = make_lisp_buffer_output_stream (buf, b, 0);
+ de_outstream = make_decoding_output_stream (XLSTREAM (lb_outstream),
+ coding_system);
+ outstream = make_encoding_output_stream (XLSTREAM (de_outstream),
+ Fget_coding_system (Qbinary));
+ istr = XLSTREAM (instream);
+ ostr = XLSTREAM (outstream);
+ GCPRO4 (instream, lb_outstream, de_outstream, outstream);
+
+ /* The chain of streams looks like this:
+
+ [BUFFER] <----- send through
+ ------> [ENCODE AS BINARY]
+ ------> [DECODE AS SPECIFIED]
+ ------> [BUFFER]
+ */
+
+ while (1)
+ {
+ char tempbuf[1024]; /* some random amount */
+ Bufpos newpos, even_newer_pos;
+ Bufpos oldpos = lisp_buffer_stream_startpos (istr);
+ int size_in_bytes = Lstream_read (istr, tempbuf, sizeof (tempbuf));
+
+ if (!size_in_bytes)
+ break;
+ newpos = lisp_buffer_stream_startpos (istr);
+ Lstream_write (ostr, tempbuf, size_in_bytes);
+ even_newer_pos = lisp_buffer_stream_startpos (istr);
+ buffer_delete_range (buf, even_newer_pos - (newpos - oldpos),
+ even_newer_pos, 0);
+ }
+ Lstream_close (istr);
+ Lstream_close (ostr);
+ UNGCPRO;
+ Lstream_delete (istr);
+ Lstream_delete (ostr);
+ Lstream_delete (XLSTREAM (de_outstream));
+ Lstream_delete (XLSTREAM (lb_outstream));
+ return Qnil;
+}
+
+\f
+/************************************************************************/
+/* Converting to an external encoding ("encoding") */
+/************************************************************************/
+
+/* An encoding stream is an output stream. When you create the
+ stream, you specify the coding system that governs the encoding
+ and another stream that the resulting encoded data is to be
+ sent to, and then start sending data to it. */
+
+#define ENCODING_STREAM_DATA(stream) LSTREAM_TYPE_DATA (stream, encoding)
+
+struct encoding_stream
+{
+ /* Coding system that governs the conversion. */
+ struct Lisp_Coding_System *codesys;
+
+ /* Stream that we read the encoded data from or
+ write the decoded data to. */
+ Lstream *other_end;
+
+ /* If we are reading, then we can return only a fixed amount of
+ data, so if the conversion resulted in too much data, we store it
+ here for retrieval the next time around. */
+ unsigned_char_dynarr *runoff;
+
+ /* FLAGS holds flags indicating the current state of the encoding.
+ Some of these flags are dependent on the coding system. */
+ unsigned int flags;
+
+ /* CH holds a partially built-up character. Since we only deal
+ with one- and two-byte characters at the moment, we only use
+ this to store the first byte of a two-byte character. */
+ unsigned int ch;
+
+ /* Additional information used by the ISO2022 encoder. */
+ struct
+ {
+ /* CHARSET holds the character sets currently assigned to the G0
+ through G3 registers. It is initialized from the array
+ INITIAL_CHARSET in CODESYS. */
+ Lisp_Object charset[4];
+
+ /* Which registers are currently invoked into the left (GL) and
+ right (GR) halves of the 8-bit encoding space? */
+ int register_left, register_right;
+
+ /* Whether we need to explicitly designate the charset in the
+ G? register before using it. It is initialized from the
+ array FORCE_CHARSET_ON_OUTPUT in CODESYS. */
+ unsigned char force_charset_on_output[4];
+
+ /* Other state variables that need to be preserved across
+ invocations. */
+ Lisp_Object current_charset;
+ int current_half;
+ int current_char_boundary;
+ } iso2022;
+
+ /* Additional information (the state of the running CCL program)
+ used by the CCL encoder. */
+ struct ccl_program ccl;
+};
+
+static int encoding_reader (Lstream *stream, unsigned char *data, size_t size);
+static int encoding_writer (Lstream *stream, CONST unsigned char *data,
+ size_t size);
+static int encoding_rewinder (Lstream *stream);
+static int encoding_seekable_p (Lstream *stream);
+static int encoding_flusher (Lstream *stream);
+static int encoding_closer (Lstream *stream);
+static Lisp_Object encoding_marker (Lisp_Object stream,
+ void (*markobj) (Lisp_Object));
+
+DEFINE_LSTREAM_IMPLEMENTATION ("encoding", lstream_encoding,
+ sizeof (struct encoding_stream));
+
+static Lisp_Object
+encoding_marker (Lisp_Object stream, void (*markobj) (Lisp_Object))
+{
+ Lstream *str = ENCODING_STREAM_DATA (XLSTREAM (stream))->other_end;
+ Lisp_Object str_obj;
+
+ /* We do not need to mark the coding systems or charsets stored
+ within the stream because they are stored in a global list
+ and automatically marked. */
+
+ XSETLSTREAM (str_obj, str);
+ (markobj) (str_obj);
+ if (str->imp->marker)
+ return (str->imp->marker) (str_obj, markobj);
+ else
+ return Qnil;
+}
+
+/* Read SIZE bytes of data and store it into DATA. We are a encoding stream
+ so we read data from the other end, encode it, and store it into DATA. */
+
+static int
+encoding_reader (Lstream *stream, unsigned char *data, size_t size)
+{
+ struct encoding_stream *str = ENCODING_STREAM_DATA (stream);
+ unsigned char *orig_data = data;
+ int read_size;
+ int error_occurred = 0;
+
+ /* We need to interface to mule_encode(), which expects to take some
+ amount of data and store the result into a Dynarr. We have
+ mule_encode() store into str->runoff, and take data from there
+ as necessary. */
+
+ /* We loop until we have enough data, reading chunks from the other
+ end and encoding it. */
+ while (1)
+ {
+ /* Take data from the runoff if we can. Make sure to take at
+ most SIZE bytes, and delete the data from the runoff. */
+ if (Dynarr_length (str->runoff) > 0)
+ {
+ int chunk = min ((int) size, Dynarr_length (str->runoff));
+ memcpy (data, Dynarr_atp (str->runoff, 0), chunk);
+ Dynarr_delete_many (str->runoff, 0, chunk);
+ data += chunk;
+ size -= chunk;
+ }
+
+ if (size == 0)
+ break; /* No more room for data */
+
+ if (str->flags & CODING_STATE_END)
+ /* This means that on the previous iteration, we hit the EOF on
+ the other end. We loop once more so that mule_encode() can
+ output any final stuff it may be holding, or any "go back
+ to a sane state" escape sequences. (This latter makes sense
+ during encoding.) */
+ break;
+
+ /* Exhausted the runoff, so get some more. DATA at least SIZE bytes
+ left of storage in it, so it's OK to read directly into it.
+ (We'll be overwriting above, after we've encoded it into the
+ runoff.) */
+ read_size = Lstream_read (str->other_end, data, size);
+ if (read_size < 0)
+ {
+ error_occurred = 1;
+ break;
+ }
+ if (read_size == 0)
+ /* There might be some more end data produced in the translation.
+ See the comment above. */
+ str->flags |= CODING_STATE_END;
+ mule_encode (stream, data, str->runoff, read_size);
+ }
+
+ if (data == orig_data)
+ return error_occurred ? -1 : 0;
+ else
+ return data - orig_data;
+}
+
+static int
+encoding_writer (Lstream *stream, CONST unsigned char *data, size_t size)
+{
+ struct encoding_stream *str = ENCODING_STREAM_DATA (stream);
+ int retval;
+
+ /* Encode all our data into the runoff, and then attempt to write
+ it all out to the other end. Remove whatever chunk we succeeded
+ in writing. */
+ mule_encode (stream, data, str->runoff, size);
+ retval = Lstream_write (str->other_end, Dynarr_atp (str->runoff, 0),
+ Dynarr_length (str->runoff));
+ if (retval > 0)
+ Dynarr_delete_many (str->runoff, 0, retval);
+ /* Do NOT return retval. The return value indicates how much
+ of the incoming data was written, not how many bytes were
+ written. */
+ return size;
+}
+
+static void
+reset_encoding_stream (struct encoding_stream *str)
+{
+ switch (CODING_SYSTEM_TYPE (str->codesys))
+ {
+ case CODESYS_ISO2022:
+ {
+ int i;
+
+ for (i = 0; i < 4; i++)
+ {
+ str->iso2022.charset[i] =
+ CODING_SYSTEM_ISO2022_INITIAL_CHARSET (str->codesys, i);
+ str->iso2022.force_charset_on_output[i] =
+ CODING_SYSTEM_ISO2022_FORCE_CHARSET_ON_OUTPUT (str->codesys, i);
+ }
+ str->iso2022.register_left = 0;
+ str->iso2022.register_right = 1;
+ str->iso2022.current_charset = Qnil;
+ str->iso2022.current_half = 0;
+ str->iso2022.current_char_boundary = 1;
+ break;
+ }
+ case CODESYS_CCL:
+ setup_ccl_program (&str->ccl, CODING_SYSTEM_CCL_ENCODE (str->codesys));
+ break;
+ default:
+ break;
+ }
+
+ str->flags = str->ch = 0;
+}
+
+static int
+encoding_rewinder (Lstream *stream)
+{
+ struct encoding_stream *str = ENCODING_STREAM_DATA (stream);
+ reset_encoding_stream (str);
+ Dynarr_reset (str->runoff);
+ return Lstream_rewind (str->other_end);
+}
+
+static int
+encoding_seekable_p (Lstream *stream)
+{
+ struct encoding_stream *str = ENCODING_STREAM_DATA (stream);
+ return Lstream_seekable_p (str->other_end);
+}
+
+static int
+encoding_flusher (Lstream *stream)
+{
+ struct encoding_stream *str = ENCODING_STREAM_DATA (stream);
+ return Lstream_flush (str->other_end);
+}
+
+static int
+encoding_closer (Lstream *stream)
+{
+ struct encoding_stream *str = ENCODING_STREAM_DATA (stream);
+ if (stream->flags & LSTREAM_FL_WRITE)
+ {
+ str->flags |= CODING_STATE_END;
+ encoding_writer (stream, 0, 0);
+ }
+ Dynarr_free (str->runoff);
+ return Lstream_close (str->other_end);
+}
+
+Lisp_Object
+encoding_stream_coding_system (Lstream *stream)
+{
+ Lisp_Object coding_system;
+ struct encoding_stream *str = ENCODING_STREAM_DATA (stream);
+
+ XSETCODING_SYSTEM (coding_system, str->codesys);
+ return coding_system;
+}
+
+void
+set_encoding_stream_coding_system (Lstream *lstr, Lisp_Object codesys)
+{
+ struct Lisp_Coding_System *cs = XCODING_SYSTEM (codesys);
+ struct encoding_stream *str = ENCODING_STREAM_DATA (lstr);
+ str->codesys = cs;
+ reset_encoding_stream (str);
+}
+
+static Lisp_Object
+make_encoding_stream_1 (Lstream *stream, Lisp_Object codesys,
+ CONST char *mode)
+{
+ Lstream *lstr = Lstream_new (lstream_encoding, mode);
+ struct encoding_stream *str = ENCODING_STREAM_DATA (lstr);
+ Lisp_Object obj;
+
+ xzero (*str);
+ str->runoff = Dynarr_new (unsigned_char);
+ str->other_end = stream;
+ set_encoding_stream_coding_system (lstr, codesys);
+ XSETLSTREAM (obj, lstr);
+ return obj;
+}
+
+Lisp_Object
+make_encoding_input_stream (Lstream *stream, Lisp_Object codesys)
+{
+ return make_encoding_stream_1 (stream, codesys, "r");
+}
+
+Lisp_Object
+make_encoding_output_stream (Lstream *stream, Lisp_Object codesys)
+{
+ return make_encoding_stream_1 (stream, codesys, "w");
+}
+
+/* Convert N bytes of internally-formatted data stored in SRC to an
+ external format, according to the encoding stream ENCODING.
+ Store the encoded data into DST. */
+
+static void
+mule_encode (Lstream *encoding, CONST unsigned char *src,
+ unsigned_char_dynarr *dst, unsigned int n)
+{
+ struct encoding_stream *str = ENCODING_STREAM_DATA (encoding);
+
+ switch (CODING_SYSTEM_TYPE (str->codesys))
+ {
+#ifdef DEBUG_XEMACS
+ case CODESYS_INTERNAL:
+ Dynarr_add_many (dst, src, n);
+ break;
+#endif
+ case CODESYS_AUTODETECT:
+ /* If we got this far and still haven't decided on the coding
+ system, then do no conversion. */
+ case CODESYS_NO_CONVERSION:
+ encode_coding_no_conversion (encoding, src, dst, n);
+ break;
+ case CODESYS_SHIFT_JIS:
+ encode_coding_sjis (encoding, src, dst, n);
+ break;
+ case CODESYS_BIG5:
+ encode_coding_big5 (encoding, src, dst, n);
+ break;
+ case CODESYS_CCL:
+ ccl_driver (&str->ccl, src, dst, n, 0);
+ break;
+ case CODESYS_ISO2022:
+ encode_coding_iso2022 (encoding, src, dst, n);
+ break;
+ default:
+ abort ();
+ }
+}
+
+DEFUN ("encode-coding-region", Fencode_coding_region, 3, 4, 0, /*
+Encode the text between START and END using CODING-SYSTEM.
+This will, for example, convert Japanese characters into stuff such as
+"^[$B!<!+^[(B" if you use the JIS encoding. Return length of encoded
+text. BUFFER defaults to the current buffer if unspecified.
+*/
+ (start, end, coding_system, buffer))
+{
+ Bufpos b, e;
+ struct buffer *buf = decode_buffer (buffer, 0);
+ Lisp_Object instream, lb_outstream, de_outstream, outstream;
+ Lstream *istr, *ostr;
+ struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+
+ get_buffer_range_char (buf, start, end, &b, &e, 0);
+
+ barf_if_buffer_read_only (buf, b, e);
+
+ coding_system = Fget_coding_system (coding_system);
+ instream = make_lisp_buffer_input_stream (buf, b, e, 0);
+ lb_outstream = make_lisp_buffer_output_stream (buf, b, 0);
+ de_outstream = make_decoding_output_stream (XLSTREAM (lb_outstream),
+ Fget_coding_system (Qbinary));
+ outstream = make_encoding_output_stream (XLSTREAM (de_outstream),
+ coding_system);
+ istr = XLSTREAM (instream);
+ ostr = XLSTREAM (outstream);
+ GCPRO4 (instream, outstream, de_outstream, lb_outstream);
+ /* The chain of streams looks like this:
+
+ [BUFFER] <----- send through
+ ------> [ENCODE AS SPECIFIED]
+ ------> [DECODE AS BINARY]
+ ------> [BUFFER]
+ */
+ while (1)
+ {
+ char tempbuf[1024]; /* some random amount */
+ Bufpos newpos, even_newer_pos;
+ Bufpos oldpos = lisp_buffer_stream_startpos (istr);
+ int size_in_bytes = Lstream_read (istr, tempbuf, sizeof (tempbuf));
+
+ if (!size_in_bytes)
+ break;
+ newpos = lisp_buffer_stream_startpos (istr);
+ Lstream_write (ostr, tempbuf, size_in_bytes);
+ even_newer_pos = lisp_buffer_stream_startpos (istr);
+ buffer_delete_range (buf, even_newer_pos - (newpos - oldpos),
+ even_newer_pos, 0);
+ }
+
+ {
+ Charcount retlen =
+ lisp_buffer_stream_startpos (XLSTREAM (instream)) - b;
+ Lstream_close (istr);
+ Lstream_close (ostr);
+ UNGCPRO;
+ Lstream_delete (istr);
+ Lstream_delete (ostr);
+ Lstream_delete (XLSTREAM (de_outstream));
+ Lstream_delete (XLSTREAM (lb_outstream));
+ return make_int (retlen);
+ }
+}
+
+\f
+/************************************************************************/
+/* Shift-JIS methods */
+/************************************************************************/
+
+/* Shift-JIS is a coding system encoding three character sets: ASCII, right
+ half of JISX0201-Kana, and JISX0208. An ASCII character is encoded
+ as is. A character of JISX0201-Kana (TYPE94 character set) is
+ encoded by "position-code + 0x80". A character of JISX0208
+ (TYPE94x94 character set) is encoded in 2-byte but two
+ position-codes are divided and shifted so that it fit in the range
+ below.
+
+ --- CODE RANGE of Shift-JIS ---
+ (character set) (range)
+ ASCII 0x00 .. 0x7F
+ JISX0201-Kana 0xA0 .. 0xDF
+ JISX0208 (1st byte) 0x80 .. 0x9F and 0xE0 .. 0xEF
+ (2nd byte) 0x40 .. 0x7E and 0x80 .. 0xFC
+ -------------------------------
+
+*/
+
+/* Is this the first byte of a Shift-JIS two-byte char? */
+
+#define BYTE_SJIS_TWO_BYTE_1_P(c) \
+ (((c) >= 0x81 && (c) <= 0x9F) || ((c) >= 0xE0 && (c) <= 0xEF))
+
+/* Is this the second byte of a Shift-JIS two-byte char? */
+
+#define BYTE_SJIS_TWO_BYTE_2_P(c) \
+ (((c) >= 0x40 && (c) <= 0x7E) || ((c) >= 0x80 && (c) <= 0xFC))
+
+#define BYTE_SJIS_KATAKANA_P(c) \
+ ((c) >= 0xA1 && (c) <= 0xDF)
+
+static int
+detect_coding_sjis (struct detection_state *st, CONST unsigned char *src,
+ unsigned int n)
+{
+ int c;
+
+ while (n--)
+ {
+ c = *src++;
+ if (c == ISO_CODE_ESC || c == ISO_CODE_SI || c == ISO_CODE_SO)
+ return 0;
+ if (st->shift_jis.in_second_byte)
+ {
+ st->shift_jis.in_second_byte = 0;
+ if (c < 0x40)
+ return 0;
+ }
+ else if ((c >= 0x80 && c < 0xA0) || c >= 0xE0)
+ st->shift_jis.in_second_byte = 1;
+ }
+ return CODING_CATEGORY_SHIFT_JIS_MASK;
+}
+
+/* Convert Shift-JIS data to internal format. */
+
+static void
+decode_coding_sjis (Lstream *decoding, CONST unsigned char *src,
+ unsigned_char_dynarr *dst, unsigned int n)
+{
+ unsigned char c;
+ unsigned int flags, ch;
+ enum eol_type eol_type;
+ struct decoding_stream *str = DECODING_STREAM_DATA (decoding);
+
+ CODING_STREAM_DECOMPOSE (str, flags, ch);
+ eol_type = str->eol_type;
+
+ while (n--)
+ {
+ c = *src++;
+
+ if (ch)
+ {
+ /* Previous character was first byte of Shift-JIS Kanji char. */
+ if (BYTE_SJIS_TWO_BYTE_2_P (c))
+ {
+ unsigned char e1, e2;
+
+ Dynarr_add (dst, LEADING_BYTE_JAPANESE_JISX0208);
+ DECODE_SJIS (ch, c, e1, e2);
+ Dynarr_add (dst, e1);
+ Dynarr_add (dst, e2);
+ }
+ else
+ {
+ DECODE_ADD_BINARY_CHAR (ch, dst);
+ DECODE_ADD_BINARY_CHAR (c, dst);
+ }
+ ch = 0;
+ }
+ else
+ {
+ DECODE_HANDLE_EOL_TYPE (eol_type, c, flags, dst);
+ if (BYTE_SJIS_TWO_BYTE_1_P (c))
+ ch = c;
+ else if (BYTE_SJIS_KATAKANA_P (c))
+ {
+ Dynarr_add (dst, LEADING_BYTE_KATAKANA_JISX0201);
+ Dynarr_add (dst, c);
+ }
+ else
+ DECODE_ADD_BINARY_CHAR (c, dst);
+ }
+ label_continue_loop:;
+ }
+
+ DECODE_HANDLE_END_OF_CONVERSION (flags, ch, dst);
+
+ CODING_STREAM_COMPOSE (str, flags, ch);
+}
+
+/* Convert internally-formatted data to Shift-JIS. */
+
+static void
+encode_coding_sjis (Lstream *encoding, CONST unsigned char *src,
+ unsigned_char_dynarr *dst, unsigned int n)
+{
+ unsigned char c;
+ struct encoding_stream *str = ENCODING_STREAM_DATA (encoding);
+ unsigned int flags, ch;
+ enum eol_type eol_type;
+
+ CODING_STREAM_DECOMPOSE (str, flags, ch);
+ eol_type = CODING_SYSTEM_EOL_TYPE (str->codesys);
+
+ while (n--)
+ {
+ c = *src++;
+ if (c == '\n')
+ {
+ if (eol_type != EOL_LF && eol_type != EOL_AUTODETECT)
+ Dynarr_add (dst, '\r');
+ if (eol_type != EOL_CR)
+ Dynarr_add (dst, '\n');
+ ch = 0;
+ }
+ else if (BYTE_ASCII_P (c))
+ {
+ Dynarr_add (dst, c);
+ ch = 0;
+ }
+ else if (BUFBYTE_LEADING_BYTE_P (c))
+ ch = (c == LEADING_BYTE_KATAKANA_JISX0201 ||
+ c == LEADING_BYTE_JAPANESE_JISX0208_1978 ||
+ c == LEADING_BYTE_JAPANESE_JISX0208) ? c : 0;
+ else if (ch)
+ {
+ if (ch == LEADING_BYTE_KATAKANA_JISX0201)
+ {
+ Dynarr_add (dst, c);
+ ch = 0;
+ }
+ else if (ch == LEADING_BYTE_JAPANESE_JISX0208_1978 ||
+ ch == LEADING_BYTE_JAPANESE_JISX0208)
+ ch = c;
+ else
+ {
+ unsigned char j1, j2;
+ ENCODE_SJIS (ch, c, j1, j2);
+ Dynarr_add (dst, j1);
+ Dynarr_add (dst, j2);
+ ch = 0;
+ }
+ }
+ }
+
+ CODING_STREAM_COMPOSE (str, flags, ch);
+}
+
+DEFUN ("decode-shift-jis-char", Fdecode_shift_jis_char, 1, 1, 0, /*
+Decode a JISX0208 character of Shift-JIS coding-system.
+CODE is the character code in Shift-JIS as a cons of type bytes.
+Return the corresponding character.
+*/
+ (code))
+{
+ unsigned char c1, c2, s1, s2;
+
+ CHECK_CONS (code);
+ CHECK_INT (XCAR (code));
+ CHECK_INT (XCDR (code));
+ s1 = XINT (XCAR (code));
+ s2 = XINT (XCDR (code));
+ if (BYTE_SJIS_TWO_BYTE_1_P (s1) &&
+ BYTE_SJIS_TWO_BYTE_2_P (s2))
+ {
+ DECODE_SJIS (s1, s2, c1, c2);
+ return make_char (MAKE_CHAR (Vcharset_japanese_jisx0208,
+ c1 & 0x7F, c2 & 0x7F));
+ }
+ else
+ return Qnil;
+}
+
+DEFUN ("encode-shift-jis-char", Fencode_shift_jis_char, 1, 1, 0, /*
+Encode a JISX0208 character CHAR to SHIFT-JIS coding-system.
+Return the corresponding character code in SHIFT-JIS as a cons of two bytes.
+*/
+ (ch))
+{
+ Lisp_Object charset;
+ int c1, c2, s1, s2;
+
+ CHECK_CHAR_COERCE_INT (ch);
+ BREAKUP_CHAR (XCHAR (ch), charset, c1, c2);
+ if (EQ (charset, Vcharset_japanese_jisx0208))
+ {
+ ENCODE_SJIS (c1 | 0x80, c2 | 0x80, s1, s2);
+ return Fcons (make_int (s1), make_int (s2));
+ }
+ else
+ return Qnil;
+}
+
+\f
+/************************************************************************/
+/* Big5 methods */
+/************************************************************************/
+
+/* BIG5 is a coding system encoding two character sets: ASCII and
+ Big5. An ASCII character is encoded as is. Big5 is a two-byte
+ character set and is encoded in two-byte.
+
+ --- CODE RANGE of BIG5 ---
+ (character set) (range)
+ ASCII 0x00 .. 0x7F
+ Big5 (1st byte) 0xA1 .. 0xFE
+ (2nd byte) 0x40 .. 0x7E and 0xA1 .. 0xFE
+ --------------------------
+
+ Since the number of characters in Big5 is larger than maximum
+ characters in Emacs' charset (96x96), it can't be handled as one
+ charset. So, in Emacs, Big5 is devided into two: `charset-big5-1'
+ and `charset-big5-2'. Both <type>s are TYPE94x94. The former
+ contains frequently used characters and the latter contains less
+ frequently used characters. */
+
+#define BYTE_BIG5_TWO_BYTE_1_P(c) \
+ ((c) >= 0xA1 && (c) <= 0xFE)
+
+/* Is this the second byte of a Shift-JIS two-byte char? */
+
+#define BYTE_BIG5_TWO_BYTE_2_P(c) \
+ (((c) >= 0x40 && (c) <= 0x7E) || ((c) >= 0xA1 && (c) <= 0xFE))
+
+/* Number of Big5 characters which have the same code in 1st byte. */
+
+#define BIG5_SAME_ROW (0xFF - 0xA1 + 0x7F - 0x40)
+
+/* Code conversion macros. These are macros because they are used in
+ inner loops during code conversion.
+
+ Note that temporary variables in macros introduce the classic
+ dynamic-scoping problems with variable names. We use capital-
+ lettered variables in the assumption that XEmacs does not use
+ capital letters in variables except in a very formalized way
+ (e.g. Qstring). */
+
+/* Convert Big5 code (b1, b2) into its internal string representation
+ (lb, c1, c2). */
+
+/* There is a much simpler way to split the Big5 charset into two.
+ For the moment I'm going to leave the algorithm as-is because it
+ claims to separate out the most-used characters into a single
+ charset, which perhaps will lead to optimizations in various
+ places.
+
+ The way the algorithm works is something like this:
+
+ Big5 can be viewed as a 94x157 charset, where the row is
+ encoded into the bytes 0xA1 .. 0xFE and the column is encoded
+ into the bytes 0x40 .. 0x7E and 0xA1 .. 0xFE. As for frequency,
+ the split between low and high column numbers is apparently
+ meaningless; ascending rows produce less and less frequent chars.
+ Therefore, we assign the lower half of rows (0xA1 .. 0xC8) to
+ the first charset, and the upper half (0xC9 .. 0xFE) to the
+ second. To do the conversion, we convert the character into
+ a single number where 0 .. 156 is the first row, 157 .. 313
+ is the second, etc. That way, the characters are ordered by
+ decreasing frequency. Then we just chop the space in two
+ and coerce the result into a 94x94 space.
+ */
+
+#define DECODE_BIG5(b1, b2, lb, c1, c2) do \
+{ \
+ int B1 = b1, B2 = b2; \
+ unsigned int I \
+ = (B1 - 0xA1) * BIG5_SAME_ROW + B2 - (B2 < 0x7F ? 0x40 : 0x62); \
+ \
+ if (B1 < 0xC9) \
+ { \
+ lb = LEADING_BYTE_CHINESE_BIG5_1; \
+ } \
+ else \
+ { \
+ lb = LEADING_BYTE_CHINESE_BIG5_2; \
+ I -= (BIG5_SAME_ROW) * (0xC9 - 0xA1); \
+ } \
+ c1 = I / (0xFF - 0xA1) + 0xA1; \
+ c2 = I % (0xFF - 0xA1) + 0xA1; \
+} while (0)
+
+/* Convert the internal string representation of a Big5 character
+ (lb, c1, c2) into Big5 code (b1, b2). */
+
+#define ENCODE_BIG5(lb, c1, c2, b1, b2) do \
+{ \
+ unsigned int I = ((c1) - 0xA1) * (0xFF - 0xA1) + ((c2) - 0xA1); \
+ \
+ if (lb == LEADING_BYTE_CHINESE_BIG5_2) \
+ { \
+ I += BIG5_SAME_ROW * (0xC9 - 0xA1); \
+ } \
+ b1 = I / BIG5_SAME_ROW + 0xA1; \
+ b2 = I % BIG5_SAME_ROW; \
+ b2 += b2 < 0x3F ? 0x40 : 0x62; \
+} while (0)
+
+static int
+detect_coding_big5 (struct detection_state *st, CONST unsigned char *src,
+ unsigned int n)
+{
+ int c;
+
+ while (n--)
+ {
+ c = *src++;
+ if (c == ISO_CODE_ESC || c == ISO_CODE_SI || c == ISO_CODE_SO ||
+ (c >= 0x80 && c <= 0xA0))
+ return 0;
+ if (st->big5.in_second_byte)
+ {
+ st->big5.in_second_byte = 0;
+ if (c < 0x40 || (c >= 0x80 && c <= 0xA0))
+ return 0;
+ }
+ else if (c >= 0xA1)
+ st->big5.in_second_byte = 1;
+ }
+ return CODING_CATEGORY_BIG5_MASK;
+}
+
+/* Convert Big5 data to internal format. */
+
+static void
+decode_coding_big5 (Lstream *decoding, CONST unsigned char *src,
+ unsigned_char_dynarr *dst, unsigned int n)
+{
+ unsigned char c;
+ unsigned int flags, ch;
+ enum eol_type eol_type;
+ struct decoding_stream *str = DECODING_STREAM_DATA (decoding);
+
+ CODING_STREAM_DECOMPOSE (str, flags, ch);
+ eol_type = str->eol_type;
+
+ while (n--)
+ {
+ c = *src++;
+ if (ch)
+ {
+ /* Previous character was first byte of Big5 char. */
+ if (BYTE_BIG5_TWO_BYTE_2_P (c))
+ {
+ unsigned char b1, b2, b3;
+ DECODE_BIG5 (ch, c, b1, b2, b3);
+ Dynarr_add (dst, b1);
+ Dynarr_add (dst, b2);
+ Dynarr_add (dst, b3);
+ }
+ else
+ {
+ DECODE_ADD_BINARY_CHAR (ch, dst);
+ DECODE_ADD_BINARY_CHAR (c, dst);
+ }
+ ch = 0;
+ }
+ else
+ {
+ DECODE_HANDLE_EOL_TYPE (eol_type, c, flags, dst);
+ if (BYTE_BIG5_TWO_BYTE_1_P (c))
+ ch = c;
+ else
+ DECODE_ADD_BINARY_CHAR (c, dst);
+ }
+ label_continue_loop:;
+ }
+
+ DECODE_HANDLE_END_OF_CONVERSION (flags, ch, dst);
+
+ CODING_STREAM_COMPOSE (str, flags, ch);
+}
+
+/* Convert internally-formatted data to Big5. */
+
+static void
+encode_coding_big5 (Lstream *encoding, CONST unsigned char *src,
+ unsigned_char_dynarr *dst, unsigned int n)
+{
+ unsigned char c;
+ struct encoding_stream *str = ENCODING_STREAM_DATA (encoding);
+ unsigned int flags, ch;
+ enum eol_type eol_type;
+
+ CODING_STREAM_DECOMPOSE (str, flags, ch);
+ eol_type = CODING_SYSTEM_EOL_TYPE (str->codesys);
+
+ while (n--)
+ {
+ c = *src++;
+ if (c == '\n')
+ {
+ if (eol_type != EOL_LF && eol_type != EOL_AUTODETECT)
+ Dynarr_add (dst, '\r');
+ if (eol_type != EOL_CR)
+ Dynarr_add (dst, '\n');
+ }
+ else if (BYTE_ASCII_P (c))
+ {
+ /* ASCII. */
+ Dynarr_add (dst, c);
+ }
+ else if (BUFBYTE_LEADING_BYTE_P (c))
+ {
+ if (c == LEADING_BYTE_CHINESE_BIG5_1 ||
+ c == LEADING_BYTE_CHINESE_BIG5_2)
+ {
+ /* A recognized leading byte. */
+ ch = c;
+ continue; /* not done with this character. */
+ }
+ /* otherwise just ignore this character. */
+ }
+ else if (ch == LEADING_BYTE_CHINESE_BIG5_1 ||
+ ch == LEADING_BYTE_CHINESE_BIG5_2)
+ {
+ /* Previous char was a recognized leading byte. */
+ ch = (ch << 8) | c;
+ continue; /* not done with this character. */
+ }
+ else if (ch)
+ {
+ /* Encountering second byte of a Big5 character. */
+ unsigned char b1, b2;
+
+ ENCODE_BIG5 (ch >> 8, ch & 0xFF, c, b1, b2);
+ Dynarr_add (dst, b1);
+ Dynarr_add (dst, b2);
+ }
+
+ ch = 0;
+ }
+
+ CODING_STREAM_COMPOSE (str, flags, ch);
+}
+
+
+DEFUN ("decode-big5-char", Fdecode_big5_char, 1, 1, 0, /*
+Decode a Big5 character CODE of BIG5 coding-system.
+CODE is the character code in BIG5, a cons of two integers.
+Return the corresponding character.
+*/
+ (code))
+{
+ unsigned char c1, c2, b1, b2;
+
+ CHECK_CONS (code);
+ CHECK_INT (XCAR (code));
+ CHECK_INT (XCDR (code));
+ b1 = XINT (XCAR (code));
+ b2 = XINT (XCDR (code));
+ if (BYTE_BIG5_TWO_BYTE_1_P (b1) &&
+ BYTE_BIG5_TWO_BYTE_2_P (b2))
+ {
+ int leading_byte;
+ Lisp_Object charset;
+ DECODE_BIG5 (b1, b2, leading_byte, c1, c2);
+ charset = CHARSET_BY_LEADING_BYTE (leading_byte);
+ return make_char (MAKE_CHAR (charset, c1 & 0x7F, c2 & 0x7F));
+ }
+ else
+ return Qnil;
+}
+
+DEFUN ("encode-big5-char", Fencode_big5_char, 1, 1, 0, /*
+Encode the Big5 character CH to BIG5 coding-system.
+Return the corresponding character code in Big5.
+*/
+ (ch))
+{
+ Lisp_Object charset;
+ int c1, c2, b1, b2;
+
+ CHECK_CHAR_COERCE_INT (ch);
+ BREAKUP_CHAR (XCHAR (ch), charset, c1, c2);
+ if (EQ (charset, Vcharset_chinese_big5_1) ||
+ EQ (charset, Vcharset_chinese_big5_2))
+ {
+ ENCODE_BIG5 (XCHARSET_LEADING_BYTE (charset), c1 | 0x80, c2 | 0x80,
+ b1, b2);
+ return Fcons (make_int (b1), make_int (b2));
+ }
+ else
+ return Qnil;
+}
+
+\f
+/************************************************************************/
+/* ISO2022 methods */
+/************************************************************************/
+
+/* The following note describes the coding system ISO2022 briefly.
+ Since the intention of this note is to help understanding of the
+ programs in this file, some parts are NOT ACCURATE or OVERLY
+ SIMPLIFIED. For thorough understanding, please refer to the
+ original document of ISO2022.
+
+ ISO2022 provides many mechanisms to encode several character sets
+ in 7-bit and 8-bit environments. If one chooses 7-bit environment,
+ all text is encoded by codes of less than 128. This may make the
+ encoded text a little bit longer, but the text get more stability
+ to pass through several gateways (some of them strip off MSB).
+
+ There are two kind of character sets: control character set and
+ graphic character set. The former contains control characters such
+ as `newline' and `escape' to provide control functions (control
+ functions are provided also by escape sequence). The latter
+ contains graphic characters such as 'A' and '-'. Emacs recognizes
+ two control character sets and many graphic character sets.
+
+ Graphic character sets are classified into one of four types,
+ according to the dimension and number of characters in the set:
+ TYPE94, TYPE96, TYPE94x94, and TYPE96x96. In addition, each
+ character set is assigned an identification byte, unique for each
+ type, called "final character" (denoted as <F> hereafter). The <F>
+ of each character set is decided by ECMA(*) when it is registered
+ in ISO. Code range of <F> is 0x30..0x7F (0x30..0x3F are for
+ private use only).
+
+ Note (*): ECMA = European Computer Manufacturers Association
+
+ Here are examples of graphic character set [NAME(<F>)]:
+ o TYPE94 -- ASCII('B'), right-half-of-JISX0201('I'), ...
+ o TYPE96 -- right-half-of-ISO8859-1('A'), ...
+ o TYPE94x94 -- GB2312('A'), JISX0208('B'), ...
+ o TYPE96x96 -- none for the moment
+
+ A code area (1byte=8bits) is divided into 4 areas, C0, GL, C1, and GR.
+ C0 [0x00..0x1F] -- control character plane 0
+ GL [0x20..0x7F] -- graphic character plane 0
+ C1 [0x80..0x9F] -- control character plane 1
+ GR [0xA0..0xFF] -- graphic character plane 1
+
+ A control character set is directly designated and invoked to C0 or
+ C1 by an escape sequence. The most common case is that:
+ - ISO646's control character set is designated/invoked to C0, and
+ - ISO6429's control character set is designated/invoked to C1,
+ and usually these designations/invocations are omitted in encoded
+ text. In a 7-bit environment, only C0 can be used, and a control
+ character for C1 is encoded by an appropriate escape sequence to
+ fit into the environment. All control characters for C1 are
+ defined to have corresponding escape sequences.
+
+ A graphic character set is at first designated to one of four
+ graphic registers (G0 through G3), then these graphic registers are
+ invoked to GL or GR. These designations and invocations can be
+ done independently. The most common case is that G0 is invoked to
+ GL, G1 is invoked to GR, and ASCII is designated to G0. Usually
+ these invocations and designations are omitted in encoded text.
+ In a 7-bit environment, only GL can be used.
+
+ When a graphic character set of TYPE94 or TYPE94x94 is invoked to
+ GL, codes 0x20 and 0x7F of the GL area work as control characters
+ SPACE and DEL respectively, and code 0xA0 and 0xFF of GR area
+ should not be used.
+
+ There are two ways of invocation: locking-shift and single-shift.
+ With locking-shift, the invocation lasts until the next different
+ invocation, whereas with single-shift, the invocation works only
+ for the following character and doesn't affect locking-shift.
+ Invocations are done by the following control characters or escape
+ sequences.
+
+ ----------------------------------------------------------------------
+ abbrev function cntrl escape seq description
+ ----------------------------------------------------------------------
+ SI/LS0 (shift-in) 0x0F none invoke G0 into GL
+ SO/LS1 (shift-out) 0x0E none invoke G1 into GL
+ LS1R (locking-shift-1 right) none ESC '~' invoke G1 into GR
+ LS2 (locking-shift-2) none ESC 'n' invoke G2 into GL
+ LS2R (locking-shift-2 right) none ESC '}' invoke G2 into GR
+ LS3 (locking-shift-3) none ESC 'o' invoke G3 into GL
+ LS3R (locking-shift 3 right) none ESC '|' invoke G3 into GR
+ SS2 (single-shift-2) 0x8E ESC 'N' invoke G2 for one char
+ SS3 (single-shift-3) 0x8F ESC 'O' invoke G3 for one char
+ ----------------------------------------------------------------------
+ The first four are for locking-shift. Control characters for these
+ functions are defined by macros ISO_CODE_XXX in `coding.h'.
+
+ Designations are done by the following escape sequences.
+ ----------------------------------------------------------------------
+ escape sequence description
+ ----------------------------------------------------------------------
+ ESC '(' <F> designate TYPE94<F> to G0
+ ESC ')' <F> designate TYPE94<F> to G1
+ ESC '*' <F> designate TYPE94<F> to G2
+ ESC '+' <F> designate TYPE94<F> to G3
+ ESC ',' <F> designate TYPE96<F> to G0 (*)
+ ESC '-' <F> designate TYPE96<F> to G1
+ ESC '.' <F> designate TYPE96<F> to G2
+ ESC '/' <F> designate TYPE96<F> to G3
+ ESC '$' '(' <F> designate TYPE94x94<F> to G0 (**)
+ ESC '$' ')' <F> designate TYPE94x94<F> to G1
+ ESC '$' '*' <F> designate TYPE94x94<F> to G2
+ ESC '$' '+' <F> designate TYPE94x94<F> to G3
+ ESC '$' ',' <F> designate TYPE96x96<F> to G0 (*)
+ ESC '$' '-' <F> designate TYPE96x96<F> to G1
+ ESC '$' '.' <F> designate TYPE96x96<F> to G2
+ ESC '$' '/' <F> designate TYPE96x96<F> to G3
+ ----------------------------------------------------------------------
+ In this list, "TYPE94<F>" means a graphic character set of type TYPE94
+ and final character <F>, and etc.
+
+ Note (*): Although these designations are not allowed in ISO2022,
+ Emacs accepts them on decoding, and produces them on encoding
+ TYPE96 or TYPE96x96 character set in a coding system which is
+ characterized as 7-bit environment, non-locking-shift, and
+ non-single-shift.
+
+ Note (**): If <F> is '@', 'A', or 'B', the intermediate character
+ '(' can be omitted. We call this as "short-form" here after.
+
+ Now you may notice that there are a lot of ways for encoding the
+ same multilingual text in ISO2022. Actually, there exist many
+ coding systems such as Compound Text (used in X's inter client
+ communication, ISO-2022-JP (used in Japanese internet), ISO-2022-KR
+ (used in Korean internet), EUC (Extended UNIX Code, used in Asian
+ localized platforms), and all of these are variants of ISO2022.
+
+ In addition to the above, Emacs handles two more kinds of escape
+ sequences: ISO6429's direction specification and Emacs' private
+ sequence for specifying character composition.
+
+ ISO6429's direction specification takes the following format:
+ o CSI ']' -- end of the current direction
+ o CSI '0' ']' -- end of the current direction
+ o CSI '1' ']' -- start of left-to-right text
+ o CSI '2' ']' -- start of right-to-left text
+ The control character CSI (0x9B: control sequence introducer) is
+ abbreviated to the escape sequence ESC '[' in 7-bit environment.
+
+ Character composition specification takes the following format:
+ o ESC '0' -- start character composition
+ o ESC '1' -- end character composition
+ Since these are not standard escape sequences of any ISO, the use
+ of them for these meanings is restricted to Emacs only. */
+
+static void
+reset_iso2022 (Lisp_Object coding_system, struct iso2022_decoder *iso)
+{
+ int i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (!NILP (coding_system))
+ iso->charset[i] =
+ XCODING_SYSTEM_ISO2022_INITIAL_CHARSET (coding_system, i);
+ else
+ iso->charset[i] = Qt;
+ iso->invalid_designated[i] = 0;
+ }
+ iso->esc = ISO_ESC_NOTHING;
+ iso->esc_bytes_index = 0;
+ iso->register_left = 0;
+ iso->register_right = 1;
+ iso->switched_dir_and_no_valid_charset_yet = 0;
+ iso->invalid_switch_dir = 0;
+ iso->output_direction_sequence = 0;
+ iso->output_literally = 0;
+ if (iso->composite_chars)
+ Dynarr_reset (iso->composite_chars);
+}
+
+static int
+fit_to_be_escape_quoted (unsigned char c)
+{
+ switch (c)
+ {
+ case ISO_CODE_ESC:
+ case ISO_CODE_CSI:
+ case ISO_CODE_SS2:
+ case ISO_CODE_SS3:
+ case ISO_CODE_SO:
+ case ISO_CODE_SI:
+ return 1;
+
+ default:
+ return 0;
+ }
+}
+
+/* Parse one byte of an ISO2022 escape sequence.
+ If the result is an invalid escape sequence, return 0 and
+ do not change anything in STR. Otherwise, if the result is
+ an incomplete escape sequence, update ISO2022.ESC and
+ ISO2022.ESC_BYTES and return -1. Otherwise, update
+ all the state variables (but not ISO2022.ESC_BYTES) and
+ return 1.
+
+ If CHECK_INVALID_CHARSETS is non-zero, check for designation
+ or invocation of an invalid character set and treat that as
+ an unrecognized escape sequence. */
+
+static int
+parse_iso2022_esc (Lisp_Object codesys, struct iso2022_decoder *iso,
+ unsigned char c, unsigned int *flags,
+ int check_invalid_charsets)
+{
+ /* (1) If we're at the end of a designation sequence, CS is the
+ charset being designated and REG is the register to designate
+ it to.
+
+ (2) If we're at the end of a locking-shift sequence, REG is
+ the register to invoke and HALF (0 == left, 1 == right) is
+ the half to invoke it into.
+
+ (3) If we're at the end of a single-shift sequence, REG is
+ the register to invoke. */
+ Lisp_Object cs = Qnil;
+ int reg, half;
+
+ /* NOTE: This code does goto's all over the fucking place.
+ The reason for this is that we're basically implementing
+ a state machine here, and hierarchical languages like C
+ don't really provide a clean way of doing this. */
+
+ if (! (*flags & CODING_STATE_ESCAPE))
+ /* At beginning of escape sequence; we need to reset our
+ escape-state variables. */
+ iso->esc = ISO_ESC_NOTHING;
+
+ iso->output_literally = 0;
+ iso->output_direction_sequence = 0;
+
+ switch (iso->esc)
+ {
+ case ISO_ESC_NOTHING:
+ iso->esc_bytes_index = 0;
+ switch (c)
+ {
+ case ISO_CODE_ESC: /* Start escape sequence */
+ *flags |= CODING_STATE_ESCAPE;
+ iso->esc = ISO_ESC;
+ goto not_done;
+
+ case ISO_CODE_CSI: /* ISO6429 (specifying directionality) */
+ *flags |= CODING_STATE_ESCAPE;
+ iso->esc = ISO_ESC_5_11;
+ goto not_done;
+
+ case ISO_CODE_SO: /* locking shift 1 */
+ reg = 1; half = 0;
+ goto locking_shift;
+ case ISO_CODE_SI: /* locking shift 0 */
+ reg = 0; half = 0;
+ goto locking_shift;
+
+ case ISO_CODE_SS2: /* single shift */
+ reg = 2;
+ goto single_shift;
+ case ISO_CODE_SS3: /* single shift */
+ reg = 3;
+ goto single_shift;
+
+ default: /* Other control characters */
+ return 0;
+ }
+
+ case ISO_ESC:
+ switch (c)
+ {
+ /**** single shift ****/
+
+ case 'N': /* single shift 2 */
+ reg = 2;
+ goto single_shift;
+ case 'O': /* single shift 3 */
+ reg = 3;
+ goto single_shift;
+
+ /**** locking shift ****/
+
+ case '~': /* locking shift 1 right */
+ reg = 1; half = 1;
+ goto locking_shift;
+ case 'n': /* locking shift 2 */
+ reg = 2; half = 0;
+ goto locking_shift;
+ case '}': /* locking shift 2 right */
+ reg = 2; half = 1;
+ goto locking_shift;
+ case 'o': /* locking shift 3 */
+ reg = 3; half = 0;
+ goto locking_shift;
+ case '|': /* locking shift 3 right */
+ reg = 3; half = 1;
+ goto locking_shift;
+
+ /**** composite ****/
+
+ case '0':
+ iso->esc = ISO_ESC_START_COMPOSITE;
+ *flags = (*flags & CODING_STATE_ISO2022_LOCK) |
+ CODING_STATE_COMPOSITE;
+ return 1;
+
+ case '1':
+ iso->esc = ISO_ESC_END_COMPOSITE;
+ *flags = (*flags & CODING_STATE_ISO2022_LOCK) &
+ ~CODING_STATE_COMPOSITE;
+ return 1;
+
+ /**** directionality ****/
+
+ case '[':
+ iso->esc = ISO_ESC_5_11;
+ goto not_done;
+
+ /**** designation ****/
+
+ case '$': /* multibyte charset prefix */
+ iso->esc = ISO_ESC_2_4;
+ goto not_done;
+
+ default:
+ if (0x28 <= c && c <= 0x2F)
+ {
+ iso->esc = (enum iso_esc_flag) (c - 0x28 + ISO_ESC_2_8);
+ goto not_done;
+ }
+
+ /* This function is called with CODESYS equal to nil when
+ doing coding-system detection. */
+ if (!NILP (codesys)
+ && XCODING_SYSTEM_ISO2022_ESCAPE_QUOTED (codesys)
+ && fit_to_be_escape_quoted (c))
+ {
+ iso->esc = ISO_ESC_LITERAL;
+ *flags &= CODING_STATE_ISO2022_LOCK;
+ return 1;
+ }
+
+ /* bzzzt! */
+ return 0;
+ }
+
+
+
+ /**** directionality ****/
+
+ case ISO_ESC_5_11: /* ISO6429 direction control */
+ if (c == ']')
+ {
+ *flags &= (CODING_STATE_ISO2022_LOCK & ~CODING_STATE_R2L);
+ goto directionality;
+ }
+ if (c == '0') iso->esc = ISO_ESC_5_11_0;
+ else if (c == '1') iso->esc = ISO_ESC_5_11_1;
+ else if (c == '2') iso->esc = ISO_ESC_5_11_2;
+ else return 0;
+ goto not_done;
+
+ case ISO_ESC_5_11_0:
+ if (c == ']')
+ {
+ *flags &= (CODING_STATE_ISO2022_LOCK & ~CODING_STATE_R2L);
+ goto directionality;
+ }
+ return 0;
+
+ case ISO_ESC_5_11_1:
+ if (c == ']')
+ {
+ *flags = (CODING_STATE_ISO2022_LOCK & ~CODING_STATE_R2L);
+ goto directionality;
+ }
+ return 0;
+
+ case ISO_ESC_5_11_2:
+ if (c == ']')
+ {
+ *flags = (*flags & CODING_STATE_ISO2022_LOCK) | CODING_STATE_R2L;
+ goto directionality;
+ }
+ return 0;
+
+ directionality:
+ iso->esc = ISO_ESC_DIRECTIONALITY;
+ /* Various junk here to attempt to preserve the direction sequences
+ literally in the text if they would otherwise be swallowed due
+ to invalid designations that don't show up as actual charset
+ changes in the text. */
+ if (iso->invalid_switch_dir)
+ {
+ /* We already inserted a direction switch literally into the
+ text. We assume (#### this may not be right) that the
+ next direction switch is the one going the other way,
+ and we need to output that literally as well. */
+ iso->output_literally = 1;
+ iso->invalid_switch_dir = 0;
+ }
+ else
+ {
+ int jj;
+
+ /* If we are in the thrall of an invalid designation,
+ then stick the directionality sequence literally into the
+ output stream so it ends up in the original text again. */
+ for (jj = 0; jj < 4; jj++)
+ if (iso->invalid_designated[jj])
+ break;
+ if (jj < 4)
+ {
+ iso->output_literally = 1;
+ iso->invalid_switch_dir = 1;
+ }
+ else
+ /* Indicate that we haven't yet seen a valid designation,
+ so that if a switch-dir is directly followed by an
+ invalid designation, both get inserted literally. */
+ iso->switched_dir_and_no_valid_charset_yet = 1;
+ }
+ return 1;
+
+
+ /**** designation ****/
+
+ case ISO_ESC_2_4:
+ if (0x28 <= c && c <= 0x2F)
+ {
+ iso->esc = (enum iso_esc_flag) (c - 0x28 + ISO_ESC_2_4_8);
+ goto not_done;
+ }
+ if (0x40 <= c && c <= 0x42)
+ {
+ cs = CHARSET_BY_ATTRIBUTES (CHARSET_TYPE_94X94, c,
+ *flags & CODING_STATE_R2L ?
+ CHARSET_RIGHT_TO_LEFT :
+ CHARSET_LEFT_TO_RIGHT);
+ reg = 0;
+ goto designated;
+ }
+ return 0;
+
+ default:
+ {
+ int type =-1;
+
+ if (c < '0' || c > '~')
+ return 0; /* bad final byte */
+
+ if (iso->esc >= ISO_ESC_2_8 &&
+ iso->esc <= ISO_ESC_2_15)
+ {
+ type = ((iso->esc >= ISO_ESC_2_12) ?
+ CHARSET_TYPE_96 : CHARSET_TYPE_94);
+ reg = (iso->esc - ISO_ESC_2_8) & 3;
+ }
+ else if (iso->esc >= ISO_ESC_2_4_8 &&
+ iso->esc <= ISO_ESC_2_4_15)
+ {
+ type = ((iso->esc >= ISO_ESC_2_4_12) ?
+ CHARSET_TYPE_96X96 : CHARSET_TYPE_94X94);
+ reg = (iso->esc - ISO_ESC_2_4_8) & 3;
+ }
+ else
+ {
+ /* Can this ever be reached? -slb */
+ abort();
+ }
+
+ cs = CHARSET_BY_ATTRIBUTES (type, c,
+ *flags & CODING_STATE_R2L ?
+ CHARSET_RIGHT_TO_LEFT :
+ CHARSET_LEFT_TO_RIGHT);
+ goto designated;
+ }
+ }
+
+ not_done:
+ iso->esc_bytes[iso->esc_bytes_index++] = (unsigned char) c;
+ return -1;
+
+ single_shift:
+ if (check_invalid_charsets && !CHARSETP (iso->charset[reg]))
+ /* can't invoke something that ain't there. */
+ return 0;
+ iso->esc = ISO_ESC_SINGLE_SHIFT;
+ *flags &= CODING_STATE_ISO2022_LOCK;
+ if (reg == 2)
+ *flags |= CODING_STATE_SS2;
+ else
+ *flags |= CODING_STATE_SS3;
+ return 1;
+
+ locking_shift:
+ if (check_invalid_charsets &&
+ !CHARSETP (iso->charset[reg]))
+ /* can't invoke something that ain't there. */
+ return 0;
+ if (half)
+ iso->register_right = reg;
+ else
+ iso->register_left = reg;
+ *flags &= CODING_STATE_ISO2022_LOCK;
+ iso->esc = ISO_ESC_LOCKING_SHIFT;
+ return 1;
+
+ designated:
+ if (NILP (cs) && check_invalid_charsets)
+ {
+ iso->invalid_designated[reg] = 1;
+ iso->charset[reg] = Vcharset_ascii;
+ iso->esc = ISO_ESC_DESIGNATE;
+ *flags &= CODING_STATE_ISO2022_LOCK;
+ iso->output_literally = 1;
+ if (iso->switched_dir_and_no_valid_charset_yet)
+ {
+ /* We encountered a switch-direction followed by an
+ invalid designation. Ensure that the switch-direction
+ gets outputted; otherwise it will probably get eaten
+ when the text is written out again. */
+ iso->switched_dir_and_no_valid_charset_yet = 0;
+ iso->output_direction_sequence = 1;
+ /* And make sure that the switch-dir going the other
+ way gets outputted, as well. */
+ iso->invalid_switch_dir = 1;
+ }
+ return 1;
+ }
+ /* This function is called with CODESYS equal to nil when
+ doing coding-system detection. */
+ if (!NILP (codesys))
+ {
+ charset_conversion_spec_dynarr *dyn =
+ XCODING_SYSTEM (codesys)->iso2022.input_conv;
+
+ if (dyn)
+ {
+ int i;
+
+ for (i = 0; i < Dynarr_length (dyn); i++)
+ {
+ struct charset_conversion_spec *spec = Dynarr_atp (dyn, i);
+ if (EQ (cs, spec->from_charset))
+ cs = spec->to_charset;
+ }
+ }
+ }
+
+ iso->charset[reg] = cs;
+ iso->esc = ISO_ESC_DESIGNATE;
+ *flags &= CODING_STATE_ISO2022_LOCK;
+ if (iso->invalid_designated[reg])
+ {
+ iso->invalid_designated[reg] = 0;
+ iso->output_literally = 1;
+ }
+ if (iso->switched_dir_and_no_valid_charset_yet)
+ iso->switched_dir_and_no_valid_charset_yet = 0;
+ return 1;
+}
+
+static int
+detect_coding_iso2022 (struct detection_state *st, CONST unsigned char *src,
+ unsigned int n)
+{
+ int c;
+ int mask;
+
+ /* #### There are serious deficiencies in the recognition mechanism
+ here. This needs to be much smarter if it's going to cut it. */
+
+ if (!st->iso2022.initted)
+ {
+ reset_iso2022 (Qnil, &st->iso2022.iso);
+ st->iso2022.mask = (CODING_CATEGORY_ISO_7_MASK |
+ CODING_CATEGORY_ISO_8_DESIGNATE_MASK |
+ CODING_CATEGORY_ISO_8_1_MASK |
+ CODING_CATEGORY_ISO_8_2_MASK |
+ CODING_CATEGORY_ISO_LOCK_SHIFT_MASK);
+ st->iso2022.flags = 0;
+ st->iso2022.high_byte_count = 0;
+ st->iso2022.saw_single_shift = 0;
+ st->iso2022.initted = 1;
+ }
+
+ mask = st->iso2022.mask;
+
+ while (n--)
+ {
+ c = *src++;
+ if (c >= 0xA0)
+ {
+ mask &= ~CODING_CATEGORY_ISO_7_MASK;
+ st->iso2022.high_byte_count++;
+ }
+ else
+ {
+ if (st->iso2022.high_byte_count && !st->iso2022.saw_single_shift)
+ {
+ if (st->iso2022.high_byte_count & 1)
+ /* odd number of high bytes; assume not iso-8-2 */
+ mask &= ~CODING_CATEGORY_ISO_8_2_MASK;
+ }
+ st->iso2022.high_byte_count = 0;
+ st->iso2022.saw_single_shift = 0;
+ if (c > 0x80)
+ mask &= ~CODING_CATEGORY_ISO_7_MASK;
+ }
+ if (!(st->iso2022.flags & CODING_STATE_ESCAPE)
+ && (BYTE_C0_P (c) || BYTE_C1_P (c)))
+ { /* control chars */
+ switch (c)
+ {
+ /* Allow and ignore control characters that you might
+ reasonably see in a text file */
+ case '\r':
+ case '\n':
+ case '\t':
+ case 7: /* bell */
+ case 8: /* backspace */
+ case 11: /* vertical tab */
+ case 12: /* form feed */
+ case 26: /* MS-DOS C-z junk */
+ case 31: /* '^_' -- for info */
+ goto label_continue_loop;
+
+ default:
+ break;
+ }
+ }
+
+ if ((st->iso2022.flags & CODING_STATE_ESCAPE) || BYTE_C0_P (c)
+ || BYTE_C1_P (c))
+ {
+ if (parse_iso2022_esc (Qnil, &st->iso2022.iso, c,
+ &st->iso2022.flags, 0))
+ {
+ switch (st->iso2022.iso.esc)
+ {
+ case ISO_ESC_DESIGNATE:
+ mask &= ~CODING_CATEGORY_ISO_8_1_MASK;
+ mask &= ~CODING_CATEGORY_ISO_8_2_MASK;
+ break;
+ case ISO_ESC_LOCKING_SHIFT:
+ mask = CODING_CATEGORY_ISO_LOCK_SHIFT_MASK;
+ goto ran_out_of_chars;
+ case ISO_ESC_SINGLE_SHIFT:
+ mask &= ~CODING_CATEGORY_ISO_8_DESIGNATE_MASK;
+ st->iso2022.saw_single_shift = 1;
+ break;
+ default:
+ break;
+ }
+ }
+ else
+ {
+ mask = 0;
+ goto ran_out_of_chars;
+ }
+ }
+ label_continue_loop:;
+ }
+
+ ran_out_of_chars:
+
+ return mask;
+}
+
+static int
+postprocess_iso2022_mask (int mask)
+{
+ /* #### kind of cheesy */
+ /* If seven-bit ISO is allowed, then assume that the encoding is
+ entirely seven-bit and turn off the eight-bit ones. */
+ if (mask & CODING_CATEGORY_ISO_7_MASK)
+ mask &= ~ (CODING_CATEGORY_ISO_8_DESIGNATE_MASK |
+ CODING_CATEGORY_ISO_8_1_MASK |
+ CODING_CATEGORY_ISO_8_2_MASK);
+ return mask;
+}
+
+/* If FLAGS is a null pointer or specifies right-to-left motion,
+ output a switch-dir-to-left-to-right sequence to DST.
+ Also update FLAGS if it is not a null pointer.
+ If INTERNAL_P is set, we are outputting in internal format and
+ need to handle the CSI differently. */
+
+static void
+restore_left_to_right_direction (struct Lisp_Coding_System *codesys,
+ unsigned_char_dynarr *dst,
+ unsigned int *flags,
+ int internal_p)
+{
+ if (!flags || (*flags & CODING_STATE_R2L))
+ {
+ if (CODING_SYSTEM_ISO2022_SEVEN (codesys))
+ {
+ Dynarr_add (dst, ISO_CODE_ESC);
+ Dynarr_add (dst, '[');
+ }
+ else if (internal_p)
+ DECODE_ADD_BINARY_CHAR (ISO_CODE_CSI, dst);
+ else
+ Dynarr_add (dst, ISO_CODE_CSI);
+ Dynarr_add (dst, '0');
+ Dynarr_add (dst, ']');
+ if (flags)
+ *flags &= ~CODING_STATE_R2L;
+ }
+}
+
+/* If FLAGS is a null pointer or specifies a direction different from
+ DIRECTION (which should be either CHARSET_RIGHT_TO_LEFT or
+ CHARSET_LEFT_TO_RIGHT), output the appropriate switch-dir escape
+ sequence to DST. Also update FLAGS if it is not a null pointer.
+ If INTERNAL_P is set, we are outputting in internal format and
+ need to handle the CSI differently. */
+
+static void
+ensure_correct_direction (int direction, struct Lisp_Coding_System *codesys,
+ unsigned_char_dynarr *dst, unsigned int *flags,
+ int internal_p)
+{
+ if ((!flags || (*flags & CODING_STATE_R2L)) &&
+ direction == CHARSET_LEFT_TO_RIGHT)
+ restore_left_to_right_direction (codesys, dst, flags, internal_p);
+ else if (!CODING_SYSTEM_ISO2022_NO_ISO6429 (codesys)
+ && (!flags || !(*flags & CODING_STATE_R2L)) &&
+ direction == CHARSET_RIGHT_TO_LEFT)
+ {
+ if (CODING_SYSTEM_ISO2022_SEVEN (codesys))
+ {
+ Dynarr_add (dst, ISO_CODE_ESC);
+ Dynarr_add (dst, '[');
+ }
+ else if (internal_p)
+ DECODE_ADD_BINARY_CHAR (ISO_CODE_CSI, dst);
+ else
+ Dynarr_add (dst, ISO_CODE_CSI);
+ Dynarr_add (dst, '2');
+ Dynarr_add (dst, ']');
+ if (flags)
+ *flags |= CODING_STATE_R2L;
+ }
+}
+
+/* Convert ISO2022-format data to internal format. */
+
+static void
+decode_coding_iso2022 (Lstream *decoding, CONST unsigned char *src,
+ unsigned_char_dynarr *dst, unsigned int n)
+{
+ unsigned char c;
+ unsigned int flags, ch;
+ enum eol_type eol_type;
+ struct decoding_stream *str = DECODING_STREAM_DATA (decoding);
+ Lisp_Object coding_system;
+ unsigned_char_dynarr *real_dst = dst;
+
+ CODING_STREAM_DECOMPOSE (str, flags, ch);
+ eol_type = str->eol_type;
+ XSETCODING_SYSTEM (coding_system, str->codesys);
+
+ if (flags & CODING_STATE_COMPOSITE)
+ dst = str->iso2022.composite_chars;
+
+ while (n--)
+ {
+ c = *src++;
+ if (flags & CODING_STATE_ESCAPE)
+ { /* Within ESC sequence */
+ int retval = parse_iso2022_esc (coding_system, &str->iso2022,
+ c, &flags, 1);
+
+ if (retval)
+ {
+ switch (str->iso2022.esc)
+ {
+ case ISO_ESC_START_COMPOSITE:
+ if (str->iso2022.composite_chars)
+ Dynarr_reset (str->iso2022.composite_chars);
+ else
+ str->iso2022.composite_chars = Dynarr_new (unsigned_char);
+ dst = str->iso2022.composite_chars;
+ break;
+ case ISO_ESC_END_COMPOSITE:
+ {
+ Bufbyte comstr[MAX_EMCHAR_LEN];
+ Bytecount len;
+ Emchar emch = lookup_composite_char (Dynarr_atp (dst, 0),
+ Dynarr_length (dst));
+ dst = real_dst;
+ len = set_charptr_emchar (comstr, emch);
+ Dynarr_add_many (dst, comstr, len);
+ break;
+ }
+
+ case ISO_ESC_LITERAL:
+ DECODE_ADD_BINARY_CHAR (c, dst);
+ break;
+
+ default:
+ /* Everything else handled already */
+ break;
+ }
+ }
+
+ /* Attempted error recovery. */
+ if (str->iso2022.output_direction_sequence)
+ ensure_correct_direction (flags & CODING_STATE_R2L ?
+ CHARSET_RIGHT_TO_LEFT :
+ CHARSET_LEFT_TO_RIGHT,
+ str->codesys, dst, 0, 1);
+ /* More error recovery. */
+ if (!retval || str->iso2022.output_literally)
+ {
+ /* Output the (possibly invalid) sequence */
+ int i;
+ for (i = 0; i < str->iso2022.esc_bytes_index; i++)
+ DECODE_ADD_BINARY_CHAR (str->iso2022.esc_bytes[i], dst);
+ flags &= CODING_STATE_ISO2022_LOCK;
+ if (!retval)
+ n++, src--;/* Repeat the loop with the same character. */
+ else
+ {
+ /* No sense in reprocessing the final byte of the
+ escape sequence; it could mess things up anyway.
+ Just add it now. */
+ DECODE_ADD_BINARY_CHAR (c, dst);
+ }
+ }
+ ch = 0;
+ }
+ else if (BYTE_C0_P (c) || BYTE_C1_P (c))
+ { /* Control characters */
+
+ /***** Error-handling *****/
+
+ /* If we were in the middle of a character, dump out the
+ partial character. */
+ DECODE_OUTPUT_PARTIAL_CHAR (ch);
+
+ /* If we just saw a single-shift character, dump it out.
+ This may dump out the wrong sort of single-shift character,
+ but least it will give an indication that something went
+ wrong. */
+ if (flags & CODING_STATE_SS2)
+ {
+ DECODE_ADD_BINARY_CHAR (ISO_CODE_SS2, dst);
+ flags &= ~CODING_STATE_SS2;
+ }
+ if (flags & CODING_STATE_SS3)
+ {
+ DECODE_ADD_BINARY_CHAR (ISO_CODE_SS3, dst);
+ flags &= ~CODING_STATE_SS3;
+ }
+
+ /***** Now handle the control characters. *****/
+
+ /* Handle CR/LF */
+ DECODE_HANDLE_EOL_TYPE (eol_type, c, flags, dst);
+
+ flags &= CODING_STATE_ISO2022_LOCK;
+
+ if (!parse_iso2022_esc (coding_system, &str->iso2022, c, &flags, 1))
+ DECODE_ADD_BINARY_CHAR (c, dst);
+ }
+ else
+ { /* Graphic characters */
+ Lisp_Object charset;
+ int lb;
+ int reg;
+
+ DECODE_HANDLE_EOL_TYPE (eol_type, c, flags, dst);
+
+ /* Now determine the charset. */
+ reg = ((flags & CODING_STATE_SS2) ? 2
+ : (flags & CODING_STATE_SS3) ? 3
+ : !BYTE_ASCII_P (c) ? str->iso2022.register_right
+ : str->iso2022.register_left);
+ charset = str->iso2022.charset[reg];
+
+ /* Error checking: */
+ if (NILP (charset) || str->iso2022.invalid_designated[reg]
+ || (((c & 0x7F) == ' ' || (c & 0x7F) == ISO_CODE_DEL)
+ && XCHARSET_CHARS (charset) == 94))
+ /* Mrmph. We are trying to invoke a register that has no
+ or an invalid charset in it, or trying to add a character
+ outside the range of the charset. Insert that char literally
+ to preserve it for the output. */
+ {
+ DECODE_OUTPUT_PARTIAL_CHAR (ch);
+ DECODE_ADD_BINARY_CHAR (c, dst);
+ }
+
+ else
+ {
+ /* Things are probably hunky-dorey. */
+
+ /* Fetch reverse charset, maybe. */
+ if (((flags & CODING_STATE_R2L) &&
+ XCHARSET_DIRECTION (charset) == CHARSET_LEFT_TO_RIGHT)
+ ||
+ (!(flags & CODING_STATE_R2L) &&
+ XCHARSET_DIRECTION (charset) == CHARSET_RIGHT_TO_LEFT))
+ {
+ Lisp_Object new_charset =
+ XCHARSET_REVERSE_DIRECTION_CHARSET (charset);
+ if (!NILP (new_charset))
+ charset = new_charset;
+ }
+
+ lb = XCHARSET_LEADING_BYTE (charset);
+ switch (XCHARSET_REP_BYTES (charset))
+ {
+ case 1: /* ASCII */
+ DECODE_OUTPUT_PARTIAL_CHAR (ch);
+ Dynarr_add (dst, c & 0x7F);
+ break;
+
+ case 2: /* one-byte official */
+ DECODE_OUTPUT_PARTIAL_CHAR (ch);
+ Dynarr_add (dst, lb);
+ Dynarr_add (dst, c | 0x80);
+ break;
+
+ case 3: /* one-byte private or two-byte official */
+ if (XCHARSET_PRIVATE_P (charset))
+ {
+ DECODE_OUTPUT_PARTIAL_CHAR (ch);
+ Dynarr_add (dst, PRE_LEADING_BYTE_PRIVATE_1);
+ Dynarr_add (dst, lb);
+ Dynarr_add (dst, c | 0x80);
+ }
+ else
+ {
+ if (ch)
+ {
+ Dynarr_add (dst, lb);
+ Dynarr_add (dst, ch | 0x80);
+ Dynarr_add (dst, c | 0x80);
+ ch = 0;
+ }
+ else
+ ch = c;
+ }
+ break;
+
+ default: /* two-byte private */
+ if (ch)
+ {
+ Dynarr_add (dst, PRE_LEADING_BYTE_PRIVATE_2);
+ Dynarr_add (dst, lb);
+ Dynarr_add (dst, ch | 0x80);
+ Dynarr_add (dst, c | 0x80);
+ ch = 0;
+ }
+ else
+ ch = c;
+ }
+ }
+
+ if (!ch)
+ flags &= CODING_STATE_ISO2022_LOCK;
+ }
+
+ label_continue_loop:;
+ }
+
+ if (flags & CODING_STATE_END)
+ DECODE_OUTPUT_PARTIAL_CHAR (ch);
+
+ CODING_STREAM_COMPOSE (str, flags, ch);
+}
+
+
+/***** ISO2022 encoder *****/
+
+/* Designate CHARSET into register REG. */
+
+static void
+iso2022_designate (Lisp_Object charset, unsigned char reg,
+ struct encoding_stream *str, unsigned_char_dynarr *dst)
+{
+ CONST char *inter94 = "()*+", *inter96= ",-./";
+ unsigned int type;
+ unsigned char final;
+ Lisp_Object old_charset = str->iso2022.charset[reg];
+
+ str->iso2022.charset[reg] = charset;
+ if (!CHARSETP (charset))
+ /* charset might be an initial nil or t. */
+ return;
+ type = XCHARSET_TYPE (charset);
+ final = XCHARSET_FINAL (charset);
+ if (!str->iso2022.force_charset_on_output[reg] &&
+ CHARSETP (old_charset) &&
+ XCHARSET_TYPE (old_charset) == type &&
+ XCHARSET_FINAL (old_charset) == final)
+ return;
+
+ str->iso2022.force_charset_on_output[reg] = 0;
+
+ {
+ charset_conversion_spec_dynarr *dyn =
+ str->codesys->iso2022.output_conv;
+
+ if (dyn)
+ {
+ int i;
+
+ for (i = 0; i < Dynarr_length (dyn); i++)
+ {
+ struct charset_conversion_spec *spec = Dynarr_atp (dyn, i);
+ if (EQ (charset, spec->from_charset))
+ charset = spec->to_charset;
+ }
+ }
+ }
+
+ Dynarr_add (dst, ISO_CODE_ESC);
+ switch (type)
+ {
+ case CHARSET_TYPE_94:
+ Dynarr_add (dst, inter94[reg]);
+ break;
+ case CHARSET_TYPE_96:
+ Dynarr_add (dst, inter96[reg]);
+ break;
+ case CHARSET_TYPE_94X94:
+ Dynarr_add (dst, '$');
+ if (reg != 0
+ || !(CODING_SYSTEM_ISO2022_SHORT (str->codesys))
+ || final < '@'
+ || final > 'B')
+ Dynarr_add (dst, inter94[reg]);
+ break;
+ case CHARSET_TYPE_96X96:
+ Dynarr_add (dst, '$');
+ Dynarr_add (dst, inter96[reg]);
+ break;
+ }
+ Dynarr_add (dst, final);
+}
+
+static void
+ensure_normal_shift (struct encoding_stream *str, unsigned_char_dynarr *dst)
+{
+ if (str->iso2022.register_left != 0)
+ {
+ Dynarr_add (dst, ISO_CODE_SI);
+ str->iso2022.register_left = 0;
+ }
+}
+
+static void
+ensure_shift_out (struct encoding_stream *str, unsigned_char_dynarr *dst)
+{
+ if (str->iso2022.register_left != 1)
+ {
+ Dynarr_add (dst, ISO_CODE_SO);
+ str->iso2022.register_left = 1;
+ }
+}
+
+/* Convert internally-formatted data to ISO2022 format. */
+
+static void
+encode_coding_iso2022 (Lstream *encoding, CONST unsigned char *src,
+ unsigned_char_dynarr *dst, unsigned int n)
+{
+ unsigned char charmask, c;
+ unsigned int flags, ch;
+ enum eol_type eol_type;
+ unsigned char char_boundary;
+ struct encoding_stream *str = ENCODING_STREAM_DATA (encoding);
+ struct Lisp_Coding_System *codesys = str->codesys;
+ int i;
+ Lisp_Object charset;
+ int half;
+
+ /* flags for handling composite chars. We do a little switcharoo
+ on the source while we're outputting the composite char. */
+ unsigned int saved_n = 0;
+ CONST unsigned char *saved_src = NULL;
+ int in_composite = 0;
+
+ CODING_STREAM_DECOMPOSE (str, flags, ch);
+ eol_type = CODING_SYSTEM_EOL_TYPE (str->codesys);
+ char_boundary = str->iso2022.current_char_boundary;
+ charset = str->iso2022.current_charset;
+ half = str->iso2022.current_half;
+
+ back_to_square_n:
+ while (n--)
+ {
+ c = *src++;
+
+ if (BYTE_ASCII_P (c))
+ { /* Processing ASCII character */
+ ch = 0;
+
+ restore_left_to_right_direction (codesys, dst, &flags, 0);
+
+ /* Make sure G0 contains ASCII */
+ if ((c > ' ' && c < ISO_CODE_DEL) ||
+ !CODING_SYSTEM_ISO2022_NO_ASCII_CNTL (codesys))
+ {
+ ensure_normal_shift (str, dst);
+ iso2022_designate (Vcharset_ascii, 0, str, dst);
+ }
+
+ /* If necessary, restore everything to the default state
+ at end-of-line */
+ if (c == '\n' &&
+ !(CODING_SYSTEM_ISO2022_NO_ASCII_EOL (codesys)))
+ {
+ restore_left_to_right_direction (codesys, dst, &flags, 0);
+
+ ensure_normal_shift (str, dst);
+
+ for (i = 0; i < 4; i++)
+ {
+ Lisp_Object initial_charset =
+ CODING_SYSTEM_ISO2022_INITIAL_CHARSET (codesys, i);
+ iso2022_designate (initial_charset, i, str, dst);
+ }
+ }
+ if (c == '\n')
+ {
+ if (eol_type != EOL_LF && eol_type != EOL_AUTODETECT)
+ Dynarr_add (dst, '\r');
+ if (eol_type != EOL_CR)
+ Dynarr_add (dst, c);
+ }
+ else
+ {
+ if (CODING_SYSTEM_ISO2022_ESCAPE_QUOTED (codesys)
+ && fit_to_be_escape_quoted (c))
+ Dynarr_add (dst, ISO_CODE_ESC);
+ Dynarr_add (dst, c);
+ }
+ char_boundary = 1;
+ }
+
+ else if (BUFBYTE_LEADING_BYTE_P (c) || BUFBYTE_LEADING_BYTE_P (ch))
+ { /* Processing Leading Byte */
+ ch = 0;
+ charset = CHARSET_BY_LEADING_BYTE (c);
+ if (LEADING_BYTE_PREFIX_P(c))
+ ch = c;
+ else if (!EQ (charset, Vcharset_control_1)
+ && !EQ (charset, Vcharset_composite))
+ {
+ int reg;
+
+ ensure_correct_direction (XCHARSET_DIRECTION (charset),
+ codesys, dst, &flags, 0);
+
+ /* Now determine which register to use. */
+ reg = -1;
+ for (i = 0; i < 4; i++)
+ {
+ if (EQ (charset, str->iso2022.charset[i]) ||
+ EQ (charset,
+ CODING_SYSTEM_ISO2022_INITIAL_CHARSET (codesys, i)))
+ {
+ reg = i;
+ break;
+ }
+ }
+
+ if (reg == -1)
+ {
+ if (XCHARSET_GRAPHIC (charset) != 0)
+ {
+ if (!NILP (str->iso2022.charset[1]) &&
+ (!CODING_SYSTEM_ISO2022_SEVEN (codesys) ||
+ CODING_SYSTEM_ISO2022_LOCK_SHIFT (codesys)))
+ reg = 1;
+ else if (!NILP (str->iso2022.charset[2]))
+ reg = 2;
+ else if (!NILP (str->iso2022.charset[3]))
+ reg = 3;
+ else
+ reg = 0;
+ }
+ else
+ reg = 0;
+ }
+
+ iso2022_designate (charset, reg, str, dst);
+
+ /* Now invoke that register. */
+ switch (reg)
+ {
+ case 0:
+ ensure_normal_shift (str, dst);
+ half = 0;
+ break;
+
+ case 1:
+ if (CODING_SYSTEM_ISO2022_SEVEN (codesys))
+ {
+ ensure_shift_out (str, dst);
+ half = 0;
+ }
+ else
+ half = 1;
+ break;
+
+ case 2:
+ if (CODING_SYSTEM_ISO2022_SEVEN (str->codesys))
+ {
+ Dynarr_add (dst, ISO_CODE_ESC);
+ Dynarr_add (dst, 'N');
+ half = 0;
+ }
+ else
+ {
+ Dynarr_add (dst, ISO_CODE_SS2);
+ half = 1;
+ }
+ break;
+
+ case 3:
+ if (CODING_SYSTEM_ISO2022_SEVEN (str->codesys))
+ {
+ Dynarr_add (dst, ISO_CODE_ESC);
+ Dynarr_add (dst, 'O');
+ half = 0;
+ }
+ else
+ {
+ Dynarr_add (dst, ISO_CODE_SS3);
+ half = 1;
+ }
+ break;
+
+ default:
+ abort ();
+ }
+ }
+ char_boundary = 0;
+ }
+ else
+ { /* Processing Non-ASCII character */
+ charmask = (half == 0 ? 0x7F : 0xFF);
+ char_boundary = 1;
+ if (EQ (charset, Vcharset_control_1))
+ {
+ if (CODING_SYSTEM_ISO2022_ESCAPE_QUOTED (codesys)
+ && fit_to_be_escape_quoted (c))
+ Dynarr_add (dst, ISO_CODE_ESC);
+ /* you asked for it ... */
+ Dynarr_add (dst, c - 0x20);
+ }
+ else
+ {
+ switch (XCHARSET_REP_BYTES (charset))
+ {
+ case 2:
+ Dynarr_add (dst, c & charmask);
+ break;
+ case 3:
+ if (XCHARSET_PRIVATE_P (charset))
+ {
+ Dynarr_add (dst, c & charmask);
+ ch = 0;
+ }
+ else if (ch)
+ {
+ if (EQ (charset, Vcharset_composite))
+ {
+ if (in_composite)
+ {
+ /* #### Bother! We don't know how to
+ handle this yet. */
+ Dynarr_add (dst, '~');
+ }
+ else
+ {
+ Emchar emch = MAKE_CHAR (Vcharset_composite,
+ ch & 0x7F, c & 0x7F);
+ Lisp_Object lstr = composite_char_string (emch);
+ saved_n = n;
+ saved_src = src;
+ in_composite = 1;
+ src = XSTRING_DATA (lstr);
+ n = XSTRING_LENGTH (lstr);
+ Dynarr_add (dst, ISO_CODE_ESC);
+ Dynarr_add (dst, '0'); /* start composing */
+ }
+ }
+ else
+ {
+ Dynarr_add (dst, ch & charmask);
+ Dynarr_add (dst, c & charmask);
+ }
+ ch = 0;
+ }
+ else
+ {
+ ch = c;
+ char_boundary = 0;
+ }
+ break;
+ case 4:
+ if (ch)
+ {
+ Dynarr_add (dst, ch & charmask);
+ Dynarr_add (dst, c & charmask);
+ ch = 0;
+ }
+ else
+ {
+ ch = c;
+ char_boundary = 0;
+ }
+ break;
+ default:
+ abort ();
+ }
+ }
+ }
+ }
+
+ if (in_composite)
+ {
+ n = saved_n;
+ src = saved_src;
+ in_composite = 0;
+ Dynarr_add (dst, ISO_CODE_ESC);
+ Dynarr_add (dst, '1'); /* end composing */
+ goto back_to_square_n; /* Wheeeeeeeee ..... */
+ }
+
+ if (char_boundary && flags & CODING_STATE_END)
+ {
+ restore_left_to_right_direction (codesys, dst, &flags, 0);
+ ensure_normal_shift (str, dst);
+ for (i = 0; i < 4; i++)
+ {
+ Lisp_Object initial_charset =
+ CODING_SYSTEM_ISO2022_INITIAL_CHARSET (codesys, i);
+ iso2022_designate (initial_charset, i, str, dst);
+ }
+ }
+
+ CODING_STREAM_COMPOSE (str, flags, ch);
+ str->iso2022.current_char_boundary = char_boundary;
+ str->iso2022.current_charset = charset;
+ str->iso2022.current_half = half;
+
+ /* Verbum caro factum est! */
+}
+
+\f
+/************************************************************************/
+/* No-conversion methods */
+/************************************************************************/
+
+/* This is used when reading in "binary" files -- i.e. files that may
+ contain all 256 possible byte values and that are not to be
+ interpreted as being in any particular decoding. */
+static void
+decode_coding_no_conversion (Lstream *decoding, CONST unsigned char *src,
+ unsigned_char_dynarr *dst, unsigned int n)
+{
+ unsigned char c;
+ unsigned int flags, ch;
+ enum eol_type eol_type;
+ struct decoding_stream *str = DECODING_STREAM_DATA (decoding);
+
+ CODING_STREAM_DECOMPOSE (str, flags, ch);
+ eol_type = str->eol_type;
+
+ while (n--)
+ {
+ c = *src++;
+
+ DECODE_HANDLE_EOL_TYPE (eol_type, c, flags, dst);
+ DECODE_ADD_BINARY_CHAR (c, dst);
+ label_continue_loop:;
+ }
+
+ DECODE_HANDLE_END_OF_CONVERSION (flags, ch, dst);
+
+ CODING_STREAM_COMPOSE (str, flags, ch);
+}
+
+static void
+encode_coding_no_conversion (Lstream *encoding, CONST unsigned char *src,
+ unsigned_char_dynarr *dst, unsigned int n)
+{
+ unsigned char c;
+ struct encoding_stream *str = ENCODING_STREAM_DATA (encoding);
+ unsigned int flags, ch;
+ enum eol_type eol_type;
+
+ CODING_STREAM_DECOMPOSE (str, flags, ch);
+ eol_type = CODING_SYSTEM_EOL_TYPE (str->codesys);
+
+ while (n--)
+ {
+ c = *src++;
+ if (c == '\n')
+ {
+ if (eol_type != EOL_LF && eol_type != EOL_AUTODETECT)
+ Dynarr_add (dst, '\r');
+ if (eol_type != EOL_CR)
+ Dynarr_add (dst, '\n');
+ ch = 0;
+ }
+ else if (BYTE_ASCII_P (c))
+ {
+ assert (ch == 0);
+ Dynarr_add (dst, c);
+ }
+ else if (BUFBYTE_LEADING_BYTE_P (c))
+ {
+ assert (ch == 0);
+ if (c == LEADING_BYTE_LATIN_ISO8859_1 ||
+ c == LEADING_BYTE_CONTROL_1)
+ ch = c;
+ else
+ Dynarr_add (dst, '~'); /* untranslatable character */
+ }
+ else
+ {
+ if (ch == LEADING_BYTE_LATIN_ISO8859_1)
+ Dynarr_add (dst, c);
+ else if (ch == LEADING_BYTE_CONTROL_1)
+ {
+ assert (c < 0xC0);
+ Dynarr_add (dst, c - 0x20);
+ }
+ /* else it should be the second or third byte of an
+ untranslatable character, so ignore it */
+ ch = 0;
+ }
+ }
+
+ CODING_STREAM_COMPOSE (str, flags, ch);
+}
+
+\f
+/************************************************************************/
+/* Simple internal/external functions */
+/************************************************************************/
+
+static Extbyte_dynarr *conversion_out_dynarr;
+static Bufbyte_dynarr *conversion_in_dynarr;
+
+/* Determine coding system from coding format */
+
+#define FILE_NAME_CODING_SYSTEM \
+ ((NILP (Vfile_name_coding_system) || \
+ (EQ ((Vfile_name_coding_system), Qbinary))) ? \
+ Qnil : Fget_coding_system (Vfile_name_coding_system))
+
+/* #### not correct for all values of `fmt'! */
+#define FMT_CODING_SYSTEM(fmt) \
+ (((fmt) == FORMAT_FILENAME) ? FILE_NAME_CODING_SYSTEM : \
+ ((fmt) == FORMAT_CTEXT ) ? Fget_coding_system (Qctext) : \
+ ((fmt) == FORMAT_TERMINAL) ? FILE_NAME_CODING_SYSTEM : \
+ Qnil)
+
+CONST Extbyte *
+convert_to_external_format (CONST Bufbyte *ptr,
+ Bytecount len,
+ Extcount *len_out,
+ enum external_data_format fmt)
+{
+ Lisp_Object coding_system = FMT_CODING_SYSTEM (fmt);
+
+ if (!conversion_out_dynarr)
+ conversion_out_dynarr = Dynarr_new (Extbyte);
+ else
+ Dynarr_reset (conversion_out_dynarr);
+
+ if (NILP (coding_system))
+ {
+ CONST Bufbyte *end = ptr + len;
+
+ for (; ptr < end;)
+ {
+ Bufbyte c =
+ (BYTE_ASCII_P (*ptr)) ? *ptr :
+ (*ptr == LEADING_BYTE_CONTROL_1) ? (*(ptr+1) - 0x20) :
+ (*ptr == LEADING_BYTE_LATIN_ISO8859_1) ? (*(ptr+1)) :
+ '~';
+
+ Dynarr_add (conversion_out_dynarr, (Extbyte) c);
+ INC_CHARPTR (ptr);
+ }
+
+#ifdef ERROR_CHECK_BUFPOS
+ assert (ptr == end);
+#endif
+ }
+ else
+ {
+ Lisp_Object instream, outstream, da_outstream;
+ Lstream *istr, *ostr;
+ struct gcpro gcpro1, gcpro2, gcpro3;
+ char tempbuf[1024]; /* some random amount */
+
+ instream = make_fixed_buffer_input_stream ((unsigned char *) ptr, len);
+ da_outstream = make_dynarr_output_stream
+ ((unsigned_char_dynarr *) conversion_out_dynarr);
+ outstream =
+ make_encoding_output_stream (XLSTREAM (da_outstream), coding_system);
+ istr = XLSTREAM (instream);
+ ostr = XLSTREAM (outstream);
+ GCPRO3 (instream, outstream, da_outstream);
+ while (1)
+ {
+ int size_in_bytes = Lstream_read (istr, tempbuf, sizeof (tempbuf));
+ if (!size_in_bytes)
+ break;
+ Lstream_write (ostr, tempbuf, size_in_bytes);
+ }
+ Lstream_close (istr);
+ Lstream_close (ostr);
+ UNGCPRO;
+ Lstream_delete (istr);
+ Lstream_delete (ostr);
+ Lstream_delete (XLSTREAM (da_outstream));
+ }
+
+ *len_out = Dynarr_length (conversion_out_dynarr);
+ Dynarr_add (conversion_out_dynarr, 0); /* remember to zero-terminate! */
+ return Dynarr_atp (conversion_out_dynarr, 0);
+}
+
+CONST Bufbyte *
+convert_from_external_format (CONST Extbyte *ptr,
+ Extcount len,
+ Bytecount *len_out,
+ enum external_data_format fmt)
+{
+ Lisp_Object coding_system = FMT_CODING_SYSTEM (fmt);
+
+ if (!conversion_in_dynarr)
+ conversion_in_dynarr = Dynarr_new (Bufbyte);
+ else
+ Dynarr_reset (conversion_in_dynarr);
+
+ if (NILP (coding_system))
+ {
+ CONST Extbyte *end = ptr + len;
+ for (; ptr < end; ptr++)
+ {
+ Extbyte c = *ptr;
+ DECODE_ADD_BINARY_CHAR (c, conversion_in_dynarr);
+ }
+ }
+ else
+ {
+ Lisp_Object instream, outstream, da_outstream;
+ Lstream *istr, *ostr;
+ struct gcpro gcpro1, gcpro2, gcpro3;
+ char tempbuf[1024]; /* some random amount */
+
+ instream = make_fixed_buffer_input_stream ((unsigned char *) ptr, len);
+ da_outstream = make_dynarr_output_stream
+ ((unsigned_char_dynarr *) conversion_in_dynarr);
+ outstream =
+ make_decoding_output_stream (XLSTREAM (da_outstream), coding_system);
+ istr = XLSTREAM (instream);
+ ostr = XLSTREAM (outstream);
+ GCPRO3 (instream, outstream, da_outstream);
+ while (1)
+ {
+ int size_in_bytes = Lstream_read (istr, tempbuf, sizeof (tempbuf));
+ if (!size_in_bytes)
+ break;
+ Lstream_write (ostr, tempbuf, size_in_bytes);
+ }
+ Lstream_close (istr);
+ Lstream_close (ostr);
+ UNGCPRO;
+ Lstream_delete (istr);
+ Lstream_delete (ostr);
+ Lstream_delete (XLSTREAM (da_outstream));
+ }
+
+ *len_out = Dynarr_length (conversion_in_dynarr);
+ Dynarr_add (conversion_in_dynarr, 0); /* remember to zero-terminate! */
+ return Dynarr_atp (conversion_in_dynarr, 0);
+}
+
+\f
+/************************************************************************/
+/* Initialization */
+/************************************************************************/
+
+void
+syms_of_mule_coding (void)
+{
+ defsymbol (&Qbuffer_file_coding_system, "buffer-file-coding-system");
+ deferror (&Qcoding_system_error, "coding-system-error",
+ "Coding-system error", Qio_error);
+
+ DEFSUBR (Fcoding_system_p);
+ DEFSUBR (Ffind_coding_system);
+ DEFSUBR (Fget_coding_system);
+ DEFSUBR (Fcoding_system_list);
+ DEFSUBR (Fcoding_system_name);
+ DEFSUBR (Fmake_coding_system);
+ DEFSUBR (Fcopy_coding_system);
+ DEFSUBR (Fsubsidiary_coding_system);
+
+ DEFSUBR (Fcoding_system_type);
+ DEFSUBR (Fcoding_system_doc_string);
+ DEFSUBR (Fcoding_system_charset);
+ DEFSUBR (Fcoding_system_property);
+
+ DEFSUBR (Fcoding_category_list);
+ DEFSUBR (Fset_coding_priority_list);
+ DEFSUBR (Fcoding_priority_list);
+ DEFSUBR (Fset_coding_category_system);
+ DEFSUBR (Fcoding_category_system);
+
+ DEFSUBR (Fdetect_coding_region);
+ DEFSUBR (Fdecode_coding_region);
+ DEFSUBR (Fencode_coding_region);
+ DEFSUBR (Fdecode_shift_jis_char);
+ DEFSUBR (Fencode_shift_jis_char);
+ DEFSUBR (Fdecode_big5_char);
+ DEFSUBR (Fencode_big5_char);
+
+ defsymbol (&Qcoding_system_p, "coding-system-p");
+
+ defsymbol (&Qbig5, "big5");
+ defsymbol (&Qshift_jis, "shift-jis");
+ defsymbol (&Qno_conversion, "no-conversion");
+ defsymbol (&Qccl, "ccl");
+ defsymbol (&Qiso2022, "iso2022");
+
+ defsymbol (&Qmnemonic, "mnemonic");
+ defsymbol (&Qeol_type, "eol-type");
+ defsymbol (&Qpost_read_conversion, "post-read-conversion");
+ defsymbol (&Qpre_write_conversion, "pre-write-conversion");
+
+ defsymbol (&Qcr, "cr");
+ defsymbol (&Qlf, "lf");
+ defsymbol (&Qcrlf, "crlf");
+ defsymbol (&Qeol_cr, "eol-cr");
+ defsymbol (&Qeol_lf, "eol-lf");
+ defsymbol (&Qeol_crlf, "eol-crlf");
+
+ defsymbol (&Qcharset_g0, "charset-g0");
+ defsymbol (&Qcharset_g1, "charset-g1");
+ defsymbol (&Qcharset_g2, "charset-g2");
+ defsymbol (&Qcharset_g3, "charset-g3");
+ defsymbol (&Qforce_g0_on_output, "force-g0-on-output");
+ defsymbol (&Qforce_g1_on_output, "force-g1-on-output");
+ defsymbol (&Qforce_g2_on_output, "force-g2-on-output");
+ defsymbol (&Qforce_g3_on_output, "force-g3-on-output");
+ defsymbol (&Qshort, "short");
+ defsymbol (&Qno_ascii_eol, "no-ascii-eol");
+ defsymbol (&Qno_ascii_cntl, "no-ascii-cntl");
+ defsymbol (&Qseven, "seven");
+ defsymbol (&Qlock_shift, "lock-shift");
+ defsymbol (&Qno_iso6429, "no-iso6429");
+ defsymbol (&Qescape_quoted, "escape-quoted");
+ defsymbol (&Qinput_charset_conversion, "input-charset-conversion");
+ defsymbol (&Qoutput_charset_conversion, "output-charset-conversion");
+
+ defsymbol (&Qencode, "encode");
+ defsymbol (&Qdecode, "decode");
+
+ defsymbol (&Qctext, "ctext");
+
+ defsymbol (&coding_category_symbol[CODING_CATEGORY_SHIFT_JIS],
+ "shift-jis");
+ defsymbol (&coding_category_symbol[CODING_CATEGORY_ISO_7],
+ "iso-7");
+ defsymbol (&coding_category_symbol[CODING_CATEGORY_ISO_8_DESIGNATE],
+ "iso-8-designate");
+ defsymbol (&coding_category_symbol[CODING_CATEGORY_ISO_8_1],
+ "iso-8-1");
+ defsymbol (&coding_category_symbol[CODING_CATEGORY_ISO_8_2],
+ "iso-8-2");
+ defsymbol (&coding_category_symbol[CODING_CATEGORY_ISO_LOCK_SHIFT],
+ "iso-lock-shift");
+ defsymbol (&coding_category_symbol[CODING_CATEGORY_BIG5],
+ "big5");
+ defsymbol (&coding_category_symbol[CODING_CATEGORY_NO_CONVERSION],
+ "no-conversion");
+}
+
+void
+lstream_type_create_mule_coding (void)
+{
+ LSTREAM_HAS_METHOD (decoding, reader);
+ LSTREAM_HAS_METHOD (decoding, writer);
+ LSTREAM_HAS_METHOD (decoding, rewinder);
+ LSTREAM_HAS_METHOD (decoding, seekable_p);
+ LSTREAM_HAS_METHOD (decoding, flusher);
+ LSTREAM_HAS_METHOD (decoding, closer);
+ LSTREAM_HAS_METHOD (decoding, marker);
+
+ LSTREAM_HAS_METHOD (encoding, reader);
+ LSTREAM_HAS_METHOD (encoding, writer);
+ LSTREAM_HAS_METHOD (encoding, rewinder);
+ LSTREAM_HAS_METHOD (encoding, seekable_p);
+ LSTREAM_HAS_METHOD (encoding, flusher);
+ LSTREAM_HAS_METHOD (encoding, closer);
+ LSTREAM_HAS_METHOD (encoding, marker);
+}
+
+void
+vars_of_mule_coding (void)
+{
+ int i;
+
+ /* Initialize to something reasonable ... */
+ for (i = 0; i <= CODING_CATEGORY_LAST; i++)
+ {
+ coding_category_system[i] = Qnil;
+ coding_category_by_priority[i] = i;
+ }
+
+ DEFVAR_LISP ("keyboard-coding-system", &Vkeyboard_coding_system /*
+Coding system used for TTY keyboard input.
+Not used under a windowing system.
+*/ );
+ Vkeyboard_coding_system = Qnil;
+
+ DEFVAR_LISP ("terminal-coding-system", &Vterminal_coding_system /*
+Coding system used for TTY display output.
+Not used under a windowing system.
+*/ );
+ Vterminal_coding_system = Qnil;
+
+ DEFVAR_LISP ("coding-system-for-read", &Vcoding_system_for_read /*
+Overriding coding system used when writing a file or process.
+You should *bind* this, not set it. If this is non-nil, it specifies
+the coding system that will be used when a file or process is read
+in, and overrides `buffer-file-coding-system-for-read',
+`insert-file-contents-pre-hook', etc. Use those variables instead of
+this one for permanent changes to the environment.
+*/ );
+ Vcoding_system_for_read = Qnil;
+
+ DEFVAR_LISP ("coding-system-for-write",
+ &Vcoding_system_for_write /*
+Overriding coding system used when writing a file or process.
+You should *bind* this, not set it. If this is non-nil, it specifies
+the coding system that will be used when a file or process is wrote
+in, and overrides `buffer-file-coding-system',
+`write-region-pre-hook', etc. Use those variables instead of this one
+for permanent changes to the environment.
+*/ );
+ Vcoding_system_for_write = Qnil;
+
+ DEFVAR_LISP ("file-name-coding-system", &Vfile_name_coding_system /*
+Coding system used to convert pathnames when accessing files.
+*/ );
+ Vfile_name_coding_system = Qnil;
+
+ DEFVAR_BOOL ("enable-multibyte-characters", &enable_multibyte_characters /*
+Non-nil means the buffer contents are regarded as multi-byte form
+of characters, not a binary code. This affects the display, file I/O,
+and behaviors of various editing commands.
+
+Setting this to nil does not do anything.
+*/ );
+ enable_multibyte_characters = 1;
+}
+
+void
+complex_vars_of_mule_coding (void)
+{
+ staticpro (&Vcoding_system_hashtable);
+ Vcoding_system_hashtable = make_lisp_hashtable (50, HASHTABLE_NONWEAK,
+ HASHTABLE_EQ);
+
+ the_codesys_prop_dynarr = Dynarr_new (codesys_prop);
+
+#define DEFINE_CODESYS_PROP(Prop_Type, Sym) do \
+{ \
+ struct codesys_prop csp; \
+ csp.sym = (Sym); \
+ csp.prop_type = (Prop_Type); \
+ Dynarr_add (the_codesys_prop_dynarr, csp); \
+} while (0)
+
+ DEFINE_CODESYS_PROP (CODESYS_PROP_ALL_OK, Qmnemonic);
+ DEFINE_CODESYS_PROP (CODESYS_PROP_ALL_OK, Qeol_type);
+ DEFINE_CODESYS_PROP (CODESYS_PROP_ALL_OK, Qeol_cr);
+ DEFINE_CODESYS_PROP (CODESYS_PROP_ALL_OK, Qeol_crlf);
+ DEFINE_CODESYS_PROP (CODESYS_PROP_ALL_OK, Qeol_lf);
+ DEFINE_CODESYS_PROP (CODESYS_PROP_ALL_OK, Qpost_read_conversion);
+ DEFINE_CODESYS_PROP (CODESYS_PROP_ALL_OK, Qpre_write_conversion);
+
+ DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qcharset_g0);
+ DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qcharset_g1);
+ DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qcharset_g2);
+ DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qcharset_g3);
+ DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qforce_g0_on_output);
+ DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qforce_g1_on_output);
+ DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qforce_g2_on_output);
+ DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qforce_g3_on_output);
+ DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qshort);
+ DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qno_ascii_eol);
+ DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qno_ascii_cntl);
+ DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qseven);
+ DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qlock_shift);
+ DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qno_iso6429);
+ DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qescape_quoted);
+ DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qinput_charset_conversion);
+ DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qoutput_charset_conversion);
+
+ DEFINE_CODESYS_PROP (CODESYS_PROP_CCL, Qencode);
+ DEFINE_CODESYS_PROP (CODESYS_PROP_CCL, Qdecode);
+
+ /* Need to create this here or we're really screwed. */
+ Fmake_coding_system (Qno_conversion, Qno_conversion, build_string ("No conversion"),
+ list2 (Qmnemonic, build_string ("Noconv")));
+
+ Fcopy_coding_system (Fcoding_system_property (Qno_conversion, Qeol_lf),
+ Qbinary);
+
+ /* Need this for bootstrapping */
+ coding_category_system[CODING_CATEGORY_NO_CONVERSION] =
+ Fget_coding_system (Qno_conversion);
+}
+
+#endif
--- /dev/null
+/* Header for code conversion stuff
+ Copyright (C) 1991, 1995 Free Software Foundation, Inc.
+ Copyright (C) 1995 Sun Microsystems, Inc.
+
+This file is part of XEmacs.
+
+XEmacs is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+XEmacs is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with XEmacs; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/* Synched up with: Mule 2.3. Not in FSF. */
+
+/* 91.10.09 written by K.Handa <handa@etl.go.jp> */
+/* Rewritten by Ben Wing <ben@xemacs.org>. */
+
+#ifndef _XEMACS_MULE_CODING_H_
+#define _XEMACS_MULE_CODING_H_
+
+struct decoding_stream;
+struct encoding_stream;
+
+/* Coding system types. These go into the TYPE field of a
+ struct Lisp_Coding_System. */
+
+enum coding_system_type
+{
+ CODESYS_AUTODETECT, /* Automatic conversion. */
+ CODESYS_SHIFT_JIS, /* Shift-JIS; Hankaku (half-width) KANA
+ is also supported. */
+ CODESYS_ISO2022, /* Any ISO2022-compliant coding system.
+ Includes JIS, EUC, CTEXT */
+ CODESYS_BIG5, /* BIG5 (used for Taiwanese). */
+ CODESYS_CCL, /* Converter written in CCL. */
+ CODESYS_NO_CONVERSION /* "No conversion"; used for binary files.
+ We use quotes because there really
+ is some conversion being applied,
+ but it appears to the user as if
+ the text is read in without conversion. */
+#ifdef DEBUG_XEMACS
+ ,CODESYS_INTERNAL /* Raw (internally-formatted) data. */
+#endif
+};
+
+enum eol_type
+{
+ EOL_AUTODETECT,
+ EOL_LF,
+ EOL_CRLF,
+ EOL_CR
+};
+
+typedef struct charset_conversion_spec charset_conversion_spec;
+struct charset_conversion_spec
+{
+ Lisp_Object from_charset;
+ Lisp_Object to_charset;
+};
+
+typedef struct
+{
+ Dynarr_declare (charset_conversion_spec);
+} charset_conversion_spec_dynarr;
+
+struct Lisp_Coding_System
+{
+ struct lcrecord_header header;
+
+ /* Name and doc string of this coding system. */
+ Lisp_Object name, doc_string;
+
+ /* This is the major type of the coding system -- one of Big5, ISO2022,
+ Shift-JIS, etc. See the constants above. */
+ enum coding_system_type type;
+
+ /* Mnemonic string displayed in the modeline when this coding
+ system is active for a particular buffer. */
+ Lisp_Object mnemonic;
+
+ Lisp_Object post_read_conversion, pre_write_conversion;
+
+ enum eol_type eol_type;
+
+ /* Subsidiary coding systems that specify a particular type of EOL
+ marking, rather than autodetecting it. These will only be non-nil
+ if (eol_type == EOL_AUTODETECT). */
+ Lisp_Object eol_lf, eol_crlf, eol_cr;
+
+ struct
+ {
+ /* What are the charsets to be initially designated to G0, G1,
+ G2, G3? If t, no charset is initially designated. If nil,
+ no charset is initially designated and no charset is allowed
+ to be designated. */
+ Lisp_Object initial_charset[4];
+
+ /* If true, a designation escape sequence needs to be sent on output
+ for the charset in G[0-3] before that charset is used. */
+ unsigned char force_charset_on_output[4];
+
+ charset_conversion_spec_dynarr *input_conv;
+ charset_conversion_spec_dynarr *output_conv;
+
+ unsigned int shoort :1; /* C makes you speak Dutch */
+ unsigned int no_ascii_eol :1;
+ unsigned int no_ascii_cntl :1;
+ unsigned int seven :1;
+ unsigned int lock_shift :1;
+ unsigned int no_iso6429 :1;
+ unsigned int escape_quoted :1;
+ } iso2022;
+
+ struct
+ {
+ /* For a CCL coding system, these specify the CCL programs used for
+ decoding (input) and encoding (output). */
+ Lisp_Object decode, encode;
+ } ccl;
+};
+
+DECLARE_LRECORD (coding_system, struct Lisp_Coding_System);
+#define XCODING_SYSTEM(x) XRECORD (x, coding_system, struct Lisp_Coding_System)
+#define XSETCODING_SYSTEM(x, p) XSETRECORD (x, p, coding_system)
+#define CODING_SYSTEMP(x) RECORDP (x, coding_system)
+#define GC_CODING_SYSTEMP(x) GC_RECORDP (x, coding_system)
+#define CHECK_CODING_SYSTEM(x) CHECK_RECORD (x, coding_system)
+#define CONCHECK_CODING_SYSTEM(x) CONCHECK_RECORD (x, coding_system)
+
+#define CODING_SYSTEM_NAME(codesys) ((codesys)->name)
+#define CODING_SYSTEM_DOC_STRING(codesys) ((codesys)->doc_string)
+#define CODING_SYSTEM_TYPE(codesys) ((codesys)->type)
+#define CODING_SYSTEM_MNEMONIC(codesys) ((codesys)->mnemonic)
+#define CODING_SYSTEM_POST_READ_CONVERSION(codesys) \
+ ((codesys)->post_read_conversion)
+#define CODING_SYSTEM_PRE_WRITE_CONVERSION(codesys) \
+ ((codesys)->pre_write_conversion)
+#define CODING_SYSTEM_EOL_TYPE(codesys) ((codesys)->eol_type)
+#define CODING_SYSTEM_EOL_LF(codesys) ((codesys)->eol_lf)
+#define CODING_SYSTEM_EOL_CRLF(codesys) ((codesys)->eol_crlf)
+#define CODING_SYSTEM_EOL_CR(codesys) ((codesys)->eol_cr)
+#define CODING_SYSTEM_ISO2022_INITIAL_CHARSET(codesys, g) \
+ ((codesys)->iso2022.initial_charset[g])
+#define CODING_SYSTEM_ISO2022_FORCE_CHARSET_ON_OUTPUT(codesys, g) \
+ ((codesys)->iso2022.force_charset_on_output[g])
+#define CODING_SYSTEM_ISO2022_SHORT(codesys) ((codesys)->iso2022.shoort)
+#define CODING_SYSTEM_ISO2022_NO_ASCII_EOL(codesys) \
+ ((codesys)->iso2022.no_ascii_eol)
+#define CODING_SYSTEM_ISO2022_NO_ASCII_CNTL(codesys) \
+ ((codesys)->iso2022.no_ascii_cntl)
+#define CODING_SYSTEM_ISO2022_SEVEN(codesys) ((codesys)->iso2022.seven)
+#define CODING_SYSTEM_ISO2022_LOCK_SHIFT(codesys) \
+ ((codesys)->iso2022.lock_shift)
+#define CODING_SYSTEM_ISO2022_NO_ISO6429(codesys) \
+ ((codesys)->iso2022.no_iso6429)
+#define CODING_SYSTEM_ISO2022_ESCAPE_QUOTED(codesys) \
+ ((codesys)->iso2022.escape_quoted)
+#define CODING_SYSTEM_CCL_DECODE(codesys) ((codesys)->ccl.decode)
+#define CODING_SYSTEM_CCL_ENCODE(codesys) ((codesys)->ccl.encode)
+
+#define XCODING_SYSTEM_NAME(codesys) \
+ CODING_SYSTEM_NAME (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_DOC_STRING(codesys) \
+ CODING_SYSTEM_DOC_STRING (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_TYPE(codesys) \
+ CODING_SYSTEM_TYPE (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_MNEMONIC(codesys) \
+ CODING_SYSTEM_MNEMONIC (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_POST_READ_CONVERSION(codesys) \
+ CODING_SYSTEM_POST_READ_CONVERSION (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_PRE_WRITE_CONVERSION(codesys) \
+ CODING_SYSTEM_PRE_WRITE_CONVERSION (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_EOL_TYPE(codesys) \
+ CODING_SYSTEM_EOL_TYPE (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_EOL_LF(codesys) \
+ CODING_SYSTEM_EOL_LF (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_EOL_CRLF(codesys) \
+ CODING_SYSTEM_EOL_CRLF (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_EOL_CR(codesys) \
+ CODING_SYSTEM_EOL_CR (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_ISO2022_INITIAL_CHARSET(codesys, g) \
+ CODING_SYSTEM_ISO2022_INITIAL_CHARSET (XCODING_SYSTEM (codesys), g)
+#define XCODING_SYSTEM_ISO2022_FORCE_CHARSET_ON_OUTPUT(codesys, g) \
+ CODING_SYSTEM_ISO2022_FORCE_CHARSET_ON_OUTPUT (XCODING_SYSTEM (codesys), g)
+#define XCODING_SYSTEM_ISO2022_SHORT(codesys) \
+ CODING_SYSTEM_ISO2022_SHORT (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_ISO2022_NO_ASCII_EOL(codesys) \
+ CODING_SYSTEM_ISO2022_NO_ASCII_EOL (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_ISO2022_NO_ASCII_CNTL(codesys) \
+ CODING_SYSTEM_ISO2022_NO_ASCII_CNTL (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_ISO2022_SEVEN(codesys) \
+ CODING_SYSTEM_ISO2022_SEVEN (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_ISO2022_LOCK_SHIFT(codesys) \
+ CODING_SYSTEM_ISO2022_LOCK_SHIFT (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_ISO2022_NO_ISO6429(codesys) \
+ CODING_SYSTEM_ISO2022_NO_ISO6429 (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_ISO2022_ESCAPE_QUOTED(codesys) \
+ CODING_SYSTEM_ISO2022_ESCAPE_QUOTED (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_CCL_DECODE(codesys) \
+ CODING_SYSTEM_CCL_DECODE (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_CCL_ENCODE(codesys) \
+ CODING_SYSTEM_CCL_ENCODE (XCODING_SYSTEM (codesys))
+
+extern Lisp_Object Qbuffer_file_coding_system, Qcoding_system_error;
+
+extern Lisp_Object Vkeyboard_coding_system;
+extern Lisp_Object Vterminal_coding_system;
+extern Lisp_Object Vcoding_system_for_read;
+extern Lisp_Object Vcoding_system_for_write;
+extern Lisp_Object Vpathname_coding_system;
+
+extern Lisp_Object Qescape_quoted;
+
+/* Flags indicating current state while converting code. */
+
+/* Used by everyone. */
+
+#define CODING_STATE_END (1 << 0) /* If set, this is the last chunk of
+ data being processed. When this
+ is finished, output any necessary
+ terminating control characters,
+ escape sequences, etc. */
+#define CODING_STATE_CR (1 << 1) /* If set, we just saw a CR. */
+
+
+/* Used by Big 5 on output. */
+
+#define CODING_STATE_BIG5_1 (1 << 2) /* If set, we just encountered
+ LEADING_BYTE_BIG5_1. */
+#define CODING_STATE_BIG5_2 (1 << 3) /* If set, we just encountered
+ LEADING_BYTE_BIG5_2. */
+
+
+/* Used by ISO2022 on input and output. */
+
+#define CODING_STATE_R2L (1 << 4) /* If set, the current
+ directionality is right-to-left.
+ Otherwise, it's left-to-right. */
+
+
+/* Used by ISO2022 on input. */
+
+#define CODING_STATE_ESCAPE (1 << 5) /* If set, we're currently parsing
+ an escape sequence and the upper
+ 16 bits should be looked at to
+ indicate what partial escape
+ sequence we've seen so far.
+ Otherwise, we're running
+ through actual text. */
+#define CODING_STATE_SS2 (1 << 6) /* If set, G2 is invoked into GL, but
+ only for the next character. */
+#define CODING_STATE_SS3 (1 << 7) /* If set, G3 is invoked into GL,
+ but only for the next character.
+ If both CODING_STATE_SS2 and
+ CODING_STATE_SS3 are set,
+ CODING_STATE_SS2 overrides; but
+ this probably indicates an error
+ in the text encoding. */
+#define CODING_STATE_COMPOSITE (1 << 8) /* If set, we're currently processing
+ a composite character (i.e. a
+ character constructed by
+ overstriking two or more
+ characters). */
+
+
+/* CODING_STATE_ISO2022_LOCK is the mask of flags that remain on until
+ explicitly turned off when in the ISO2022 encoder/decoder. Other flags are
+ turned off at the end of processing each character or escape sequence. */
+# define CODING_STATE_ISO2022_LOCK \
+ (CODING_STATE_END | CODING_STATE_COMPOSITE | CODING_STATE_R2L)
+#define CODING_STATE_BIG5_LOCK \
+ CODING_STATE_END
+
+/* Flags indicating what we've seen so far when parsing an
+ ISO2022 escape sequence. */
+enum iso_esc_flag
+{
+ /* Partial sequences */
+ ISO_ESC_NOTHING, /* Nothing has been seen. */
+ ISO_ESC, /* We've seen ESC. */
+ ISO_ESC_2_4, /* We've seen ESC $. This indicates
+ that we're designating a multi-byte, rather
+ than a single-byte, character set. */
+ ISO_ESC_2_8, /* We've seen ESC 0x28, i.e. ESC (.
+ This means designate a 94-character
+ character set into G0. */
+ ISO_ESC_2_9, /* We've seen ESC 0x29 -- designate a
+ 94-character character set into G1. */
+ ISO_ESC_2_10, /* We've seen ESC 0x2A. */
+ ISO_ESC_2_11, /* We've seen ESC 0x2B. */
+ ISO_ESC_2_12, /* We've seen ESC 0x2C -- designate a
+ 96-character character set into G0.
+ (This is not ISO2022-standard.
+ The following 96-character
+ control sequences are standard,
+ though.) */
+ ISO_ESC_2_13, /* We've seen ESC 0x2D -- designate a
+ 96-character character set into G1.
+ */
+ ISO_ESC_2_14, /* We've seen ESC 0x2E. */
+ ISO_ESC_2_15, /* We've seen ESC 0x2F. */
+ ISO_ESC_2_4_8, /* We've seen ESC $ 0x28 -- designate
+ a 94^N character set into G0. */
+ ISO_ESC_2_4_9, /* We've seen ESC $ 0x29. */
+ ISO_ESC_2_4_10, /* We've seen ESC $ 0x2A. */
+ ISO_ESC_2_4_11, /* We've seen ESC $ 0x2B. */
+ ISO_ESC_2_4_12, /* We've seen ESC $ 0x2C. */
+ ISO_ESC_2_4_13, /* We've seen ESC $ 0x2D. */
+ ISO_ESC_2_4_14, /* We've seen ESC $ 0x2E. */
+ ISO_ESC_2_4_15, /* We've seen ESC $ 0x2F. */
+ ISO_ESC_5_11, /* We've seen ESC [ or 0x9B. This
+ starts a directionality-control
+ sequence. The next character
+ must be 0, 1, 2, or ]. */
+ ISO_ESC_5_11_0, /* We've seen 0x9B 0. The next
+ character must be ]. */
+ ISO_ESC_5_11_1, /* We've seen 0x9B 1. The next
+ character must be ]. */
+ ISO_ESC_5_11_2, /* We've seen 0x9B 2. The next
+ character must be ]. */
+
+ /* Full sequences. */
+ ISO_ESC_START_COMPOSITE, /* Private usage for START COMPOSING */
+ ISO_ESC_END_COMPOSITE, /* Private usage for END COMPOSING */
+ ISO_ESC_SINGLE_SHIFT, /* We've seen a complete single-shift sequence. */
+ ISO_ESC_LOCKING_SHIFT,/* We've seen a complete locking-shift sequence. */
+ ISO_ESC_DESIGNATE, /* We've seen a complete designation sequence. */
+ ISO_ESC_DIRECTIONALITY,/* We've seen a complete ISO6429 directionality
+ sequence. */
+ ISO_ESC_LITERAL /* We've seen a literal character ala
+ escape-quoting. */
+};
+
+/* Macros to define code of control characters for ISO2022's functions. */
+ /* code */ /* function */
+#define ISO_CODE_LF 0x0A /* line-feed */
+#define ISO_CODE_CR 0x0D /* carriage-return */
+#define ISO_CODE_SO 0x0E /* shift-out */
+#define ISO_CODE_SI 0x0F /* shift-in */
+#define ISO_CODE_ESC 0x1B /* escape */
+#define ISO_CODE_DEL 0x7F /* delete */
+#define ISO_CODE_SS2 0x8E /* single-shift-2 */
+#define ISO_CODE_SS3 0x8F /* single-shift-3 */
+#define ISO_CODE_CSI 0x9B /* control-sequence-introduce */
+
+/* Macros to access an encoding stream or decoding stream */
+
+#define CODING_STREAM_DECOMPOSE(str, flags, ch) \
+do { \
+ flags = (str)->flags; \
+ ch = (str)->ch; \
+} while (0)
+
+#define CODING_STREAM_COMPOSE(str, flags, ch) \
+do { \
+ (str)->flags = flags; \
+ (str)->ch = ch; \
+} while (0)
+
+
+/* For detecting the encoding of text */
+enum coding_category_type
+{
+ CODING_CATEGORY_SHIFT_JIS,
+ CODING_CATEGORY_ISO_7, /* ISO2022 system using only seven-bit bytes,
+ no locking shift */
+ CODING_CATEGORY_ISO_8_DESIGNATE, /* ISO2022 system using eight-bit bytes,
+ no locking shift, no single shift,
+ using designation to switch charsets */
+ CODING_CATEGORY_ISO_8_1, /* ISO2022 system using eight-bit bytes,
+ no locking shift, no designation sequences,
+ one-dimension characters in the upper half. */
+ CODING_CATEGORY_ISO_8_2, /* ISO2022 system using eight-bit bytes,
+ no locking shift, no designation sequences,
+ two-dimension characters in the upper half. */
+ CODING_CATEGORY_ISO_LOCK_SHIFT, /* ISO2022 system using locking shift */
+ CODING_CATEGORY_BIG5,
+ CODING_CATEGORY_NO_CONVERSION
+};
+
+#define CODING_CATEGORY_LAST CODING_CATEGORY_NO_CONVERSION
+
+#define CODING_CATEGORY_SHIFT_JIS_MASK \
+ (1 << CODING_CATEGORY_SHIFT_JIS)
+#define CODING_CATEGORY_ISO_7_MASK \
+ (1 << CODING_CATEGORY_ISO_7)
+#define CODING_CATEGORY_ISO_8_DESIGNATE_MASK \
+ (1 << CODING_CATEGORY_ISO_8_DESIGNATE)
+#define CODING_CATEGORY_ISO_8_1_MASK \
+ (1 << CODING_CATEGORY_ISO_8_1)
+#define CODING_CATEGORY_ISO_8_2_MASK \
+ (1 << CODING_CATEGORY_ISO_8_2)
+#define CODING_CATEGORY_ISO_LOCK_SHIFT_MASK \
+ (1 << CODING_CATEGORY_ISO_LOCK_SHIFT)
+#define CODING_CATEGORY_BIG5_MASK \
+ (1 << CODING_CATEGORY_BIG5)
+#define CODING_CATEGORY_NO_CONVERSION_MASK \
+ (1 << CODING_CATEGORY_NO_CONVERSION)
+#define CODING_CATEGORY_NOT_FINISHED_MASK \
+ (1 << 30)
+
+/* Convert shift-JIS code (sj1, sj2) into internal string
+ representation (c1, c2). (The leading byte is assumed.) */
+
+#define DECODE_SJIS(sj1, sj2, c1, c2) \
+do { \
+ int I1 = sj1, I2 = sj2; \
+ if (I2 >= 0x9f) \
+ c1 = (I1 << 1) - ((I1 >= 0xe0) ? 0xe0 : 0x60), \
+ c2 = I2 + 2; \
+ else \
+ c1 = (I1 << 1) - ((I1 >= 0xe0) ? 0xe1 : 0x61), \
+ c2 = I2 + ((I2 >= 0x7f) ? 0x60 : 0x61); \
+} while (0)
+
+/* Convert the internal string representation of a Shift-JIS character
+ (c1, c2) into Shift-JIS code (sj1, sj2). The leading byte is
+ assumed. */
+
+#define ENCODE_SJIS(c1, c2, sj1, sj2) \
+do { \
+ int I1 = c1, I2 = c2; \
+ if (I1 & 1) \
+ sj1 = (I1 >> 1) + ((I1 < 0xdf) ? 0x31 : 0x71), \
+ sj2 = I2 - ((I2 >= 0xe0) ? 0x60 : 0x61); \
+ else \
+ sj1 = (I1 >> 1) + ((I1 < 0xdf) ? 0x30 : 0x70), \
+ sj2 = I2 - 2; \
+} while (0)
+
+Lisp_Object make_decoding_input_stream (Lstream *stream, Lisp_Object codesys);
+Lisp_Object make_encoding_input_stream (Lstream *stream, Lisp_Object codesys);
+Lisp_Object make_decoding_output_stream (Lstream *stream, Lisp_Object codesys);
+Lisp_Object make_encoding_output_stream (Lstream *stream, Lisp_Object codesys);
+Lisp_Object decoding_stream_coding_system (Lstream *stream);
+Lisp_Object encoding_stream_coding_system (Lstream *stream);
+void set_decoding_stream_coding_system (Lstream *stream, Lisp_Object codesys);
+void set_encoding_stream_coding_system (Lstream *stream, Lisp_Object codesys);
+void determine_real_coding_system (Lstream *stream, Lisp_Object *codesys_in_out,
+ enum eol_type *eol_type_in_out);
+#endif /* _XEMACS_MULE_CODING_H_ */
--- /dev/null
+/* Support for Non-ASCII Path Name
+ Copyright (C) 1985, 1986, 1992, 1993, 1995 Free Software Foundation, Inc.
+ Copyright (C) 1995 Sun Microsystems, Inc.
+
+This file is part of XEmacs.
+
+XEmacs is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+XEmacs is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with XEmacs; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/* Synched up with: Mule 2.3. Not in FSF. */
+
+/* mcpath.h should be included in config.h */
+#include <config.h>
+#include "lisp.h"
+
+#include "sysfile.h"
+#include "buffer.h"
+#include "mule.h"
+
+Lisp_Object Qpathname_coding_system = 0;
+
+static void
+mcpath_encode_code (struct Lisp_Coding_System *cp)
+{
+ Lisp_Object coding_system;
+
+ coding_system = Fsymbol_value (Qpathname_coding_system);
+
+ mule_encode_code (coding_system, cp);
+ CODE_CNTL (cp) |= CC_END;
+}
+
+static int
+mule_encode_path_1 (unsigned char *src, unsigned int srcsize,
+ unsigned char *dst, unsigned int dstsize)
+{
+ struct Lisp_Coding_System code;
+
+ mcpath_encode_code (&code);
+ if (CODE_TYPE (&code) > MULE_AUTOCONV)
+ {
+ unsigned char *buf;
+
+ /* get_conversion_buffer () is not */
+ /* re-entrant. */
+ buf = (unsigned char *) alloca (MULE_ENCODE_BUF_SIZE (srcsize, &code));
+ if (buf)
+ {
+ int len;
+ Lisp_Object dummy = Qnil;
+
+ len = mule_encode (&code, src, buf, srcsize, &dummy);
+ if (!CODE_CHAR (&code) && len <= dstsize)
+ {
+ memcpy (dst, buf, len);
+ return len;
+ }
+ }
+ }
+ return -1; /* use original */
+}
+
+static unsigned char *
+mule_decode_path_1 (unsigned char *src, unsigned char *dst,
+ unsigned int dstsize)
+{
+ struct Lisp_Coding_System code;
+
+ mcpath_encode_code (&code);
+ if (CODE_TYPE (&code) > MULE_AUTOCONV)
+ {
+ int len;
+ unsigned char *buf;
+
+ len = strlen (src) + 1; /* + 1 for '\0' */
+
+ /* get_conversion_buffer () is not */
+ /* re-entrant. */
+ buf = (unsigned char *) alloca (MULE_DECODE_BUF_SIZE (len, &code));
+ if (buf)
+ {
+ CODE_CNTL (&code) |= CC_END;
+ len = mule_decode (&code, src, buf, len);
+ if (!CODE_CHAR (&code) && len <= dstsize)
+ {
+ memcpy (dst, buf, len); /* len should include '\0' */
+ return dst;
+ }
+ }
+ }
+ return src;
+}
+
+static unsigned char *
+mule_decode_path (unsigned char *path, unsigned char ext_path[MC_MAXPATHLEN])
+{
+ return
+ (Qpathname_coding_system
+ ? mule_decode_path_1 (path, ext_path, MC_MAXPATHLEN)
+ : path); /* in case of before initialization */
+}
+
+static unsigned char *
+mule_encode_path (unsigned char *path, unsigned char *encode_buffer,
+ unsigned int size)
+{
+ int len;
+
+ len = mule_encode_path_1 (path, strlen (path), encode_buffer, size);
+ if (len > 0)
+ path = encode_buffer;
+#ifdef MSDOS
+ /* convert the MSDOS style path delimiter to the UNIX style. Note
+ that now the code is *internal*, so we can simply compare each
+ character with '\\'. And this operation will alter the contents
+ of Lisp Object, PATH. */
+ {
+ unsigned char *p = path;
+
+ while (*p)
+ {
+ if (*p == '\\')
+ *p = '/';
+ p++;
+ }
+ }
+#endif /* MSDOS */
+ return path;
+}
+
+#if 0 /* example of how they do it (similar junk deleted) ... */
+
+int
+mc_creat (unsigned char *path, int mode)
+{
+ unsigned char buffer[MC_MAXPATHLEN];
+ return creat (mule_decode_path (path, buffer), mode);
+}
+
+int
+mc_readlink (unsigned char *path, unsigned char *buf, int size)
+{
+ unsigned char buffer[MC_MAXPATHLEN], buffer2[MAXPATHLEN];
+ int nread;
+
+ nread = readlink (mule_decode_path (path, buffer), buffer2, MAXPATHLEN);
+ if (nread > 0)
+ {
+ int len;
+ unsigned char *p;
+
+ len = mule_encode_path_1 (buffer2, nread, buffer, sizeof (buffer));
+ if (0 <= len && len <= size)
+ {
+ memcpy (buf, buffer, len);
+ return len;
+ }
+ }
+ return -1;
+}
+
+int
+mc_chdir (unsigned char *path)
+{
+ unsigned char buffer[MC_MAXPATHLEN];
+
+ path = mule_decode_path (path, buffer);
+
+#ifdef MSDOS
+ if ((path[0] != 0) && (path[1] == ':'))
+ {
+ int drive = (tolower (path[0]) - 'a');
+ if (getdisk () != drive)
+ setdisk (drive);
+ }
+
+ /* If path != "/" and path != "a:/" and path ends with slash, remove
+ it. */
+ {
+ int len = strlen (path);
+
+ if (strcmp (path + 1, ":/") && (len > 1) && (path[len - 1] == '/'))
+ {
+ if (path != buffer) /* It is not good to modify original path. */
+ {
+ memcpy (buffer, path, len - 1); /* no need to copy last /. */
+ path = buffer;
+ }
+ path[len - 1] = 0;
+ }
+ }
+#endif /* MSDOS */
+
+ return chdir (path);
+}
+
+#ifdef MSDOS
+#ifndef HAVE_GETWD
+unsigned char *
+mc_getcwd (unsigned char *null, size_t size)
+{
+ unsigned char buffer[MAXPATHLEN];
+ unsigned char *path;
+
+ path = (unsigned char *) getcwd ((char *)buffer, MAXPATHLEN);
+ if (path)
+ {
+ /* here, shoule be (path == buffer). */
+ path = (unsigned char *) xmalloc (MC_MAXPATHLEN); /* MSDOS */
+ if (path)
+ {
+ int len;
+ int buffer_length = strlen (buffer) + 1;
+
+ len = mule_encode_path_1 (buffer, buffer_length, path, MC_MAXPATHLEN);
+ if (len < 0)
+ {
+ /* conversion failed. use value that is returned from system. */
+ memcpy (path, buffer, buffer_length);
+ }
+ }
+ }
+ return path;
+}
+#else /* HAVE_GETWD */
+unsigned char *
+mc_getwd (unsigned char path[])
+{
+ unsigned char *p;
+
+ p = getwd (path);
+ if (p)
+ {
+ unsigned char buffer[MC_MAXPATHLEN];
+ int len;
+
+ len = mule_encode_path_1 (path, strlen (path) + 1, buffer, sizeof buffer);
+ if (len > 0)
+ {
+ memcpy (path, buffer, len);
+ }
+ }
+ return p;
+}
+#endif /* HAVE_GETWD */
+#endif /* MSDOS */
+
+/* In callproc.c, execvp() is called like this:
+ * execvp (new_argv[0], new_argv);
+ * following implement depends this.
+ */
+#ifndef NO_MC_EXECVP
+void
+mc_execvp (unsigned char *path, unsigned char *argv[])
+{
+ unsigned char buffer[MC_MAXPATHLEN];
+ argv[0] = path = mule_decode_path (path, buffer);
+ execvp (path, argv);
+}
+#endif /* !NO_MC_EXECVP */
+
+static DIRENTRY mcpath_directory_entry;
+DIRENTRY *
+mc_readdir (DIR *d)
+{
+ SYSTEM_DIRENTRY *sp;
+ DIRENTRY *dp = &mcpath_directory_entry;
+
+ sp = readdir (d);
+ if (!sp) return 0;
+
+#ifndef MSDOS
+ dp->d_ino = sp->d_ino;
+#endif /* MSDOS */
+ { /* copy d_name with conversion. */
+ int len;
+
+ len = mule_encode_path_1 (sp->d_name, NAMLEN (sp),
+ dp->d_name, sizeof (dp->d_name) - 1);
+ if (len < 0)
+ {
+ len = NAMLEN (sp);
+#ifdef MCPATH_ASSERT
+ assert (len < sizeof (dp->d_name));
+#endif
+ memcpy (dp->d_name, sp->d_name, len);
+ }
+ dp->d_name[len] = 0;
+ }
+ return dp;
+}
+
+#endif /* 0 */
+
--- /dev/null
+/* Support for Non-ASCII Path Name
+ Copyright (C) 1985, 1986, 1995 Free Software Foundation, Inc.
+ Copyright (C) 1995 Sun Microsystems, Inc.
+
+This file is part of XEmacs.
+
+XEmacs is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+XEmacs is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with XEmacs; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/* Synched up with: Mule 2.3. Not in FSF. */
+
+/* This part cannot be surround with #ifdef emacs, because it is needed */
+/* during generate xmakefile. */
+#ifndef MCPATH
+# define MCPATH
+#endif /* !MCPATH */
+
+/* not to confuse while compiling etc/*.c */
+#ifdef emacs
+#ifdef MCPATH
+# ifndef _MCPATH_H /* enable to include twice */
+
+#if 1
+\f
+/* !!! This page is copied from dired.c except that DIRENTRY is
+ changed to SYSTEM_DIRENTRY. Don't modify this page. */
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+/* The d_nameln member of a struct dirent includes the '\0' character
+ on some systems, but not on others. What's worse, you can't tell
+ at compile-time which one it will be, since it really depends on
+ the sort of system providing the filesystem you're reading from,
+ not the system you are running on. Paul Eggert
+ <eggert@bi.twinsun.com> says this occurs when Emacs is running on a
+ SunOS 4.1.2 host, reading a directory that is remote-mounted from a
+ Solaris 2.1 host and is in a native Solaris 2.1 filesystem.
+
+ Since applying strlen to the name always works, we'll just do that. */
+#define NAMLEN(p) strlen (p->d_name)
+
+#ifdef SYSV_SYSTEM_DIR
+
+#include <dirent.h>
+#define SYSTEM_DIRENTRY struct dirent
+
+#else /* not SYSV_SYSTEM_DIR */
+
+#ifdef NONSYSTEM_DIR_LIBRARY
+#include "ndir.h"
+#else /* not NONSYSTEM_DIR_LIBRARY */
+#ifdef MSDOS
+#include <dirent.h>
+#else
+#include <sys/dir.h>
+#endif
+#endif /* not NONSYSTEM_DIR_LIBRARY */
+
+#ifndef MSDOS
+#define SYSTEM_DIRENTRY struct direct
+
+extern DIR *opendir ();
+extern struct direct *readdir ();
+
+#endif /* not MSDOS */
+#endif /* not SYSV_SYSTEM_DIR */
+#endif
+\f
+ /* maximum buffer size to do conversion. */
+#define MCPATH_BUFSIZ(s) (((s) * 3) + 256)
+#define MC_MAXPATHLEN MCPATH_BUFSIZ (MAXPATHLEN)
+
+#define DIRENTRY struct mcpath_direntry
+struct mcpath_direntry
+{
+ /* emacs 19.28 uses d_ino and d_name. */
+#ifndef MSDOS
+ int d_ino;
+#endif /* not MSDOS */
+ unsigned char d_name [MCPATH_BUFSIZ (MAXNAMLEN) + 1];
+};
#define WNNSERVER_T 2
#define WNNSERVER_K 3
-int check_wnn_server_type (void);
+int check_wnn_server_type (void);
void w2m (w_char *wp, unsigned char *mp, unsigned char lb);
void m2w (unsigned char *mp, w_char *wp);
void w2y (w_char *w);
case WNNSERVER_C:
langname = "zh_CN";
break;
-/*
+/*
case WNNSERVER_T:
strcpy (langname, "zh_TW");
break;
DEFUN ("wnn-server-close", Fwnn_close, 0, 0, 0, /*
-Close the connection to jserver, Dictionary and frequency files
+Close the connection to jserver, Dictionary and friquency files
are not saved.
*/
())
if (!wnnfns_buf[snum]) return Qnil;
if (wnnfns_env_norm[snum])
{
- if (NILP (Vwnnenv_sticky)) jl_env_un_sticky_e (wnnfns_env_norm[snum]);
+ if (EQ(Vwnnenv_sticky, Qnil)) jl_env_un_sticky_e (wnnfns_env_norm[snum]);
else jl_env_sticky_e (wnnfns_env_norm[snum]);
jl_disconnect (wnnfns_env_norm[snum]);
}
if (wnnfns_env_rev[snum])
{
- if (NILP (Vwnnenv_sticky)) jl_env_un_sticky_e (wnnfns_env_rev[snum]);
+ if (EQ(Vwnnenv_sticky, Qnil)) jl_env_un_sticky_e (wnnfns_env_rev[snum]);
else jl_env_sticky_e (wnnfns_env_rev[snum]);
jl_disconnect (wnnfns_env_rev[snum]);
}
CHECK_STRING (args[0]);
CHECK_STRING (args[1]);
CHECK_INT (args[2]);
- if (! NILP (args[5])) CHECK_STRING (args[5]);
- if (! NILP (args[6])) CHECK_STRING (args[6]);
+ if (!EQ(args[5], Qnil)) CHECK_STRING (args[5]);
+ if (!EQ(args[6], Qnil)) CHECK_STRING (args[6]);
if ((snum = check_wnn_server_type ()) == -1) return Qnil;
if (!wnnfns_buf[snum]) return Qnil;
GCPRO1 (*args);
gcpro1.nvars = nargs;
if (jl_dic_add (wnnfns_buf[snum],
- XSTRING_DATA (args[0]),
- XSTRING_DATA (args[1]),
+ XSTRING (args[0])->_data,
+ XSTRING (args[1])->_data,
wnnfns_norm ? WNN_DIC_ADD_NOR : WNN_DIC_ADD_REV,
XINT (args[2]),
- NILP (args[3]) ? WNN_DIC_RDONLY : WNN_DIC_RW,
- NILP (args[4]) ? WNN_DIC_RDONLY : WNN_DIC_RW,
- NILP (args[5]) ? 0 : XSTRING_DATA (args[5]),
- NILP (args[6]) ? 0 : XSTRING_DATA (args[6]),
+ (EQ(args[3], Qnil)) ? WNN_DIC_RDONLY : WNN_DIC_RW,
+ (EQ(args[4], Qnil)) ? WNN_DIC_RDONLY : WNN_DIC_RW,
+ (EQ(args[5], Qnil)) ? 0 : XSTRING (args[5])->_data,
+ (EQ(args[6], Qnil)) ? 0 : XSTRING (args[6])->_data,
yes_or_no,
puts2 ) < 0)
{
int cnt, i;
unsigned char comment[1024];
Lisp_Object val;
- int snum;
+ int snum;
unsigned char lb;
if ((snum = check_wnn_server_type ()) == -1) return Qnil;
DEFUN ("wnn-server-dict-comment", Fwnn_dict_comment, 2, 2, 0, /*
Set comment to dictionary specified by DIC-NUMBER.
Comment string COMMENT
-*/
+*/
(dicno, comment))
{
w_char wbuf[512];
CHECK_STRING (comment);
if ((snum = check_wnn_server_type ()) == -1) return Qnil;
if (!wnnfns_buf[snum]) return Qnil;
- m2w (XSTRING_DATA (comment), wbuf);
- if (jl_dic_comment_set (wnnfns_buf[snum], XINT (dicno), wbuf) < 0)
+ m2w (XSTRING (comment)->_data, wbuf);
+ if (jl_dic_comment_set (wnnfns_buf[snum], XINT (dicno), wbuf) < 0)
return Qnil;
return Qt;
}
{
int snum;
if ((snum = check_wnn_server_type ()) == -1) return Qnil;
- if (NILP (rev))
+ if (EQ(rev, Qnil))
{
if ((!wnnfns_buf[snum]) || (!wnnfns_env_norm[snum])) return Qnil;
jl_env_set (wnnfns_buf[snum], wnnfns_env_norm[snum]);
CHECK_STRING (hstring);
if ((snum = check_wnn_server_type ()) == -1) return Qnil;
if (!wnnfns_buf[snum]) return Qnil;
- m2w (XSTRING_DATA (hstring), wbuf);
+ m2w (XSTRING (hstring)->_data, wbuf);
if (snum == WNNSERVER_C)
w2y (wbuf);
#ifdef WNN6
- if ((cnt = jl_fi_ren_conv (wnnfns_buf[snum], wbuf, 0, -1, WNN_USE_MAE)) < 0)
+ if ((cnt = jl_fi_ren_conv (wnnfns_buf[snum], wbuf, 0, -1, WNN_USE_MAE)) < 0)
return Qnil;
#else
- if ((cnt = jl_ren_conv (wnnfns_buf[snum], wbuf, 0, -1, WNN_USE_MAE)) < 0)
+ if ((cnt = jl_ren_conv (wnnfns_buf[snum], wbuf, 0, -1, WNN_USE_MAE)) < 0)
return Qnil;
#endif
return make_int (cnt);
CHECK_INT (offset);
if ((snum = check_wnn_server_type ()) == -1) return Qnil;
if (!wnnfns_buf[snum]) return Qnil;
- if (NILP (dai))
+ if (EQ(dai, Qnil))
{
if (jl_set_jikouho (wnnfns_buf[snum], XINT (offset)) < 0) return Qnil;
}
no = XINT (bunNo);
#ifdef WNN6
if ((cnt = jl_fi_nobi_conv (wnnfns_buf[snum], no, XINT(len), -1, WNN_USE_MAE,
- NILP (dai) ? WNN_SHO : WNN_DAI)) < 0)
+ (EQ(dai, Qnil)) ? WNN_SHO : WNN_DAI)) < 0)
return Qnil;
#else
if ((cnt = jl_nobi_conv (wnnfns_buf[snum], no, XINT(len), -1, WNN_USE_MAE,
- NILP (dai) ? WNN_SHO : WNN_DAI)) < 0)
+ (EQ(dai, Qnil)) ? WNN_SHO : WNN_DAI)) < 0)
return Qnil;
#endif
return make_int (cnt);
int no;
int snum;
if ((snum = check_wnn_server_type ()) == -1) return Qnil;
- if (NILP (bunNo)) no = -1;
+ if (EQ(bunNo, Qnil)) no = -1;
else
{
CHECK_INT (bunNo);
CHECK_INT (hinsi);
if ((snum = check_wnn_server_type ()) == -1) return Qnil;
if (!wnnfns_buf[snum]) return Qnil;
- m2w (XSTRING_DATA (yomi), yomi_buf);
+ m2w (XSTRING (yomi)->_data, yomi_buf);
if (snum == WNNSERVER_C)
w2y (yomi_buf);
- m2w (XSTRING_DATA (kanji), kanji_buf);
- m2w (XSTRING_DATA (comment), comment_buf);
+ m2w (XSTRING (kanji)->_data, kanji_buf);
+ m2w (XSTRING (comment)->_data, comment_buf);
if (jl_word_add (wnnfns_buf[snum], XINT (dicno), yomi_buf, kanji_buf,
- comment_buf, XINT (hinsi), 0) < 0)
+ comment_buf, XINT (hinsi), 0) < 0)
return Qnil;
else return Qt;
}
if ((snum = check_wnn_server_type ()) == -1) return Qnil;
lb = lb_wnn_server_type[snum];
if (!wnnfns_buf[snum]) return Qnil;
- m2w (XSTRING_DATA (yomi), wbuf);
+ m2w (XSTRING (yomi)->_data, wbuf);
if (snum == WNNSERVER_C)
w2y (wbuf);
if ((count = jl_word_search_by_env (wnnfns_buf[snum],
CHECK_INT (val);
setval = XINT (val);
if (EQ (key, Qwnn_n)) param.n = setval;
- else if (EQ (key, Qwnn_nsho)) param.nsho = setval;
+ else if (EQ (key, Qwnn_nsho)) param.nsho = setval;
else if (EQ (key, Qwnn_hindo)) param.p1 = setval;
else if (EQ (key, Qwnn_len)) param.p2 = setval;
else if (EQ (key, Qwnn_jiri)) param.p3 = setval;
#if 0
printf("wnn_n = %d\n",param.n);
printf("wnn_nsho = %d\n",param.nsho);
- printf("wnn_hindo = %d\n",param.p1);
- printf("wnn_len = %d\n",param.p2);
- printf("wnn_jiri = %d\n",param.p3);
- printf("wnn_flag = %d\n",param.p4);
- printf("wnn_jisho = %d\n",param.p5);
- printf("wnn_sbn = %d\n",param.p6);
- printf("wnn_dbn_len = %d\n",param.p7);
- printf("wnn_sbn_cnt = %d\n",param.p8);
- printf("wnn_suuji = %d\n",param.p9);
- printf("wnn_kana = %d\n",param.p10);
- printf("wnn_eisuu = %d\n",param.p11);
- printf("wnn_kigou = %d\n",param.p12);
- printf("wnn_toji_kakko = %d\n",param.p13);
- printf("wnn_fuzokogo = %d\n",param.p14);
- printf("wnn_kaikakko = %d\n",param.p15);
+ printf("wnn_hindo = %d\n",param.p1);
+ printf("wnn_len = %d\n",param.p2);
+ printf("wnn_jiri = %d\n",param.p3);
+ printf("wnn_flag = %d\n",param.p4);
+ printf("wnn_jisho = %d\n",param.p5);
+ printf("wnn_sbn = %d\n",param.p6);
+ printf("wnn_dbn_len = %d\n",param.p7);
+ printf("wnn_sbn_cnt = %d\n",param.p8);
+ printf("wnn_suuji = %d\n",param.p9);
+ printf("wnn_kana = %d\n",param.p10);
+ printf("wnn_eisuu = %d\n",param.p11);
+ printf("wnn_kigou = %d\n",param.p12);
+ printf("wnn_toji_kakko = %d\n",param.p13);
+ printf("wnn_fuzokogo = %d\n",param.p14);
+ printf("wnn_kaikakko = %d\n",param.p15);
#endif
rc = jl_param_set (wnnfns_buf[snum], ¶m);
CHECK_STRING (file);
if ((snum = check_wnn_server_type ()) == -1) return Qnil;
if (!wnnfns_buf[snum]) return Qnil;
- if (jl_fuzokugo_set (wnnfns_buf[snum], XSTRING_DATA (file)) < 0)
+ if (jl_fuzokugo_set (wnnfns_buf[snum], XSTRING (file)->_data) < 0)
return Qnil;
return Qt;
}
if ((snum = check_wnn_server_type ()) == -1) return Qnil;
lb = lb_wnn_server_type[snum];
if (!wnnfns_buf[snum]) return Qnil;
- m2w (XSTRING_DATA (name), wbuf);
+ m2w (XSTRING (name)->_data, wbuf);
if ((cnt = jl_hinsi_list (wnnfns_buf[snum], XINT (dicno), wbuf, &area)) < 0)
return Qnil;
if (cnt == 0) return make_int (0);
int snum;
CHECK_STRING (args[0]);
CHECK_STRING (args[1]);
- if (! NILP (args[3])) CHECK_STRING (args[3]);
+ if (!EQ(args[3], Qnil)) CHECK_STRING (args[3]);
if ((snum = check_wnn_server_type()) == -1) return Qnil;
if(!wnnfns_buf[snum]) return Qnil;
GCPRO1 (*args);
gcpro1.nvars = nargs;
if(jl_fi_dic_add(wnnfns_buf[snum],
- XSTRING_DATA (args[0]),
- XSTRING_DATA (args[1]),
- WNN_FI_SYSTEM_DICT,
- WNN_DIC_RDONLY,
- NILP (args[2]) ? WNN_DIC_RDONLY : WNN_DIC_RW,
- 0,
- NILP (args[3]) ? 0 : XSTRING_DATA (args[3]),
- yes_or_no,
- puts2 ) < 0) {
+ XSTRING(args[0])->_data,
+ XSTRING(args[1])->_data,
+ WNN_FI_SYSTEM_DICT,
+ WNN_DIC_RDONLY,
+ (EQ(args[2], Qnil)) ? WNN_DIC_RDONLY : WNN_DIC_RW,
+ 0,
+ (EQ(args[3], Qnil)) ? 0 : XSTRING(args[3])->_data,
+ yes_or_no,
+ puts2 ) < 0) {
UNGCPRO;
return Qnil;
}
int snum;
CHECK_STRING (args[0]);
CHECK_STRING (args[1]);
- if (! NILP (args[4])) CHECK_STRING (args[4]);
- if (! NILP (args[5])) CHECK_STRING (args[5]);
+ if (!EQ(args[4], Qnil)) CHECK_STRING (args[4]);
+ if (!EQ(args[5], Qnil)) CHECK_STRING (args[5]);
if ((snum = check_wnn_server_type()) == -1) return Qnil;
if(!wnnfns_buf[snum]) return Qnil;
GCPRO1 (*args);
gcpro1.nvars = nargs;
if(jl_fi_dic_add(wnnfns_buf[snum],
- XSTRING_DATA (args[0]),
- XSTRING_DATA (args[1]),
- WNN_FI_USER_DICT,
- NILP (args[2]) ? WNN_DIC_RDONLY : WNN_DIC_RW,
- NILP (args[3]) ? WNN_DIC_RDONLY : WNN_DIC_RW,
- NILP (args[4]) ? 0 : XSTRING_DATA (args[4]),
- NILP (args[5]) ? 0 : XSTRING_DATA (args[5]),
- yes_or_no,
- puts2 ) < 0) {
+ XSTRING(args[0])->_data,
+ XSTRING(args[1])->_data,
+ WNN_FI_USER_DICT,
+ (EQ(args[2], Qnil)) ? WNN_DIC_RDONLY : WNN_DIC_RW,
+ (EQ(args[3], Qnil)) ? WNN_DIC_RDONLY : WNN_DIC_RW,
+ (EQ(args[4], Qnil)) ? 0 : XSTRING(args[4])->_data,
+ (EQ(args[5], Qnil)) ? 0 : XSTRING(args[5])->_data,
+ yes_or_no,
+ puts2 ) < 0) {
UNGCPRO;
return Qnil;
}
struct wnn_henkan_env henv;
CHECK_STRING (args[0]);
CHECK_INT (args[1]);
- if (! NILP (args[3])) CHECK_STRING (args[3]);
+ if (!EQ(args[3], Qnil)) CHECK_STRING (args[3]);
if ((snum = check_wnn_server_type()) == -1) return Qnil;
if(!wnnfns_buf[snum]) return Qnil;
GCPRO1 (*args);
dic_no = js_get_autolearning_dic(cur_env, WNN_MUHENKAN_LEARNING);
if (dic_no == WNN_NO_LEARNING) {
if((dic_no = jl_dic_add(wnnfns_buf[snum],
- XSTRING_DATA (args[0]),
+ XSTRING(args[0])->_data,
0,
wnnfns_norm ? WNN_DIC_ADD_NOR : WNN_DIC_ADD_REV,
XINT(args[1]),
WNN_DIC_RW, WNN_DIC_RW,
- NILP (args[3]) ? 0 : XSTRING_DATA (args[3]),
+ (EQ(args[3], Qnil)) ? 0 : XSTRING(args[3])->_data,
0,
yes_or_no,
puts2)) < 0) {
}
}
vmask |= WNN_ENV_MUHENKAN_LEARN_MASK;
- henv.muhenkan_flag = NILP (args[2]) ? WNN_DIC_RDONLY : WNN_DIC_RW;
+ henv.muhenkan_flag = (EQ(args[2], Qnil)) ? WNN_DIC_RDONLY : WNN_DIC_RW;
if(jl_set_henkan_env(wnnfns_buf[snum],
vmask,
&henv) < 0) {
struct wnn_henkan_env henv;
CHECK_STRING (args[0]);
CHECK_INT (args[1]);
- if (! NILP (args[3])) CHECK_STRING (args[3]);
+ if (!EQ(args[3], Qnil)) CHECK_STRING (args[3]);
if ((snum = check_wnn_server_type()) == -1) return Qnil;
if(!wnnfns_buf[snum]) return Qnil;
GCPRO1 (*args);
dic_no = js_get_autolearning_dic(cur_env, WNN_BUNSETSUGIRI_LEARNING);
if (dic_no == WNN_NO_LEARNING) {
if((dic_no = jl_dic_add(wnnfns_buf[snum],
- XSTRING_DATA (args[0]),
+ XSTRING(args[0])->_data,
0,
wnnfns_norm ? WNN_DIC_ADD_NOR : WNN_DIC_ADD_REV,
XINT(args[1]),
WNN_DIC_RW, WNN_DIC_RW,
- NILP (args[3]) ? 0 : XSTRING_DATA (args[3]),
+ (EQ(args[3], Qnil)) ? 0 : XSTRING(args[3])->_data,
0,
yes_or_no,
puts2)) < 0) {
}
}
vmask |= WNN_ENV_BUNSETSUGIRI_LEARN_MASK;
- henv.bunsetsugiri_flag = NILP (args[2]) ? WNN_DIC_RDONLY : WNN_DIC_RW;
+ henv.bunsetsugiri_flag = (EQ(args[2], Qnil)) ? WNN_DIC_RDONLY : WNN_DIC_RW;
if(jl_set_henkan_env(wnnfns_buf[snum],
vmask,
&henv) < 0) {
struct wnn_henkan_env henv;
if ((snum = check_wnn_server_type()) == -1) return Qnil;
if(!wnnfns_buf[snum]) return Qnil;
- vmask |= WNN_ENV_LAST_IS_FIRST_MASK;
- henv.last_is_first_flag = NILP (mode) ? False : True;
+ vmask |= WNN_ENV_LAST_IS_FIRST_MASK;
+ henv.last_is_first_flag = (EQ(mode, Qnil)) ? False : True;
if(jl_set_henkan_env(wnnfns_buf[snum],
vmask,
&henv) < 0) return Qnil;
if ((snum = check_wnn_server_type()) == -1) return Qnil;
if(!wnnfns_buf[snum]) return Qnil;
vmask |= WNN_ENV_COMPLEX_CONV_MASK;
- henv.complex_flag = NILP (mode) ? False : True;
+ henv.complex_flag = (EQ(mode, Qnil)) ? False : True;
if(jl_set_henkan_env(wnnfns_buf[snum],
vmask,
&henv) < 0) return Qnil;
if ((snum = check_wnn_server_type()) == -1) return Qnil;
if(!wnnfns_buf[snum]) return Qnil;
vmask |= WNN_ENV_OKURI_LEARN_MASK;
- henv.okuri_learn_flag = NILP (mode) ? False : True;
+ henv.okuri_learn_flag = (EQ(mode, Qnil)) ? False : True;
if(jl_set_henkan_env(wnnfns_buf[snum],
vmask,
&henv) < 0) return Qnil;
if ((snum = check_wnn_server_type()) == -1) return Qnil;
if(!wnnfns_buf[snum]) return Qnil;
vmask |= WNN_ENV_PREFIX_LEARN_MASK;
- henv.prefix_learn_flag = NILP (mode) ? False : True;
+ henv.prefix_learn_flag = (EQ(mode, Qnil)) ? False : True;
if(jl_set_henkan_env(wnnfns_buf[snum],
vmask,
&henv) < 0) return Qnil;
if ((snum = check_wnn_server_type()) == -1) return Qnil;
if(!wnnfns_buf[snum]) return Qnil;
vmask |= WNN_ENV_SUFFIX_LEARN_MASK;
- henv.suffix_learn_flag = NILP (mode) ? False : True;
+ henv.suffix_learn_flag = (EQ(mode, Qnil)) ? False : True;
if(jl_set_henkan_env(wnnfns_buf[snum],
vmask,
&henv) < 0) return Qnil;
if ((snum = check_wnn_server_type()) == -1) return Qnil;
if(!wnnfns_buf[snum]) return Qnil;
vmask |= WNN_ENV_COMMON_LAERN_MASK;
- henv.common_learn_flag = NILP (mode) ? False : True;
+ henv.common_learn_flag = (EQ(mode, Qnil)) ? False : True;
if(jl_set_henkan_env(wnnfns_buf[snum],
vmask,
&henv) < 0) return Qnil;
if ((snum = check_wnn_server_type()) == -1) return Qnil;
if(!wnnfns_buf[snum]) return Qnil;
vmask |= WNN_ENV_YURAGI_MASK;
- henv.yuragi_flag = NILP (mode) ? False : True;
+ henv.yuragi_flag = (EQ(mode, Qnil)) ? False : True;
if(jl_set_henkan_env(wnnfns_buf[snum],
vmask,
&henv) < 0) return Qnil;
CHECK_STRING (name);
if ((snum = check_wnn_server_type ()) == -1) return Qnil;
if (!wnnfns_buf[snum]) return Qnil;
- m2w (XSTRING_DATA (name), w_buf);
+ m2w (XSTRING (name)->_data, w_buf);
if ((no = jl_hinsi_number (wnnfns_buf[snum], w_buf)) < 0) return Qnil;
return make_int (no);
}
if (EQ(Vwnn_server_type, Qcserver))
{
len = cwnn_yincod_pzy (pzy, wc,
- NILP (Vcwnn_zhuyin)
+ (EQ(Vcwnn_zhuyin, Qnil))
? CWNN_PINYIN
: CWNN_ZHUYIN);
for (i = 0; i < len; i++)
m2w (unsigned char *mp, w_char *wp)
{
unsigned int ch;
-
+
while ((ch = *mp++) != 0)
{
if (BUFBYTE_LEADING_BYTE_P (ch))
w++; pin++;
}
len = cwnn_pzy_yincod (ybuf, pbuf,
- NILP (Vcwnn_zhuyin) ? CWNN_PINYIN : CWNN_ZHUYIN);
+ (EQ(Vcwnn_zhuyin, Qnil)) ? CWNN_PINYIN : CWNN_ZHUYIN);
if (len <= 0)
return;
#include "device.h"
#include "insdel.h"
-#if defined(__CYGWIN32__) || defined(__MINGW32__)
+#ifdef __CYGWIN32__
#define stricmp strcasecmp
-#define FONTENUMPROC FONTENUMEXPROC
-#define ntmTm ntmentm
#endif
typedef struct colormap_t
{
- CONST char *name;
- CONST COLORREF colorref;
+ char *name;
+ COLORREF colorref;
} colormap_t;
/* Colors from X11R6 "XConsortium: rgb.txt,v 10.41 94/02/20 18:39:36 rws Exp" */
{"LightGreen" , PALETTERGB (144, 238, 144) }
};
-
-typedef struct fontmap_t
-{
- CONST char *name;
- CONST int value;
-} fontmap_t;
-
-/* Default weight first, preferred names listed before synonyms */
-static CONST fontmap_t fontweight_map[] =
-{
- {"Regular" , FW_REGULAR}, /* The standard font weight */
- {"Thin" , FW_THIN},
- {"Extra Light" , FW_EXTRALIGHT},
- {"Ultra Light" , FW_ULTRALIGHT},
- {"Light" , FW_LIGHT},
- {"Normal" , FW_NORMAL},
- {"Medium" , FW_MEDIUM},
- {"Semi Bold" , FW_SEMIBOLD},
- {"Demi Bold" , FW_DEMIBOLD},
- {"Bold" , FW_BOLD}, /* The standard bold font weight */
- {"Extra Bold" , FW_EXTRABOLD},
- {"Ultra Bold" , FW_ULTRABOLD},
- {"Heavy" , FW_HEAVY},
- {"Black" , FW_BLACK}
-};
-
-/* Default charset first, no synonyms allowed because these names are
- * matched against the names reported by win32 by match_font() */
-static CONST fontmap_t charset_map[] =
-{
- {"Western" , ANSI_CHARSET},
- {"Symbol" , SYMBOL_CHARSET},
- {"Shift JIS" , SHIFTJIS_CHARSET}, /* #### Name to be verified */
- {"GB2312" , GB2312_CHARSET}, /* #### Name to be verified */
- {"Hanguel" , HANGEUL_CHARSET},
- {"Chinese Big 5" , CHINESEBIG5_CHARSET}, /* #### Name to be verified */
-#if (WINVER >= 0x0400)
- {"Johab" , JOHAB_CHARSET}, /* #### Name to be verified */
- {"Hebrew" , HEBREW_CHARSET}, /* #### Name to be verified */
- {"Arabic" , ARABIC_CHARSET}, /* #### Name to be verified */
- {"Greek" , GREEK_CHARSET},
- {"Turkish" , TURKISH_CHARSET},
- {"Vietnamese" , VIETNAMESE_CHARSET}, /* #### Name to be verified */
- {"Thai" , THAI_CHARSET}, /* #### Name to be verified */
- {"Central European" , EASTEUROPE_CHARSET},
- {"Cyrillic" , RUSSIAN_CHARSET},
- {"Mac" , MAC_CHARSET},
- {"Baltic" , BALTIC_CHARSET},
-#endif
- {"OEM/DOS" , OEM_CHARSET}
-};
-
\f
/************************************************************************/
/* helpers */
return 1;
}
-
-
-
-\f
-/************************************************************************/
-/* exports */
-/************************************************************************/
-
-struct font_enum_t
-{
- HDC hdc;
- struct device *d;
-};
-
-static int CALLBACK
-font_enum_callback_2 (ENUMLOGFONTEX *lpelfe, NEWTEXTMETRICEX *lpntme,
- int FontType, struct font_enum_t *font_enum)
-{
- struct mswindows_font_enum *fontlist, **fonthead;
- char fontname[MSW_FONTSIZE];
- int i;
-
- /*
- * The enumerated font weights are not to be trusted because:
- * a) lpelfe->elfStyle is only filled in for TrueType fonts.
- * b) Not all Bold and Italic styles of all fonts (inluding some Vector,
- * Truetype and Raster fonts) are enumerated.
- * I guess that fonts for which Bold and Italic styles are generated
- * 'on-the-fly' are not enumerated. It would be overly restrictive to
- * disallow Bold And Italic weights for these fonts, so we just leave
- * weights unspecified. This means that we have to weed out duplicates of
- * those fonts that do get enumerated with different weights.
- */
- if (FontType == 0 /*vector*/ || FontType == TRUETYPE_FONTTYPE)
- /* Scalable, so leave pointsize blank */
- sprintf (fontname, "%s::::", lpelfe->elfLogFont.lfFaceName);
- else
- /* Formula for pointsize->height from LOGFONT docs in Platform SDK */
- sprintf (fontname, "%s::%d::", lpelfe->elfLogFont.lfFaceName,
- MulDiv (lpntme->ntmTm.tmHeight - lpntme->ntmTm.tmInternalLeading,
- 72, DEVICE_MSWINDOWS_LOGPIXELSY (font_enum->d)));
-
- /*
- * The enumerated font character set strings are not to be trusted because
- * lpelfe->elfScript is returned in the host language and not in English.
- * We can't know a priori the translations of "Western", "Central European"
- * etc into the host language, so we must use English. The same argument
- * applies to the font weight string when matching fonts.
- */
- for (i=0; i<countof (charset_map); i++)
- if (lpelfe->elfLogFont.lfCharSet == charset_map[i].value)
- {
- strcat (fontname, charset_map[i].name);
- break;
- }
- if (i==countof (charset_map))
- strcpy (fontname, charset_map[0].name);
-
- /* Check that the new font is not a duplicate */
- fonthead = &DEVICE_MSWINDOWS_FONTLIST (font_enum->d);
- fontlist = *fonthead;
- while (fontlist)
- if (!strcmp (fontname, fontlist->fontname))
- return 1; /* found a duplicate */
- else
- fontlist = fontlist->next;
-
- /* Insert entry at head */
- fontlist = *fonthead;
- *fonthead = xmalloc (sizeof (struct mswindows_font_enum));
- if (*fonthead == NULL)
- {
- *fonthead = fontlist;
- return 0;
- }
- strcpy ((*fonthead)->fontname, fontname);
- (*fonthead)->next = fontlist;
- return 1;
-}
-
-static int CALLBACK
-font_enum_callback_1 (ENUMLOGFONTEX *lpelfe, NEWTEXTMETRICEX *lpntme,
- int FontType, struct font_enum_t *font_enum)
-{
- /* This function gets called once per facename per character set.
- * We call a second callback to enumerate the fonts in each facename */
- return EnumFontFamiliesEx (font_enum->hdc, &lpelfe->elfLogFont,
- (FONTENUMPROC) font_enum_callback_2,
- (LPARAM) font_enum, 0);
-}
-
-/*
- * Enumerate the available fonts. Called by mswindows_init_device().
- * Fills in the device's device-type-specfic fontlist.
- */
-void
-mswindows_enumerate_fonts (struct device *d)
-{
- HDC hdc = CreateCompatibleDC (NULL);
- LOGFONT logfont;
- struct font_enum_t font_enum;
-
- assert (hdc!=NULL);
- logfont.lfCharSet = DEFAULT_CHARSET;
- logfont.lfFaceName[0] = '\0';
- logfont.lfPitchAndFamily = DEFAULT_PITCH;
- font_enum.hdc = hdc;
- font_enum.d = d;
- DEVICE_MSWINDOWS_FONTLIST (d) = NULL;
- EnumFontFamiliesEx (hdc, &logfont, (FONTENUMPROC) font_enum_callback_1,
- (LPARAM) (&font_enum), 0);
- DeleteDC (hdc);
-}
-
\f
/************************************************************************/
/* methods */
COLOR_INSTANCE_MSWINDOWS_COLOR (c) = color;
return 1;
}
- maybe_signal_simple_error ("Unrecognized color", name, Qcolor, errb);
+ maybe_signal_simple_error ("unrecognized color", name, Qcolor, errb);
return(0);
}
}
}
-
static int
mswindows_initialize_font_instance (struct Lisp_Font_Instance *f, Lisp_Object name,
Lisp_Object device, Error_behavior errb)
{
CONST char *extname;
LOGFONT logfont;
- int fields, i;
+ int fields;
int pt;
char fontname[LF_FACESIZE], weight[LF_FACESIZE], *style, points[8];
char effects[LF_FACESIZE], charset[LF_FACESIZE];
char *c;
- HDC hdc;
- HFONT holdfont;
- TEXTMETRIC metrics;
-
- extname = XSTRING_DATA (name);
+
+ GET_C_STRING_CTEXT_DATA_ALLOCA (f->name, extname);
/*
* mswindows fonts look like:
/* This function is implemented in a fairly ad-hoc manner.
* The general idea is to validate and canonicalize each of the above fields
* at the same time as we build up the win32 LOGFONT structure. This enables
- * us to use match_font() on a canonicalized font string to check the
+ * us to use math_font() on a canonicalized font string to check the
* availability of the requested font */
- if (fields < 0)
+ if (fields<0)
{
- maybe_signal_simple_error ("Invalid font", name, Qfont, errb);
+ maybe_signal_simple_error ("Invalid font", f->name, Qfont, errb);
return (0);
}
}
else
{
- maybe_signal_simple_error ("Must specify a font name", name, Qfont, errb);
+ maybe_signal_simple_error ("Must specify a font name", f->name, Qfont, errb);
return (0);
}
/* weight */
if (fields < 2)
- strcpy (weight, fontweight_map[0].name);
+ strcpy (weight, "Regular");
/* Maybe split weight into weight and style */
if ((c=strchr(weight, ' ')))
else
style = NULL;
- for (i=0; i<countof (fontweight_map); i++)
- if (!stricmp (weight, fontweight_map[i].name))
- {
- logfont.lfWeight = fontweight_map[i].value;
- break;
- }
- if (i == countof (fontweight_map)) /* No matching weight */
+#define FROB(wgt) \
+ if (stricmp (weight, #wgt) == 0) \
+ logfont.lfWeight = FW_##wgt
+
+ FROB (REGULAR);
+ else FROB (THIN);
+ else FROB (EXTRALIGHT);
+ else FROB (ULTRALIGHT);
+ else FROB (LIGHT);
+ else FROB (NORMAL);
+ else FROB (MEDIUM);
+ else FROB (SEMIBOLD);
+ else FROB (DEMIBOLD);
+ else FROB (BOLD);
+ else FROB (EXTRABOLD);
+ else FROB (ULTRABOLD);
+ else FROB (HEAVY);
+ else FROB (BLACK);
+ else if (!style)
{
- if (!style)
- {
- logfont.lfWeight = FW_REGULAR;
- style = weight; /* May have specified style without weight */
- }
- else
- {
- maybe_signal_simple_error ("Invalid font weight", name, Qfont, errb);
- return (0);
- }
+ logfont.lfWeight = FW_REGULAR;
+ style = weight; /* May have specified style without weight */
+ }
+ else
+ {
+ maybe_signal_simple_error ("Invalid font weight", f->name, Qfont, errb);
+ return (0);
}
+#undef FROB
+
if (style)
{
/* #### what about oblique? */
logfont.lfItalic = TRUE;
else
{
- maybe_signal_simple_error ("Invalid font weight or style", name, Qfont, errb);
+ maybe_signal_simple_error ("Invalid font weight or style", f->name, Qfont, errb);
return (0);
}
pt = 10; /* #### Should we reject strings that don't specify a size? */
else if ((pt=atoi(points)) == 0)
{
- maybe_signal_simple_error ("Invalid font pointsize", name, Qfont, errb);
+ maybe_signal_simple_error ("Invalid font pointsize", f->name, Qfont, errb);
return (0);
}
/* Formula for pointsize->height from LOGFONT docs in MSVC5 Platform SDK */
- logfont.lfHeight = -MulDiv(pt, DEVICE_MSWINDOWS_LOGPIXELSY (XDEVICE (device)), 72);
+ logfont.lfHeight = -MulDiv(pt, DEVICE_MSWINDOWS_LOGPIXELSY(XDEVICE (device)), 72);
logfont.lfWidth = 0;
/* Effects */
logfont.lfStrikeOut = TRUE;
else
{
- maybe_signal_simple_error ("Invalid font effect", name, Qfont, errb);
+ maybe_signal_simple_error ("Invalid font effect", f->name,
+ Qfont, errb);
return (0);
}
logfont.lfStrikeOut = TRUE;
else
{
- maybe_signal_simple_error ("Invalid font effect", name,
+ maybe_signal_simple_error ("Invalid font effect", f->name,
Qfont, errb);
return (0);
}
else
effects[0] = '\0';
- /* Charset */
+#define FROB(cs) \
+ else if (stricmp (charset, #cs) == 0) \
+ logfont.lfCharSet = cs##_CHARSET
+
+ /* Charset aliases. Hangeul = Hangul is defined in windows.h.
+ We do not use the name "russian", only "cyrillic", as it is
+ the common name of this charset, used in other languages
+ than Russian. */
+#define CYRILLIC_CHARSET RUSSIAN_CHARSET
+#define CENTRALEUROPEAN_CHARSET EASTEUROPE_CHARSET
+#define CENTRALEUROPEAN_CHARSET EASTEUROPE_CHARSET
+
/* charset can be specified even if earlier fields havn't been */
- if (fields < 5)
+ if ((fields < 5) && (c=strchr (extname, ':')) && (c=strchr (c+1, ':')) &&
+ (c=strchr (c+1, ':')) && (c=strchr (c+1, ':')))
{
- if ((c=strchr (extname, ':')) && (c=strchr (c+1, ':')) &&
- (c=strchr (c+1, ':')) && (c=strchr (c+1, ':')))
- {
- strncpy (charset, c+1, LF_FACESIZE);
- charset[LF_FACESIZE-1] = '\0';
- }
- else
- strcpy (charset, charset_map[0].name);
+ strncpy (charset, c+1, LF_FACESIZE);
+ charset[LF_FACESIZE-1] = '\0';
}
-
- for (i=0; i<countof (charset_map); i++)
- if (!stricmp (charset, charset_map[i].name))
- {
- logfont.lfCharSet = charset_map[i].value;
- break;
- }
-
- if (i == countof (charset_map)) /* No matching charset */
+ else
+ charset[0] = '\0';
+
+ if (charset[0] == '\0' || (stricmp (charset, "ansi") == 0) ||
+ (stricmp (charset, "western") == 0))
{
- maybe_signal_simple_error ("Invalid charset", name, Qfont, errb);
+ logfont.lfCharSet = ANSI_CHARSET;
+ strcpy (charset, "western");
+ }
+ FROB (SYMBOL);
+ FROB (SHIFTJIS);
+ FROB (GB2312);
+ FROB (HANGEUL);
+ FROB (CHINESEBIG5);
+ FROB (JOHAB);
+ FROB (HEBREW);
+ FROB (ARABIC);
+ FROB (GREEK);
+ FROB (TURKISH);
+ FROB (THAI);
+ FROB (EASTEUROPE);
+ FROB (CENTRALEUROPEAN);
+ FROB (CYRILLIC);
+ FROB (MAC);
+ FROB (BALTIC);
+ else if (stricmp (charset, "oem/dos") == 0)
+ logfont.lfCharSet = OEM_CHARSET;
+ else
+ {
+ maybe_signal_simple_error ("Invalid charset", f->name, Qfont, errb);
return 0;
}
- /* Misc crud */
- logfont.lfEscapement = logfont.lfOrientation = 0;
-#if 1
- logfont.lfOutPrecision = OUT_DEFAULT_PRECIS;
- logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
- logfont.lfQuality = DEFAULT_QUALITY;
-#else
- logfont.lfOutPrecision = OUT_STROKE_PRECIS;
- logfont.lfClipPrecision = CLIP_STROKE_PRECIS;
- logfont.lfQuality = PROOF_QUALITY;
-#endif
- /* Default to monospaced if the specified fontname doesn't exist. */
- logfont.lfPitchAndFamily = FF_MODERN;
+#undef FROB
/* Windows will silently substitute a default font if the fontname
* specifies a non-existent font. So we check the font against the device's
- * list of font patterns to make sure that at least one of them matches. */
+ * list of font patterns to make sure that at least one of them matches */
{
struct mswindows_font_enum *fontlist;
char truename[MSW_FONTSIZE];
}
if (!done)
{
- maybe_signal_simple_error ("No matching font", name, Qfont, errb);
+ maybe_signal_simple_error ("No matching font", f->name, Qfont, errb);
return 0;
}
}
+ /* Misc crud */
+ logfont.lfEscapement = logfont.lfOrientation = 0;
+#if 1
+ logfont.lfOutPrecision = OUT_DEFAULT_PRECIS;
+ logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
+ logfont.lfQuality = DEFAULT_QUALITY;
+#else
+ logfont.lfOutPrecision = OUT_STROKE_PRECIS;
+ logfont.lfClipPrecision = CLIP_STROKE_PRECIS;
+ logfont.lfQuality = PROOF_QUALITY;
+#endif
+ /* Default to monospaced if the specified fontname doesn't exist.
+ * The match_font calls above should mean that this can't happen. */
+ logfont.lfPitchAndFamily = FF_MODERN;
+
if ((f->data = CreateFontIndirect(&logfont)) == NULL)
{
- maybe_signal_simple_error ("Couldn't create font", name, Qfont, errb);
+ maybe_signal_simple_error ("Couldn't create font", f->name, Qfont, errb);
return 0;
}
- hdc = CreateCompatibleDC (NULL);
- if (hdc)
- {
- holdfont = SelectObject(hdc, f->data);
- if (holdfont)
- {
- GetTextMetrics (hdc, &metrics);
- SelectObject(hdc, holdfont);
- DeleteDC (hdc);
- f->width = (unsigned short) metrics.tmAveCharWidth;
- f->height = (unsigned short) metrics.tmHeight;
- f->ascent = (unsigned short) metrics.tmAscent;
- f->descent = (unsigned short) metrics.tmDescent;
- f->proportional_p = (metrics.tmPitchAndFamily & TMPF_FIXED_PITCH);
- return 1;
- }
- DeleteDC (hdc);
- }
- mswindows_finalize_font_instance (f);
- maybe_signal_simple_error ("Couldn't map font", name, Qfont, errb);
+ {
+ HDC hdc;
+ HFONT holdfont;
+ TEXTMETRIC metrics;
+
+ hdc = CreateCompatibleDC (NULL);
+ if (hdc)
+ {
+ holdfont = SelectObject(hdc, f->data);
+ if (holdfont)
+ {
+ GetTextMetrics (hdc, &metrics);
+ SelectObject(hdc, holdfont);
+ DeleteDC (hdc);
+ f->width = (unsigned short) metrics.tmAveCharWidth;
+ f->height = (unsigned short) metrics.tmHeight;
+ f->ascent = (unsigned short) metrics.tmAscent;
+ f->descent = (unsigned short) metrics.tmDescent;
+ f->proportional_p = (metrics.tmPitchAndFamily & TMPF_FIXED_PITCH);
+ return 1;
+ }
+ DeleteDC (hdc);
+ }
+ mswindows_finalize_font_instance (f);
+ maybe_signal_simple_error ("Couldn't map font", f->name, Qfont, errb);
+ }
return 0;
}
return Fnreverse (result);
}
-/* Fill in missing parts of a font spec. This is primarily intended as a
- * helper function for the functions below.
- * mswindows fonts look like:
- * fontname[:[weight][ style][:pointsize[:effects]]][:charset]
- * A minimal mswindows font spec looks like:
- * Courier New
- * A maximal mswindows font spec looks like:
- * Courier New:Bold Italic:10:underline strikeout:Western
- * Missing parts of the font spec should be filled in with these values:
- * Courier New:Regular:10::Western */
-static Lisp_Object
-mswindows_font_instance_truename (struct Lisp_Font_Instance *f, Error_behavior errb)
-{
- int nsep=0;
- char *name = (char *) XSTRING_DATA (f->name);
- char* ptr = name;
- char* extname = alloca (strlen (name) + 19);
- strcpy (extname, name);
-
- while ((ptr = strchr (ptr, ':')) != 0)
- {
- ptr++;
- nsep++;
- }
-
- switch (nsep)
- {
- case 0:
- strcat (extname, ":Regular:10::Western");
- break;
- case 1:
- strcat (extname, ":10::Western");
- break;
- case 2:
- strcat (extname, "::Western");
- break;
- case 3:
- strcat (extname, ":Western");
- break;
- default:;
- }
-
- return build_ext_string (extname, FORMAT_OS);
-}
-
#ifdef MULE
static int
/* CONSOLE_HAS_METHOD (mswindows, mark_font_instance); */
CONSOLE_HAS_METHOD (mswindows, print_font_instance);
CONSOLE_HAS_METHOD (mswindows, finalize_font_instance);
- CONSOLE_HAS_METHOD (mswindows, font_instance_truename);
+/* CONSOLE_HAS_METHOD (mswindows, font_instance_truename); */
CONSOLE_HAS_METHOD (mswindows, list_fonts);
#ifdef MULE
CONSOLE_HAS_METHOD (mswindows, font_spec_matches_charset);
tty_mark_color_instance (struct Lisp_Color_Instance *c,
void (*markobj) (Lisp_Object))
{
- markobj (COLOR_INSTANCE_TTY_SYMBOL (c));
+ ((markobj) (COLOR_INSTANCE_TTY_SYMBOL (c)));
}
static void
tty_mark_font_instance (struct Lisp_Font_Instance *f,
void (*markobj) (Lisp_Object))
{
- markobj (FONT_INSTANCE_TTY_CHARSET (f));
+ ((markobj) (FONT_INSTANCE_TTY_CHARSET (f)));
}
static void
--- /dev/null
+/* This file is part of XEmacs.
+
+XEmacs is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+XEmacs is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with XEmacs; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/* Synched up with: FSF 19.30. Split out of alloc.c. */
+
+#include <config.h>
+#include "lisp.h"
+#include "puresize.h"
+
+/* Moved from puresize.h to here so alloc.c does not get recompiled */
+
+# include <puresize-adjust.h>
+#define PURESIZE ((RAW_PURESIZE) + (PURESIZE_ADJUSTMENT))
+
+size_t
+get_PURESIZE (void)
+{
+ return PURESIZE;
+}
+
+/* Force linker to put it into data space! */
+EMACS_INT pure[PURESIZE / sizeof (EMACS_INT)] = { (EMACS_INT) 0};
--- /dev/null
+/* Definition of PURESIZE.
+ Copyright (C) 1986, 1988, 1992, 1993, 1994 Free Software Foundation, Inc.
+ Copyright (C) 1995, 1996 Ben Wing.
+
+This file is part of XEmacs.
+
+XEmacs is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+XEmacs is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with XEmacs; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/* Synched up with: Not in FSF. */
+
+#ifndef PURESIZE_H
+#define PURESIZE_H
+
+/* If RAW_PURESIZE is already defined then the user overrode it at
+ configure time. */
+#ifndef RAW_PURESIZE
+
+/* Basic amount of purespace to use, in the absence of extra
+ things configured in. */
+
+
+/* This computation is Barbra Streisand, BS
+#if (LONGBITS == 64)
+# define BASE_PURESIZE 938000
+#else
+# define BASE_PURESIZE 563000
+#endif
+*/
+
+#define BASE_PURESIZE 1400000
+
+/* If any particular systems need to change the base puresize, they
+ should define SYSTEM_PURESIZE_EXTRA. Note that this can be
+ negative as well as positive.
+
+ Do NOT define PURESIZE or any other values. This allows the
+ other values to shift while still keeping things in sync. */
+
+#ifndef SYSTEM_PURESIZE_EXTRA
+# define SYSTEM_PURESIZE_EXTRA 0
+#endif
+
+/* Extra amount of purespace needed for menubars. */
+
+#ifdef HAVE_DIALOGS
+# if (LONGBITS == 64)
+# define DIALOG_PURESIZE_EXTRA 43000
+# else
+# define DIALOG_PURESIZE_EXTRA 1800
+# endif
+#else
+# define DIALOG_PURESIZE_EXTRA 0
+#endif
+
+#ifdef HAVE_MENUBARS
+# if (LONGBITS == 64)
+# define MENUBAR_PURESIZE_EXTRA 43000
+# else
+# define MENUBAR_PURESIZE_EXTRA 36000
+# endif
+#else
+# define MENUBAR_PURESIZE_EXTRA 0
+#endif
+
+#ifdef HAVE_SCROLLBARS
+# if (LONGBITS == 64)
+# define SCROLLBAR_PURESIZE_EXTRA 4000
+# else
+# define SCROLLBAR_PURESIZE_EXTRA 1800
+# endif
+#else
+# define SCROLLBAR_PURESIZE_EXTRA 0
+#endif
+
+#ifdef HAVE_TOOLBARS
+# if (LONGBITS == 64)
+# define TOOLBAR_PURESIZE_EXTRA 4000
+# else
+# define TOOLBAR_PURESIZE_EXTRA 8400
+# endif
+#else
+# define TOOLBAR_PURESIZE_EXTRA 0
+#endif
+
+/* Extra amount of purespace needed for X11, separate from menubars
+ and scrollbars. */
+
+#ifdef HAVE_X_WINDOWS
+# if (LONGBITS == 64)
+# define X11_PURESIZE_EXTRA 95000
+# else
+# define X11_PURESIZE_EXTRA 68000
+# endif
+#else
+# define X11_PURESIZE_EXTRA 0
+#endif
+
+/* Extra amount of purespace needed for Mule. */
+
+#ifdef MULE
+#ifdef HAVE_CANNA
+# define MULE_PURESIZE_CANNA 5000
+#else
+# define MULE_PURESIZE_CANNA 0
+#endif
+#ifdef HAVE_WNN
+# define MULE_PURESIZE_WNN 5000
+#else
+# define MULE_PURESIZE_WNN 0
+#endif
+# if (LONGBITS == 64)
+# define MULE_PURESIZE_EXTRA 99000+MULE_PURESIZE_CANNA+MULE_PURESIZE_WNN
+# else
+# define MULE_PURESIZE_EXTRA 78000+MULE_PURESIZE_CANNA+MULE_PURESIZE_WNN
+# endif
+#else
+# define MULE_PURESIZE_EXTRA 0
+#endif
+
+/* Extra amount of purespace needed for Tooltalk. */
+
+#ifdef TOOLTALK
+# if (LONGBITS == 64)
+# define TOOLTALK_PURESIZE_EXTRA 100000
+# else
+# define TOOLTALK_PURESIZE_EXTRA 8300
+# endif
+#else
+# define TOOLTALK_PURESIZE_EXTRA 0
+#endif
+
+/* Extra amount of purespace needed for Sunpro builds. */
+
+#ifdef SUNPRO
+#define SUNPRO_PURESIZE_EXTRA 95000
+#else
+# define SUNPRO_PURESIZE_EXTRA 0
+#endif
+
+#define RAW_PURESIZE ((BASE_PURESIZE) + \
+ (DIALOG_PURESIZE_EXTRA) + \
+ (MENUBAR_PURESIZE_EXTRA) + \
+ (SCROLLBAR_PURESIZE_EXTRA) + \
+ (TOOLBAR_PURESIZE_EXTRA) + \
+ (X11_PURESIZE_EXTRA) + \
+ (SYSTEM_PURESIZE_EXTRA) + \
+ (MULE_PURESIZE_EXTRA) + \
+ (TOOLTALK_PURESIZE_EXTRA) + \
+ (SUNPRO_PURESIZE_EXTRA))
+
+#endif /* !RAW_PURESIZE */
+
+size_t get_PURESIZE (void);
+extern EMACS_INT pure[];
+
+#endif /* PURESIZE_H */
#define MSWINDOWS_EOL_CURSOR_WIDTH 5
/*
- * Random forward declarations
+ * Random forward delarations
*/
static void mswindows_update_dc (HDC hdc, Lisp_Object font, Lisp_Object fg,
Lisp_Object bg, Lisp_Object bg_pmap);
+static void mswindows_clear_region (Lisp_Object locale, face_index findex,
+ int x, int y, int width, int height);
static void mswindows_output_vertical_divider (struct window *w, int clear);
static void mswindows_redraw_exposed_windows (Lisp_Object window, int x,
int y, int width, int height);
char_converter.reg[1] = byte1;
char_converter.reg[2] = byte2;
char_converter.ic = 0; /* start at beginning each time */
- ccl_driver (&char_converter, 0, 0, 0, 0, CCL_MODE_ENCODING);
+ ccl_driver (&char_converter, 0, 0, 0, 0);
byte1 = char_converter.reg[1];
byte2 = char_converter.reg[2];
}
struct face_cachel *cachel = WINDOW_FACE_CACHEL (w, rb->findex);
Lisp_Object bg_pmap = WINDOW_FACE_CACHEL_BACKGROUND_PIXMAP (w, rb->findex);
-
+
if (!IMAGE_INSTANCEP (bg_pmap)
|| !IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (bg_pmap)))
bg_pmap = Qnil;
{
struct frame *f = XFRAME (w->frame);
struct device *d = XDEVICE (f->device);
- struct face_cachel *cachel=0;
+ struct face_cachel *cachel;
Lisp_Object font = Qnil;
int focus = EQ (w->frame, DEVICE_FRAME_WITH_FOCUS_REAL (d));
HDC hdc = FRAME_MSWINDOWS_DC (f);
xpos -= xoffset;
/* sort out the destination rectangle */
- height = DISPLAY_LINE_HEIGHT (dl);
+ height = dl->ascent + dl->descent - dl->clip;
rect.left = clip_start;
rect.top = dl->ypos - dl->ascent;
rect.right = clip_end;
int clear_end = min (xpos + this_width, clip_end);
{
- redisplay_clear_region (window, findex, clear_start,
+ mswindows_clear_region (window, findex, clear_start,
dl->ypos - dl->ascent,
clear_end - clear_start,
height);
int need_clipping = (clip_x || clip_y);
int yoffset=0;
int xoffset=0;
-
/* do we need to offset the pixmap vertically? this is necessary
for background pixmaps. */
if (offset_bitmap)
struct Lisp_Image_Instance *p = XIMAGE_INSTANCE (image_instance);
Lisp_Object window;
- int lheight = DISPLAY_LINE_HEIGHT (dl);
+ int lheight = dl->ascent + dl->descent - dl->clip;
int pheight = ((int) IMAGE_INSTANCE_PIXMAP_HEIGHT (p) > lheight ? lheight :
IMAGE_INSTANCE_PIXMAP_HEIGHT (p));
int clip_x, clip_y, clip_width, clip_height;
}
if (!offset_bitmap) /* i.e. not a bg pixmap */
- redisplay_clear_region (window, findex, clear_x, clear_y,
+ mswindows_clear_region (window, findex, clear_x, clear_y,
clear_width, clear_height);
}
Given a display line, a block number for that start line, output all
runes between start and end in the specified display block.
- Ripped off with minimal thought from the corresponding X routine.
+ Ripped off with mininmal thought from the corresponding X routine.
****************************************************************************/
static void
mswindows_output_display_block (struct window *w, struct display_line *dl, int block,
else if (rb->object.chr.ch == '\n')
{
/* Clear in case a cursor was formerly here. */
- int height = DISPLAY_LINE_HEIGHT (dl);
+ int height = dl->ascent + dl->descent - dl->clip;
- redisplay_clear_region (window, findex, xpos, dl->ypos - dl->ascent,
+ mswindows_clear_region (window, findex, xpos, dl->ypos - dl->ascent,
rb->width, height);
elt++;
}
abort ();
case IMAGE_SUBWINDOW:
- case IMAGE_WIDGET:
- redisplay_output_subwindow (w, dl, instance, xpos,
- rb->object.dglyph.xoffset, start_pixpos,
- rb->width, findex, cursor_start,
- cursor_width, cursor_height);
- if (rb->cursor_type == CURSOR_ON)
- mswindows_output_cursor (w, dl, xpos, cursor_width,
- findex, 0, 1);
+ /* #### implement me */
break;
case IMAGE_NOTHING:
/* Draw a shadow around the divider */
if (shadow != 0)
{
- /* #### This will be fixed to support arbitrary thickness */
+ /* #### This will be fixed to support arbitrary thichkness */
InflateRect (&rect, abs_shadow, abs_shadow);
DrawEdge (FRAME_MSWINDOWS_DC (f), &rect,
shadow > 0 ? EDGE_RAISED : EDGE_SUNKEN, BF_RECT);
given face.
****************************************************************************/
static void
-mswindows_clear_region (Lisp_Object locale, struct device* d, struct frame* f,
- face_index findex, int x, int y,
- int width, int height, Lisp_Object fcolor, Lisp_Object bcolor,
- Lisp_Object background_pixmap)
+mswindows_clear_region (Lisp_Object locale, face_index findex, int x, int y,
+ int width, int height)
{
+ struct window *w;
+ struct frame *f;
+ Lisp_Object background_pixmap = Qunbound;
+ Lisp_Object temp;
RECT rect = { x, y, x+width, y+height };
- if (!NILP (background_pixmap))
+ if (!(width && height)) /* We often seem to get called with width==0 */
+ return;
+
+ if (WINDOWP (locale))
+ {
+ w = XWINDOW (locale);
+ f = XFRAME (w->frame);
+ }
+ else if (FRAMEP (locale))
+ {
+ w = NULL;
+ f = XFRAME (locale);
+ }
+ else
+ abort ();
+
+ if (w)
+ {
+ temp = WINDOW_FACE_CACHEL_BACKGROUND_PIXMAP (w, findex);
+
+ if (IMAGE_INSTANCEP (temp)
+ && IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (temp)))
+ {
+ /* #### maybe we could implement such that a string
+ can be a background pixmap? */
+ background_pixmap = temp;
+ }
+ }
+ else
+ {
+ temp = FACE_BACKGROUND_PIXMAP (Vdefault_face, locale);
+
+ if (IMAGE_INSTANCEP (temp)
+ && IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (temp)))
+ {
+ background_pixmap = temp;
+ }
+ }
+
+ if (!UNBOUNDP (background_pixmap))
{
+ Lisp_Object fcolor, bcolor;
+
+ if (w)
+ {
+ fcolor = WINDOW_FACE_CACHEL_FOREGROUND (w, findex);
+ bcolor = WINDOW_FACE_CACHEL_BACKGROUND (w, findex);
+ }
+ else
+ {
+ fcolor = FACE_FOREGROUND (Vdefault_face, locale);
+ bcolor = FACE_BACKGROUND (Vdefault_face, locale);
+ }
+
mswindows_update_dc (FRAME_MSWINDOWS_DC (f),
Qnil, fcolor, bcolor, background_pixmap);
}
else
{
- mswindows_update_dc (FRAME_MSWINDOWS_DC (f), Qnil, Qnil, fcolor, Qnil);
- ExtTextOut (FRAME_MSWINDOWS_DC (f), 0, 0, ETO_OPAQUE,
- &rect, NULL, 0, NULL);
+ Lisp_Object color = (w ? WINDOW_FACE_CACHEL_BACKGROUND (w, findex) :
+ FACE_BACKGROUND (Vdefault_face, locale));
+ mswindows_update_dc (FRAME_MSWINDOWS_DC (f), Qnil, Qnil, color, Qnil);
+ ExtTextOut (FRAME_MSWINDOWS_DC (f), 0, 0, ETO_OPAQUE, &rect, NULL, 0, NULL);
}
#ifdef HAVE_SCROLLBARS
if (WINDOWP (locale))
- mswindows_redisplay_deadbox_maybe (XWINDOW (locale), &rect);
+ mswindows_redisplay_deadbox_maybe (w, &rect);
#endif
}
XSETWINDOW (window, w);
if (window_is_leftmost (w))
- redisplay_clear_region (window, DEFAULT_INDEX, FRAME_LEFT_BORDER_START (f),
+ mswindows_clear_region (window, DEFAULT_INDEX, FRAME_LEFT_BORDER_START (f),
ypos1, FRAME_BORDER_WIDTH (f), height);
if (bounds.left_in - bounds.left_out > 0)
- redisplay_clear_region (window,
+ mswindows_clear_region (window,
get_builtin_face_cache_index (w, Vleft_margin_face),
bounds.left_out, ypos1,
bounds.left_in - bounds.left_out, height);
if (bounds.right_in - bounds.left_in > 0)
- redisplay_clear_region (window, DEFAULT_INDEX, bounds.left_in, ypos1,
+ mswindows_clear_region (window, DEFAULT_INDEX, bounds.left_in, ypos1,
bounds.right_in - bounds.left_in, height);
if (bounds.right_out - bounds.right_in > 0)
- redisplay_clear_region (window,
+ mswindows_clear_region (window,
get_builtin_face_cache_index (w, Vright_margin_face),
bounds.right_in, ypos1,
bounds.right_out - bounds.right_in, height);
if (window_is_rightmost (w))
- redisplay_clear_region (window, DEFAULT_INDEX, FRAME_RIGHT_BORDER_START (f),
+ mswindows_clear_region (window, DEFAULT_INDEX, FRAME_RIGHT_BORDER_START (f),
ypos1, FRAME_BORDER_WIDTH (f), height);
}
#include <config.h>
#include "lisp.h"
+#include "debug.h"
#include "buffer.h"
#include "window.h"
#include "redisplay.h"
#include "faces.h"
+#include "sysdep.h"
+
static int compare_runes (struct window *w, struct rune *crb,
struct rune *drb);
static void redraw_cursor_in_window (struct window *w,
int run_end_begin_glyphs);
-static void redisplay_output_display_block (struct window *w, struct display_line *dl,
- int block, int start, int end, int start_pixpos,
- int cursor_start, int cursor_width,
- int cursor_height);
/*****************************************************************************
sync_rune_structs
int cursor_height)
{
struct frame *f = XFRAME (w->frame);
+ struct device *d = XDEVICE (f->device);
+
struct display_block *cdb, *ddb;
int start_pos;
int stop_pos;
stop_pos = elt + 1;
}
- redisplay_output_display_block (w, ddl, d_block, start_pos,
- stop_pos, start_pixpos,
- cursor_start, cursor_width,
- cursor_height);
+ DEVMETH (d, output_display_block, (w, ddl, d_block, start_pos,
+ stop_pos, start_pixpos,
+ cursor_start, cursor_width,
+ cursor_height));
return 1;
}
clear_left_border (struct window *w, int y, int height)
{
struct frame *f = XFRAME (w->frame);
+ struct device *d = XDEVICE (f->device);
Lisp_Object window;
XSETWINDOW (window, w);
- redisplay_clear_region (window, DEFAULT_INDEX,
- FRAME_LEFT_BORDER_START (f), y,
- FRAME_BORDER_WIDTH (f), height);
+ DEVMETH (d, clear_region, (window, DEFAULT_INDEX,
+ FRAME_LEFT_BORDER_START (f), y,
+ FRAME_BORDER_WIDTH (f), height));
}
/*****************************************************************************
clear_right_border (struct window *w, int y, int height)
{
struct frame *f = XFRAME (w->frame);
+ struct device *d = XDEVICE (f->device);
Lisp_Object window;
XSETWINDOW (window, w);
- redisplay_clear_region (window, DEFAULT_INDEX,
- FRAME_RIGHT_BORDER_START (f),
- y, FRAME_BORDER_WIDTH (f), height);
+ DEVMETH (d, clear_region, (window, DEFAULT_INDEX,
+ FRAME_RIGHT_BORDER_START (f),
+ y, FRAME_BORDER_WIDTH (f), height));
}
/*****************************************************************************
{
struct frame *f = XFRAME (w->frame);
+ struct device *d = XDEVICE (f->device);
struct buffer *b = XBUFFER (w->buffer);
struct buffer *old_b = window_display_buffer (w);
struct display_line *cdl, *ddl;
a TEXT block. */
if (ddl->modeline)
{
- /* The shadow thickness check is necessary if only the sign of
+ /* The shadow thickness check is necesssary if only the sign of
the size changed. */
if (cdba && !w->shadow_thickness_changed)
{
}
else
{
- redisplay_output_display_block (w, ddl, 0, 0, -1, start_pixpos,
- 0, 0, 0);
+ DEVMETH (d, output_display_block, (w, ddl, 0, 0, -1, start_pixpos,
+ 0, 0, 0));
must_sync = 1;
}
XSETWINDOW (window, w);
/* Clear the empty area. */
- redisplay_clear_region (window, get_builtin_face_cache_index (w, face),
- x, y, width, height);
+ DEVMETH (d, clear_region,
+ (window, get_builtin_face_cache_index (w,
+ face),
+ x, y, width, height));
/* Mark that we should clear the border. This is
necessary because italic fonts may leave
}
must_sync = 1;
- redisplay_output_display_block (w, ddl, block, first_elt,
- last_elt,
- start_pixpos,
- cursor_start, cursor_width,
- cursor_height);
+ DEVMETH (d, output_display_block, (w, ddl, block, first_elt,
+ last_elt,
+ start_pixpos,
+ cursor_start, cursor_width,
+ cursor_height));
}
-
+
start_pixpos = next_start_pixpos;
}
}
redraw_cursor_in_window (XWINDOW (window), run_end_begin_meths);
}
-/****************************************************************************
- redisplay_output_display_block
-
- Given a display line, a block number for that start line, output all
- runes between start and end in the specified display block.
- ****************************************************************************/
-static void
-redisplay_output_display_block (struct window *w, struct display_line *dl, int block,
- int start, int end, int start_pixpos, int cursor_start,
- int cursor_width, int cursor_height)
-{
- struct frame *f = XFRAME (w->frame);
- struct device *d = XDEVICE (f->device);
-
- DEVMETH (d, output_display_block, (w, dl, block, start,
- end, start_pixpos,
- cursor_start, cursor_width,
- cursor_height));
-}
-
-/****************************************************************************
- redisplay_unmap_subwindows
-
- Remove subwindows from the area in the box defined by the given
- parameters.
- ****************************************************************************/
-static void redisplay_unmap_subwindows (struct frame* f, int x, int y, int width, int height)
-{
- int elt;
-
- for (elt = 0; elt < Dynarr_length (f->subwindow_cachels); elt++)
- {
- struct subwindow_cachel *cachel =
- Dynarr_atp (f->subwindow_cachels, elt);
-
- if (cachel->being_displayed
- &&
- cachel->x + cachel->width > x && cachel->x < x + width
- &&
- cachel->y + cachel->height > y && cachel->y < y + height)
- {
- unmap_subwindow (cachel->subwindow);
- }
- }
-}
-
-/****************************************************************************
- redisplay_unmap_subwindows_maybe
-
- Potentially subwindows from the area in the box defined by the given
- parameters.
- ****************************************************************************/
-void redisplay_unmap_subwindows_maybe (struct frame* f, int x, int y, int width, int height)
-{
- if (Dynarr_length (FRAME_SUBWINDOW_CACHE (f)))
- {
- redisplay_unmap_subwindows (f, x, y, width, height);
- }
-}
-
-/****************************************************************************
- redisplay_output_subwindow
-
-
- output a subwindow. This code borrows heavily from the pixmap stuff,
- although is much simpler not needing to account for partial
- pixmaps, backgrounds etc.
- ****************************************************************************/
-void
-redisplay_output_subwindow (struct window *w, struct display_line *dl,
- Lisp_Object image_instance, int xpos, int xoffset,
- int start_pixpos, int width, face_index findex,
- int cursor_start, int cursor_width, int cursor_height)
-{
- struct Lisp_Image_Instance *p = XIMAGE_INSTANCE (image_instance);
- Lisp_Object window;
-
- int lheight = dl->ascent + dl->descent - dl->clip;
- int pheight = ((int) IMAGE_INSTANCE_SUBWINDOW_HEIGHT (p) > lheight ? lheight :
- IMAGE_INSTANCE_SUBWINDOW_HEIGHT (p));
-
- XSETWINDOW (window, w);
-
- /* Clear the area the subwindow is going into. The subwindow itself
- will always take care of the full width. We don't want to clear
- where it is going to go in order to avoid flicker. So, all we
- have to take care of is any area above or below the subwindow. Of
- course this is rubbish if the subwindow has transparent areas
- (for instance with frames). */
- /* #### We take a shortcut for now. We know that since we have
- subwindow_offset hardwired to 0 that the subwindow is against the top
- edge so all we have to worry about is below it. */
- if ((int) (dl->ypos - dl->ascent + pheight) <
- (int) (dl->ypos + dl->descent - dl->clip))
- {
- int clear_x, clear_width;
-
- int clear_y = dl->ypos - dl->ascent + pheight;
- int clear_height = lheight - pheight;
-
- if (start_pixpos >= 0 && start_pixpos > xpos)
- {
- clear_x = start_pixpos;
- clear_width = xpos + width - start_pixpos;
- }
- else
- {
- clear_x = xpos;
- clear_width = width;
- }
-
- redisplay_clear_region (window, findex, clear_x, clear_y,
- clear_width, clear_height);
- }
-#if 0
- redisplay_clear_region (window, findex, xpos - xoffset, dl->ypos - dl->ascent,
- width, lheight);
-#endif
- /* if we can't view the whole window we can't view any of it */
- if (IMAGE_INSTANCE_SUBWINDOW_HEIGHT (p) > lheight
- ||
- IMAGE_INSTANCE_SUBWINDOW_WIDTH (p) > width)
- {
- redisplay_clear_region (window, findex, xpos - xoffset, dl->ypos - dl->ascent,
- width, lheight);
- unmap_subwindow (image_instance);
- }
- else
- map_subwindow (image_instance, xpos - xoffset, dl->ypos - dl->ascent);
-}
-
-/****************************************************************************
- redisplay_clear_region
-
- Clear the area in the box defined by the given parameters using the
- given face. This has been generalised so that subwindows can be
- coped with effectively.
- ****************************************************************************/
-void
-redisplay_clear_region (Lisp_Object locale, face_index findex, int x, int y,
- int width, int height)
-{
- struct window *w = NULL;
- struct frame *f = NULL;
- struct device *d;
- Lisp_Object background_pixmap = Qunbound;
- Lisp_Object fcolor = Qnil, bcolor = Qnil;
-
- if (!width || !height)
- return;
-
- if (WINDOWP (locale))
- {
- w = XWINDOW (locale);
- f = XFRAME (w->frame);
- }
- else if (FRAMEP (locale))
- {
- w = NULL;
- f = XFRAME (locale);
- }
- else
- abort ();
-
- d = XDEVICE (f->device);
-
- /* if we have subwindows in the region we have to unmap them */
- if (Dynarr_length (FRAME_SUBWINDOW_CACHE (f)))
- {
- redisplay_unmap_subwindows (f, x, y, width, height);
- }
-
- /* #### This isn't quite right for when this function is called
- from the toolbar code. */
-
- /* Don't use a backing pixmap in the border area */
- if (x >= FRAME_LEFT_BORDER_END (f)
- && x < FRAME_RIGHT_BORDER_START (f)
- && y >= FRAME_TOP_BORDER_END (f)
- && y < FRAME_BOTTOM_BORDER_START (f))
- {
- Lisp_Object temp;
-
- if (w)
- {
- temp = WINDOW_FACE_CACHEL_BACKGROUND_PIXMAP (w, findex);
-
- if (IMAGE_INSTANCEP (temp)
- && IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (temp)))
- {
- /* #### maybe we could implement such that a string
- can be a background pixmap? */
- background_pixmap = temp;
- }
- }
- else
- {
- temp = FACE_BACKGROUND_PIXMAP (Vdefault_face, locale);
-
- if (IMAGE_INSTANCEP (temp)
- && IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (temp)))
- {
- background_pixmap = temp;
- }
- }
- }
-
- if (!UNBOUNDP (background_pixmap) &&
- XIMAGE_INSTANCE_PIXMAP_DEPTH (background_pixmap) == 0)
- {
- if (w)
- {
- fcolor = WINDOW_FACE_CACHEL_FOREGROUND (w, findex);
- bcolor = WINDOW_FACE_CACHEL_BACKGROUND (w, findex);
- }
- else
- {
- fcolor = FACE_FOREGROUND (Vdefault_face, locale);
- bcolor = FACE_BACKGROUND (Vdefault_face, locale);
- }
- }
- else
- {
- fcolor = (w ?
- WINDOW_FACE_CACHEL_BACKGROUND (w, findex) :
- FACE_BACKGROUND (Vdefault_face, locale));
-
- }
-
- if (UNBOUNDP (background_pixmap))
- background_pixmap = Qnil;
-
- DEVMETH (d, clear_region,
- (locale, d, f, findex, x, y, width, height, fcolor, bcolor, background_pixmap));
-}
-
/*****************************************************************************
redisplay_clear_top_of_window
if (!NILP (Fwindow_highest_p (window)))
{
struct frame *f = XFRAME (w->frame);
+ struct device *d = XDEVICE (f->device);
int x, y, width, height;
x = w->pixel_left;
y = FRAME_TOP_BORDER_START (f) - 1;
height = FRAME_BORDER_HEIGHT (f) + 1;
- redisplay_clear_region (window, DEFAULT_INDEX, x, y, width, height);
+ DEVMETH (d, clear_region, (window, DEFAULT_INDEX, x, y, width, height));
}
}
elt++;
}
}
- /* #### RUNE_HLINE is actually a little more complicated than this
+ /* #### RUNE_HLINE is actualy a little more complicated than this
but at the moment it is only used to draw a turned off
modeline and this will suffice for that. */
else if (rb->type == RUNE_BLANK || rb->type == RUNE_HLINE)
case IMAGE_MONO_PIXMAP:
case IMAGE_COLOR_PIXMAP:
case IMAGE_SUBWINDOW:
- case IMAGE_WIDGET:
/* just do nothing here */
break;
Clear the area in the box defined by the given parameters.
****************************************************************************/
static void
-tty_clear_region (Lisp_Object window, struct device* d, struct frame * f,
- face_index findex, int x, int y,
- int width, int height, Lisp_Object fcolor, Lisp_Object bcolor,
- Lisp_Object background_pixmap)
+tty_clear_region (Lisp_Object window, face_index findex, int x, int y,
+ int width, int height)
{
+ struct window *w = XWINDOW (window);
+ struct frame *f = XFRAME (w->frame);
struct console *c = XCONSOLE (FRAME_CONSOLE (f));
int line;
- struct window* w = XWINDOW (window);
+
+ if (!width || !height)
+ return;
tty_turn_on_face (w, findex);
for (line = y; line < y + height; line++)
Lisp_Object window;
XSETWINDOW (window, w);
- redisplay_clear_region (window, DEFAULT_INDEX, x, ypos1, width, ypos2 - ypos1);
+ tty_clear_region (window, DEFAULT_INDEX, x, ypos1, width, ypos2 - ypos1);
}
}
struct frame *f = XFRAME (frm);
/* Clear the bottom line of the frame. */
- redisplay_clear_region (FRAME_SELECTED_WINDOW (f), DEFAULT_INDEX, 0,
+ tty_clear_region (FRAME_SELECTED_WINDOW (f), DEFAULT_INDEX, 0,
f->height, f->width, 1);
/* And then stick the cursor there. */
int width, int height);
static void x_redraw_exposed_windows (Lisp_Object window, int x, int y,
int width, int height);
+static void x_clear_region (Lisp_Object window, face_index findex, int x,
+ int y, int width, int height);
static void x_output_eol_cursor (struct window *w, struct display_line *dl,
int xpos, face_index findex);
static void x_clear_frame (struct frame *f);
char_converter.reg[0] = XCHARSET_ID (charset);
char_converter.reg[1] = byte1;
char_converter.reg[2] = byte2;
- ccl_driver (&char_converter, 0, 0, 0, 0, CCL_MODE_ENCODING);
+ ccl_driver (&char_converter, 0, 0, 0, 0);
byte1 = char_converter.reg[1];
byte2 = char_converter.reg[2];
}
/* Clear in case a cursor was formerly here. */
int height = dl->ascent + dl->descent - dl->clip;
- redisplay_clear_region (window, findex, xpos, dl->ypos - dl->ascent,
+ x_clear_region (window, findex, xpos, dl->ypos - dl->ascent,
rb->width, height);
elt++;
}
case IMAGE_POINTER:
abort ();
- case IMAGE_WIDGET:
case IMAGE_SUBWINDOW:
- redisplay_output_subwindow (w, dl, instance, xpos,
- rb->object.dglyph.xoffset, start_pixpos,
- rb->width, findex, cursor_start,
- cursor_width, cursor_height);
+ /* #### implement me */
+ break;
case IMAGE_NOTHING:
/* nothing is as nothing does */
mask |= GCBackground;
}
- /* This special case comes from a request to draw text with a face which has
- the dim property. We'll use a stippled foreground GC. */
- if (EQ (bg_pmap, Qdim))
- {
- assert (DEVICE_X_GRAY_PIXMAP (d) != None);
-
- gcv.fill_style = FillStippled;
- gcv.stipple = DEVICE_X_GRAY_PIXMAP (d);
- mask |= (GCFillStyle | GCStipple);
- }
- else if (IMAGE_INSTANCEP (bg_pmap)
- && IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (bg_pmap)))
+ if (IMAGE_INSTANCEP (bg_pmap)
+ && IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (bg_pmap)))
{
if (XIMAGE_INSTANCE_PIXMAP_DEPTH (bg_pmap) == 0)
{
if (ypos1_line < ypos1_string)
{
- redisplay_clear_region (window, findex, clear_start, ypos1_line,
+ x_clear_region (window, findex, clear_start, ypos1_line,
clear_end - clear_start,
ypos1_string - ypos1_line);
}
if (ypos2_line > ypos2_string)
{
- redisplay_clear_region (window, findex, clear_start, ypos2_string,
+ x_clear_region (window, findex, clear_start, ypos2_string,
clear_end - clear_start,
ypos2_line - ypos2_string);
}
}
else
{
- redisplay_clear_region (window, findex, clear_start,
+ x_clear_region (window, findex, clear_start,
dl->ypos - dl->ascent, clear_end - clear_start,
height);
}
if (cursor && cursor_cachel && focus && NILP (bar_cursor_value))
gc = x_get_gc (d, font, cursor_cachel->foreground,
cursor_cachel->background, Qnil, Qnil);
- else if (cachel->dim)
- {
- /* Ensure the gray bitmap exists */
- if (DEVICE_X_GRAY_PIXMAP (d) == None)
- DEVICE_X_GRAY_PIXMAP (d) =
- XCreateBitmapFromData (dpy, x_win, (char *)gray_bits,
- gray_width, gray_height);
-
- /* Request a GC with the gray stipple pixmap to draw dimmed text */
- gc = x_get_gc (d, font, cachel->foreground, cachel->background,
- Qdim, Qnil);
- }
else
gc = x_get_gc (d, font, cachel->foreground, cachel->background,
Qnil, Qnil);
clear_width = width;
}
- redisplay_clear_region (window, findex, clear_x, clear_y,
+ x_clear_region (window, findex, clear_x, clear_y,
clear_width, clear_height);
}
unsigned long mask;
int x, y1, y2, width, shadow_thickness, spacing, line_width;
face_index div_face = get_builtin_face_cache_index (w, Vvertical_divider_face);
-
+
width = window_divider_width (w);
shadow_thickness = XINT (w->vertical_divider_shadow_thickness);
spacing = XINT (w->vertical_divider_spacing);
x = WINDOW_RIGHT (w) - width;
y1 = WINDOW_TOP (w);
y2 = WINDOW_BOTTOM (w);
-
+
memset (&gcv, ~0, sizeof (XGCValues));
-
+
tmp_pixel = WINDOW_FACE_CACHEL_BACKGROUND (w, div_face);
tmp_color = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (tmp_pixel));
-
+
/* First, get the GC's. */
top_shadow_pixel = tmp_color.pixel;
bottom_shadow_pixel = tmp_color.pixel;
background_pixel = tmp_color.pixel;
-
+
x_generate_shadow_pixels (f, &top_shadow_pixel, &bottom_shadow_pixel,
background_pixel, ef->core.background_pixel);
-
+
tmp_pixel = WINDOW_FACE_CACHEL_FOREGROUND (w, div_face);
tmp_color = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (tmp_pixel));
gcv.background = tmp_color.pixel;
mask = GCForeground | GCBackground | GCGraphicsExposures;
/* If we can't distinguish one of the shadows (the color is the same as the
- background), it's better to use a pixmap to generate a dithered gray. */
+ background), it's better to use a pixmap to generate a dithrered gray. */
if (top_shadow_pixel == background_pixel ||
bottom_shadow_pixel == background_pixel)
use_pixmap = 1;
-
+
if (use_pixmap)
{
if (DEVICE_X_GRAY_PIXMAP (d) == None)
XCreatePixmapFromBitmapData (dpy, x_win, (char *) gray_bits,
gray_width, gray_height, 1, 0, 1);
}
-
+
tmp_pixel = WINDOW_FACE_CACHEL_BACKGROUND (w, div_face);
tmp_color = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (tmp_pixel));
gcv.foreground = tmp_color.pixel;
gcv.stipple = DEVICE_X_GRAY_PIXMAP (d);
top_shadow_gc = gc_cache_lookup (DEVICE_X_GC_CACHE (d), &gcv,
(mask | GCStipple | GCFillStyle));
-
+
tmp_pixel = WINDOW_FACE_CACHEL_FOREGROUND (w, div_face);
tmp_color = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (tmp_pixel));
bottom_shadow_pixel = tmp_color.pixel;
-
+
flip_gcs = (bottom_shadow_pixel ==
WhitePixelOfScreen (DefaultScreenOfDisplay (dpy)));
}
gcv.foreground = top_shadow_pixel;
top_shadow_gc = gc_cache_lookup (DEVICE_X_GC_CACHE (d), &gcv, mask);
}
-
+
gcv.foreground = bottom_shadow_pixel;
bottom_shadow_gc = gc_cache_lookup (DEVICE_X_GC_CACHE (d), &gcv, mask);
-
+
if (use_pixmap && flip_gcs)
{
GC tmp_gc = bottom_shadow_gc;
bottom_shadow_gc = top_shadow_gc;
top_shadow_gc = tmp_gc;
}
-
+
gcv.foreground = background_pixel;
background_gc = gc_cache_lookup (DEVICE_X_GC_CACHE (d), &gcv, mask);
-
+
/* possibly revert the GC's in case the shadow thickness is < 0.
This will give a depressed look to the divider */
if (shadow_thickness < 0)
temp = top_shadow_gc;
top_shadow_gc = bottom_shadow_gc;
bottom_shadow_gc = temp;
-
- /* better avoid a Bad Address XLib error ;-) */
+
+ /* better avoid a Bad Adress XLib error ;-) */
shadow_thickness = - shadow_thickness;
}
XClearArea (dpy, x_win, x, y1, width, y2 - y1, False);
/* Draw the divider line. */
- XFillRectangle (dpy, x_win, background_gc,
+ XFillRectangle (dpy, x_win, background_gc,
x + spacing + shadow_thickness, y1,
line_width, y2 - y1);
-
+
/* Draw the shadows around the divider line */
- x_output_shadows (f, x + spacing, y1,
+ x_output_shadows (f, x + spacing, y1,
width - 2 * spacing, y2 - y1,
top_shadow_gc, bottom_shadow_gc,
background_gc, shadow_thickness);
x_output_shadows
Draw a shadow around the given area using the given GC's. It is the
- callers responsibility to set the GC's appropriately.
+ callers responsibility to ste the GC's appropriately.
****************************************************************************/
void
x_output_shadows (struct frame *f, int x, int y, int width, int height,
XSETWINDOW (window, w);
if (window_is_leftmost (w))
- redisplay_clear_region (window, DEFAULT_INDEX, FRAME_LEFT_BORDER_START (f),
+ x_clear_region (window, DEFAULT_INDEX, FRAME_LEFT_BORDER_START (f),
ypos1, FRAME_BORDER_WIDTH (f), height);
if (bounds.left_in - bounds.left_out > 0)
- redisplay_clear_region (window,
+ x_clear_region (window,
get_builtin_face_cache_index (w, Vleft_margin_face),
bounds.left_out, ypos1,
bounds.left_in - bounds.left_out, height);
if (bounds.right_in - bounds.left_in > 0)
- redisplay_clear_region (window, DEFAULT_INDEX, bounds.left_in, ypos1,
+ x_clear_region (window, DEFAULT_INDEX, bounds.left_in, ypos1,
bounds.right_in - bounds.left_in, height);
if (bounds.right_out - bounds.right_in > 0)
- redisplay_clear_region (window,
+ x_clear_region (window,
get_builtin_face_cache_index (w, Vright_margin_face),
bounds.right_in, ypos1,
bounds.right_out - bounds.right_in, height);
if (window_is_rightmost (w))
- redisplay_clear_region (window, DEFAULT_INDEX, FRAME_RIGHT_BORDER_START (f),
+ x_clear_region (window, DEFAULT_INDEX, FRAME_RIGHT_BORDER_START (f),
ypos1, FRAME_BORDER_WIDTH (f), height);
}
}
given face.
****************************************************************************/
static void
-x_clear_region (Lisp_Object locale, struct device* d, struct frame* f, face_index findex,
- int x, int y,
- int width, int height, Lisp_Object fcolor, Lisp_Object bcolor,
- Lisp_Object background_pixmap)
+x_clear_region (Lisp_Object locale, face_index findex, int x, int y,
+ int width, int height)
{
+ struct window *w = NULL;
+ struct frame *f = NULL;
+ struct device *d;
+ Lisp_Object background_pixmap;
+
Display *dpy;
Window x_win;
- GC gc = NULL;
+ if (WINDOWP (locale))
+ {
+ w = XWINDOW (locale);
+ f = XFRAME (w->frame);
+ }
+ else if (FRAMEP (locale))
+ {
+ w = NULL;
+ f = XFRAME (locale);
+ }
+ else
+ abort ();
+
+ d = XDEVICE (f->device);
dpy = DEVICE_X_DISPLAY (d);
x_win = XtWindow (FRAME_X_TEXT_WIDGET (f));
- if (!UNBOUNDP (background_pixmap))
+ /* #### This function is going to have to be made cursor aware. */
+ if (width && height)
{
- gc = x_get_gc (d, Qnil, fcolor, bcolor, background_pixmap, Qnil);
- }
+ GC gc = NULL;
- if (gc)
- XFillRectangle (dpy, x_win, gc, x, y, width, height);
- else
- XClearArea (dpy, x_win, x, y, width, height, False);
+ /* #### This isn't quite right for when this function is called
+ from the toolbar code. */
+ background_pixmap = Qunbound;
+
+ /* Don't use a backing pixmap in the border area */
+ if (x >= FRAME_LEFT_BORDER_END (f)
+ && x < FRAME_RIGHT_BORDER_START (f)
+ && y >= FRAME_TOP_BORDER_END (f)
+ && y < FRAME_BOTTOM_BORDER_START (f))
+ {
+ Lisp_Object temp;
+
+ if (w)
+ {
+ temp = WINDOW_FACE_CACHEL_BACKGROUND_PIXMAP (w, findex);
+
+ if (IMAGE_INSTANCEP (temp)
+ && IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (temp)))
+ {
+ /* #### maybe we could implement such that a string
+ can be a background pixmap? */
+ background_pixmap = temp;
+ }
+ }
+ else
+ {
+ temp = FACE_BACKGROUND_PIXMAP (Vdefault_face, locale);
+
+ if (IMAGE_INSTANCEP (temp)
+ && IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (temp)))
+ {
+ background_pixmap = temp;
+ }
+ }
+
+ if (!UNBOUNDP (background_pixmap) &&
+ XIMAGE_INSTANCE_PIXMAP_DEPTH (background_pixmap) == 0)
+ {
+ Lisp_Object fcolor, bcolor;
+
+ if (w)
+ {
+ fcolor = WINDOW_FACE_CACHEL_FOREGROUND (w, findex);
+ bcolor = WINDOW_FACE_CACHEL_BACKGROUND (w, findex);
+ }
+ else
+ {
+ fcolor = FACE_FOREGROUND (Vdefault_face, locale);
+ bcolor = FACE_BACKGROUND (Vdefault_face, locale);
+ }
+
+ gc = x_get_gc (d, Qnil, fcolor, bcolor, background_pixmap, Qnil);
+ }
+ else
+ {
+ Lisp_Object color = (w ?
+ WINDOW_FACE_CACHEL_BACKGROUND (w, findex) :
+ FACE_BACKGROUND (Vdefault_face, locale));
+
+ if (UNBOUNDP (background_pixmap))
+ background_pixmap = Qnil;
+
+ gc = x_get_gc (d, Qnil, color, Qnil, background_pixmap, Qnil);
+ }
+ }
+
+ if (gc)
+ XFillRectangle (dpy, x_win, gc, x, y, width, height);
+ else
+ XClearArea (dpy, x_win, x, y, width, height, False);
+ }
}
/*****************************************************************************
int defheight, defascent;
XSETWINDOW (window, w);
- redisplay_clear_region (window, findex, x, y, width, height);
+ x_clear_region (window, findex, x, y, width, height);
if (NILP (w->text_cursor_visible_p))
return;
#include "commands.h"
#include "debug.h"
#include "device.h"
-#include "elhash.h"
#include "extents.h"
#include "faces.h"
#include "frame.h"
struct glyph_cachel *cachel);
static Bytind create_text_block (struct window *w, struct display_line *dl,
Bytind bi_start_pos, int start_col,
- prop_block_dynarr **prop,
- int type);
+ prop_block_dynarr **prop, int type);
static int create_overlay_glyph_block (struct window *w,
struct display_line *dl);
static void create_left_glyph_block (struct window *w,
int glyphs_changed;
int glyphs_changed_set;
-/* non-zero if any displayed subwindow is in need of updating
- somewhere. */
-int subwindows_changed;
-int subwindows_changed_set;
-
/* This variable is 1 if the icon has to be updated.
It is set to 1 when `frame-icon-glyph' changes. */
int icon_changed;
static Bufpos
generate_display_line (struct window *w, struct display_line *dl, int bounds,
Bufpos start_pos, int start_col,
- prop_block_dynarr **prop,
- int type)
+ prop_block_dynarr **prop, int type)
{
Bufpos ret_bufpos;
int overlay_width;
}
}
+/* Given a display table entry, call the appropriate functions to
+ display each element of the entry. */
+
static prop_block_dynarr *
-add_disp_table_entry_runes_1 (pos_data *data, Lisp_Object entry)
+add_disp_table_entry_runes (pos_data *data, Lisp_Object entry)
{
prop_block_dynarr *prop = NULL;
- if (STRINGP (entry))
+ if (VECTORP (entry))
+ {
+ struct Lisp_Vector *de = XVECTOR (entry);
+ long len = vector_length (de);
+ int elt;
+
+ for (elt = 0; elt < len; elt++)
+ {
+ if (NILP (de->contents[elt]))
+ continue;
+ else if (STRINGP (de->contents[elt]))
+ {
+ prop =
+ add_bufbyte_string_runes
+ (data,
+ XSTRING_DATA (de->contents[elt]),
+ XSTRING_LENGTH (de->contents[elt]),
+ 0);
+ }
+ else if (GLYPHP (de->contents[elt]))
+ {
+ if (data->start_col)
+ data->start_col--;
+
+ if (!data->start_col && data->bi_start_col_enabled)
+ {
+ prop = add_hscroll_rune (data);
+ }
+ else
+ {
+ struct glyph_block gb;
+
+ gb.glyph = de->contents[elt];
+ gb.extent = Qnil;
+ prop = add_glyph_rune (data, &gb, BEGIN_GLYPHS, 0, 0);
+ }
+ }
+ else if (CHAR_OR_CHAR_INTP (de->contents[elt]))
+ {
+ data->ch = XCHAR_OR_CHAR_INT (de->contents[elt]);
+ prop = add_emchar_rune (data);
+ }
+ /* Else blow it off because someone added a bad entry and we
+ don't have any safe way of signaling an error. */
+
+ /* #### Still need to add any remaining elements to the
+ propagation information. */
+ if (prop)
+ return prop;
+ }
+ }
+ else if (STRINGP (entry))
{
prop = add_bufbyte_string_runes (data,
XSTRING_DATA (entry),
data->ch = XCHAR_OR_CHAR_INT (entry);
prop = add_emchar_rune (data);
}
- else if (CONSP (entry))
- {
- if (EQ (XCAR (entry), Qformat)
- && CONSP (XCDR (entry))
- && STRINGP (XCAR (XCDR (entry))))
- {
- Lisp_Object format = XCAR (XCDR (entry));
- Bytind len = XSTRING_LENGTH (format);
- Bufbyte *src = XSTRING_DATA (format), *end = src + len;
- Bufbyte *result = alloca_array (Bufbyte, len);
- Bufbyte *dst = result;
-
- while (src < end)
- {
- Emchar c = charptr_emchar (src);
- INC_CHARPTR (src);
- if (c != '%' || src == end)
- dst += set_charptr_emchar (dst, c);
- else
- {
- c = charptr_emchar (src);
- INC_CHARPTR (src);
- switch (c)
- {
- /*case 'x':
- dst += long_to_string_base ((char *)dst, data->ch, 16);
- break;*/
- case '%':
- dst += set_charptr_emchar (dst, '%');
- break;
- }
- }
- }
- prop = add_bufbyte_string_runes (data, result, dst - result, 0);
- }
- }
/* Else blow it off because someone added a bad entry and we don't
- have any safe way of signaling an error. */
- return prop;
-}
-
-/* Given a display table entry, call the appropriate functions to
- display each element of the entry. */
-
-static prop_block_dynarr *
-add_disp_table_entry_runes (pos_data *data, Lisp_Object entry)
-{
- prop_block_dynarr *prop = NULL;
- if (VECTORP (entry))
- {
- struct Lisp_Vector *de = XVECTOR (entry);
- EMACS_INT len = vector_length (de);
- int elt;
-
- for (elt = 0; elt < len; elt++)
- {
- if (NILP (vector_data (de)[elt]))
- continue;
- else
- prop = add_disp_table_entry_runes_1 (data, vector_data (de)[elt]);
- /* Else blow it off because someone added a bad entry and we
- don't have any safe way of signaling an error. Hey, this
- comment sounds familiar. */
-
- /* #### Still need to add any remaining elements to the
- propagation information. */
- if (prop)
- return prop;
- }
- }
- else
- prop = add_disp_table_entry_runes_1 (data, entry);
+ have any safe way of signaling an error. Hey, this comment
+ sounds familiar. */
return prop;
}
static Bytind
create_text_block (struct window *w, struct display_line *dl,
Bytind bi_start_pos, int start_col,
- prop_block_dynarr **prop,
- int type)
+ prop_block_dynarr **prop, int type)
{
struct frame *f = XFRAME (w->frame);
struct buffer *b = XBUFFER (w->buffer);
struct device *d = XDEVICE (f->device);
pos_data data;
+ struct Lisp_Vector *dt = 0;
/* Don't display anything in the minibuffer if this window is not on
a selected frame. We consider all other windows to be active
into a more general conversion mechanism. Ideally you
could specify a Lisp function that converts characters,
but this violates the Second Golden Rule and besides would
- make things way way way way slow.
-
- So instead, we extend the display-table concept, which was
- historically limited to 256-byte vectors, to one of the
- following:
-
- a) A 256-entry vector, for backward compatibility;
- b) char-table, mapping characters to values;
- c) range-table, mapping ranges of characters to values;
- d) a list of the above.
-
- The (d) option allows you to specify multiple display tables
- instead of just one. Each display table can specify conversions
- for some characters and leave others unchanged. The way the
- character gets displayed is determined by the first display table
- with a binding for that character. This way, you could call a
- function `enable-hex-display' that adds a hex display-table to
- the list of display tables for the current buffer.
-
- #### ...not yet implemented... Also, we extend the concept of
- "mapping" to include a printf-like spec. Thus you can make all
- extended characters show up as hex with a display table like
- this:
-
- #s(range-table data ((256 524288) (format "%x")))
+ make things way way way way slow. An idea I like is to
+ be able to specify multiple display tables instead of just
+ one. Each display table can specify conversions for some
+ characters and leave others unchanged. The way the
+ character gets displayed is determined by the first display
+ table with a binding for that character. This way, you
+ could call a function `enable-hex-display' that adds a
+ pre-defined hex display-table (or maybe computes one if
+ you give weird parameters to the function) and adds it
+ to the list of display tables for the current buffer.
+
+ Unfortunately there are still problems dealing with Mule
+ characters. For example, maybe I want to specify that
+ all extended characters (i.e. >= 256) are displayed in hex.
+ It's not reasonable to create a mapping for all possible
+ such characters, because there are about 2^19 of them.
+ One way of dealing with this is to extend the concept
+ of what a display table is. Currently it's only allowed
+ to be a 256-entry vector. Instead, it should be something
+ like:
+
+ a) A 256-entry vector, for backward compatibility
+ b) Some sort of hashtable, mapping characters to values
+ c) A list that specifies a range of values and the
+ mapping to provide for those values.
+
+ Also, extend the concept of "mapping" to include a
+ printf-like spec. Then, you could make all extended
+ characters show up as hex with a display table like
+
+ ((256 . 524288) . "%x")
Since more than one display table is possible, you have
- great flexibility in mapping ranges of characters. */
+ great flexibility in mapping ranges of characters.
+ */
Emchar printable_min = (CHAR_OR_CHAR_INTP (b->ctl_arrow)
? XCHAR_OR_CHAR_INT (b->ctl_arrow)
: ((EQ (b->ctl_arrow, Qt) || EQ (b->ctl_arrow, Qnil))
? 255 : 160));
- Lisp_Object face_dt, window_dt;
-
/* The text display block for this display line. */
struct display_block *db = get_display_block_from_line (dl, TEXT);
/* Remember that the extent-fragment routines deal in Bytind's. */
extent_fragment_update (w, data.ef, data.bi_bufpos);
- get_display_tables (w, data.findex, &face_dt, &window_dt);
-
if (data.bi_bufpos == data.ef->end)
no_more_frags = 1;
+
+ dt = get_display_table (w, data.findex);
}
initial = 0;
else
{
- Lisp_Object entry = Qnil;
/* Get the character at the current buffer position. */
data.ch = BI_BUF_FETCH_CHAR (b, data.bi_bufpos);
- if (!NILP (face_dt) || !NILP (window_dt))
- entry = display_table_entry (data.ch, face_dt, window_dt);
/* If there is a display table entry for it, hand it off to
add_disp_table_entry_runes and let it worry about it. */
- if (!NILP (entry) && !EQ (entry, make_char (data.ch)))
+ if (dt && !NILP (DISP_CHAR_ENTRY (dt, data.ch)))
{
- *prop = add_disp_table_entry_runes (&data, entry);
+ *prop =
+ add_disp_table_entry_runes (&data,
+ DISP_CHAR_ENTRY (dt, data.ch));
if (*prop)
goto done;
{
/* If data.start_col_enabled is still true, then the window is
scrolled far enough so that nothing on this line is visible.
- We need to stick a truncation glyph at the beginning of the
+ We need to stick a trunctation glyph at the beginning of the
line in that case unless the line is completely blank. */
if (data.bi_start_col_enabled)
{
they should start. The inside margin glyphs get whatever space
is left after the whitespace glyphs have been displayed. These
are tricky to calculate since if we decide to use the overflow
- area we basically have to start over. So for these we build up a
+ area we basicaly have to start over. So for these we build up a
list of just the inside margin glyphs and manipulate it to
determine the needed info. */
{
struct glyph_block *gb = Dynarr_atp (dl->left_glyphs, elt);
if (NILP (gb->extent))
- abort (); /* these should have been handled in add_glyph_rune */
+ abort (); /* these should have beeb handled in add_glyph_rune */
if (extent_begin_glyph_layout (XEXTENT (gb->extent)) ==
GL_OUTSIDE_MARGIN)
they should start. The inside margin glyphs get whatever space
is left after the whitespace glyphs have been displayed. These
are tricky to calculate since if we decide to use the overflow
- area we basically have to start over. So for these we build up a
+ area we basicaly have to start over. So for these we build up a
list of just the inside margin glyphs and manipulate it to
determine the needed info. */
{
struct glyph_block *gb = Dynarr_atp (dl->right_glyphs, elt);
if (NILP (gb->extent))
- abort (); /* these should have been handled in add_glyph_rune */
+ abort (); /* these should have beeb handled in add_glyph_rune */
if (extent_end_glyph_layout (XEXTENT (gb->extent)) == GL_OUTSIDE_MARGIN)
{
MODELINE_INDEX, min_pixpos, max_pixpos, type);
/* The modeline is at the bottom of the gutters. We have to wait to
- set this until we've generated the modeline in order to account
+ set this until we've generated teh modeline in order to account
for any embedded faces. */
dl->ypos = WINDOW_BOTTOM (w) - dl->descent - ypos_adj;
}
}
if (prop)
- Dynarr_free (prop);
+ Dynarr_free (prop);
/* #### More not quite right, but close enough. */
/* #### Ben sez: apparently window_end_pos[] is measured
/* If the changes are below the visible area then if point hasn't
moved return success otherwise fail in order to be safe. */
if (line > dla_end)
- return regenerate_window_extents_only_changed (w, startp, pointm,
- extent_beg_unchanged,
- extent_end_unchanged);
+ {
+ return regenerate_window_extents_only_changed (w, startp, pointm,
+ extent_beg_unchanged,
+ extent_end_unchanged);
+ }
else
/* At this point we know what line the changes first affect. We
now redraw that line. If the changes are contained within it
&& extent_end_unchanged != -1
&& ((extent_beg_unchanged < ddl->bufpos)
|| (extent_end_unchanged > ddl->end_bufpos)))
- return regenerate_window_extents_only_changed (w, startp, pointm,
- extent_beg_unchanged,
- extent_end_unchanged);
+ {
+ return
+ regenerate_window_extents_only_changed (w, startp, pointm,
+ extent_beg_unchanged,
+ extent_end_unchanged);
+ }
else
return 1;
}
Fset_marker (w->pointm[DESIRED_DISP], make_int (pointm),
the_buffer);
- /* #### BUFU amounts of overkill just to get the cursor
+ /* #### BUFU amounts of overkil just to get the cursor
location marked properly. FIX ME FIX ME FIX ME */
regenerate_window (w, startp, pointm, DESIRED_DISP);
}
temporary change to the echo area. */
&& !(MINI_WINDOW_P (w) && f->buffers_changed)
&& !f->frame_changed
- && !truncation_changed
- /* check whether start is really at the begining of a line GE */
- && (!w->start_at_line_beg || beginning_of_line_p (b, startp))
- )
+ && !truncation_changed)
{
/* Check if the cursor has actually moved. */
if (EQ (Fmarker_buffer (w->last_point[CURRENT_DISP]), w->buffer)
&& !f->extents_changed
&& !f->faces_changed
&& !f->glyphs_changed
- && !f->subwindows_changed
&& !f->point_changed
&& !f->windows_structure_changed)
{
&& !f->extents_changed
&& !f->faces_changed
&& !f->glyphs_changed
- && !f->subwindows_changed
&& !f->windows_structure_changed)
{
if (point_visible (w, pointm, CURRENT_DISP)
&& !f->clip_changed
&& !f->faces_changed
&& !f->glyphs_changed
- && !f->subwindows_changed
&& !f->windows_structure_changed
&& !f->frame_changed
&& !truncation_changed
Bufpos end = (w->window_end_pos[DESIRED_DISP] == -1
? BUF_ZV (b)
: BUF_Z (b) - w->window_end_pos[DESIRED_DISP] - 1);
- /* Don't pollute the cache if not sure if we are correct */
- if (w->start_at_line_beg)
- update_line_start_cache (w, start, end, pointm, 1);
+
+ update_line_start_cache (w, start, end, pointm, 1);
redisplay_output_window (w);
/*
* If we just displayed the echo area, the line start cache is
- * no longer valid, because the minibuffer window is associated
+ * no longer valid, because the minibuffer window is assocaited
* with the window now.
*/
if (echo_active)
change_frame_size (f, f->new_height, f->new_width, 0);
/* If frame size might need to be changed, due to changed size
- of toolbars, scrollbars etc, change it now */
+ of toolbars, scroolabrs etc, change it now */
if (f->size_slipped)
{
adjust_frame_size (f);
assert (!f->size_slipped);
}
-
+
/* The menubar, toolbar, and icon updates must be done before
hold_frame_size_changes is called and we are officially
'in_display'. They may eval lisp code which may call Fsignal.
being handled. */
update_frame_menubars (f);
#endif /* HAVE_MENUBARS */
- /* widgets are similar to menus in that they can call lisp to
- determine activation etc. Therefore update them before we get
- into redisplay. This is primarily for connected widgets such as
- radio buttons. */
- update_frame_subwindows (f);
+
#ifdef HAVE_TOOLBARS
/* Update the toolbars. */
update_frame_toolbars (f);
/* Erase the frame before outputting its contents. */
if (f->clear)
- {
- DEVMETH (d, clear_frame, (f));
- }
-
- /* invalidate the subwindow cache. we are going to reuse the glyphs
- flag here to cause subwindows to get instantiated. This is
- because subwindows changed is less strict - dealing with things
- like the clicked state of button. */
- if (!Dynarr_length (f->subwindow_cachels)
- || f->glyphs_changed
- || f->frame_changed)
- reset_subwindow_cachels (f);
- else
- mark_subwindow_cachels_as_not_updated (f);
+ DEVMETH (d, clear_frame, (f));
/* Do the selected window first. */
redisplay_window (FRAME_SELECTED_WINDOW (f), 0);
f->faces_changed = 0;
f->frame_changed = 0;
f->glyphs_changed = 0;
- f->subwindows_changed = 0;
f->icon_changed = 0;
f->menubar_changed = 0;
f->modeline_changed = 0;
f->faces_changed || f->frame_changed || f->menubar_changed ||
f->modeline_changed || f->point_changed || f->size_changed ||
f->toolbar_changed || f->windows_changed || f->size_slipped ||
- f->windows_structure_changed || f->glyphs_changed || f->subwindows_changed)
+ f->windows_structure_changed || f->glyphs_changed)
{
preempted = redisplay_frame (f, 0);
}
f->modeline_changed || f->point_changed || f->size_changed ||
f->toolbar_changed || f->windows_changed ||
f->windows_structure_changed ||
- f->glyphs_changed || f->subwindows_changed)
+ f->glyphs_changed)
{
preempted = redisplay_frame (f, 0);
}
d->faces_changed = 0;
d->frame_changed = 0;
d->glyphs_changed = 0;
- d->subwindows_changed = 0;
d->icon_changed = 0;
d->menubar_changed = 0;
d->modeline_changed = 0;
!faces_changed && !frame_changed && !icon_changed &&
!menubar_changed && !modeline_changed && !point_changed &&
!size_changed && !toolbar_changed && !windows_changed &&
- !glyphs_changed && !subwindows_changed &&
+ !glyphs_changed &&
!windows_structure_changed && !disable_preemption &&
preemption_count < max_preempts)
goto done;
d->menubar_changed || d->modeline_changed || d->point_changed ||
d->size_changed || d->toolbar_changed || d->windows_changed ||
d->windows_structure_changed ||
- d->glyphs_changed || d->subwindows_changed)
+ d->glyphs_changed)
{
preempted = redisplay_device (d);
extents_changed = 0;
frame_changed = 0;
glyphs_changed = 0;
- subwindows_changed = 0;
icon_changed = 0;
menubar_changed = 0;
modeline_changed = 0;
{
struct device *d = XDEVICE (XFRAME (w->frame)->device);
struct buffer *b = XBUFFER (w->buffer);
- /* Be careful in the order of these tests. The first clause will
+ /* Be careful in the order of these tests. The first clasue will
fail if DEVICE_SELECTED_FRAME == Qnil (since w->frame cannot be).
- This can occur when the frame title is computed really early */
+ This can occur when the frame title is computed really early */
Bufpos pos =
((EQ(DEVICE_SELECTED_FRAME(d), w->frame) &&
(w == XWINDOW (FRAME_SELECTED_WINDOW (device_selected_frame(d)))) &&
for (; gb < gb_last; gb++)
{
- if (!NILP (gb->glyph))
- markobj (gb->glyph);
- if (!NILP (gb->extent))
- markobj (gb->extent);
+ if (!NILP (gb->glyph)) ((markobj) (gb->glyph));
+ if (!NILP (gb->extent)) ((markobj) (gb->extent));
}
}
}
if (r->type == RUNE_DGLYPH)
{
if (!NILP (r->object.dglyph.glyph))
- markobj (r->object.dglyph.glyph);
+ ((markobj) (r->object.dglyph.glyph));
if (!NILP (r->object.dglyph.extent))
- markobj (r->object.dglyph.extent);
+ ((markobj) (r->object.dglyph.extent));
}
}
}
else
{
struct line_start_cache lsc;
-
+
lsc.start = dl->bufpos;
lsc.end = dl->end_bufpos;
lsc.height = dl->ascent + dl->descent;
size changes can cause text shifting. However, the extent
covering the region is constantly having its face set and
priority altered by the mouse code. This means that the line
- start cache is constantly being invalidated. This is bad
+ start cache is constanty being invalidated. This is bad
since the mouse code also triggers heavy usage of the cache.
Since it is an unlikely that f->extents being changed
indicates that the cache really needs to be updated and if it
/*
* Handle invisible text properly:
- * If the last line we're inserting has the same end as the
+ * If the last line we're inserting has the same end as the
* line before which it will be added, merge the two lines.
*/
if (Dynarr_length (cache) &&
d->pixel_to_glyph_cache.obj1 = *obj1; \
d->pixel_to_glyph_cache.obj2 = *obj2; \
d->pixel_to_glyph_cache.retval = position; \
- RETURN_SANS_WARNINGS position; \
+ RETURN__ position; \
} while (0)
/* Given x and y coordinates in pixels relative to a frame, return
{
if (WINDOWP (locale))
{
- MARK_FRAME_GLYPHS_CHANGED (XFRAME (WINDOW_FRAME (XWINDOW (locale))));
+ struct frame *f = XFRAME (WINDOW_FRAME (XWINDOW (locale)));
+ MARK_FRAME_GLYPHS_CHANGED (f);
}
else if (FRAMEP (locale))
{
- MARK_FRAME_GLYPHS_CHANGED (XFRAME (locale));
+ struct frame *f = XFRAME (locale);
+ MARK_FRAME_GLYPHS_CHANGED (f);
}
else if (DEVICEP (locale))
{
Lisp_Object frmcons;
DEVICE_FRAME_LOOP (frmcons, XDEVICE (locale))
- MARK_FRAME_GLYPHS_CHANGED (XFRAME (XCAR (frmcons)));
+ {
+ struct frame *f = XFRAME (XCAR (frmcons));
+ MARK_FRAME_GLYPHS_CHANGED (f);
+ }
}
else if (CONSOLEP (locale))
{
Lisp_Object frmcons, devcons;
CONSOLE_FRAME_LOOP_NO_BREAK (frmcons, devcons, XCONSOLE (locale))
- MARK_FRAME_GLYPHS_CHANGED (XFRAME (XCAR (frmcons)));
+ {
+ struct frame *f = XFRAME (XCAR (frmcons));
+ MARK_FRAME_GLYPHS_CHANGED (f);
+ }
}
else /* global or buffer */
{
Lisp_Object frmcons, devcons, concons;
FRAME_LOOP_NO_BREAK (frmcons, devcons, concons)
- MARK_FRAME_GLYPHS_CHANGED (XFRAME (XCAR (frmcons)));
+ {
+ struct frame *f = XFRAME (XCAR (frmcons));
+ MARK_FRAME_GLYPHS_CHANGED (f);
+ }
}
}
Minimum pixel height for clipped bottom display line.
A clipped line shorter than this won't be displayed.
*/ ,
- redisplay_variable_changed);
+ redisplay_variable_changed);
vertical_clip = 5;
DEFVAR_INT_MAGIC ("pixel-horizontal-clip-threshold", &horizontal_clip /*
Clipped glyphs shorter than this won't be displayed.
Only pixmap glyph instances are currently allowed to be clipped.
*/ ,
- redisplay_variable_changed);
+ redisplay_variable_changed);
horizontal_clip = 5;
DEFVAR_LISP ("global-mode-string", &Vglobal_mode_string /*
Marker for where to display an arrow on top of the buffer text.
This must be the beginning of a line in order to work.
See also `overlay-arrow-string'.
-*/ ,
- redisplay_variable_changed);
+*/ , redisplay_variable_changed);
Voverlay_arrow_position = Qnil;
DEFVAR_LISP_MAGIC ("overlay-arrow-string", &Voverlay_arrow_string /*
String to display as an arrow. See also `overlay-arrow-position'.
*/ ,
- redisplay_variable_changed);
+ redisplay_variable_changed);
Voverlay_arrow_string = Qnil;
DEFVAR_INT ("scroll-step", &scroll_step /*
&truncate_partial_width_windows /*
*Non-nil means truncate lines in all windows less than full frame wide.
*/ ,
- redisplay_variable_changed);
+ redisplay_variable_changed);
truncate_partial_width_windows = 1;
DEFVAR_BOOL ("visible-bell", &visible_bell /*
/* CHAR */
struct
{
- Emchar ch; /* Character of this rune. */
+ Emchar ch; /* Cbaracter of this rune. */
} chr;
/* HLINE */
int cursor_elt; /* rune block of TEXT display
block cursor is at or -1 */
char used_prop_data; /* can't incrementally update if line
- used propagation data */
+ used propogation data */
layout_bounds bounds; /* line boundary positions */
glyph_block_dynarr *right_glyphs;
};
-#define DISPLAY_LINE_HEIGHT(dl) \
-(dl->ascent + dl->descent - dl->clip)
-#define DISPLAY_LINE_YPOS(dl) \
-(dl->ypos - dl->ascent)
-
typedef struct
{
Dynarr_declare (display_line);
extern int glyphs_changed;
extern int glyphs_changed_set;
-/* True if any displayed subwindow is in need of updating
- somewhere. */
-extern int subwindows_changed;
-extern int subwindows_changed_set;
-
/* True if an icon is in need of updating somewhere. */
extern int icon_changed;
extern int icon_changed_set;
if each has already been called and don't bother doing most of the
work if it is currently set. */
-#define MARK_TYPE_CHANGED(object) do { \
- if (!object##_changed_set) { \
- Lisp_Object MTC_devcons, MTC_concons; \
- DEVICE_LOOP_NO_BREAK (MTC_devcons, MTC_concons) \
- { \
- Lisp_Object MTC_frmcons; \
- struct device *MTC_d = XDEVICE (XCAR (MTC_devcons)); \
- DEVICE_FRAME_LOOP (MTC_frmcons, MTC_d) \
- { \
- struct frame *MTC_f = XFRAME (XCAR (MTC_frmcons)); \
- MTC_f->object##_changed = 1; \
- MTC_f->modiff++; \
- } \
- MTC_d->object##_changed = 1; \
- } \
- object##_changed = 1; \
- object##_changed_set = 1; } \
+#define MARK_TYPE_CHANGED(object) do { \
+ if (!object##_changed_set) { \
+ Lisp_Object _devcons_, _concons_; \
+ DEVICE_LOOP_NO_BREAK (_devcons_, _concons_) \
+ { \
+ Lisp_Object _frmcons_; \
+ struct device *_d_ = XDEVICE (XCAR (_devcons_)); \
+ DEVICE_FRAME_LOOP (_frmcons_, _d_) \
+ { \
+ struct frame *_f_ = XFRAME (XCAR (_frmcons_)); \
+ _f_->object##_changed = 1; \
+ _f_->modiff++; \
+ } \
+ _d_->object##_changed = 1; \
+ } \
+ object##_changed = 1; \
+ object##_changed_set = 1; } \
} while (0)
#define MARK_BUFFERS_CHANGED MARK_TYPE_CHANGED (buffers)
#define MARK_POINT_CHANGED MARK_TYPE_CHANGED (point)
#define MARK_TOOLBAR_CHANGED MARK_TYPE_CHANGED (toolbar)
#define MARK_GLYPHS_CHANGED MARK_TYPE_CHANGED (glyphs)
-#define MARK_SUBWINDOWS_CHANGED MARK_TYPE_CHANGED (subwindows)
/* Anytime a console, device or frame is added or deleted we need to reset
these flags. */
-#define RESET_CHANGED_SET_FLAGS \
- do { \
- buffers_changed_set = 0; \
- clip_changed_set = 0; \
- extents_changed_set = 0; \
- icon_changed_set = 0; \
- menubar_changed_set = 0; \
- modeline_changed_set = 0; \
- point_changed_set = 0; \
- toolbar_changed_set = 0; \
- glyphs_changed_set = 0; \
- subwindows_changed_set = 0; \
+#define RESET_CHANGED_SET_FLAGS \
+ do { \
+ buffers_changed_set = 0; \
+ clip_changed_set = 0; \
+ extents_changed_set = 0; \
+ icon_changed_set = 0; \
+ menubar_changed_set = 0; \
+ modeline_changed_set = 0; \
+ point_changed_set = 0; \
+ toolbar_changed_set = 0; \
+ glyphs_changed_set = 0; \
} while (0)
\f
/* redisplay global variables */
/*************************************************************************/
-/* redisplay structure used by various utility routines. */
+/* redisplay structre used by various utility routines. */
extern display_line_dynarr *cmotion_display_lines;
/* Nonzero means truncate lines in all windows less wide than the frame. */
extern int display_arg;
/* Type of display specified. Defined in emacs.c. */
-extern CONST char *display_use;
+extern char *display_use;
/* Nonzero means reading single-character input with prompt
so put cursor on minibuffer after the prompt. */
int get_next_display_block (layout_bounds bounds,
display_block_dynarr *dba, int start_pos,
int *next_start);
-void redisplay_output_subwindow (struct window *w, struct display_line *dl,
- Lisp_Object image_instance, int xpos,
- int xoffset, int start_pixpos, int width,
- face_index findex, int cursor_start,
- int cursor_width, int cursor_height);
-void redisplay_unmap_subwindows_maybe (struct frame* f, int x, int y, int width, int height);
-void redisplay_clear_region (Lisp_Object window, face_index findex, int x,
- int y, int width, int height);
void redisplay_clear_bottom_of_window (struct window *w,
display_line_dynarr *ddla,
int min_start, int max_end);
DEBUG_PRINT2 (" Pushing reg: %d\n", this_reg); \
DEBUG_STATEMENT (num_regs_pushed++); \
\
- DEBUG_PRINT2 (" start: 0x%lx\n", (long) regstart[this_reg]); \
+ DEBUG_PRINT2 (" start: 0x%p\n", regstart[this_reg]); \
PUSH_FAILURE_POINTER (regstart[this_reg]); \
\
- DEBUG_PRINT2 (" end: 0x%lx\n", (long) regend[this_reg]); \
+ DEBUG_PRINT2 (" end: 0x%p\n", regend[this_reg]); \
PUSH_FAILURE_POINTER (regend[this_reg]); \
\
DEBUG_PRINT2 (" info: 0x%lx\n ", \
- * (long *) (®_info[this_reg])); \
+ * (unsigned long *) (®_info[this_reg])); \
DEBUG_PRINT2 (" match_null=%d", \
REG_MATCH_NULL_STRING_P (reg_info[this_reg])); \
DEBUG_PRINT2 (" active=%d", IS_ACTIVE (reg_info[this_reg])); \
DEBUG_PRINT2 (" Pushing high active reg: %d\n", highest_active_reg);\
PUSH_FAILURE_INT (highest_active_reg); \
\
- DEBUG_PRINT2 (" Pushing pattern 0x%lx: ", (long) pattern_place); \
+ DEBUG_PRINT2 (" Pushing pattern 0x%p: ", pattern_place); \
DEBUG_PRINT_COMPILED_PATTERN (bufp, pattern_place, pend); \
PUSH_FAILURE_POINTER (pattern_place); \
\
- DEBUG_PRINT2 (" Pushing string 0x%lx: `", (long) string_place); \
+ DEBUG_PRINT2 (" Pushing string 0x%p: `", string_place); \
DEBUG_PRINT_DOUBLE_STRING (string_place, string1, size1, string2, \
size2); \
DEBUG_PRINT1 ("'\n"); \
if (string_temp != NULL) \
str = (CONST char *) string_temp; \
\
- DEBUG_PRINT2 (" Popping string 0x%lx: `", (long) str); \
+ DEBUG_PRINT2 (" Popping string 0x%p: `", str); \
DEBUG_PRINT_DOUBLE_STRING (str, string1, size1, string2, size2); \
DEBUG_PRINT1 ("'\n"); \
\
pat = (unsigned char *) POP_FAILURE_POINTER (); \
- DEBUG_PRINT2 (" Popping pattern 0x%lx: ", (long) pat); \
+ DEBUG_PRINT2 (" Popping pattern 0x%p: ", pat); \
DEBUG_PRINT_COMPILED_PATTERN (bufp, pat, pend); \
\
/* Restore register info. */ \
\
reg_info[this_reg].word = POP_FAILURE_ELT (); \
DEBUG_PRINT2 (" info: 0x%lx\n", \
- * (long *) ®_info[this_reg]); \
+ * (unsigned long *) ®_info[this_reg]); \
\
regend[this_reg] = (CONST char *) POP_FAILURE_POINTER (); \
- DEBUG_PRINT2 (" end: 0x%lx\n", (long) regend[this_reg]); \
+ DEBUG_PRINT2 (" end: 0x%p\n", regend[this_reg]); \
\
regstart[this_reg] = (CONST char *) POP_FAILURE_POINTER (); \
- DEBUG_PRINT2 (" start: 0x%lx\n", (long) regstart[this_reg]); \
+ DEBUG_PRINT2 (" start: 0x%p\n", regstart[this_reg]); \
} \
\
set_regs_matched_done = 0; \
return syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR;
/* Can't have ranges spanning different charsets, except maybe for
- ranges entirely within the first 256 chars. */
+ ranges entirely witin the first 256 chars. */
if ((range_start >= 0x100 || range_end >= 0x100)
&& CHAR_LEADING_BYTE (range_start) !=
fails at this starting point in the input data. */
for (;;)
{
- DEBUG_PRINT2 ("\n0x%lx: ", (long) p);
+ DEBUG_PRINT2 ("\n0x%p: ", p);
#ifdef emacs /* XEmacs added, w/removal of immediate_quit */
if (!no_quit_in_re_search)
QUIT;
highest_active_reg = NO_HIGHEST_ACTIVE_REG;
}
else
- {
- highest_active_reg = r;
-
- /* 98/9/21 jhod: We've also gotta set lowest_active_reg, don't we? */
- r = 1;
- while (r < highest_active_reg && !IS_ACTIVE(reg_info[r]))
- r++;
- lowest_active_reg = r;
- }
- }
+ highest_active_reg = r;
+ }
/* If just failed to match something this time around with a
group that's operated on by a repetition operator, try to
DEBUG_PRINT1 ("EXECUTING on_failure_keep_string_jump");
EXTRACT_NUMBER_AND_INCR (mcnt, p);
- DEBUG_PRINT3 (" %d (to 0x%lx):\n", mcnt, (long) (p + mcnt));
+ DEBUG_PRINT3 (" %d (to 0x%p):\n", mcnt, p + mcnt);
PUSH_FAILURE_POINT (p + mcnt, (char *) 0, -2);
break;
DEBUG_PRINT1 ("EXECUTING on_failure_jump");
EXTRACT_NUMBER_AND_INCR (mcnt, p);
- DEBUG_PRINT3 (" %d (to 0x%lx)", mcnt, (long) (p + mcnt));
+ DEBUG_PRINT3 (" %d (to 0x%p)", mcnt, p + mcnt);
/* If this on_failure_jump comes right before a group (i.e.,
the original * applied to a group), save the information
EXTRACT_NUMBER_AND_INCR (mcnt, p); /* Get the amount to jump. */
DEBUG_PRINT2 ("EXECUTING jump %d ", mcnt);
p += mcnt; /* Do the jump. */
- DEBUG_PRINT2 ("(to 0x%lx).\n", (long) p);
+ DEBUG_PRINT2 ("(to 0x%p).\n", p);
break;
mcnt--;
p += 2;
STORE_NUMBER_AND_INCR (p, mcnt);
- DEBUG_PRINT3 (" Setting 0x%lx to %d.\n", (long) p, mcnt);
+ DEBUG_PRINT3 (" Setting 0x%p to %d.\n", p, mcnt);
}
else if (mcnt == 0)
{
- DEBUG_PRINT2 (" Setting two bytes from 0x%lx to no_op.\n",
- (long) (p+2));
+ DEBUG_PRINT2 (" Setting two bytes from 0x%p to no_op.\n", p+2);
p[2] = (unsigned char) no_op;
p[3] = (unsigned char) no_op;
goto on_failure;
EXTRACT_NUMBER_AND_INCR (mcnt, p);
p1 = p + mcnt;
EXTRACT_NUMBER_AND_INCR (mcnt, p);
- DEBUG_PRINT3 (" Setting 0x%lx to %d.\n", (long) p1, mcnt);
+ DEBUG_PRINT3 (" Setting 0x%p to %d.\n", p1, mcnt);
STORE_NUMBER (p1, mcnt);
break;
}
--- /dev/null
+/* System description file for MS-DOS
+
+ Copyright (C) 1993 Free Software Foundation, Inc.
+
+This file is part of GNU Emacs.
+
+GNU Emacs is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Emacs is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with XEmacs; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/* Synched up with: FSF 19.31. */
+
+/* Note: lots of stuff here was taken from s-msdos.h in demacs. */
+
+
+/*
+ * Define symbols to identify the version of Unix this is.
+ * Define all the symbols that apply correctly.
+ */
+
+/* #define UNIPLUS */
+/* #define USG5 */
+/* #define USG */
+/* #define HPUX */
+/* #define UMAX */
+/* #define BSD4_1 */
+/* #define BSD4_2 */
+/* #define BSD4_3 */
+/* #define BSD */
+#ifndef MSDOS
+#define MSDOS
+#endif
+
+#ifdef __GO32__
+#ifndef __DJGPP__
+#define __DJGPP__ 1 /* V2 defines __DJGPP__ == 2 */
+#endif
+#else
+You lose; /* Emacs for DOS must be compiled with DJGPP */
+#endif
+
+#define DOS_NT /* MSDOS or WINDOWSNT */
+#undef BSD
+
+/* SYSTEM_TYPE should indicate the kind of system you are using.
+ It sets the Lisp variable system-type. */
+
+#define SYSTEM_TYPE "ms-dos"
+
+#define SYMS_SYSTEM syms_of_dosfns();syms_of_msdos()
+
+/* Letter to use in finding device name of first pty,
+ if system supports pty's. 'a' means it is /dev/ptya0 */
+
+/* #define FIRST_PTY_LETTER 'a' */
+
+/*
+ * Define HAVE_PTYS if the system supports pty devices.
+ */
+
+/* #define HAVE_PTYS */
+
+/* MSDOS has dirent.h but doesn't behave otherwise like the SYSV
+ directory functions. We have special tests for this in
+ sysdir.h. */
+
+#undef SYSV_SYSTEM_DIR
+
+/* Define this is the compiler understands `volatile'. */
+#define HAVE_VOLATILE
+
+#define NO_SUBPROCESSES
+
+/* If your system uses COFF (Common Object File Format) then define the
+ preprocessor symbol "COFF". */
+
+#define COFF
+
+/* define MAIL_USE_FLOCK if the mailer uses flock
+ to interlock access to /usr/spool/mail/$USER.
+ The alternative is that a lock file named
+ /usr/spool/mail/$USER.lock. */
+
+/* #define MAIL_USE_FLOCK */
+
+/* Here, on a separate page, add any special hacks needed
+ to make Emacs work on this system. For example,
+ you might define certain system call names that don't
+ exist on your system, or that do different things on
+ your system and must be used only through an encapsulation
+ (Which you should place, by convention, in sysdep.c). */
+\f
+/* Avoid incompatibilities between gmalloc.c and system header files
+ in how to declare valloc. */
+#define GMALLOC_INHIBIT_VALLOC
+
+/* setjmp and longjmp can safely replace _setjmp and _longjmp,
+ but they will run slower. */
+
+#define _setjmp setjmp
+#define _longjmp longjmp
+
+#if __DJGPP__ < 2
+
+#define NO_MODE_T
+
+/* New chdir () routine.
+ DJGPP v2.0 and later doesn't need it because its chdir() does
+ set the drive itself. */
+#ifdef chdir
+#undef chdir
+#endif
+#define chdir sys_chdir
+
+#define LIBS_SYSTEM "-lpc" /* isn't required in DJGPP v2.0, either */
+
+#endif /* __DJGPP__ < 2 */
+
+#if __DJGPP__ > 1
+
+#define DATA_START (&etext + 1)
+#define TEXT_START &start
+#define TEXT_END &etext
+
+#define _NAIVE_DOS_REGS
+
+#else /* not __DJGPP__ > 1 */
+
+/* This somehow needs to be defined even though we use COFF. */
+#define TEXT_START -1
+
+#endif /* not __DJGPP__ > 1 */
+
+#define ORDINARY_LINK
+
+/* command.com does not understand `...` so we define this. */
+#define LIB_GCC "-Lgcc"
+#define DONT_NEED_ENVIRON
+#define SEPCHAR ';'
+
+#define NULL_DEVICE "nul"
+#define EXEC_SUFFIXES ".exe:.com:.bat:"
+
+#if __DJGPP__ < 2
+#define O_RDONLY 0x0001
+#define O_WRONLY 0x0002
+#define O_RDWR 0x0004
+#define O_CREAT 0x0100
+#define O_TRUNC 0x0200
+#define O_EXCL 0x0400
+#define O_APPEND 0x0800
+#define O_TEXT 0x4000
+#define O_BINARY 0x8000
+#define NO_MATHERR
+#endif
+
+#define HAVE_INVERSE_HYPERBOLIC
+#define FLOAT_CHECK_DOMAIN
+
+/* When $TERM is "internal" then this is substituted: */
+#define INTERNAL_TERMINAL "pc|bios|IBM PC with colour display:\
+:co#80:li#25:km:ms:cm=<CM>:cl=<CL>:ce=<CE>:"
+
+/* Define this to a function (Fdowncase, Fupcase) if your file system
+ likes that */
+#define FILE_SYSTEM_CASE Fmsdos_downcase_filename
+
+/* Define this to be the separator between devices and paths */
+#define DEVICE_SEP ':'
+
+/* We'll support either convention on MSDOG. */
+#define IS_DIRECTORY_SEP(_c_) ((_c_) == '/' || (_c_) == '\\')
+#define IS_ANY_SEP(_c_) (IS_DIRECTORY_SEP (_c_) || IS_DEVICE_SEP (_c_))
+
+/* Call init_gettimeofday when TZ changes. */
+#if __DJGPP__ < 2
+#define LOCALTIME_CACHE
+#define tzset init_gettimeofday
+#endif
+
+/* bcopy under djgpp is quite safe */
+#define GAP_USE_BCOPY
+#define BCOPY_UPWARD_SAFE 1
+#define BCOPY_DOWNWARD_SAFE 1
+
+/* Mode line description of a buffer's type. */
+#define MODE_LINE_BINARY_TEXT(buf) (NILP(buf->buffer_file_type) ? "T" : "B")
+
+/* Do we have POSIX signals? */
+#if __DJGPP__ > 1
+#define POSIX_SIGNALS
+#endif
+
+/* We have (the code to control) a mouse. */
+#define HAVE_MOUSE
+
+/* We canuse mouse menus. */
+#define HAVE_MENUS
+
+/* We have support for faces. */
+#define HAVE_FACES
+
+/* Define one of these for easier conditionals. */
+#ifdef HAVE_X_WINDOWS
+/* We need a little extra space, see ../../lisp/loadup.el */
+#define SYSTEM_PURESIZE_EXTRA 15000
+#define HAVE_X11R5
+#define LIBX11_SYSTEM "-lxext -lsys"
+#else
+/* We need a little extra space, see ../../lisp/loadup.el */
+#define SYSTEM_PURESIZE_EXTRA 85000
+#endif
--- /dev/null
+/* Synched up with: FSF 19.31. */
+
+/* System description file for Windows 95. */
+
+#include "windowsnt.h"
+
+#define WINDOWS95
#include "lisp.h"
#include "buffer.h"
+#include "commands.h"
#include "insdel.h"
#include "opaque.h"
#ifdef REGION_CACHE_NEEDS_WORK
}
Bytind
-bi_find_next_newline_no_quit (struct buffer *buf, Bytind from, int count)
+bi_find_next_newline_no_quit (struct buffer *buf, Bytind from, int cnt)
{
- return bi_scan_buffer (buf, '\n', from, 0, count, 0, 0);
+ return bi_scan_buffer (buf, '\n', from, 0, cnt, 0, 0);
}
Bufpos
-find_next_newline_no_quit (struct buffer *buf, Bufpos from, int count)
+find_next_newline_no_quit (struct buffer *buf, Bufpos from, int cnt)
{
- return scan_buffer (buf, '\n', from, 0, count, 0, 0);
+ return scan_buffer (buf, '\n', from, 0, cnt, 0, 0);
}
Bufpos
-find_next_newline (struct buffer *buf, Bufpos from, int count)
+find_next_newline (struct buffer *buf, Bufpos from, int cnt)
{
- return scan_buffer (buf, '\n', from, 0, count, 0, 1);
+ return scan_buffer (buf, '\n', from, 0, cnt, 0, 1);
}
/* Like find_next_newline, but returns position before the newline,
not after, and only search up to TO. This isn't just
find_next_newline (...)-1, because you might hit TO. */
Bufpos
-find_before_next_newline (struct buffer *buf, Bufpos from, Bufpos to, int count)
+find_before_next_newline (struct buffer *buf, Bufpos from, Bufpos to, int cnt)
{
EMACS_INT shortage;
- Bufpos pos = scan_buffer (buf, '\n', from, to, count, &shortage, 1);
+ Bufpos pos = scan_buffer (buf, '\n', from, to, cnt, &shortage, 1);
if (shortage == 0)
pos--;
REGISTER int i;
struct Lisp_Char_Table *syntax_table =
XCHAR_TABLE (buf->mirror_syntax_table);
- Bufpos limit;
+
+ CHECK_STRING (string);
if (NILP (lim))
- limit = forwardp ? BUF_ZV (buf) : BUF_BEGV (buf);
+ XSETINT (lim, forwardp ? BUF_ZV (buf) : BUF_BEGV (buf));
else
- {
- CHECK_INT_COERCE_MARKER (lim);
- limit = XINT (lim);
+ CHECK_INT_COERCE_MARKER (lim);
- /* In any case, don't allow scan outside bounds of buffer. */
- if (limit > BUF_ZV (buf)) limit = BUF_ZV (buf);
- if (limit < BUF_BEGV (buf)) limit = BUF_BEGV (buf);
- }
+ /* In any case, don't allow scan outside bounds of buffer. */
+ if (XINT (lim) > BUF_ZV (buf))
+ lim = make_int (BUF_ZV (buf));
+ if (XINT (lim) < BUF_BEGV (buf))
+ lim = make_int (BUF_BEGV (buf));
- CHECK_STRING (string);
p = XSTRING_DATA (string);
pend = p + XSTRING_LENGTH (string);
memset (fastmap, 0, sizeof (fastmap));
to worry about */
if (forwardp)
{
- while (BUF_PT (buf) < limit
+ while (BUF_PT (buf) < XINT (lim)
&& fastmap[(unsigned char)
syntax_code_spec
[(int) SYNTAX (syntax_table,
}
else
{
- while (BUF_PT (buf) > limit
+ while (BUF_PT (buf) > XINT (lim)
&& fastmap[(unsigned char)
syntax_code_spec
[(int) SYNTAX (syntax_table,
{
if (forwardp)
{
- while (BUF_PT (buf) < limit)
+ while (BUF_PT (buf) < XINT (lim))
{
Emchar ch = BUF_FETCH_CHAR (buf, BUF_PT (buf));
if ((ch < 0400) ? fastmap[ch] :
}
else
{
- while (BUF_PT (buf) > limit)
+ while (BUF_PT (buf) > XINT (lim))
{
Emchar ch = BUF_FETCH_CHAR (buf, BUF_PT (buf) - 1);
if ((ch < 0400) ? fastmap[ch] :
(EMACS_UINT) p_limit)
cursor += BM_tab[*cursor];
}
- /* If you are here, cursor is beyond the end of the searched region. */
+/* If you are here, cursor is beyond the end of the searched region. */
/* This can happen if you match on the far character of the pattern, */
/* because the "stride" of that character is infinity, a number able */
/* to throw you well beyond the end of the search. It can also */
case_action = nochange; /* We tried an initialization */
/* but some C compilers blew it */
- if (search_regs.num_regs == 0)
+ if (search_regs.num_regs <= 0)
error ("replace-match called before any match found");
if (NILP (string))
Charcount subend = -1;
c = string_char (XSTRING (newtext), strpos);
- if (c == '\\' && strpos < stlen - 1)
+ if (c == '\\')
{
c = string_char (XSTRING (newtext), ++strpos);
if (c == '&')
Charcount offset = BUF_PT (buf) - search_regs.start[0];
c = string_char (XSTRING (newtext), strpos);
- if (c == '\\' && strpos < stlen - 1)
+ if (c == '\\')
{
c = string_char (XSTRING (newtext), ++strpos);
if (c == '&')
n = XINT (num);
if (n < 0 || n >= search_regs.num_regs)
args_out_of_range (num, make_int (search_regs.num_regs));
- if (search_regs.num_regs == 0 ||
+ if (search_regs.num_regs <= 0 ||
search_regs.start[n] < 0)
return Qnil;
return make_int (beginningp ? search_regs.start[n] : search_regs.end[n]);
/* If REUSE is a list, store as many value elements as will fit
into the elements of REUSE. */
- for (prev = Qnil, i = 0, tail = reuse; CONSP (tail); i++, tail = XCDR (tail))
+ for (i = 0, tail = reuse; CONSP (tail); i++, tail = XCDR (tail))
{
if (i < 2 * len + 2)
XCAR (tail) = data[i];
#include "buffer.h" /* for Vbuffer_defaults */
#include "console.h"
-#include "elhash.h"
+
+#include "elhash.h" /* for HASHTABLE_NONWEAK and HASHTABLE_EQ */
Lisp_Object Qad_advice_info, Qad_activate;
Lisp_Object Qboundp, Qfboundp, Qglobally_boundp, Qmakunbound;
Lisp_Object Qsymbol_value, Qset, Qdefault_boundp, Qdefault_value;
-Lisp_Object Qset_default, Qsetq_default;
-Lisp_Object Qmake_variable_buffer_local, Qmake_local_variable;
+Lisp_Object Qset_default, Qmake_variable_buffer_local, Qmake_local_variable;
Lisp_Object Qkill_local_variable, Qkill_console_local_variable;
Lisp_Object Qsymbol_value_in_buffer, Qsymbol_value_in_console;
Lisp_Object Qlocal_variable_p;
Lisp_Object funsym,
int nargs, ...);
static Lisp_Object fetch_value_maybe_past_magic (Lisp_Object sym,
- Lisp_Object follow_past_lisp_magic);
+ Lisp_Object
+ follow_past_lisp_magic);
static Lisp_Object *value_slot_past_magic (Lisp_Object sym);
-static Lisp_Object follow_varalias_pointers (Lisp_Object symbol,
- Lisp_Object follow_past_lisp_magic);
+static Lisp_Object follow_varalias_pointers (Lisp_Object object,
+ Lisp_Object
+ follow_past_lisp_magic);
\f
+#ifdef LRECORD_SYMBOL
+
static Lisp_Object
mark_symbol (Lisp_Object obj, void (*markobj) (Lisp_Object))
{
struct Lisp_Symbol *sym = XSYMBOL (obj);
Lisp_Object pname;
- markobj (sym->value);
- markobj (sym->function);
+ ((markobj) (sym->value));
+ ((markobj) (sym->function));
+ /* No need to mark through ->obarray, because it only holds nil or t. */
+ /*((markobj) (sym->obarray));*/
XSETSTRING (pname, sym->name);
- markobj (pname);
+ ((markobj) (pname));
if (!symbol_next (sym))
return sym->plist;
else
{
- markobj (sym->plist);
+ ((markobj) (sym->plist));
/* Mark the rest of the symbols in the obarray hash-chain */
sym = symbol_next (sym);
XSETSYMBOL (obj, sym);
}
}
-static const struct lrecord_description symbol_description[] = {
- { XD_LISP_OBJECT, offsetof(struct Lisp_Symbol, next), 5 }
-};
-
DEFINE_BASIC_LRECORD_IMPLEMENTATION ("symbol", symbol,
mark_symbol, print_symbol, 0, 0, 0,
- symbol_description, struct Lisp_Symbol);
+ struct Lisp_Symbol);
+#endif /* LRECORD_SYMBOL */
\f
/**********************************************************************/
Lisp_Object
intern (CONST char *str)
{
+ Lisp_Object tem;
Bytecount len = strlen (str);
- CONST Bufbyte *buf = (CONST Bufbyte *) str;
Lisp_Object obarray = Vobarray;
-
if (!VECTORP (obarray) || XVECTOR_LENGTH (obarray) == 0)
obarray = check_obarray (obarray);
+ tem = oblookup (obarray, (CONST Bufbyte *) str, len);
- {
- Lisp_Object tem = oblookup (obarray, buf, len);
- if (SYMBOLP (tem))
- return tem;
- }
-
- return Fintern (make_string (buf, len), obarray);
+ if (SYMBOLP (tem))
+ return tem;
+ return Fintern (((purify_flag)
+ ? make_pure_pname ((CONST Bufbyte *) str, len, 0)
+ : make_string ((CONST Bufbyte *) str, len)),
+ obarray);
}
DEFUN ("intern", Fintern, 1, 2, 0, /*
A second optional argument specifies the obarray to use;
it defaults to the value of `obarray'.
*/
- (string, obarray))
+ (str, obarray))
{
- Lisp_Object object, *ptr;
- struct Lisp_Symbol *symbol;
+ Lisp_Object sym, *ptr;
Bytecount len;
if (NILP (obarray)) obarray = Vobarray;
obarray = check_obarray (obarray);
- CHECK_STRING (string);
+ CHECK_STRING (str);
- len = XSTRING_LENGTH (string);
- object = oblookup (obarray, XSTRING_DATA (string), len);
- if (!INTP (object))
+ len = XSTRING_LENGTH (str);
+ sym = oblookup (obarray, XSTRING_DATA (str), len);
+ if (!INTP (sym))
/* Found it */
- return object;
+ return sym;
+
+ ptr = &XVECTOR_DATA (obarray)[XINT (sym)];
- ptr = &XVECTOR_DATA (obarray)[XINT (object)];
+ if (purify_flag && ! purified (str))
+ str = make_pure_pname (XSTRING_DATA (str), len, 0);
+ sym = Fmake_symbol (str);
+ /* FSFmacs places OBARRAY here, but it is pointless because we do
+ not mark through this slot, so it is not usable later (because
+ the obarray might have been collected). Marking through the
+ ->obarray slot is an even worse idea, because it would keep
+ obarrays from being collected because of symbols pointed to them.
- object = Fmake_symbol (string);
- symbol = XSYMBOL (object);
+ NOTE: We place Qt here only if OBARRAY is actually Vobarray. It
+ is safer to do it this way, to avoid hosing with symbols within
+ pure objects. */
+ if (EQ (obarray, Vobarray))
+ XSYMBOL (sym)->obarray = Qt;
if (SYMBOLP (*ptr))
- symbol_next (symbol) = XSYMBOL (*ptr);
+ symbol_next (XSYMBOL (sym)) = XSYMBOL (*ptr);
else
- symbol_next (symbol) = 0;
- *ptr = object;
-
- if (string_byte (symbol_name (symbol), 0) == ':' && EQ (obarray, Vobarray))
- {
- /* The LISP way is to put keywords in their own package, but we
- don't have packages, so we do something simpler. Someday,
- maybe we'll have packages and then this will be reworked.
- --Stig. */
- symbol_value (symbol) = object;
- }
-
- return object;
+ symbol_next (XSYMBOL (sym)) = 0;
+ *ptr = sym;
+ return sym;
}
DEFUN ("intern-soft", Fintern_soft, 1, 2, 0, /*
-Return the canonical symbol named NAME, or nil if none exists.
-NAME may be a string or a symbol. If it is a symbol, that exact
-symbol is searched for.
+Return the canonical symbol whose name is STRING, or nil if none exists.
A second optional argument specifies the obarray to use;
it defaults to the value of `obarray'.
*/
- (name, obarray))
+ (str, obarray))
{
- /* #### Bug! (intern-soft "nil") returns nil. Perhaps we should
- add a DEFAULT-IF-NOT-FOUND arg, like in get. */
Lisp_Object tem;
- struct Lisp_String *string;
if (NILP (obarray)) obarray = Vobarray;
obarray = check_obarray (obarray);
- if (!SYMBOLP (name))
- {
- CHECK_STRING (name);
- string = XSTRING (name);
- }
- else
- string = symbol_name (XSYMBOL (name));
+ CHECK_STRING (str);
- tem = oblookup (obarray, string_data (string), string_length (string));
- if (INTP (tem) || (SYMBOLP (name) && !EQ (name, tem)))
- return Qnil;
- else
+ tem = oblookup (obarray, XSTRING_DATA (str), XSTRING_LENGTH (str));
+ if (!INTP (tem))
return tem;
+ return Qnil;
}
\f
DEFUN ("unintern", Funintern, 1, 2, 0, /*
*/
(name, obarray))
{
- Lisp_Object tem;
- struct Lisp_String *string;
+ Lisp_Object string, tem;
int hash;
if (NILP (obarray)) obarray = Vobarray;
obarray = check_obarray (obarray);
if (SYMBOLP (name))
- string = symbol_name (XSYMBOL (name));
+ XSETSTRING (string, XSYMBOL (name)->name);
else
{
CHECK_STRING (name);
- string = XSTRING (name);
+ string = name;
}
- tem = oblookup (obarray, string_data (string), string_length (string));
+ tem = oblookup (obarray, XSTRING_DATA (string), XSTRING_LENGTH (string));
if (INTP (tem))
return Qnil;
/* If arg was a symbol, don't delete anything but that symbol itself. */
}
}
}
+ XSYMBOL (tem)->obarray = Qnil;
return Qt;
}
\f
/* Return the symbol in OBARRAY whose names matches the string
of SIZE characters at PTR. If there is no such symbol in OBARRAY,
- return the index into OBARRAY that the string hashes to.
+ return nil.
Also store the bucket number in oblookup_last_bucket_number. */
obarray = check_obarray (obarray);
obsize = XVECTOR_LENGTH (obarray);
}
- hash = hash_string (ptr, size) % obsize;
- oblookup_last_bucket_number = hash;
+#if 0 /* FSFmacs */
+ /* #### Huh? */
+ /* This is sometimes needed in the middle of GC. */
+ obsize &= ~ARRAY_MARK_FLAG;
+#endif
+ /* Combining next two lines breaks VMS C 2.3. */
+ hash = hash_string (ptr, size);
+ hash %= obsize;
bucket = XVECTOR_DATA (obarray)[hash];
+ oblookup_last_bucket_number = hash;
if (ZEROP (bucket))
;
else if (!SYMBOLP (bucket))
DEFUN ("boundp", Fboundp, 1, 1, 0, /*
Return t if SYMBOL's value is not void.
*/
- (symbol))
+ (sym))
{
- CHECK_SYMBOL (symbol);
- return UNBOUNDP (find_symbol_value (symbol)) ? Qnil : Qt;
+ CHECK_SYMBOL (sym);
+ return UNBOUNDP (find_symbol_value (sym)) ? Qnil : Qt;
}
DEFUN ("globally-boundp", Fglobally_boundp, 1, 1, 0, /*
Return t if SYMBOL has a global (non-bound) value.
This is for the byte-compiler; you really shouldn't be using this.
*/
- (symbol))
+ (sym))
{
- CHECK_SYMBOL (symbol);
- return UNBOUNDP (top_level_value (symbol)) ? Qnil : Qt;
+ CHECK_SYMBOL (sym);
+ return UNBOUNDP (top_level_value (sym)) ? Qnil : Qt;
}
DEFUN ("fboundp", Ffboundp, 1, 1, 0, /*
Return t if SYMBOL's function definition is not void.
*/
- (symbol))
+ (sym))
{
- CHECK_SYMBOL (symbol);
- return UNBOUNDP (XSYMBOL (symbol)->function) ? Qnil : Qt;
+ CHECK_SYMBOL (sym);
+ return UNBOUNDP (XSYMBOL (sym)->function) ? Qnil : Qt;
}
/* Return non-zero if SYM's value or function (the current contents of
}
/* We don't return true for keywords here because they are handled
- specially by reject_constant_symbols(). */
+ specially by reject_constant_symbols(). */
return 0;
}
FOLLOW_PAST_LISP_MAGIC specifies whether we delve past
symbol-value-lisp-magic objects. */
-void
+static void
reject_constant_symbols (Lisp_Object sym, Lisp_Object newval, int function_p,
Lisp_Object follow_past_lisp_magic)
{
sym);
if (symbol_is_constant (sym, val)
- || (SYMBOL_IS_KEYWORD (sym) && !EQ (newval, sym)))
+ || (SYMBOL_IS_KEYWORD (sym) && !EQ (newval, sym)
+ && !NILP (XSYMBOL (sym)->obarray)))
signal_error (Qsetting_constant,
UNBOUNDP (newval) ? list1 (sym) : list2 (sym, newval));
}
DEFUN ("makunbound", Fmakunbound, 1, 1, 0, /*
Make SYMBOL's value be void.
*/
- (symbol))
+ (sym))
{
- Fset (symbol, Qunbound);
- return symbol;
+ Fset (sym, Qunbound);
+ return sym;
}
DEFUN ("fmakunbound", Ffmakunbound, 1, 1, 0, /*
Make SYMBOL's function definition be void.
*/
- (symbol))
+ (sym))
{
- CHECK_SYMBOL (symbol);
- reject_constant_symbols (symbol, Qunbound, 1, Qt);
- XSYMBOL (symbol)->function = Qunbound;
- return symbol;
+ CHECK_SYMBOL (sym);
+ reject_constant_symbols (sym, Qunbound, 1, Qt);
+ XSYMBOL (sym)->function = Qunbound;
+ return sym;
}
DEFUN ("symbol-function", Fsymbol_function, 1, 1, 0, /*
{
CHECK_SYMBOL (symbol);
if (UNBOUNDP (XSYMBOL (symbol)->function))
- signal_void_function_error (symbol);
+ return Fsignal (Qvoid_function, list1 (symbol));
return XSYMBOL (symbol)->function;
}
DEFUN ("symbol-plist", Fsymbol_plist, 1, 1, 0, /*
Return SYMBOL's property list.
*/
- (symbol))
+ (sym))
{
- CHECK_SYMBOL (symbol);
- return XSYMBOL (symbol)->plist;
+ CHECK_SYMBOL (sym);
+ return XSYMBOL (sym)->plist;
}
DEFUN ("symbol-name", Fsymbol_name, 1, 1, 0, /*
Return SYMBOL's name, a string.
*/
- (symbol))
+ (sym))
{
Lisp_Object name;
- CHECK_SYMBOL (symbol);
- XSETSTRING (name, XSYMBOL (symbol)->name);
+ CHECK_SYMBOL (sym);
+ XSETSTRING (name, XSYMBOL (sym)->name);
return name;
}
DEFUN ("fset", Ffset, 2, 2, 0, /*
Set SYMBOL's function definition to NEWDEF, and return NEWDEF.
*/
- (symbol, newdef))
+ (sym, newdef))
{
/* This function can GC */
- CHECK_SYMBOL (symbol);
- reject_constant_symbols (symbol, newdef, 1, Qt);
- if (!NILP (Vautoload_queue) && !UNBOUNDP (XSYMBOL (symbol)->function))
- Vautoload_queue = Fcons (Fcons (symbol, XSYMBOL (symbol)->function),
+ CHECK_SYMBOL (sym);
+ reject_constant_symbols (sym, newdef, 1, Qt);
+ if (!NILP (Vautoload_queue) && !UNBOUNDP (XSYMBOL (sym)->function))
+ Vautoload_queue = Fcons (Fcons (sym, XSYMBOL (sym)->function),
Vautoload_queue);
- XSYMBOL (symbol)->function = newdef;
+ XSYMBOL (sym)->function = newdef;
/* Handle automatic advice activation */
- if (CONSP (XSYMBOL (symbol)->plist) &&
- !NILP (Fget (symbol, Qad_advice_info, Qnil)))
+ if (CONSP (XSYMBOL (sym)->plist) && !NILP (Fget (sym, Qad_advice_info,
+ Qnil)))
{
- call2 (Qad_activate, symbol, Qnil);
- newdef = XSYMBOL (symbol)->function;
+ call2 (Qad_activate, sym, Qnil);
+ newdef = XSYMBOL (sym)->function;
}
return newdef;
}
Set SYMBOL's function definition to NEWDEF, and return NEWDEF.
Associates the function with the current load file, if any.
*/
- (symbol, newdef))
+ (sym, newdef))
{
/* This function can GC */
- Ffset (symbol, newdef);
- LOADHIST_ATTACH (symbol);
+ CHECK_SYMBOL (sym);
+ Ffset (sym, newdef);
+ LOADHIST_ATTACH (sym);
return newdef;
}
DEFUN ("setplist", Fsetplist, 2, 2, 0, /*
Set SYMBOL's property list to NEWPLIST, and return NEWPLIST.
*/
- (symbol, newplist))
+ (sym, newplist))
{
- CHECK_SYMBOL (symbol);
+ CHECK_SYMBOL (sym);
#if 0 /* Inserted for debugging 6/28/1997 -slb */
/* Somebody is setting a property list of integer 0, who? */
/* Not this way apparently. */
if (EQ(newplist, Qzero)) abort();
#endif
- XSYMBOL (symbol)->plist = newplist;
+ XSYMBOL (sym)->plist = newplist;
return newplist;
}
If a symbol is "unbound", then the contents of its value cell is
Qunbound. Despite appearances, this is *not* a symbol, but is a
symbol-value-forward object. This is so that printing it results
- in "INTERNAL OBJECT (XEmacs bug?)", in case it leaks to Lisp, somehow.
+ in "INTERNAL EMACS BUG", in case it leaks to Lisp, somehow.
Logically all of the following objects are "symbol-value-magic"
objects, and there are some games played w.r.t. this (#### this
{
struct symbol_value_buffer_local *bfwd;
-#ifdef ERROR_CHECK_TYPECHECK
assert (XSYMBOL_VALUE_MAGIC_TYPE (obj) == SYMVAL_BUFFER_LOCAL ||
XSYMBOL_VALUE_MAGIC_TYPE (obj) == SYMVAL_SOME_BUFFER_LOCAL);
-#endif
bfwd = XSYMBOL_VALUE_BUFFER_LOCAL (obj);
- markobj (bfwd->default_value);
- markobj (bfwd->current_value);
- markobj (bfwd->current_buffer);
+ ((markobj) (bfwd->default_value));
+ ((markobj) (bfwd->current_value));
+ ((markobj) (bfwd->current_buffer));
return bfwd->current_alist_element;
}
bfwd = XSYMBOL_VALUE_LISP_MAGIC (obj);
for (i = 0; i < MAGIC_HANDLER_MAX; i++)
{
- markobj (bfwd->handler[i]);
- markobj (bfwd->harg[i]);
+ ((markobj) (bfwd->handler[i]));
+ ((markobj) (bfwd->harg[i]));
}
return bfwd->shadowed;
}
assert (XSYMBOL_VALUE_MAGIC_TYPE (obj) == SYMVAL_VARALIAS);
bfwd = XSYMBOL_VALUE_VARALIAS (obj);
- markobj (bfwd->shadowed);
+ ((markobj) (bfwd->shadowed));
return bfwd->aliasee;
}
Lisp_Object printcharfun, int escapeflag)
{
char buf[200];
- sprintf (buf, "#<INTERNAL OBJECT (XEmacs bug?) (%s type %d) 0x%lx>",
+ sprintf (buf, "#<INTERNAL EMACS BUG (%s type %d) 0x%p>",
XRECORD_LHEADER_IMPLEMENTATION (obj)->name,
XSYMBOL_VALUE_MAGIC_TYPE (obj),
- (long) XPNTR (obj));
+ (void *) XPNTR (obj));
write_c_string (buf, printcharfun);
}
-static const struct lrecord_description symbol_value_buffer_local_description[] = {
- { XD_LISP_OBJECT, offsetof(struct symbol_value_buffer_local, default_value), 4 },
- { XD_END }
-};
-
-static const struct lrecord_description symbol_value_lisp_magic_description[] = {
- { XD_LISP_OBJECT, offsetof(struct symbol_value_lisp_magic, handler), 2*MAGIC_HANDLER_MAX+1 },
- { XD_END }
-};
-
-static const struct lrecord_description symbol_value_varalias_description[] = {
- { XD_LISP_OBJECT, offsetof(struct symbol_value_varalias, aliasee), 2 },
- { XD_END }
-};
-
DEFINE_LRECORD_IMPLEMENTATION ("symbol-value-forward",
symbol_value_forward,
this_one_is_unmarkable,
- print_symbol_value_magic, 0, 0, 0, 0,
+ print_symbol_value_magic, 0, 0, 0,
struct symbol_value_forward);
DEFINE_LRECORD_IMPLEMENTATION ("symbol-value-buffer-local",
symbol_value_buffer_local,
mark_symbol_value_buffer_local,
print_symbol_value_magic, 0, 0, 0,
- symbol_value_buffer_local_description,
struct symbol_value_buffer_local);
DEFINE_LRECORD_IMPLEMENTATION ("symbol-value-lisp-magic",
symbol_value_lisp_magic,
mark_symbol_value_lisp_magic,
print_symbol_value_magic, 0, 0, 0,
- symbol_value_lisp_magic_description,
struct symbol_value_lisp_magic);
DEFINE_LRECORD_IMPLEMENTATION ("symbol-value-varalias",
symbol_value_varalias,
mark_symbol_value_varalias,
print_symbol_value_magic, 0, 0, 0,
- symbol_value_varalias_description,
struct symbol_value_varalias);
\f
if (mask > 0) /* Not always per-buffer */
{
- Lisp_Object elt;
+ Lisp_Object tail;
/* Set value in each buffer which hasn't shadowed the default */
- LIST_LOOP_2 (elt, Vbuffer_alist)
+ LIST_LOOP (tail, Vbuffer_alist)
{
- struct buffer *b = XBUFFER (XCDR (elt));
+ struct buffer *b = XBUFFER (XCDR (XCAR (tail)));
if (!(b->local_var_flags & mask))
{
if (magicfun)
- magicfun (sym, &value, make_buffer (b), 0);
+ (magicfun) (sym, &value, make_buffer (b), 0);
*((Lisp_Object *) (offset + (char *) b)) = value;
}
}
if (mask > 0) /* Not always per-console */
{
- Lisp_Object console;
+ Lisp_Object tail;
/* Set value in each console which hasn't shadowed the default */
- LIST_LOOP_2 (console, Vconsole_list)
+ LIST_LOOP (tail, Vconsole_list)
{
- struct console *d = XCONSOLE (console);
+ Lisp_Object dev = XCAR (tail);
+ struct console *d = XCONSOLE (dev);
if (!(d->local_var_flags & mask))
{
if (magicfun)
- magicfun (sym, &value, console, 0);
+ (magicfun) (sym, &value, dev, 0);
*((Lisp_Object *) (offset + (char *) d)) = value;
}
}
|| !SYMBOL_VALUE_MAGIC_P (*store_pointer));
*store_pointer = newval;
}
+
else
{
- CONST struct symbol_value_forward *fwd = XSYMBOL_VALUE_FORWARD (ovalue);
+ CONST struct symbol_value_forward *fwd
+ = XSYMBOL_VALUE_FORWARD (ovalue);
+ int type = XSYMBOL_VALUE_MAGIC_TYPE (ovalue);
int (*magicfun) (Lisp_Object simm, Lisp_Object *val,
- Lisp_Object in_object, int flags)
- = symbol_value_forward_magicfun (fwd);
+ Lisp_Object in_object, int flags) =
+ symbol_value_forward_magicfun (fwd);
- switch (XSYMBOL_VALUE_MAGIC_TYPE (ovalue))
+ switch (type)
{
case SYMVAL_FIXNUM_FORWARD:
- CHECK_INT (newval);
- if (magicfun)
- magicfun (sym, &newval, Qnil, 0);
- *((int *) symbol_value_forward_forward (fwd)) = XINT (newval);
- return;
+ {
+ CHECK_INT (newval);
+ if (magicfun)
+ (magicfun) (sym, &newval, Qnil, 0);
+ *((int *) symbol_value_forward_forward (fwd)) = XINT (newval);
+ return;
+ }
case SYMVAL_BOOLEAN_FORWARD:
- if (magicfun)
- magicfun (sym, &newval, Qnil, 0);
- *((int *) symbol_value_forward_forward (fwd))
- = ((NILP (newval)) ? 0 : 1);
- return;
+ {
+ if (magicfun)
+ (magicfun) (sym, &newval, Qnil, 0);
+ *((int *) symbol_value_forward_forward (fwd))
+ = ((NILP (newval)) ? 0 : 1);
+ return;
+ }
case SYMVAL_OBJECT_FORWARD:
- if (magicfun)
- magicfun (sym, &newval, Qnil, 0);
- *((Lisp_Object *) symbol_value_forward_forward (fwd)) = newval;
- return;
+ {
+ if (magicfun)
+ (magicfun) (sym, &newval, Qnil, 0);
+ *((Lisp_Object *) symbol_value_forward_forward (fwd)) = newval;
+ return;
+ }
case SYMVAL_DEFAULT_BUFFER_FORWARD:
- set_default_buffer_slot_variable (sym, newval);
- return;
+ {
+ set_default_buffer_slot_variable (sym, newval);
+ return;
+ }
case SYMVAL_CURRENT_BUFFER_FORWARD:
- if (magicfun)
- magicfun (sym, &newval, make_buffer (current_buffer), 0);
- *((Lisp_Object *) ((char *) current_buffer
- + ((char *) symbol_value_forward_forward (fwd)
- - (char *) &buffer_local_flags)))
- = newval;
- return;
+ {
+ if (magicfun)
+ (magicfun) (sym, &newval, make_buffer (current_buffer), 0);
+ *((Lisp_Object *) ((char *) current_buffer
+ + ((char *) symbol_value_forward_forward (fwd)
+ - (char *) &buffer_local_flags)))
+ = newval;
+ return;
+ }
case SYMVAL_DEFAULT_CONSOLE_FORWARD:
- set_default_console_slot_variable (sym, newval);
- return;
+ {
+ set_default_console_slot_variable (sym, newval);
+ return;
+ }
case SYMVAL_SELECTED_CONSOLE_FORWARD:
- if (magicfun)
- magicfun (sym, &newval, Vselected_console, 0);
- *((Lisp_Object *) ((char *) XCONSOLE (Vselected_console)
- + ((char *) symbol_value_forward_forward (fwd)
- - (char *) &console_local_flags)))
- = newval;
- return;
+ {
+ if (magicfun)
+ (magicfun) (sym, &newval, Vselected_console, 0);
+ *((Lisp_Object *) ((char *) XCONSOLE (Vselected_console)
+ + ((char *) symbol_value_forward_forward (fwd)
+ - (char *) &console_local_flags)))
+ = newval;
+ return;
+ }
default:
abort ();
/* Retrieve the new alist element and new value. */
if (NILP (new_alist_el)
&& set_it_p)
- new_alist_el = buffer_local_alist_element (buf, sym, bfwd);
+ new_alist_el = buffer_local_alist_element (buf, sym, bfwd);
if (NILP (new_alist_el))
new_val = bfwd->default_value;
else if (NILP (symcons))
{
if (set_it_p)
- valcontents = assq_no_quit (sym, buf->local_var_alist);
+ valcontents = assq_no_quit (sym, buf->local_var_alist);
if (NILP (valcontents))
valcontents = bfwd->default_value;
else
CHECK_SYMBOL (sym);
- if (NILP (buffer))
- buf = current_buffer;
- else
+ if (!NILP (buffer))
{
CHECK_BUFFER (buffer);
buf = XBUFFER (buffer);
}
+ else
+ buf = current_buffer;
return find_symbol_value_1 (sym, buf,
/* If it bombs out at startup due to a
{
CHECK_SYMBOL (sym);
- if (NILP (console))
- console = Vselected_console;
- else
+ if (!NILP (console))
CHECK_CONSOLE (console);
+ else
+ console = Vselected_console;
return find_symbol_value_1 (sym, current_buffer, XCONSOLE (console), 0,
Qnil, 1);
{
/* WARNING: This function can be called when current_buffer is 0
and Vselected_console is Qnil, early in initialization. */
- struct console *con;
+ struct console *dev;
Lisp_Object valcontents;
CHECK_SYMBOL (sym);
return valcontents;
if (CONSOLEP (Vselected_console))
- con = XCONSOLE (Vselected_console);
+ dev = XCONSOLE (Vselected_console);
else
{
/* This can also get called while we're preparing to shutdown.
#### What should really happen in that case? Should we
actually fix things so we can't get here in that case? */
assert (!initialized || preparing_for_armageddon);
- con = 0;
+ dev = 0;
}
- return find_symbol_value_1 (sym, current_buffer, con, 1, Qnil, 1);
+ return find_symbol_value_1 (sym, current_buffer, dev, 1, Qnil, 1);
}
/* This is an optimized function for quick lookup of buffer local symbols
{
/* WARNING: This function can be called when current_buffer is 0
and Vselected_console is Qnil, early in initialization. */
- struct console *con;
+ struct console *dev;
Lisp_Object sym = find_it_p ? XCAR (symbol_cons) : symbol_cons;
CHECK_SYMBOL (sym);
if (CONSOLEP (Vselected_console))
- con = XCONSOLE (Vselected_console);
+ dev = XCONSOLE (Vselected_console);
else
{
/* This can also get called while we're preparing to shutdown.
#### What should really happen in that case? Should we
actually fix things so we can't get here in that case? */
assert (!initialized || preparing_for_armageddon);
- con = 0;
+ dev = 0;
}
- return find_symbol_value_1 (sym, current_buffer, con, 1,
+ return find_symbol_value_1 (sym, current_buffer, dev, 1,
find_it_p ? symbol_cons : Qnil,
find_it_p);
}
DEFUN ("symbol-value", Fsymbol_value, 1, 1, 0, /*
Return SYMBOL's value. Error if that is void.
*/
- (symbol))
+ (sym))
{
- Lisp_Object val = find_symbol_value (symbol);
+ Lisp_Object val = find_symbol_value (sym);
if (UNBOUNDP (val))
- return Fsignal (Qvoid_variable, list1 (symbol));
+ return Fsignal (Qvoid_variable, list1 (sym));
else
return val;
}
DEFUN ("set", Fset, 2, 2, 0, /*
Set SYMBOL's value to NEWVAL, and return NEWVAL.
*/
- (symbol, newval))
+ (sym, newval))
{
REGISTER Lisp_Object valcontents;
- struct Lisp_Symbol *sym;
/* remember, we're called by Fmakunbound() as well */
- CHECK_SYMBOL (symbol);
+ CHECK_SYMBOL (sym);
retry:
- sym = XSYMBOL (symbol);
- valcontents = sym->value;
-
- if (EQ (symbol, Qnil) ||
- EQ (symbol, Qt) ||
- SYMBOL_IS_KEYWORD (symbol))
- reject_constant_symbols (symbol, newval, 0,
+ valcontents = XSYMBOL (sym)->value;
+ if (NILP (sym) || EQ (sym, Qt) || SYMBOL_VALUE_MAGIC_P (valcontents)
+ || SYMBOL_IS_KEYWORD (sym))
+ reject_constant_symbols (sym, newval, 0,
UNBOUNDP (newval) ? Qmakunbound : Qset);
-
- if (!SYMBOL_VALUE_MAGIC_P (valcontents) || UNBOUNDP (valcontents))
+ else
{
- sym->value = newval;
+ XSYMBOL (sym)->value = newval;
return newval;
}
- reject_constant_symbols (symbol, newval, 0,
- UNBOUNDP (newval) ? Qmakunbound : Qset);
-
retry_2:
- switch (XSYMBOL_VALUE_MAGIC_TYPE (valcontents))
+ if (SYMBOL_VALUE_MAGIC_P (valcontents))
{
- case SYMVAL_LISP_MAGIC:
- {
- Lisp_Object retval;
-
- if (UNBOUNDP (newval))
- retval = maybe_call_magic_handler (symbol, Qmakunbound, 0);
- else
- retval = maybe_call_magic_handler (symbol, Qset, 1, newval);
- if (!UNBOUNDP (retval))
- return newval;
- valcontents = XSYMBOL_VALUE_LISP_MAGIC (valcontents)->shadowed;
- /* semi-change-o */
- goto retry_2;
- }
-
- case SYMVAL_VARALIAS:
- symbol = follow_varalias_pointers (symbol,
- UNBOUNDP (newval)
- ? Qmakunbound : Qset);
- /* presto change-o! */
- goto retry;
+ switch (XSYMBOL_VALUE_MAGIC_TYPE (valcontents))
+ {
+ case SYMVAL_LISP_MAGIC:
+ {
+ Lisp_Object retval;
- case SYMVAL_FIXNUM_FORWARD:
- case SYMVAL_BOOLEAN_FORWARD:
- case SYMVAL_OBJECT_FORWARD:
- case SYMVAL_DEFAULT_BUFFER_FORWARD:
- case SYMVAL_DEFAULT_CONSOLE_FORWARD:
- if (UNBOUNDP (newval))
- signal_error (Qerror,
- list2 (build_string ("Cannot makunbound"), symbol));
- break;
+ if (UNBOUNDP (newval))
+ retval = maybe_call_magic_handler (sym, Qmakunbound, 0);
+ else
+ retval = maybe_call_magic_handler (sym, Qset, 1, newval);
+ if (!UNBOUNDP (retval))
+ return newval;
+ valcontents = XSYMBOL_VALUE_LISP_MAGIC (valcontents)->shadowed;
+ /* semi-change-o */
+ goto retry_2;
+ }
- /* case SYMVAL_UNBOUND_MARKER: break; */
+ case SYMVAL_VARALIAS:
+ sym = follow_varalias_pointers (sym,
+ UNBOUNDP (newval)
+ ? Qmakunbound : Qset);
+ /* presto change-o! */
+ goto retry;
- case SYMVAL_CURRENT_BUFFER_FORWARD:
- {
- CONST struct symbol_value_forward *fwd
- = XSYMBOL_VALUE_FORWARD (valcontents);
- int mask = XINT (*((Lisp_Object *)
- symbol_value_forward_forward (fwd)));
- if (mask > 0)
- /* Setting this variable makes it buffer-local */
- current_buffer->local_var_flags |= mask;
- break;
- }
+ case SYMVAL_FIXNUM_FORWARD:
+ case SYMVAL_BOOLEAN_FORWARD:
+ case SYMVAL_OBJECT_FORWARD:
+ case SYMVAL_DEFAULT_BUFFER_FORWARD:
+ case SYMVAL_DEFAULT_CONSOLE_FORWARD:
+ if (UNBOUNDP (newval))
+ signal_error (Qerror,
+ list2 (build_string ("Cannot makunbound"), sym));
+ break;
- case SYMVAL_SELECTED_CONSOLE_FORWARD:
- {
- CONST struct symbol_value_forward *fwd
- = XSYMBOL_VALUE_FORWARD (valcontents);
- int mask = XINT (*((Lisp_Object *)
- symbol_value_forward_forward (fwd)));
- if (mask > 0)
- /* Setting this variable makes it console-local */
- XCONSOLE (Vselected_console)->local_var_flags |= mask;
- break;
- }
+ case SYMVAL_UNBOUND_MARKER:
+ break;
- case SYMVAL_BUFFER_LOCAL:
- case SYMVAL_SOME_BUFFER_LOCAL:
- {
- /* If we want to examine or set the value and
- CURRENT-BUFFER is current, we just examine or set
- CURRENT-VALUE. If CURRENT-BUFFER is not current, we
- store the current CURRENT-VALUE value into
- CURRENT-ALIST- ELEMENT, then find the appropriate alist
- element for the buffer now current and set up
- CURRENT-ALIST-ELEMENT. Then we set CURRENT-VALUE out
- of that element, and store into CURRENT-BUFFER.
-
- If we are setting the variable and the current buffer does
- not have an alist entry for this variable, an alist entry is
- created.
-
- Note that CURRENT-VALUE can be a forwarding pointer.
- Each time it is examined or set, forwarding must be
- done. */
- struct symbol_value_buffer_local *bfwd
- = XSYMBOL_VALUE_BUFFER_LOCAL (valcontents);
- int some_buffer_local_p =
- (bfwd->magic.type == SYMVAL_SOME_BUFFER_LOCAL);
- /* What value are we caching right now? */
- Lisp_Object aelt = bfwd->current_alist_element;
+ case SYMVAL_CURRENT_BUFFER_FORWARD:
+ {
+ CONST struct symbol_value_forward *fwd
+ = XSYMBOL_VALUE_FORWARD (valcontents);
+ int mask = XINT (*((Lisp_Object *)
+ symbol_value_forward_forward (fwd)));
+ if (mask > 0)
+ /* Setting this variable makes it buffer-local */
+ current_buffer->local_var_flags |= mask;
+ break;
+ }
- if (!NILP (bfwd->current_buffer) &&
- current_buffer == XBUFFER (bfwd->current_buffer)
- && ((some_buffer_local_p)
- ? 1 /* doesn't automatically become local */
- : !NILP (aelt) /* already local */
- ))
+ case SYMVAL_SELECTED_CONSOLE_FORWARD:
{
- /* Cache is valid */
- valcontents = bfwd->current_value;
+ CONST struct symbol_value_forward *fwd
+ = XSYMBOL_VALUE_FORWARD (valcontents);
+ int mask = XINT (*((Lisp_Object *)
+ symbol_value_forward_forward (fwd)));
+ if (mask > 0)
+ /* Setting this variable makes it console-local */
+ XCONSOLE (Vselected_console)->local_var_flags |= mask;
+ break;
}
- else
+
+ case SYMVAL_BUFFER_LOCAL:
+ case SYMVAL_SOME_BUFFER_LOCAL:
{
- /* If the current buffer is not the buffer whose binding is
- currently cached, or if it's a SYMVAL_BUFFER_LOCAL and
- we're looking at the default value, the cache is invalid; we
- need to write it out, and find the new CURRENT-ALIST-ELEMENT
- */
-
- /* Write out the cached value for the old buffer; copy it
- back to its alist element. This works if the current
- buffer only sees the default value, too. */
- write_out_buffer_local_cache (symbol, bfwd);
-
- /* Find the new value for CURRENT-ALIST-ELEMENT. */
- aelt = buffer_local_alist_element (current_buffer, symbol, bfwd);
- if (NILP (aelt))
+ /* If we want to examine or set the value and
+ CURRENT-BUFFER is current, we just examine or set
+ CURRENT-VALUE. If CURRENT-BUFFER is not current, we
+ store the current CURRENT-VALUE value into
+ CURRENT-ALIST- ELEMENT, then find the appropriate alist
+ element for the buffer now current and set up
+ CURRENT-ALIST-ELEMENT. Then we set CURRENT-VALUE out
+ of that element, and store into CURRENT-BUFFER.
+
+ If we are setting the variable and the current buffer does
+ not have an alist entry for this variable, an alist entry is
+ created.
+
+ Note that CURRENT-VALUE can be a forwarding pointer.
+ Each time it is examined or set, forwarding must be
+ done. */
+ struct symbol_value_buffer_local *bfwd
+ = XSYMBOL_VALUE_BUFFER_LOCAL (valcontents);
+ int some_buffer_local_p =
+ (bfwd->magic.type == SYMVAL_SOME_BUFFER_LOCAL);
+ /* What value are we caching right now? */
+ Lisp_Object aelt = bfwd->current_alist_element;
+
+ if (!NILP (bfwd->current_buffer) &&
+ current_buffer == XBUFFER (bfwd->current_buffer)
+ && ((some_buffer_local_p)
+ ? 1 /* doesn't automatically become local */
+ : !NILP (aelt) /* already local */
+ ))
{
- /* This buffer is still seeing the default value. */
- if (!some_buffer_local_p)
- {
- /* If it's a SYMVAL_BUFFER_LOCAL, give this buffer a
- new assoc for a local value and set
- CURRENT-ALIST-ELEMENT to point to that. */
- aelt =
- do_symval_forwarding (bfwd->current_value,
- current_buffer,
- XCONSOLE (Vselected_console));
- aelt = Fcons (symbol, aelt);
- current_buffer->local_var_alist
- = Fcons (aelt, current_buffer->local_var_alist);
- }
- else
+ /* Cache is valid */
+ valcontents = bfwd->current_value;
+ }
+ else
+ {
+ /* If the current buffer is not the buffer whose binding is
+ currently cached, or if it's a SYMVAL_BUFFER_LOCAL and
+ we're looking at the default value, the cache is invalid; we
+ need to write it out, and find the new CURRENT-ALIST-ELEMENT
+ */
+
+ /* Write out the cached value for the old buffer; copy it
+ back to its alist element. This works if the current
+ buffer only sees the default value, too. */
+ write_out_buffer_local_cache (sym, bfwd);
+
+ /* Find the new value for CURRENT-ALIST-ELEMENT. */
+ aelt = buffer_local_alist_element (current_buffer, sym, bfwd);
+ if (NILP (aelt))
{
- /* If the variable is a SYMVAL_SOME_BUFFER_LOCAL,
- we're currently seeing the default value. */
- ;
+ /* This buffer is still seeing the default value. */
+ if (!some_buffer_local_p)
+ {
+ /* If it's a SYMVAL_BUFFER_LOCAL, give this buffer a
+ new assoc for a local value and set
+ CURRENT-ALIST-ELEMENT to point to that. */
+ aelt =
+ do_symval_forwarding (bfwd->current_value,
+ current_buffer,
+ XCONSOLE (Vselected_console));
+ aelt = Fcons (sym, aelt);
+ current_buffer->local_var_alist
+ = Fcons (aelt, current_buffer->local_var_alist);
+ }
+ else
+ {
+ /* If the variable is a SYMVAL_SOME_BUFFER_LOCAL,
+ we're currently seeing the default value. */
+ ;
+ }
}
+ /* Cache the new buffer's assoc in CURRENT-ALIST-ELEMENT. */
+ bfwd->current_alist_element = aelt;
+ /* Set BUFFER, now that CURRENT-ALIST-ELEMENT is accurate. */
+ XSETBUFFER (bfwd->current_buffer, current_buffer);
+ valcontents = bfwd->current_value;
}
- /* Cache the new buffer's assoc in CURRENT-ALIST-ELEMENT. */
- bfwd->current_alist_element = aelt;
- /* Set BUFFER, now that CURRENT-ALIST-ELEMENT is accurate. */
- XSETBUFFER (bfwd->current_buffer, current_buffer);
- valcontents = bfwd->current_value;
+ break;
}
- break;
- }
- default:
- abort ();
+ default:
+ abort ();
+ }
}
- store_symval_forwarding (symbol, valcontents, newval);
+ store_symval_forwarding (sym, valcontents, newval);
return newval;
}
XCONSOLE (Vselected_console));
}
- RETURN_NOT_REACHED (Qnil) /* suppress compiler warning */
+ RETURN_NOT_REACHED(Qnil) /* suppress compiler warning */
}
DEFUN ("default-boundp", Fdefault_boundp, 1, 1, 0, /*
This is the value that is seen in buffers that do not have their own values
for this variable.
*/
- (symbol))
+ (sym))
{
- return UNBOUNDP (default_value (symbol)) ? Qnil : Qt;
+ return UNBOUNDP (default_value (sym)) ? Qnil : Qt;
}
DEFUN ("default-value", Fdefault_value, 1, 1, 0, /*
for this variable. The default value is meaningful for variables with
local bindings in certain buffers.
*/
- (symbol))
+ (sym))
{
- Lisp_Object value = default_value (symbol);
+ Lisp_Object value = default_value (sym);
- return UNBOUNDP (value) ? Fsignal (Qvoid_variable, list1 (symbol)) : value;
+ return UNBOUNDP (value) ? Fsignal (Qvoid_variable, list1 (sym)) : value;
}
DEFUN ("set-default", Fset_default, 2, 2, 0, /*
The default value is seen in buffers that do not have their own values
for this variable.
*/
- (symbol, value))
+ (sym, value))
{
Lisp_Object valcontents;
- CHECK_SYMBOL (symbol);
+ CHECK_SYMBOL (sym);
retry:
- valcontents = XSYMBOL (symbol)->value;
+ valcontents = XSYMBOL (sym)->value;
retry_2:
if (!SYMBOL_VALUE_MAGIC_P (valcontents))
- return Fset (symbol, value);
+ return Fset (sym, value);
switch (XSYMBOL_VALUE_MAGIC_TYPE (valcontents))
{
case SYMVAL_LISP_MAGIC:
- RETURN_IF_NOT_UNBOUND (maybe_call_magic_handler (symbol, Qset_default, 1,
+ RETURN_IF_NOT_UNBOUND (maybe_call_magic_handler (sym, Qset_default, 1,
value));
valcontents = XSYMBOL_VALUE_LISP_MAGIC (valcontents)->shadowed;
/* semi-change-o */
goto retry_2;
case SYMVAL_VARALIAS:
- symbol = follow_varalias_pointers (symbol, Qset_default);
+ sym = follow_varalias_pointers (sym, Qset_default);
/* presto change-o! */
goto retry;
case SYMVAL_CURRENT_BUFFER_FORWARD:
- set_default_buffer_slot_variable (symbol, value);
+ set_default_buffer_slot_variable (sym, value);
return value;
case SYMVAL_SELECTED_CONSOLE_FORWARD:
- set_default_console_slot_variable (symbol, value);
+ set_default_console_slot_variable (sym, value);
return value;
case SYMVAL_BUFFER_LOCAL:
/* If current-buffer doesn't shadow default_value,
* we must set the CURRENT-VALUE slot too */
if (NILP (bfwd->current_alist_element))
- store_symval_forwarding (symbol, bfwd->current_value, value);
+ store_symval_forwarding (sym, bfwd->current_value, value);
return value;
}
default:
- return Fset (symbol, value);
+ return Fset (sym, value);
}
+ RETURN_NOT_REACHED(Qnil) /* suppress compiler warning */
}
-DEFUN ("setq-default", Fsetq_default, 0, UNEVALLED, 0, /*
-Set the default value of variable SYMBOL to VALUE.
-SYMBOL, the variable name, is literal (not evaluated);
+DEFUN ("setq-default", Fsetq_default, 2, UNEVALLED, 0, /*
+Set the default value of variable SYM to VALUE.
+SYM, the variable name, is literal (not evaluated);
VALUE is an expression and it is evaluated.
The default value of a variable is seen in buffers
that do not have their own values for the variable.
More generally, you can use multiple variables and values, as in
- (setq-default SYMBOL VALUE SYMBOL VALUE...)
-This sets each SYMBOL's default value to the corresponding VALUE.
-The VALUE for the Nth SYMBOL can refer to the new default values
-of previous SYMBOLs.
+ (setq-default SYM VALUE SYM VALUE...)
+This sets each SYM's default value to the corresponding VALUE.
+The VALUE for the Nth SYM can refer to the new default values
+of previous SYMs.
*/
(args))
{
/* This function can GC */
- Lisp_Object symbol, tail, val = Qnil;
- int nargs;
+ Lisp_Object args_left;
+ Lisp_Object val, sym;
struct gcpro gcpro1;
- GET_LIST_LENGTH (args, nargs);
-
- if (nargs & 1) /* Odd number of arguments? */
- Fsignal (Qwrong_number_of_arguments,
- list2 (Qsetq_default, make_int (nargs)));
+ if (NILP (args))
+ return Qnil;
- GCPRO1 (val);
+ args_left = args;
+ GCPRO1 (args);
- PROPERTY_LIST_LOOP (tail, symbol, val, args)
+ do
{
- val = Feval (val);
- Fset_default (symbol, val);
+ val = Feval (Fcar (Fcdr (args_left)));
+ sym = Fcar (args_left);
+ Fset_default (sym, val);
+ args_left = Fcdr (Fcdr (args_left));
}
+ while (!NILP (args_left));
UNGCPRO;
return val;
{
struct symbol_value_buffer_local *bfwd
= alloc_lcrecord_type (struct symbol_value_buffer_local,
- &lrecord_symbol_value_buffer_local);
+ lrecord_symbol_value_buffer_local);
Lisp_Object foo;
bfwd->magic.type = SYMVAL_BUFFER_LOCAL;
/* Make sure variable is set up to hold per-buffer values */
bfwd = alloc_lcrecord_type (struct symbol_value_buffer_local,
- &lrecord_symbol_value_buffer_local);
+ lrecord_symbol_value_buffer_local);
bfwd->magic.type = SYMVAL_SOME_BUFFER_LOCAL;
bfwd->current_buffer = Qnil;
Lisp_Object oldval = * (Lisp_Object *)
(offset + (char *) XCONSOLE (Vconsole_defaults));
if (magicfun)
- magicfun (variable, &oldval, Vselected_console, 0);
+ (magicfun) (variable, &oldval, Vselected_console, 0);
*(Lisp_Object *) (offset + (char *) XCONSOLE (Vselected_console))
= oldval;
XCONSOLE (Vselected_console)->local_var_flags &= ~mask;
default:
return variable;
}
+ RETURN_NOT_REACHED(Qnil) /* suppress compiler warning */
}
/* Used by specbind to determine what effects it might have. Returns:
CHECK_SYMBOL (symbol);
CHECK_BUFFER (buffer);
value = symbol_value_in_buffer (symbol, buffer);
- return UNBOUNDP (value) ? unbound_value : value;
+ if (UNBOUNDP (value))
+ return unbound_value;
+ else
+ return value;
}
DEFUN ("symbol-value-in-console", Fsymbol_value_in_console, 2, 3, 0, /*
CHECK_SYMBOL (symbol);
CHECK_CONSOLE (console);
value = symbol_value_in_console (symbol, console);
- return UNBOUNDP (value) ? unbound_value : value;
+ if (UNBOUNDP (value))
+ return unbound_value;
+ else
+ return value;
}
DEFUN ("built-in-variable-type", Fbuilt_in_variable_type, 1, 1, 0, /*
-If SYMBOL is a built-in variable, return info about this; else return nil.
+If SYM is a built-in variable, return info about this; else return nil.
The returned info will be a symbol, one of
`object' A simple built-in variable.
`default-console' Forwards to the default value of a built-in
console-local variable.
*/
- (symbol))
+ (sym))
{
REGISTER Lisp_Object valcontents;
- CHECK_SYMBOL (symbol);
+ CHECK_SYMBOL (sym);
retry:
- valcontents = XSYMBOL (symbol)->value;
-
+ valcontents = XSYMBOL (sym)->value;
retry_2:
- if (!SYMBOL_VALUE_MAGIC_P (valcontents))
- return Qnil;
- switch (XSYMBOL_VALUE_MAGIC_TYPE (valcontents))
+ if (SYMBOL_VALUE_MAGIC_P (valcontents))
{
- case SYMVAL_LISP_MAGIC:
- valcontents = XSYMBOL_VALUE_LISP_MAGIC (valcontents)->shadowed;
- /* semi-change-o */
- goto retry_2;
+ switch (XSYMBOL_VALUE_MAGIC_TYPE (valcontents))
+ {
+ case SYMVAL_LISP_MAGIC:
+ valcontents = XSYMBOL_VALUE_LISP_MAGIC (valcontents)->shadowed;
+ /* semi-change-o */
+ goto retry_2;
- case SYMVAL_VARALIAS:
- symbol = follow_varalias_pointers (symbol, Qt);
- /* presto change-o! */
- goto retry;
+ case SYMVAL_VARALIAS:
+ sym = follow_varalias_pointers (sym, Qt);
+ /* presto change-o! */
+ goto retry;
- case SYMVAL_BUFFER_LOCAL:
- case SYMVAL_SOME_BUFFER_LOCAL:
- valcontents =
- XSYMBOL_VALUE_BUFFER_LOCAL (valcontents)->current_value;
- /* semi-change-o */
- goto retry_2;
+ case SYMVAL_BUFFER_LOCAL:
+ case SYMVAL_SOME_BUFFER_LOCAL:
+ valcontents =
+ XSYMBOL_VALUE_BUFFER_LOCAL (valcontents)->current_value;
+ /* semi-change-o */
+ goto retry_2;
- case SYMVAL_FIXNUM_FORWARD: return Qinteger;
- case SYMVAL_CONST_FIXNUM_FORWARD: return Qconst_integer;
- case SYMVAL_BOOLEAN_FORWARD: return Qboolean;
- case SYMVAL_CONST_BOOLEAN_FORWARD: return Qconst_boolean;
- case SYMVAL_OBJECT_FORWARD: return Qobject;
- case SYMVAL_CONST_OBJECT_FORWARD: return Qconst_object;
- case SYMVAL_CONST_SPECIFIER_FORWARD: return Qconst_specifier;
- case SYMVAL_DEFAULT_BUFFER_FORWARD: return Qdefault_buffer;
- case SYMVAL_CURRENT_BUFFER_FORWARD: return Qcurrent_buffer;
- case SYMVAL_CONST_CURRENT_BUFFER_FORWARD: return Qconst_current_buffer;
- case SYMVAL_DEFAULT_CONSOLE_FORWARD: return Qdefault_console;
- case SYMVAL_SELECTED_CONSOLE_FORWARD: return Qselected_console;
- case SYMVAL_CONST_SELECTED_CONSOLE_FORWARD: return Qconst_selected_console;
- case SYMVAL_UNBOUND_MARKER: return Qnil;
+ case SYMVAL_FIXNUM_FORWARD:
+ return Qinteger;
- default:
- abort (); return Qnil;
+ case SYMVAL_CONST_FIXNUM_FORWARD:
+ return Qconst_integer;
+
+ case SYMVAL_BOOLEAN_FORWARD:
+ return Qboolean;
+
+ case SYMVAL_CONST_BOOLEAN_FORWARD:
+ return Qconst_boolean;
+
+ case SYMVAL_OBJECT_FORWARD:
+ return Qobject;
+
+ case SYMVAL_CONST_OBJECT_FORWARD:
+ return Qconst_object;
+
+ case SYMVAL_CONST_SPECIFIER_FORWARD:
+ return Qconst_specifier;
+
+ case SYMVAL_DEFAULT_BUFFER_FORWARD:
+ return Qdefault_buffer;
+
+ case SYMVAL_CURRENT_BUFFER_FORWARD:
+ return Qcurrent_buffer;
+
+ case SYMVAL_CONST_CURRENT_BUFFER_FORWARD:
+ return Qconst_current_buffer;
+
+ case SYMVAL_DEFAULT_CONSOLE_FORWARD:
+ return Qdefault_console;
+
+ case SYMVAL_SELECTED_CONSOLE_FORWARD:
+ return Qselected_console;
+
+ case SYMVAL_CONST_SELECTED_CONSOLE_FORWARD:
+ return Qconst_selected_console;
+
+ case SYMVAL_UNBOUND_MARKER:
+ return Qnil;
+
+ default:
+ abort ();
+ }
}
+
+ return Qnil;
}
gets into its final form. I currently like the way everything is
set up and it has all the features I want it to have, except for
one: I really want to be able to have multiple nested handlers,
-to implement an `advice'-like capability. This would allow,
+to implement an `advice'-like capabiility. This would allow,
for example, a clean way of implementing `debug-if-set' or
`debug-if-referenced' and such.
if (!SYMBOL_VALUE_LISP_MAGIC_P (valcontents))
{
bfwd = alloc_lcrecord_type (struct symbol_value_lisp_magic,
- &lrecord_symbol_value_lisp_magic);
+ lrecord_symbol_value_lisp_magic);
bfwd->magic.type = SYMVAL_LISP_MAGIC;
for (i = 0; i < MAGIC_HANDLER_MAX; i++)
{
\f
/* functions for working with variable aliases. */
-/* Follow the chain of variable aliases for SYMBOL. Return the
+/* Follow the chain of variable aliases for OBJECT. Return the
resulting symbol, whose value cell is guaranteed not to be a
symbol-value-varalias.
*/
static Lisp_Object
-follow_varalias_pointers (Lisp_Object symbol,
+follow_varalias_pointers (Lisp_Object object,
Lisp_Object follow_past_lisp_magic)
{
-#define VARALIAS_INDIRECTION_SUSPICION_LENGTH 16
- Lisp_Object tortoise, hare, val;
- int count;
+ Lisp_Object tortoise = object;
+ Lisp_Object hare = object;
/* quick out just in case */
- if (!SYMBOL_VALUE_MAGIC_P (XSYMBOL (symbol)->value))
- return symbol;
-
- /* Compare implementation of indirect_function(). */
- for (hare = tortoise = symbol, count = 0;
- val = fetch_value_maybe_past_magic (hare, follow_past_lisp_magic),
- SYMBOL_VALUE_VARALIAS_P (val);
- hare = symbol_value_varalias_aliasee (XSYMBOL_VALUE_VARALIAS (val)),
- count++)
+ if (!SYMBOL_VALUE_MAGIC_P (XSYMBOL (object)->value))
+ return object;
+
+ /* based off of indirect_function() */
+ for (;;)
{
- if (count < VARALIAS_INDIRECTION_SUSPICION_LENGTH) continue;
+ Lisp_Object value;
+
+ value = fetch_value_maybe_past_magic (hare, follow_past_lisp_magic);
+ if (!SYMBOL_VALUE_VARALIAS_P (value))
+ break;
+ hare = symbol_value_varalias_aliasee (XSYMBOL_VALUE_VARALIAS (value));
+ value = fetch_value_maybe_past_magic (hare, follow_past_lisp_magic);
+ if (!SYMBOL_VALUE_VARALIAS_P (value))
+ break;
+ hare = symbol_value_varalias_aliasee (XSYMBOL_VALUE_VARALIAS (value));
+
+ value = fetch_value_maybe_past_magic (tortoise, follow_past_lisp_magic);
+ tortoise = symbol_value_varalias_aliasee
+ (XSYMBOL_VALUE_VARALIAS (value));
- if (count & 1)
- tortoise = symbol_value_varalias_aliasee
- (XSYMBOL_VALUE_VARALIAS (fetch_value_maybe_past_magic
- (tortoise, follow_past_lisp_magic)));
if (EQ (hare, tortoise))
- return Fsignal (Qcyclic_variable_indirection, list1 (symbol));
+ return Fsignal (Qcyclic_variable_indirection, list1 (object));
}
return hare;
reject_constant_symbols (variable, Qunbound, 0, Qt);
bfwd = alloc_lcrecord_type (struct symbol_value_varalias,
- &lrecord_symbol_value_varalias);
+ lrecord_symbol_value_varalias);
bfwd->magic.type = SYMVAL_VARALIAS;
bfwd->aliasee = alias;
bfwd->shadowed = valcontents;
{ { symbol_value_forward_lheader_initializer, 0, 69},
SYMVAL_UNBOUND_MARKER };
+Lisp_Object Vpure_uninterned_symbol_table;
+
void
init_symbols_once_early (void)
{
#ifndef Qnull_pointer
/* C guarantees that Qnull_pointer will be initialized to all 0 bits,
- so the following is actually a no-op. */
+ so the following is a actually a no-op. */
XSETOBJ (Qnull_pointer, (enum Lisp_Type) 0, 0);
#endif
- /* Bootstrapping problem: Qnil isn't set when make_string_nocopy is
+ /* see comment in Fpurecopy() */
+ Vpure_uninterned_symbol_table =
+ make_lisp_hashtable (50, HASHTABLE_NONWEAK, HASHTABLE_EQ);
+ staticpro (&Vpure_uninterned_symbol_table);
+
+ Qnil = Fmake_symbol (make_pure_pname ((CONST Bufbyte *) "nil", 3, 1));
+ /* Bootstrapping problem: Qnil isn't set when make_pure_pname is
called the first time. */
- Qnil = Fmake_symbol (make_string_nocopy ((CONST Bufbyte *) "nil", 3));
XSYMBOL (Qnil)->name->plist = Qnil;
XSYMBOL (Qnil)->value = Qnil; /* Nihil ex nihil */
XSYMBOL (Qnil)->plist = Qnil;
{
int hash = hash_string (string_data (XSYMBOL (Qnil)->name), 3);
XVECTOR_DATA (Vobarray)[hash % OBARRAY_SIZE] = Qnil;
+ XSYMBOL (Qnil)->obarray = Qt;
}
{
void
defsymbol (Lisp_Object *location, CONST char *name)
{
- *location = Fintern (make_string_nocopy ((CONST Bufbyte *) name,
- strlen (name)),
+ *location = Fintern (make_pure_pname ((CONST Bufbyte *) name,
+ strlen (name), 1),
Qnil);
staticpro (location);
}
Fset (*location, *location);
}
-#ifdef DEBUG_XEMACS
-/* Check that nobody spazzed writing a DEFUN. */
-static void
-check_sane_subr (Lisp_Subr *subr, Lisp_Object sym)
+void
+defsubr (struct Lisp_Subr *subr)
{
+ Lisp_Object sym = intern (subr_name (subr));
+
+#ifdef DEBUG_XEMACS
+ /* Check that nobody spazzed writing a DEFUN. */
assert (subr->min_args >= 0);
assert (subr->min_args <= SUBR_MAX_ARGS);
- if (subr->max_args != MANY &&
- subr->max_args != UNEVALLED)
+ if (subr->max_args != MANY && subr->max_args != UNEVALLED)
{
/* Need to fix lisp.h and eval.c if SUBR_MAX_ARGS too small */
assert (subr->max_args <= SUBR_MAX_ARGS);
}
assert (UNBOUNDP (XSYMBOL (sym)->function));
-}
-#else
-#define check_sane_subr(subr, sym) /* nothing */
-#endif
+#endif /* DEBUG_XEMACS */
-#ifdef HAVE_SHLIB
-/*
- * If we are not in a pure undumped Emacs, we need to make a duplicate of
- * the subr. This is because the only time this function will be called
- * in a running Emacs is when a dynamically loaded module is adding a
- * subr, and we need to make sure that the subr is in allocated, Lisp-
- * accessible memory. The address assigned to the static subr struct
- * in the shared object will be a trampoline address, so we need to create
- * a copy here to ensure that a real address is used.
- *
- * Once we have copied everything across, we re-use the original static
- * structure to store a pointer to the newly allocated one. This will be
- * used in emodules.c by emodules_doc_subr() to find a pointer to the
- * allocated object so that we can set its doc string propperly.
- *
- * NOTE: We dont actually use the DOC pointer here any more, but we did
- * in an earlier implementation of module support. There is no harm in
- * setting it here in case we ever need it in future implementations.
- * subr->doc will point to the new subr structure that was allocated.
- * Code can then get this value from the statis subr structure and use
- * it if required.
- *
- * FIXME: Should newsubr be staticpro()'ed? I dont think so but I need
- * a guru to check.
- */
-#define check_module_subr() \
-do { \
- if (initialized) { \
- struct Lisp_Subr *newsubr; \
- newsubr = (Lisp_Subr *)xmalloc(sizeof(struct Lisp_Subr)); \
- memcpy (newsubr, subr, sizeof(struct Lisp_Subr)); \
- subr->doc = (CONST char *)newsubr; \
- subr = newsubr; \
- } \
-} while (0)
-#else /* ! HAVE_SHLIB */
-#define check_module_subr()
-#endif
-
-void
-defsubr (Lisp_Subr *subr)
-{
- Lisp_Object sym = intern (subr_name (subr));
- Lisp_Object fun;
-
- check_sane_subr (subr, sym);
- check_module_subr ();
-
- XSETSUBR (fun, subr);
- XSYMBOL (sym)->function = fun;
-}
-
-/* Define a lisp macro using a Lisp_Subr. */
-void
-defsubr_macro (Lisp_Subr *subr)
-{
- Lisp_Object sym = intern (subr_name (subr));
- Lisp_Object fun;
-
- check_sane_subr (subr, sym);
- check_module_subr();
-
- XSETSUBR (fun, subr);
- XSYMBOL (sym)->function = Fcons (Qmacro, fun);
+ XSETSUBR (XSYMBOL (sym)->function, subr);
}
void
defsymbol (&Qmakunbound, "makunbound");
defsymbol (&Qsymbol_value, "symbol-value");
defsymbol (&Qset, "set");
- defsymbol (&Qsetq_default, "setq-default");
defsymbol (&Qdefault_boundp, "default-boundp");
defsymbol (&Qdefault_value, "default-value");
defsymbol (&Qset_default, "set-default");
DEFSUBR (Ffboundp);
DEFSUBR (Ffset);
DEFSUBR (Fdefine_function);
- Ffset (intern ("defalias"), intern ("define-function"));
DEFSUBR (Fsetplist);
DEFSUBR (Fsymbol_value_in_buffer);
DEFSUBR (Fsymbol_value_in_console);
DEFSUBR (Fdontusethis_set_symbol_value_handler);
}
-/* Create and initialize a Lisp variable whose value is forwarded to C data */
+/* Create and initialize a variable whose value is forwarded to C data */
void
-defvar_magic (CONST char *symbol_name, CONST struct symbol_value_forward *magic)
+defvar_mumble (CONST char *namestring, CONST void *magic, size_t sizeof_magic)
{
- Lisp_Object sym, kludge;
+ Lisp_Object kludge;
+ Lisp_Object sym = Fintern (make_pure_pname ((CONST Bufbyte *) namestring,
+ strlen (namestring),
+ 1),
+ Qnil);
- /* Check that `magic' points somewhere we can represent as a Lisp pointer */
+ /* Check that magic points somewhere we can represent as a Lisp pointer */
XSETOBJ (kludge, Lisp_Type_Record, magic);
- if ((void *)magic != (void*) XPNTR (kludge))
+ if (magic != (CONST void *) XPNTR (kludge))
{
/* This might happen on DATA_SEG_BITS machines. */
/* abort (); */
/* Copy it to somewhere which is representable. */
- struct symbol_value_forward *p = xnew (struct symbol_value_forward);
- memcpy (p, magic, sizeof *magic);
- magic = p;
+ void *f = xmalloc (sizeof_magic);
+ memcpy (f, magic, sizeof_magic);
+ XSETOBJ (XSYMBOL (sym)->value, Lisp_Type_Record, f);
}
-
-#if defined(HAVE_SHLIB)
- /*
- * As with defsubr(), this will only be called in a dumped Emacs when
- * we are adding variables from a dynamically loaded module. That means
- * we can't use purespace. Take that into account.
- */
- if (initialized)
- sym = Fintern (build_string (symbol_name), Qnil);
else
-#endif
- sym = Fintern (make_string_nocopy ((CONST Bufbyte *) symbol_name,
- strlen (symbol_name)), Qnil);
-
- XSETOBJ (XSYMBOL (sym)->value, Lisp_Type_Record, magic);
+ XSETOBJ (XSYMBOL (sym)->value, Lisp_Type_Record, magic);
}
void
void syms_of_dialog (void);
void syms_of_dired (void);
void syms_of_dired_mswindows (void);
+void syms_of_dll (void);
void syms_of_doc (void);
void syms_of_dragdrop (void);
void syms_of_editfns (void);
void syms_of_general (void);
void syms_of_glyphs_x (void);
void syms_of_glyphs_eimage (void);
-void syms_of_glyphs_widget (void);
void syms_of_glyphs_mswindows (void);
void syms_of_glyphs (void);
void syms_of_gui_x (void);
void syms_of_menubar (void);
void syms_of_menubar_mswindows (void);
void syms_of_minibuf (void);
-void syms_of_module (void);
void syms_of_mule (void);
void syms_of_mule_canna (void);
void syms_of_mule_ccl (void);
void syms_of_mule_charset (void);
-void syms_of_file_coding (void);
+void syms_of_mule_coding (void);
void syms_of_mule_wnn (void);
-void syms_of_ntproc (void);
void syms_of_objects_tty (void);
void syms_of_objects_x (void);
void syms_of_objects_mswindows (void);
void syms_of_scrollbar (void);
void syms_of_scrollbar_mswindows(void);
void syms_of_search (void);
-void syms_of_select (void);
void syms_of_select_mswindows (void);
void syms_of_signal (void);
void syms_of_sound (void);
void console_type_create_objects_x (void);
void console_type_create_redisplay_x (void);
void console_type_create_scrollbar_x (void);
-void console_type_create_select_x (void);
void console_type_create_toolbar_x (void);
void console_type_create_dialog_x (void);
void console_type_create_mswindows (void);
void console_type_create_toolbar_mswindows (void);
void console_type_create_glyphs_mswindows (void);
void console_type_create_dialog_mswindows (void);
-void console_type_create_select_mswindows (void);
/* Initialize the specifier types (dump-time only). */
void structure_type_create_chartab (void);
void structure_type_create_faces (void);
void structure_type_create_rangetab (void);
-void structure_type_create_hash_table (void);
+void structure_type_create_hashtable (void);
/* Initialize the image instantiator types (dump-time only). */
void image_instantiator_format_create (void);
void image_instantiator_format_create_glyphs_eimage (void);
-void image_instantiator_format_create_glyphs_widget (void);
void image_instantiator_format_create_glyphs_x (void);
void image_instantiator_format_create_glyphs_mswindows (void);
-void image_instantiator_format_create_glyphs_tty (void);
/* Initialize the lstream types (dump-time only). */
void lstream_type_create (void);
-void lstream_type_create_file_coding (void);
+void lstream_type_create_mule_coding (void);
void lstream_type_create_print (void);
void lstream_type_create_mswindows_selectable (void);
void vars_of_bytecode (void);
void vars_of_callint (void);
void vars_of_callproc (void);
-void vars_of_chartab (void);
void vars_of_cmdloop (void);
void vars_of_cmds (void);
void vars_of_console (void);
void vars_of_frame (void);
void vars_of_glyphs_x (void);
void vars_of_glyphs_eimage (void);
-void vars_of_glyphs_widget (void);
void vars_of_glyphs_mswindows (void);
void vars_of_glyphs (void);
void vars_of_gui_x (void);
void vars_of_menubar (void);
void vars_of_menubar_mswindows (void);
void vars_of_minibuf (void);
-void vars_of_module (void);
void vars_of_mule (void);
void vars_of_mule_canna (void);
-void vars_of_mule_ccl(void);
void vars_of_mule_charset (void);
-void vars_of_file_coding (void);
+void vars_of_mule_coding (void);
void vars_of_mule_wnn (void);
-void vars_of_ntproc (void);
void vars_of_objects (void);
void vars_of_objects_tty (void);
void vars_of_objects_mswindows (void);
void vars_of_scrollbar (void);
void vars_of_scrollbar_mswindows (void);
void vars_of_search (void);
-void vars_of_select (void);
void vars_of_select_mswindows (void);
void vars_of_sound (void);
void vars_of_specifier (void);
void complex_vars_of_extents (void);
void complex_vars_of_faces (void);
void complex_vars_of_mule_charset (void);
-void complex_vars_of_file_coding (void);
+void complex_vars_of_mule_coding (void);
void complex_vars_of_glyphs (void);
void complex_vars_of_glyphs_x (void);
void complex_vars_of_glyphs_mswindows (void);
#include "lisp.h"
#include "buffer.h"
+#include "commands.h"
+#include "insdel.h"
#include "syntax.h"
/* Here is a comment from Ken'ichi HANDA <handa@etl.go.jp>
two such characters. */
/* Mule 2.4 doesn't seem to have Sextword - I'm removing it -- mrb */
-/* Recovered by tomo */
Lisp_Object Qsyntax_table_p;
}
\f
-#ifdef MULE
-/* Return 1 if there is a word boundary between two word-constituent
- characters C1 and C2 if they appear in this order, else return 0.
- There is no word boundary between two word-constituent ASCII
- characters. */
-#define WORD_BOUNDARY_P(c1, c2) \
- (!(CHAR_ASCII_P (c1) && CHAR_ASCII_P (c2)) \
- && word_boundary_p (c1, c2))
-
-extern int word_boundary_p (Emchar c1, Emchar c2);
-#else
+
static int
word_constituent_p (struct buffer *buf, Bufpos pos,
struct Lisp_Char_Table *tab)
(code == Sescape || code == Scharquote))
|| (code == Sword));
}
-#endif
/* Return the position across COUNT words from FROM.
If that many words cannot be found before the end of the buffer, return 0.
{
Bufpos limit = count > 0 ? BUF_ZV (buf) : BUF_BEGV (buf);
struct Lisp_Char_Table *mirrortab = XCHAR_TABLE (buf->mirror_syntax_table);
-#ifdef MULE
- Emchar ch0, ch1;
- enum syntaxcode code;
-#endif
-
while (count > 0)
{
QUIT;
{
if (from == limit)
return 0;
-#ifdef MULE
- ch0 = BUF_FETCH_CHAR (buf, from);
- code = SYNTAX_UNSAFE (mirrortab, ch0);
-#else
if (word_constituent_p (buf, from, mirrortab))
break;
-#endif
from++;
-#ifdef MULE
- if (words_include_escapes
- && (code == Sescape || code == Scharquote))
- break;
- if (code == Sword)
- break;
-#endif
}
QUIT;
- while ((from != limit)
-#ifndef MULE
- && word_constituent_p (buf, from, mirrortab)
-#endif
- )
+ while ((from != limit) && word_constituent_p (buf, from, mirrortab))
{
-#ifdef MULE
- ch1 = BUF_FETCH_CHAR (buf, from);
- code = SYNTAX_UNSAFE (mirrortab, ch1);
- if (!(words_include_escapes
- && (code == Sescape || code == Scharquote)))
- if (code != Sword || WORD_BOUNDARY_P (ch0, ch1))
- break;
- ch0 = ch1;
-#endif
from++;
}
count--;
{
if (from == limit)
return 0;
-#ifndef MULE
if (word_constituent_p (buf, from - 1, mirrortab))
break;
-#endif
from--;
-#ifdef MULE
- ch1 = BUF_FETCH_CHAR (buf, from - 1);
- code = SYNTAX_UNSAFE (mirrortab, ch1);
- if (words_include_escapes
- && (code == Sescape || code == Scharquote))
- break;
- if (code == Sword)
- break;
-#endif
}
QUIT;
- while ((from != limit)
-#ifndef MULE
- && word_constituent_p (buf, from - 1, mirrortab)
-#endif
- )
+ while ((from != limit) && word_constituent_p (buf, from - 1, mirrortab))
{
-#ifdef MULE
- ch0 = BUF_FETCH_CHAR (buf, from - 1);
- code = SYNTAX_UNSAFE (mirrortab, ch0);
- if (!(words_include_escapes
- && (code == Sescape || code == Scharquote)))
- if (code != Sword || WORD_BOUNDARY_P (ch0, ch1))
- break;
- ch1 = ch0;
-#endif
from--;
}
count++;
}
DEFUN ("forward-word", Fforward_word, 1, 2, "_p", /*
-Move point forward COUNT words (backward if COUNT is negative).
+Move point forward ARG words (backward if ARG is negative).
Normally returns t.
If an edge of the buffer is reached, point is left there
and nil is returned.
-
-Optional argument BUFFER defaults to the current buffer.
*/
(count, buffer))
{
Vstandard_syntax_table = Fcopy_syntax_table (Qnil);
staticpro (&Vstandard_syntax_table);
- Vsyntax_designator_chars_string = make_string_nocopy (syntax_code_spec,
- Smax);
+ Vsyntax_designator_chars_string = make_pure_string (syntax_code_spec,
+ Smax, Qnil, 1);
staticpro (&Vsyntax_designator_chars_string);
fill_char_table (XCHAR_TABLE (Vstandard_syntax_table),
INLINE int
WORD_SYNTAX_P (struct Lisp_Char_Table *table, Emchar c)
{
- return SYNTAX (table, c) == Sword;
+ int syncode = SYNTAX (table, c);
+ return syncode == Sword;
}
/* OK, here's a graphic diagram of the format of the syntax values:
#include "console-x.h"
#include "glyphs-x.h"
#include "objects-x.h"
+#include "xgccache.h"
#include "EmacsFrame.h"
#include "EmacsFrameP.h"
+#include "EmacsManager.h"
#include "faces.h"
#include "frame.h"
Lisp_Object frame;
XSETFRAME (frame, f);
- redisplay_clear_region (frame,
- DEFAULT_INDEX, FRAME_PIXWIDTH (f) - 1, y, 1,
- bar_height);
+ DEVMETH (d, clear_region, (frame,
+ DEFAULT_INDEX, FRAME_PIXWIDTH (f) - 1, y, 1,
+ bar_height));
}
SET_TOOLBAR_WAS_VISIBLE_FLAG (f, pos, 1);
SET_TOOLBAR_WAS_VISIBLE_FLAG (f, pos, 0);
- redisplay_clear_region (frame, DEFAULT_INDEX, x, y, width, height);
+ DEVMETH (d, clear_region, (frame, DEFAULT_INDEX, x, y, width, height));
XFlush (DEVICE_X_DISPLAY (d));
}
--- /dev/null
+/* X Selection processing for XEmacs
+ Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
+
+This file is part of XEmacs.
+
+XEmacs is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+XEmacs is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with XEmacs; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/* Synched up with: Not synched with FSF. */
+
+/* Rewritten by jwz */
+
+#include <config.h>
+#include "lisp.h"
+
+#include "buffer.h"
+#include "console-x.h"
+#include "objects-x.h"
+
+#include "frame.h"
+#include "opaque.h"
+#include "systime.h"
+
+int lisp_to_time (Lisp_Object, time_t *);
+Lisp_Object time_to_lisp (time_t);
+
+#ifdef LWLIB_USES_MOTIF
+# define MOTIF_CLIPBOARDS
+#endif
+
+#ifdef MOTIF_CLIPBOARDS
+# include <Xm/CutPaste.h>
+static void hack_motif_clipboard_selection (Atom selection_atom,
+ Lisp_Object selection_value,
+ Time thyme, Display *display,
+ Window selecting_window,
+ Bool owned_p);
+#endif
+
+#define CUT_BUFFER_SUPPORT
+
+Lisp_Object QPRIMARY, QSECONDARY, QSTRING, QINTEGER, QCLIPBOARD, QTIMESTAMP,
+ QTEXT, QDELETE, QMULTIPLE, QINCR, QEMACS_TMP, QTARGETS, QATOM, QNULL,
+ QATOM_PAIR, QCOMPOUND_TEXT;
+
+#ifdef CUT_BUFFER_SUPPORT
+Lisp_Object QCUT_BUFFER0, QCUT_BUFFER1, QCUT_BUFFER2, QCUT_BUFFER3,
+ QCUT_BUFFER4, QCUT_BUFFER5, QCUT_BUFFER6, QCUT_BUFFER7;
+#endif
+
+Lisp_Object Vx_lost_selection_hooks;
+Lisp_Object Vx_sent_selection_hooks;
+
+/* If this is a smaller number than the max-request-size of the display,
+ emacs will use INCR selection transfer when the selection is larger
+ than this. The max-request-size is usually around 64k, so if you want
+ emacs to use incremental selection transfers when the selection is
+ smaller than that, set this. I added this mostly for debugging the
+ incremental transfer stuff, but it might improve server performance.
+ */
+#define MAX_SELECTION_QUANTUM 0xFFFFFF
+
+#define SELECTION_QUANTUM(dpy) ((XMaxRequestSize (dpy) << 2) - 100)
+
+/* This is an association list whose elements are of the form
+ ( selection-name selection-value selection-timestamp )
+ selection-name is a lisp symbol, whose name is the name of an X Atom.
+ selection-value is the value that emacs owns for that selection.
+ It may be any kind of Lisp object.
+ selection-timestamp is the time at which emacs began owning this selection,
+ as a cons of two 16-bit numbers (making a 32 bit time).
+ If there is an entry in this alist, then it can be assumed that emacs owns
+ that selection.
+ The only (eq) parts of this list that are visible from elisp are the
+ selection-values.
+ */
+Lisp_Object Vselection_alist;
+
+/* This is an alist whose CARs are selection-types (whose names are the same
+ as the names of X Atoms) and whose CDRs are the names of Lisp functions to
+ call to convert the given Emacs selection value to a string representing
+ the given selection type. This is for elisp-level extension of the emacs
+ selection handling.
+ */
+Lisp_Object Vselection_converter_alist;
+
+/* "Selection owner couldn't convert selection" */
+Lisp_Object Qselection_conversion_error;
+
+/* If the selection owner takes too long to reply to a selection request,
+ we give up on it. This is in seconds (0 = no timeout).
+ */
+int x_selection_timeout;
+
+\f
+/* Utility functions */
+
+static void lisp_data_to_selection_data (struct device *,
+ Lisp_Object obj,
+ unsigned char **data_ret,
+ Atom *type_ret,
+ unsigned int *size_ret,
+ int *format_ret);
+static Lisp_Object selection_data_to_lisp_data (struct device *,
+ unsigned char *data,
+ size_t size,
+ Atom type,
+ int format);
+static Lisp_Object x_get_window_property_as_lisp_data (Display *,
+ Window,
+ Atom property,
+ Lisp_Object target_type,
+ Atom selection_atom);
+
+static int expect_property_change (Display *, Window, Atom prop, int state);
+static void wait_for_property_change (long);
+static void unexpect_property_change (int);
+static int waiting_for_other_props_on_window (Display *, Window);
+
+/* This converts a Lisp symbol to a server Atom, avoiding a server
+ roundtrip whenever possible.
+ */
+static Atom
+symbol_to_x_atom (struct device *d, Lisp_Object sym, int only_if_exists)
+{
+ Display *display = DEVICE_X_DISPLAY (d);
+
+ if (NILP (sym)) return XA_PRIMARY;
+ if (EQ (sym, Qt)) return XA_SECONDARY;
+ if (EQ (sym, QPRIMARY)) return XA_PRIMARY;
+ if (EQ (sym, QSECONDARY)) return XA_SECONDARY;
+ if (EQ (sym, QSTRING)) return XA_STRING;
+ if (EQ (sym, QINTEGER)) return XA_INTEGER;
+ if (EQ (sym, QATOM)) return XA_ATOM;
+ if (EQ (sym, QCLIPBOARD)) return DEVICE_XATOM_CLIPBOARD (d);
+ if (EQ (sym, QTIMESTAMP)) return DEVICE_XATOM_TIMESTAMP (d);
+ if (EQ (sym, QTEXT)) return DEVICE_XATOM_TEXT (d);
+ if (EQ (sym, QDELETE)) return DEVICE_XATOM_DELETE (d);
+ if (EQ (sym, QMULTIPLE)) return DEVICE_XATOM_MULTIPLE (d);
+ if (EQ (sym, QINCR)) return DEVICE_XATOM_INCR (d);
+ if (EQ (sym, QEMACS_TMP)) return DEVICE_XATOM_EMACS_TMP (d);
+ if (EQ (sym, QTARGETS)) return DEVICE_XATOM_TARGETS (d);
+ if (EQ (sym, QNULL)) return DEVICE_XATOM_NULL (d);
+ if (EQ (sym, QATOM_PAIR)) return DEVICE_XATOM_ATOM_PAIR (d);
+ if (EQ (sym, QCOMPOUND_TEXT)) return DEVICE_XATOM_COMPOUND_TEXT (d);
+
+#ifdef CUT_BUFFER_SUPPORT
+ if (EQ (sym, QCUT_BUFFER0)) return XA_CUT_BUFFER0;
+ if (EQ (sym, QCUT_BUFFER1)) return XA_CUT_BUFFER1;
+ if (EQ (sym, QCUT_BUFFER2)) return XA_CUT_BUFFER2;
+ if (EQ (sym, QCUT_BUFFER3)) return XA_CUT_BUFFER3;
+ if (EQ (sym, QCUT_BUFFER4)) return XA_CUT_BUFFER4;
+ if (EQ (sym, QCUT_BUFFER5)) return XA_CUT_BUFFER5;
+ if (EQ (sym, QCUT_BUFFER6)) return XA_CUT_BUFFER6;
+ if (EQ (sym, QCUT_BUFFER7)) return XA_CUT_BUFFER7;
+#endif /* CUT_BUFFER_SUPPORT */
+
+ {
+ CONST char *nameext;
+ GET_C_STRING_CTEXT_DATA_ALLOCA (Fsymbol_name (sym), nameext);
+ return XInternAtom (display, nameext, only_if_exists ? True : False);
+ }
+}
+
+
+/* This converts a server Atom to a Lisp symbol, avoiding server roundtrips
+ and calls to intern whenever possible.
+ */
+static Lisp_Object
+x_atom_to_symbol (struct device *d, Atom atom)
+{
+ Display *display = DEVICE_X_DISPLAY (d);
+
+ if (! atom) return Qnil;
+ if (atom == XA_PRIMARY) return QPRIMARY;
+ if (atom == XA_SECONDARY) return QSECONDARY;
+ if (atom == XA_STRING) return QSTRING;
+ if (atom == XA_INTEGER) return QINTEGER;
+ if (atom == XA_ATOM) return QATOM;
+ if (atom == DEVICE_XATOM_CLIPBOARD (d)) return QCLIPBOARD;
+ if (atom == DEVICE_XATOM_TIMESTAMP (d)) return QTIMESTAMP;
+ if (atom == DEVICE_XATOM_TEXT (d)) return QTEXT;
+ if (atom == DEVICE_XATOM_DELETE (d)) return QDELETE;
+ if (atom == DEVICE_XATOM_MULTIPLE (d)) return QMULTIPLE;
+ if (atom == DEVICE_XATOM_INCR (d)) return QINCR;
+ if (atom == DEVICE_XATOM_EMACS_TMP (d)) return QEMACS_TMP;
+ if (atom == DEVICE_XATOM_TARGETS (d)) return QTARGETS;
+ if (atom == DEVICE_XATOM_NULL (d)) return QNULL;
+ if (atom == DEVICE_XATOM_ATOM_PAIR (d)) return QATOM_PAIR;
+ if (atom == DEVICE_XATOM_COMPOUND_TEXT (d)) return QCOMPOUND_TEXT;
+
+#ifdef CUT_BUFFER_SUPPORT
+ if (atom == XA_CUT_BUFFER0) return QCUT_BUFFER0;
+ if (atom == XA_CUT_BUFFER1) return QCUT_BUFFER1;
+ if (atom == XA_CUT_BUFFER2) return QCUT_BUFFER2;
+ if (atom == XA_CUT_BUFFER3) return QCUT_BUFFER3;
+ if (atom == XA_CUT_BUFFER4) return QCUT_BUFFER4;
+ if (atom == XA_CUT_BUFFER5) return QCUT_BUFFER5;
+ if (atom == XA_CUT_BUFFER6) return QCUT_BUFFER6;
+ if (atom == XA_CUT_BUFFER7) return QCUT_BUFFER7;
+#endif
+
+ {
+ Lisp_Object newsym;
+ CONST Bufbyte *intstr;
+ char *str = XGetAtomName (display, atom);
+
+ if (! str) return Qnil;
+
+ GET_C_CHARPTR_INT_CTEXT_DATA_ALLOCA (str, intstr);
+ newsym = intern ((char *) intstr);
+ XFree (str);
+ return newsym;
+ }
+}
+
+\f
+/* Do protocol to assert ourself as a selection owner.
+ Update the Vselection_alist so that we can reply to later requests for
+ our selection.
+ */
+static void
+x_own_selection (Lisp_Object selection_name, Lisp_Object selection_value)
+{
+ struct device *d = decode_x_device (Qnil);
+ Display *display = DEVICE_X_DISPLAY (d);
+ struct frame *sel_frame = selected_frame ();
+ Window selecting_window = XtWindow (FRAME_X_TEXT_WIDGET (sel_frame));
+ /* Use the time of the last-read mouse or keyboard event.
+ For selection purposes, we use this as a sleazy way of knowing what the
+ current time is in server-time. This assumes that the most recently read
+ mouse or keyboard event has something to do with the assertion of the
+ selection, which is probably true.
+ */
+ Time thyme = DEVICE_X_MOUSE_TIMESTAMP (d);
+ Atom selection_atom;
+
+ CHECK_SYMBOL (selection_name);
+ selection_atom = symbol_to_x_atom (d, selection_name, 0);
+
+ XSetSelectionOwner (display, selection_atom, selecting_window, thyme);
+
+ /* Now update the local cache */
+ {
+ /* We do NOT use time_to_lisp() here any more, like we used to.
+ That assumed equivalence of time_t and Time, which is not
+ necessarily the case (e.g. under OSF on the Alphas, where
+ Time is a 64-bit quantity and time_t is a 32-bit quantity).
+
+ Opaque pointers are the clean way to go here.
+ */
+ Lisp_Object selection_time = make_opaque (sizeof (thyme), (void *) &thyme);
+ Lisp_Object selection_data = list3 (selection_name,
+ selection_value,
+ selection_time);
+ Lisp_Object prev_value = assq_no_quit (selection_name, Vselection_alist);
+ Vselection_alist = Fcons (selection_data, Vselection_alist);
+
+ /* If we already owned the selection, remove the old selection data.
+ Perhaps we should destructively modify it instead.
+ Don't use Fdelq() as that may QUIT;.
+ */
+ if (!NILP (prev_value))
+ {
+ Lisp_Object rest; /* we know it's not the CAR, so it's easy. */
+ for (rest = Vselection_alist; !NILP (rest); rest = Fcdr (rest))
+ if (EQ (prev_value, Fcar (XCDR (rest))))
+ {
+ XCDR (rest) = Fcdr (XCDR (rest));
+ break;
+ }
+ }
+#ifdef MOTIF_CLIPBOARDS
+ hack_motif_clipboard_selection (selection_atom, selection_value,
+ thyme, display, selecting_window,
+ !NILP (prev_value));
+#endif
+ }
+}
+
+
+#ifdef MOTIF_CLIPBOARDS /* Bend over baby. Take it and like it. */
+
+# ifdef MOTIF_INCREMENTAL_CLIPBOARDS_WORK
+static void motif_clipboard_cb ();
+# endif
+
+static void
+hack_motif_clipboard_selection (Atom selection_atom,
+ Lisp_Object selection_value,
+ Time thyme,
+ Display *display,
+ Window selecting_window,
+ Bool owned_p)
+{
+ struct device *d = get_device_from_display (display);
+ /* Those Motif wankers can't be bothered to follow the ICCCM, and do
+ their own non-Xlib non-Xt clipboard processing. So we have to do
+ this so that linked-in Motif widgets don't get themselves wedged.
+ */
+ if (selection_atom == DEVICE_XATOM_CLIPBOARD (d)
+ && STRINGP (selection_value)
+
+ /* If we already own the clipboard, don't own it again in the Motif
+ way. This might lose in some subtle way, since the timestamp won't
+ be current, but owning the selection on the Motif way does a
+ SHITLOAD of X protocol, and it makes killing text be incredibly
+ slow when using an X terminal. ARRRRGGGHHH!!!!
+ */
+ /* No, this is no good, because then Motif text fields don't bother
+ to look up the new value, and you can't Copy from a buffer, Paste
+ into a text field, then Copy something else from the buffer and
+ paste it into the text field -- it pastes the first thing again. */
+/* && !owned_p */
+ )
+ {
+#ifdef MOTIF_INCREMENTAL_CLIPBOARDS_WORK
+ Widget widget = FRAME_X_TEXT_WIDGET (selected_frame());
+#endif
+ long itemid;
+#if XmVersion >= 1002
+ long dataid;
+#else
+ int dataid; /* 1.2 wants long, but 1.1.5 wants int... */
+#endif
+ XmString fmh;
+ String encoding = "STRING";
+ CONST Extbyte *data = XSTRING_DATA (selection_value);
+ Extcount bytes = XSTRING_LENGTH (selection_value);
+
+#ifdef MULE
+ {
+ enum { ASCII, LATIN_1, WORLD } chartypes = ASCII;
+ CONST Bufbyte *ptr = data, *end = ptr + bytes;
+ /* Optimize for the common ASCII case */
+ while (ptr <= end)
+ {
+ if (BYTE_ASCII_P (*ptr))
+ {
+ ptr++;
+ continue;
+ }
+
+ if ((*ptr) == LEADING_BYTE_LATIN_ISO8859_1 ||
+ (*ptr) == LEADING_BYTE_CONTROL_1)
+ {
+ chartypes = LATIN_1;
+ ptr += 2;
+ continue;
+ }
+
+ chartypes = WORLD;
+ break;
+ }
+
+ if (chartypes == LATIN_1)
+ GET_STRING_BINARY_DATA_ALLOCA (selection_value, data, bytes);
+ else if (chartypes == WORLD)
+ {
+ GET_STRING_CTEXT_DATA_ALLOCA (selection_value, data, bytes);
+ encoding = "COMPOUND_TEXT";
+ }
+ }
+#endif /* MULE */
+
+ fmh = XmStringCreateLtoR ("Clipboard", XmSTRING_DEFAULT_CHARSET);
+ while (ClipboardSuccess !=
+ XmClipboardStartCopy (display, selecting_window, fmh, thyme,
+#ifdef MOTIF_INCREMENTAL_CLIPBOARDS_WORK
+ widget, motif_clipboard_cb,
+#else
+ 0, NULL,
+#endif
+ &itemid))
+ ;
+ XmStringFree (fmh);
+ while (ClipboardSuccess !=
+ XmClipboardCopy (display, selecting_window, itemid, encoding,
+#ifdef MOTIF_INCREMENTAL_CLIPBOARDS_WORK
+ /* O'Reilly examples say size can be 0,
+ but this clearly is not the case. */
+ 0, bytes, (int) selecting_window, /* private id */
+#else /* !MOTIF_INCREMENTAL_CLIPBOARDS_WORK */
+ (XtPointer) data, bytes, 0,
+#endif /* !MOTIF_INCREMENTAL_CLIPBOARDS_WORK */
+ &dataid))
+ ;
+ while (ClipboardSuccess !=
+ XmClipboardEndCopy (display, selecting_window, itemid))
+ ;
+ }
+}
+
+# ifdef MOTIF_INCREMENTAL_CLIPBOARDS_WORK
+/* I tried to treat the clipboard like a real selection, and not send
+ the data until it was requested, but it looks like that just doesn't
+ work at all unless the selection owner and requestor are in different
+ processes. From reading the Motif source, it looks like they never
+ even considered having two widgets in the same application transfer
+ data between each other using "by-name" clipboard values. What a
+ bunch of fuckups.
+ */
+static void
+motif_clipboard_cb (Widget widget, int *data_id, int *private_id, int *reason)
+{
+ switch (*reason)
+ {
+ case XmCR_CLIPBOARD_DATA_REQUEST:
+ {
+ Display *dpy = XtDisplay (widget);
+ Window window = (Window) *private_id;
+ Lisp_Object selection = assq_no_quit (QCLIPBOARD, Vselection_alist);
+ if (NILP (selection)) abort ();
+ selection = XCDR (selection);
+ if (!STRINGP (selection)) abort ();
+ XmClipboardCopyByName (dpy, window, *data_id,
+ (char *) XSTRING_DATA (selection),
+ XSTRING_LENGTH (selection) + 1,
+ 0);
+ }
+ break;
+ case XmCR_CLIPBOARD_DATA_DELETE:
+ default:
+ /* don't need to free anything */
+ break;
+ }
+}
+# endif /* MOTIF_INCREMENTAL_CLIPBOARDS_WORK */
+#endif /* MOTIF_CLIPBOARDS */
+
+
+/* Given a selection-name and desired type, this looks up our local copy of
+ the selection value and converts it to the type. It returns nil or a
+ string. This calls random elisp code, and may signal or gc.
+ */
+static Lisp_Object
+x_get_local_selection (Lisp_Object selection_symbol, Lisp_Object target_type)
+{
+ /* This function can GC */
+ Lisp_Object local_value = assq_no_quit (selection_symbol, Vselection_alist);
+ Lisp_Object handler_fn, value, check;
+
+ if (NILP (local_value)) return Qnil;
+
+ /* TIMESTAMP and MULTIPLE are special cases 'cause that's easiest. */
+ if (EQ (target_type, QTIMESTAMP))
+ {
+ handler_fn = Qnil;
+ value = XCAR (XCDR (XCDR (local_value)));
+ }
+
+#if 0 /* #### MULTIPLE doesn't work yet */
+ else if (CONSP (target_type) &&
+ XCAR (target_type) == QMULTIPLE)
+ {
+ Lisp_Object pairs = XCDR (target_type);
+ int len = XVECTOR_LENGTH (pairs);
+ int i;
+ /* If the target is MULTIPLE, then target_type looks like
+ (MULTIPLE . [[SELECTION1 TARGET1] [SELECTION2 TARGET2] ... ])
+ We modify the second element of each pair in the vector and
+ return it as [[SELECTION1 <value1>] [SELECTION2 <value2>] ... ]
+ */
+ for (i = 0; i < len; i++)
+ {
+ Lisp_Object pair = XVECTOR_DATA (pairs) [i];
+ XVECTOR_DATA (pair) [1] =
+ x_get_local_selection (XVECTOR_DATA (pair) [0],
+ XVECTOR_DATA (pair) [1]);
+ }
+ return pairs;
+ }
+#endif
+ else
+ {
+ CHECK_SYMBOL (target_type);
+ handler_fn = Fcdr (Fassq (target_type, Vselection_converter_alist));
+ if (NILP (handler_fn)) return Qnil;
+ value = call3 (handler_fn,
+ selection_symbol, target_type,
+ XCAR (XCDR (local_value)));
+ }
+
+ /* This lets the selection function to return (TYPE . VALUE). For example,
+ when the selected type is LINE_NUMBER, the returned type is SPAN, not
+ INTEGER.
+ */
+ check = value;
+ if (CONSP (value) && SYMBOLP (XCAR (value)))
+ check = XCDR (value);
+
+ /* Strings, vectors, and symbols are converted to selection data format in
+ the obvious way. Integers are converted to 16 bit quantities if they're
+ small enough, otherwise 32 bits are used.
+ */
+ if (STRINGP (check) ||
+ VECTORP (check) ||
+ SYMBOLP (check) ||
+ INTP (check) ||
+ CHARP (check) ||
+ NILP (value))
+ return value;
+
+ /* (N . M) or (N M) get turned into a 32 bit quantity. So if you want to
+ always return a small quantity as 32 bits, your converter routine needs
+ to return a cons.
+ */
+ else if (CONSP (check) &&
+ INTP (XCAR (check)) &&
+ (INTP (XCDR (check)) ||
+ (CONSP (XCDR (check)) &&
+ INTP (XCAR (XCDR (check))) &&
+ NILP (XCDR (XCDR (check))))))
+ return value;
+ /* Otherwise the lisp converter function returned something unrecognized.
+ */
+ else
+ signal_error (Qerror,
+ list3 (build_string
+ ("unrecognized selection-conversion type"),
+ handler_fn,
+ value));
+
+ return Qnil; /* suppress compiler warning */
+}
+
+
+
+/* Send a SelectionNotify event to the requestor with property=None, meaning
+ we were unable to do what they wanted.
+ */
+static void
+x_decline_selection_request (XSelectionRequestEvent *event)
+{
+ XSelectionEvent reply;
+ reply.type = SelectionNotify;
+ reply.display = event->display;
+ reply.requestor = event->requestor;
+ reply.selection = event->selection;
+ reply.time = event->time;
+ reply.target = event->target;
+ reply.property = None;
+
+ XSendEvent (reply.display, reply.requestor, False, 0L, (XEvent *) &reply);
+ XFlush (reply.display);
+}
+
+
+/* Used as an unwind-protect clause so that, if a selection-converter signals
+ an error, we tell the requestor that we were unable to do what they wanted
+ before we throw to top-level or go into the debugger or whatever.
+ */
+static Lisp_Object
+x_selection_request_lisp_error (Lisp_Object closure)
+{
+ XSelectionRequestEvent *event = (XSelectionRequestEvent *)
+ get_opaque_ptr (closure);
+
+ free_opaque_ptr (closure);
+ if (event->type == 0) /* we set this to mean "completed normally" */
+ return Qnil;
+ x_decline_selection_request (event);
+ return Qnil;
+}
+
+
+/* Convert our selection to the requested type, and put that data where the
+ requestor wants it. Then tell them whether we've succeeded.
+ */
+static void
+x_reply_selection_request (XSelectionRequestEvent *event, int format,
+ unsigned char *data, int size, Atom type)
+{
+ /* This function can GC */
+ XSelectionEvent reply;
+ Display *display = event->display;
+ struct device *d = get_device_from_display (display);
+ Window window = event->requestor;
+ int bytes_remaining;
+ int format_bytes = format/8;
+ int max_bytes = SELECTION_QUANTUM (display);
+ if (max_bytes > MAX_SELECTION_QUANTUM) max_bytes = MAX_SELECTION_QUANTUM;
+
+ reply.type = SelectionNotify;
+ reply.display = display;
+ reply.requestor = window;
+ reply.selection = event->selection;
+ reply.time = event->time;
+ reply.target = event->target;
+ reply.property = (event->property == None ? event->target : event->property);
+
+ /* #### XChangeProperty can generate BadAlloc, and we must handle it! */
+
+ /* Store the data on the requested property.
+ If the selection is large, only store the first N bytes of it.
+ */
+ bytes_remaining = size * format_bytes;
+ if (bytes_remaining <= max_bytes)
+ {
+ /* Send all the data at once, with minimal handshaking. */
+#if 0
+ stderr_out ("\nStoring all %d\n", bytes_remaining);
+#endif
+ XChangeProperty (display, window, reply.property, type, format,
+ PropModeReplace, data, size);
+ /* At this point, the selection was successfully stored; ack it. */
+ XSendEvent (display, window, False, 0L, (XEvent *) &reply);
+ XFlush (display);
+ }
+ else
+ {
+ /* Send an INCR selection. */
+ int prop_id;
+
+ if (x_window_to_frame (d, window)) /* #### debug */
+ error ("attempt to transfer an INCR to ourself!");
+#if 0
+ stderr_out ("\nINCR %d\n", bytes_remaining);
+#endif
+ prop_id = expect_property_change (display, window, reply.property,
+ PropertyDelete);
+
+ XChangeProperty (display, window, reply.property, DEVICE_XATOM_INCR (d),
+ 32, PropModeReplace, (unsigned char *)
+ &bytes_remaining, 1);
+ XSelectInput (display, window, PropertyChangeMask);
+ /* Tell 'em the INCR data is there... */
+ XSendEvent (display, window, False, 0L, (XEvent *) &reply);
+ XFlush (display);
+
+ /* First, wait for the requestor to ack by deleting the property.
+ This can run random lisp code (process handlers) or signal.
+ */
+ wait_for_property_change (prop_id);
+
+ while (bytes_remaining)
+ {
+ int i = ((bytes_remaining < max_bytes)
+ ? bytes_remaining
+ : max_bytes);
+ prop_id = expect_property_change (display, window, reply.property,
+ PropertyDelete);
+#if 0
+ stderr_out (" INCR adding %d\n", i);
+#endif
+ /* Append the next chunk of data to the property. */
+ XChangeProperty (display, window, reply.property, type, format,
+ PropModeAppend, data, i / format_bytes);
+ bytes_remaining -= i;
+ data += i;
+
+ /* Now wait for the requestor to ack this chunk by deleting the
+ property. This can run random lisp code or signal.
+ */
+ wait_for_property_change (prop_id);
+ }
+ /* Now write a zero-length chunk to the property to tell the requestor
+ that we're done. */
+#if 0
+ stderr_out (" INCR done\n");
+#endif
+ if (! waiting_for_other_props_on_window (display, window))
+ XSelectInput (display, window, 0L);
+
+ XChangeProperty (display, window, reply.property, type, format,
+ PropModeReplace, data, 0);
+ }
+}
+
+
+
+/* Called from the event-loop in response to a SelectionRequest event.
+ */
+void
+x_handle_selection_request (XSelectionRequestEvent *event)
+{
+ /* This function can GC */
+ struct gcpro gcpro1, gcpro2, gcpro3;
+ XSelectionEvent reply;
+ Lisp_Object local_selection_data = Qnil;
+ Lisp_Object selection_symbol;
+ Lisp_Object target_symbol = Qnil;
+ Lisp_Object converted_selection = Qnil;
+ Time local_selection_time;
+ Lisp_Object successful_p = Qnil;
+ int count;
+ struct device *d = get_device_from_display (event->display);
+
+ GCPRO3 (local_selection_data, converted_selection, target_symbol);
+
+ reply.type = SelectionNotify; /* Construct the reply event */
+ reply.display = event->display;
+ reply.requestor = event->requestor;
+ reply.selection = event->selection;
+ reply.time = event->time;
+ reply.target = event->target;
+ reply.property = (event->property == None ? event->target : event->property);
+
+ selection_symbol = x_atom_to_symbol (d, event->selection);
+
+ local_selection_data = assq_no_quit (selection_symbol, Vselection_alist);
+
+#if 0
+# define CDR(x) (XCDR (x))
+# define CAR(x) (XCAR (x))
+ /* This list isn't user-visible, so it can't "go bad." */
+ if (!CONSP (local_selection_data)) abort ();
+ if (!CONSP (CDR (local_selection_data))) abort ();
+ if (!CONSP (CDR (CDR (local_selection_data)))) abort ();
+ if (!NILP (CDR (CDR (CDR (local_selection_data))))) abort ();
+ if (!CONSP (CAR (CDR (CDR (local_selection_data))))) abort ();
+ if (!INTP (CAR (CAR (CDR (CDR (local_selection_data)))))) abort ();
+ if (!INTP (CDR (CAR (CDR (CDR (local_selection_data)))))) abort ();
+# undef CAR
+# undef CDR
+#endif
+
+ if (NILP (local_selection_data))
+ {
+ /* Someone asked for the selection, but we don't have it any more.
+ */
+ x_decline_selection_request (event);
+ goto DONE_LABEL;
+ }
+
+ local_selection_time =
+ * (Time *) XOPAQUE_DATA (XCAR (XCDR (XCDR (local_selection_data))));
+
+ if (event->time != CurrentTime &&
+ local_selection_time > event->time)
+ {
+ /* Someone asked for the selection, and we have one, but not the one
+ they're looking for.
+ */
+ x_decline_selection_request (event);
+ goto DONE_LABEL;
+ }
+
+ count = specpdl_depth ();
+ record_unwind_protect (x_selection_request_lisp_error,
+ make_opaque_ptr (event));
+ target_symbol = x_atom_to_symbol (d, event->target);
+
+#if 0 /* #### MULTIPLE doesn't work yet */
+ if (EQ (target_symbol, QMULTIPLE))
+ target_symbol = fetch_multiple_target (event);
+#endif
+
+ /* Convert lisp objects back into binary data */
+
+ converted_selection =
+ x_get_local_selection (selection_symbol, target_symbol);
+
+ if (! NILP (converted_selection))
+ {
+ unsigned char *data;
+ unsigned int size;
+ int format;
+ Atom type;
+ lisp_data_to_selection_data (d, converted_selection,
+ &data, &type, &size, &format);
+
+ x_reply_selection_request (event, format, data, size, type);
+ successful_p = Qt;
+ /* Tell x_selection_request_lisp_error() it's cool. */
+ event->type = 0;
+ xfree (data);
+ }
+ unbind_to (count, Qnil);
+
+ DONE_LABEL:
+
+ UNGCPRO;
+
+ /* Let random lisp code notice that the selection has been asked for. */
+ {
+ Lisp_Object rest;
+ Lisp_Object val = Vx_sent_selection_hooks;
+ if (!UNBOUNDP (val) && !NILP (val))
+ {
+ if (CONSP (val) && !EQ (XCAR (val), Qlambda))
+ for (rest = val; !NILP (rest); rest = Fcdr (rest))
+ call3 (Fcar(rest), selection_symbol, target_symbol,
+ successful_p);
+ else
+ call3 (val, selection_symbol, target_symbol,
+ successful_p);
+ }
+ }
+}
+
+
+/* Called from the event-loop in response to a SelectionClear event.
+ */
+void
+x_handle_selection_clear (XSelectionClearEvent *event)
+{
+ Display *display = event->display;
+ struct device *d = get_device_from_display (display);
+ Atom selection = event->selection;
+ Time changed_owner_time = event->time;
+
+ Lisp_Object selection_symbol, local_selection_data;
+ Time local_selection_time;
+
+ selection_symbol = x_atom_to_symbol (d, selection);
+
+ local_selection_data = assq_no_quit (selection_symbol, Vselection_alist);
+
+ /* Well, we already believe that we don't own it, so that's just fine. */
+ if (NILP (local_selection_data)) return;
+
+ local_selection_time =
+ * (Time *) XOPAQUE_DATA (XCAR (XCDR (XCDR (local_selection_data))));
+
+ /* This SelectionClear is for a selection that we no longer own, so we can
+ disregard it. (That is, we have reasserted the selection since this
+ request was generated.)
+ */
+ if (changed_owner_time != CurrentTime &&
+ local_selection_time > changed_owner_time)
+ return;
+
+ /* Otherwise, we're really honest and truly being told to drop it.
+ Don't use Fdelq() as that may QUIT;.
+ */
+ if (EQ (local_selection_data, Fcar (Vselection_alist)))
+ Vselection_alist = Fcdr (Vselection_alist);
+ else
+ {
+ Lisp_Object rest;
+ for (rest = Vselection_alist; !NILP (rest); rest = Fcdr (rest))
+ if (EQ (local_selection_data, Fcar (XCDR (rest))))
+ {
+ XCDR (rest) = Fcdr (XCDR (rest));
+ break;
+ }
+ }
+
+ /* Let random lisp code notice that the selection has been stolen.
+ */
+ {
+ Lisp_Object rest;
+ Lisp_Object val = Vx_lost_selection_hooks;
+ if (!UNBOUNDP (val) && !NILP (val))
+ {
+ if (CONSP (val) && !EQ (XCAR (val), Qlambda))
+ for (rest = val; !NILP (rest); rest = Fcdr (rest))
+ call1 (Fcar (rest), selection_symbol);
+ else
+ call1 (val, selection_symbol);
+ }
+ }
+}
+
+\f
+/* This stuff is so that INCR selections are reentrant (that is, so we can
+ be servicing multiple INCR selection requests simultaneously). I haven't
+ actually tested that yet.
+ */
+
+static int prop_location_tick;
+
+static struct prop_location {
+ int tick;
+ Display *display;
+ Window window;
+ Atom property;
+ int desired_state;
+ struct prop_location *next;
+} *for_whom_the_bell_tolls;
+
+
+static int
+property_deleted_p (void *tick)
+{
+ struct prop_location *rest = for_whom_the_bell_tolls;
+ while (rest)
+ if (rest->tick == (long) tick)
+ return 0;
+ else
+ rest = rest->next;
+ return 1;
+}
+
+static int
+waiting_for_other_props_on_window (Display *display, Window window)
+{
+ struct prop_location *rest = for_whom_the_bell_tolls;
+ while (rest)
+ if (rest->display == display && rest->window == window)
+ return 1;
+ else
+ rest = rest->next;
+ return 0;
+}
+
+
+static int
+expect_property_change (Display *display, Window window,
+ Atom property, int state)
+{
+ struct prop_location *pl = xnew (struct prop_location);
+ pl->tick = ++prop_location_tick;
+ pl->display = display;
+ pl->window = window;
+ pl->property = property;
+ pl->desired_state = state;
+ pl->next = for_whom_the_bell_tolls;
+ for_whom_the_bell_tolls = pl;
+ return pl->tick;
+}
+
+static void
+unexpect_property_change (int tick)
+{
+ struct prop_location *prev = 0, *rest = for_whom_the_bell_tolls;
+ while (rest)
+ {
+ if (rest->tick == tick)
+ {
+ if (prev)
+ prev->next = rest->next;
+ else
+ for_whom_the_bell_tolls = rest->next;
+ xfree (rest);
+ return;
+ }
+ prev = rest;
+ rest = rest->next;
+ }
+}
+
+static void
+wait_for_property_change (long tick)
+{
+ /* This function can GC */
+ wait_delaying_user_input (property_deleted_p, (void *) tick);
+}
+
+
+/* Called from the event-loop in response to a PropertyNotify event.
+ */
+void
+x_handle_property_notify (XPropertyEvent *event)
+{
+ struct prop_location *prev = 0, *rest = for_whom_the_bell_tolls;
+ while (rest)
+ {
+ if (rest->property == event->atom &&
+ rest->window == event->window &&
+ rest->display == event->display &&
+ rest->desired_state == event->state)
+ {
+#if 0
+ stderr_out ("Saw expected prop-%s on %s\n",
+ (event->state == PropertyDelete ? "delete" : "change"),
+ (char *) string_data (XSYMBOL (x_atom_to_symbol (get_device_from_display (event->display), event->atom))->name);
+#endif
+ if (prev)
+ prev->next = rest->next;
+ else
+ for_whom_the_bell_tolls = rest->next;
+ xfree (rest);
+ return;
+ }
+ prev = rest;
+ rest = rest->next;
+ }
+#if 0
+ stderr_out ("Saw UNexpected prop-%s on %s\n",
+ (event->state == PropertyDelete ? "delete" : "change"),
+ (char *) string_data (XSYMBOL (x_atom_to_symbol (get_device_from_display (event->display), event->atom))->name));
+#endif
+}
+
+
+\f
+#if 0 /* #### MULTIPLE doesn't work yet */
+
+static Lisp_Object
+fetch_multiple_target (XSelectionRequestEvent *event)
+{
+ /* This function can GC */
+ Display *display = event->display;
+ Window window = event->requestor;
+ Atom target = event->target;
+ Atom selection_atom = event->selection;
+ int result;
+
+ return
+ Fcons (QMULTIPLE,
+ x_get_window_property_as_lisp_data (display, window, target,
+ QMULTIPLE,
+ selection_atom));
+}
+
+static Lisp_Object
+copy_multiple_data (Lisp_Object obj)
+{
+ Lisp_Object vec;
+ int i;
+ int len;
+ if (CONSP (obj))
+ return Fcons (XCAR (obj), copy_multiple_data (XCDR (obj)));
+
+ CHECK_VECTOR (obj);
+ len = XVECTOR_LENGTH (obj);
+ vec = make_vector (len, Qnil);
+ for (i = 0; i < len; i++)
+ {
+ Lisp_Object vec2 = XVECTOR_DATA (obj) [i];
+ CHECK_VECTOR (vec2);
+ if (XVECTOR_LENGTH (vec2) != 2)
+ signal_error (Qerror, list2 (build_string
+ ("vectors must be of length 2"),
+ vec2));
+ XVECTOR_DATA (vec) [i] = make_vector (2, Qnil);
+ XVECTOR_DATA (XVECTOR_DATA (vec) [i]) [0] = XVECTOR_DATA (vec2) [0];
+ XVECTOR_DATA (XVECTOR_DATA (vec) [i]) [1] = XVECTOR_DATA (vec2) [1];
+ }
+ return vec;
+}
+
+#endif /* 0 */
+
+\f
+static Window reading_selection_reply;
+static Atom reading_which_selection;
+static int selection_reply_timed_out;
+
+static int
+selection_reply_done (void *ignore)
+{
+ return !reading_selection_reply;
+}
+
+static Lisp_Object Qx_selection_reply_timeout_internal;
+
+DEFUN ("x-selection-reply-timeout-internal", Fx_selection_reply_timeout_internal,
+ 1, 1, 0, /*
+*/
+ (arg))
+{
+ selection_reply_timed_out = 1;
+ reading_selection_reply = 0;
+ return Qnil;
+}
+
+
+/* Do protocol to read selection-data from the server.
+ Converts this to lisp data and returns it.
+ */
+static Lisp_Object
+x_get_foreign_selection (Lisp_Object selection_symbol, Lisp_Object target_type)
+{
+ /* This function can GC */
+ struct device *d = decode_x_device (Qnil);
+ Display *display = DEVICE_X_DISPLAY (d);
+ struct frame *sel_frame = selected_frame ();
+ Window requestor_window = XtWindow (FRAME_X_TEXT_WIDGET (sel_frame));
+ Time requestor_time = DEVICE_X_MOUSE_TIMESTAMP (d);
+ Atom target_property = DEVICE_XATOM_EMACS_TMP (d);
+ Atom selection_atom = symbol_to_x_atom (d, selection_symbol, 0);
+ int speccount;
+ Atom type_atom = symbol_to_x_atom (d, (CONSP (target_type) ?
+ XCAR (target_type) : target_type), 0);
+
+ XConvertSelection (display, selection_atom, type_atom, target_property,
+ requestor_window, requestor_time);
+
+ /* Block until the reply has been read. */
+ reading_selection_reply = requestor_window;
+ reading_which_selection = selection_atom;
+ selection_reply_timed_out = 0;
+
+ speccount = specpdl_depth ();
+
+ /* add a timeout handler */
+ if (x_selection_timeout > 0)
+ {
+ Lisp_Object id = Fadd_timeout (make_int (x_selection_timeout),
+ Qx_selection_reply_timeout_internal,
+ Qnil, Qnil);
+ record_unwind_protect (Fdisable_timeout, id);
+ }
+
+ /* This is ^Gable */
+ wait_delaying_user_input (selection_reply_done, 0);
+
+ if (selection_reply_timed_out)
+ error ("timed out waiting for reply from selection owner");
+
+ unbind_to (speccount, Qnil);
+
+ /* otherwise, the selection is waiting for us on the requested property. */
+ return
+ x_get_window_property_as_lisp_data (display, requestor_window,
+ target_property, target_type,
+ selection_atom);
+}
+
+
+static void
+x_get_window_property (Display *display, Window window, Atom property,
+ unsigned char **data_ret, int *bytes_ret,
+ Atom *actual_type_ret, int *actual_format_ret,
+ unsigned long *actual_size_ret, int delete_p)
+{
+ int total_size;
+ unsigned long bytes_remaining;
+ int offset = 0;
+ unsigned char *tmp_data = 0;
+ int result;
+ int buffer_size = SELECTION_QUANTUM (display);
+ if (buffer_size > MAX_SELECTION_QUANTUM) buffer_size = MAX_SELECTION_QUANTUM;
+
+ /* First probe the thing to find out how big it is. */
+ result = XGetWindowProperty (display, window, property,
+ 0, 0, False, AnyPropertyType,
+ actual_type_ret, actual_format_ret,
+ actual_size_ret,
+ &bytes_remaining, &tmp_data);
+ if (result != Success)
+ {
+ *data_ret = 0;
+ *bytes_ret = 0;
+ return;
+ }
+ XFree ((char *) tmp_data);
+
+ if (*actual_type_ret == None || *actual_format_ret == 0)
+ {
+ if (delete_p) XDeleteProperty (display, window, property);
+ *data_ret = 0;
+ *bytes_ret = 0;
+ return;
+ }
+
+ total_size = bytes_remaining + 1;
+ *data_ret = (unsigned char *) xmalloc (total_size);
+
+ /* Now read, until weve gotten it all. */
+ while (bytes_remaining)
+ {
+#if 0
+ int last = bytes_remaining;
+#endif
+ result =
+ XGetWindowProperty (display, window, property,
+ offset/4, buffer_size/4,
+ (delete_p ? True : False),
+ AnyPropertyType,
+ actual_type_ret, actual_format_ret,
+ actual_size_ret, &bytes_remaining, &tmp_data);
+#if 0
+ stderr_out ("<< read %d\n", last-bytes_remaining);
+#endif
+ /* If this doesn't return Success at this point, it means that
+ some clod deleted the selection while we were in the midst of
+ reading it. Deal with that, I guess....
+ */
+ if (result != Success) break;
+ *actual_size_ret *= *actual_format_ret / 8;
+ memcpy ((*data_ret) + offset, tmp_data, *actual_size_ret);
+ offset += *actual_size_ret;
+ XFree ((char *) tmp_data);
+ }
+ *bytes_ret = offset;
+}
+
+
+static void
+receive_incremental_selection (Display *display, Window window, Atom property,
+ /* this one is for error messages only */
+ Lisp_Object target_type,
+ unsigned int min_size_bytes,
+ unsigned char **data_ret, int *size_bytes_ret,
+ Atom *type_ret, int *format_ret,
+ unsigned long *size_ret)
+{
+ /* This function can GC */
+ int offset = 0;
+ int prop_id;
+ *size_bytes_ret = min_size_bytes;
+ *data_ret = (unsigned char *) xmalloc (*size_bytes_ret);
+#if 0
+ stderr_out ("\nread INCR %d\n", min_size_bytes);
+#endif
+ /* At this point, we have read an INCR property, and deleted it (which
+ is how we ack its receipt: the sending window will be selecting
+ PropertyNotify events on our window to notice this).
+
+ Now, we must loop, waiting for the sending window to put a value on
+ that property, then reading the property, then deleting it to ack.
+ We are done when the sender places a property of length 0.
+ */
+ prop_id = expect_property_change (display, window, property,
+ PropertyNewValue);
+ while (1)
+ {
+ unsigned char *tmp_data;
+ int tmp_size_bytes;
+ wait_for_property_change (prop_id);
+ /* expect it again immediately, because x_get_window_property may
+ .. no it wont, I dont get it.
+ .. Ok, I get it now, the Xt code that implements INCR is broken.
+ */
+ prop_id = expect_property_change (display, window, property,
+ PropertyNewValue);
+ x_get_window_property (display, window, property,
+ &tmp_data, &tmp_size_bytes,
+ type_ret, format_ret, size_ret, 1);
+
+ if (tmp_size_bytes == 0) /* we're done */
+ {
+#if 0
+ stderr_out (" read INCR done\n");
+#endif
+ unexpect_property_change (prop_id);
+ if (tmp_data) xfree (tmp_data);
+ break;
+ }
+#if 0
+ stderr_out (" read INCR %d\n", tmp_size_bytes);
+#endif
+ if (*size_bytes_ret < offset + tmp_size_bytes)
+ {
+#if 0
+ stderr_out (" read INCR realloc %d -> %d\n",
+ *size_bytes_ret, offset + tmp_size_bytes);
+#endif
+ *size_bytes_ret = offset + tmp_size_bytes;
+ *data_ret = (unsigned char *) xrealloc (*data_ret, *size_bytes_ret);
+ }
+ memcpy ((*data_ret) + offset, tmp_data, tmp_size_bytes);
+ offset += tmp_size_bytes;
+ xfree (tmp_data);
+ }
+}
+
+
+static Lisp_Object
+x_get_window_property_as_lisp_data (Display *display,
+ Window window,
+ Atom property,
+ /* next two for error messages only */
+ Lisp_Object target_type,
+ Atom selection_atom)
+{
+ /* This function can GC */
+ Atom actual_type;
+ int actual_format;
+ unsigned long actual_size;
+ unsigned char *data = NULL;
+ int bytes = 0;
+ Lisp_Object val;
+ struct device *d = get_device_from_display (display);
+
+ x_get_window_property (display, window, property, &data, &bytes,
+ &actual_type, &actual_format, &actual_size, 1);
+ if (! data)
+ {
+ if (XGetSelectionOwner (display, selection_atom))
+ /* there is a selection owner */
+ signal_error
+ (Qselection_conversion_error,
+ Fcons (build_string ("selection owner couldn't convert"),
+ Fcons (x_atom_to_symbol (d, selection_atom),
+ actual_type ?
+ list2 (target_type, x_atom_to_symbol (d, actual_type)) :
+ list1 (target_type))));
+ else
+ signal_error (Qerror,
+ list2 (build_string ("no selection"),
+ x_atom_to_symbol (d, selection_atom)));
+ }
+
+ if (actual_type == DEVICE_XATOM_INCR (d))
+ {
+ /* Ok, that data wasn't *the* data, it was just the beginning. */
+
+ unsigned int min_size_bytes = * ((unsigned int *) data);
+ xfree (data);
+ receive_incremental_selection (display, window, property, target_type,
+ min_size_bytes, &data, &bytes,
+ &actual_type, &actual_format,
+ &actual_size);
+ }
+
+ /* It's been read. Now convert it to a lisp object in some semi-rational
+ manner. */
+ val = selection_data_to_lisp_data (d, data, bytes,
+ actual_type, actual_format);
+
+ xfree (data);
+ return val;
+}
+\f
+/* These functions convert from the selection data read from the server into
+ something that we can use from elisp, and vice versa.
+
+ Type: Format: Size: Elisp Type:
+ ----- ------- ----- -----------
+ * 8 * String
+ ATOM 32 1 Symbol
+ ATOM 32 > 1 Vector of Symbols
+ * 16 1 Integer
+ * 16 > 1 Vector of Integers
+ * 32 1 if <=16 bits: Integer
+ if > 16 bits: Cons of top16, bot16
+ * 32 > 1 Vector of the above
+
+ When converting a Lisp number to C, it is assumed to be of format 16 if
+ it is an integer, and of format 32 if it is a cons of two integers.
+
+ When converting a vector of numbers from Elisp to C, it is assumed to be
+ of format 16 if every element in the vector is an integer, and is assumed
+ to be of format 32 if any element is a cons of two integers.
+
+ When converting an object to C, it may be of the form (SYMBOL . <data>)
+ where SYMBOL is what we should claim that the type is. Format and
+ representation are as above.
+
+ NOTE: Under Mule, when someone shoves us a string without a type, we
+ set the type to 'COMPOUND_TEXT and automatically convert to Compound
+ Text. If the string has a type, we assume that the user wants the
+ data sent as-is so we just do "binary" conversion.
+ */
+
+
+static Lisp_Object
+selection_data_to_lisp_data (struct device *d,
+ unsigned char *data,
+ size_t size,
+ Atom type,
+ int format)
+{
+ if (type == DEVICE_XATOM_NULL (d))
+ return QNULL;
+
+ /* Convert any 8-bit data to a string, for compactness. */
+ else if (format == 8)
+ return make_ext_string (data, size,
+ type == DEVICE_XATOM_TEXT (d) ||
+ type == DEVICE_XATOM_COMPOUND_TEXT (d)
+ ? FORMAT_CTEXT : FORMAT_BINARY);
+
+ /* Convert a single atom to a Lisp Symbol. Convert a set of atoms to
+ a vector of symbols.
+ */
+ else if (type == XA_ATOM)
+ {
+ if (size == sizeof (Atom))
+ return x_atom_to_symbol (d, *((Atom *) data));
+ else
+ {
+ int i;
+ int len = size / sizeof (Atom);
+ Lisp_Object v = Fmake_vector (make_int (len), Qzero);
+ for (i = 0; i < len; i++)
+ Faset (v, make_int (i), x_atom_to_symbol (d, ((Atom *) data) [i]));
+ return v;
+ }
+ }
+
+ /* Convert a single 16 or small 32 bit number to a Lisp Int.
+ If the number is > 16 bits, convert it to a cons of integers,
+ 16 bits in each half.
+ */
+ else if (format == 32 && size == sizeof (long))
+ return word_to_lisp (((unsigned long *) data) [0]);
+ else if (format == 16 && size == sizeof (short))
+ return make_int ((int) (((unsigned short *) data) [0]));
+
+ /* Convert any other kind of data to a vector of numbers, represented
+ as above (as an integer, or a cons of two 16 bit integers).
+
+ #### Perhaps we should return the actual type to lisp as well.
+
+ (x-get-selection-internal 'PRIMARY 'LINE_NUMBER)
+ ==> [4 4]
+
+ and perhaps it should be
+
+ (x-get-selection-internal 'PRIMARY 'LINE_NUMBER)
+ ==> (SPAN . [4 4])
+
+ Right now the fact that the return type was SPAN is discarded before
+ lisp code gets to see it.
+ */
+ else if (format == 16)
+ {
+ int i;
+ Lisp_Object v = make_vector (size / 4, Qzero);
+ for (i = 0; i < (int) size / 4; i++)
+ {
+ int j = (int) ((unsigned short *) data) [i];
+ Faset (v, make_int (i), make_int (j));
+ }
+ return v;
+ }
+ else
+ {
+ int i;
+ Lisp_Object v = make_vector (size / 4, Qzero);
+ for (i = 0; i < (int) size / 4; i++)
+ {
+ unsigned long j = ((unsigned long *) data) [i];
+ Faset (v, make_int (i), word_to_lisp (j));
+ }
+ return v;
+ }
+}
+
+
+static void
+lisp_data_to_selection_data (struct device *d,
+ Lisp_Object obj,
+ unsigned char **data_ret,
+ Atom *type_ret,
+ unsigned int *size_ret,
+ int *format_ret)
+{
+ Lisp_Object type = Qnil;
+
+ if (CONSP (obj) && SYMBOLP (XCAR (obj)))
+ {
+ type = XCAR (obj);
+ obj = XCDR (obj);
+ if (CONSP (obj) && NILP (XCDR (obj)))
+ obj = XCAR (obj);
+ }
+
+ if (EQ (obj, QNULL) || (EQ (type, QNULL)))
+ { /* This is not the same as declining */
+ *format_ret = 32;
+ *size_ret = 0;
+ *data_ret = 0;
+ type = QNULL;
+ }
+ else if (STRINGP (obj))
+ {
+ CONST Extbyte *extval;
+ Extcount extvallen;
+
+ if (NILP (type))
+ GET_STRING_CTEXT_DATA_ALLOCA (obj, extval, extvallen);
+ else
+ GET_STRING_BINARY_DATA_ALLOCA (obj, extval, extvallen);
+ *format_ret = 8;
+ *size_ret = extvallen;
+ *data_ret = (unsigned char *) xmalloc (*size_ret);
+ memcpy (*data_ret, extval, *size_ret);
+#ifdef MULE
+ if (NILP (type)) type = QCOMPOUND_TEXT;
+#else
+ if (NILP (type)) type = QSTRING;
+#endif
+ }
+ else if (CHARP (obj))
+ {
+ Bufbyte buf[MAX_EMCHAR_LEN];
+ Bytecount len;
+ CONST Extbyte *extval;
+ Extcount extvallen;
+
+ *format_ret = 8;
+ len = set_charptr_emchar (buf, XCHAR (obj));
+ GET_CHARPTR_EXT_CTEXT_DATA_ALLOCA (buf, len, extval, extvallen);
+ *size_ret = extvallen;
+ *data_ret = (unsigned char *) xmalloc (*size_ret);
+ memcpy (*data_ret, extval, *size_ret);
+#ifdef MULE
+ if (NILP (type)) type = QCOMPOUND_TEXT;
+#else
+ if (NILP (type)) type = QSTRING;
+#endif
+ }
+ else if (SYMBOLP (obj))
+ {
+ *format_ret = 32;
+ *size_ret = 1;
+ *data_ret = (unsigned char *) xmalloc (sizeof (Atom) + 1);
+ (*data_ret) [sizeof (Atom)] = 0;
+ (*(Atom **) data_ret) [0] = symbol_to_x_atom (d, obj, 0);
+ if (NILP (type)) type = QATOM;
+ }
+ else if (INTP (obj) &&
+ XINT (obj) <= 0x7FFF &&
+ XINT (obj) >= -0x8000)
+ {
+ *format_ret = 16;
+ *size_ret = 1;
+ *data_ret = (unsigned char *) xmalloc (sizeof (short) + 1);
+ (*data_ret) [sizeof (short)] = 0;
+ (*(short **) data_ret) [0] = (short) XINT (obj);
+ if (NILP (type)) type = QINTEGER;
+ }
+ else if (INTP (obj) || CONSP (obj))
+ {
+ *format_ret = 32;
+ *size_ret = 1;
+ *data_ret = (unsigned char *) xmalloc (sizeof (long) + 1);
+ (*data_ret) [sizeof (long)] = 0;
+ (*(unsigned long **) data_ret) [0] = lisp_to_word (obj);
+ if (NILP (type)) type = QINTEGER;
+ }
+ else if (VECTORP (obj))
+ {
+ /* Lisp Vectors may represent a set of ATOMs;
+ a set of 16 or 32 bit INTEGERs;
+ or a set of ATOM_PAIRs (represented as [[A1 A2] [A3 A4] ...]
+ */
+ int i;
+
+ if (SYMBOLP (XVECTOR_DATA (obj) [0]))
+ /* This vector is an ATOM set */
+ {
+ if (NILP (type)) type = QATOM;
+ *size_ret = XVECTOR_LENGTH (obj);
+ *format_ret = 32;
+ *data_ret = (unsigned char *) xmalloc ((*size_ret) * sizeof (Atom));
+ for (i = 0; i < (int) (*size_ret); i++)
+ if (SYMBOLP (XVECTOR_DATA (obj) [i]))
+ (*(Atom **) data_ret) [i] =
+ symbol_to_x_atom (d, XVECTOR_DATA (obj) [i], 0);
+ else
+ signal_error (Qerror, /* Qselection_error */
+ list2 (build_string
+ ("all elements of the vector must be of the same type"),
+ obj));
+ }
+#if 0 /* #### MULTIPLE doesn't work yet */
+ else if (VECTORP (XVECTOR_DATA (obj) [0]))
+ /* This vector is an ATOM_PAIR set */
+ {
+ if (NILP (type)) type = QATOM_PAIR;
+ *size_ret = XVECTOR_LENGTH (obj);
+ *format_ret = 32;
+ *data_ret = (unsigned char *)
+ xmalloc ((*size_ret) * sizeof (Atom) * 2);
+ for (i = 0; i < *size_ret; i++)
+ if (VECTORP (XVECTOR_DATA (obj) [i]))
+ {
+ Lisp_Object pair = XVECTOR_DATA (obj) [i];
+ if (XVECTOR_LENGTH (pair) != 2)
+ signal_error (Qerror,
+ list2 (build_string
+ ("elements of the vector must be vectors of exactly two elements"),
+ pair));
+
+ (*(Atom **) data_ret) [i * 2] =
+ symbol_to_x_atom (d, XVECTOR_DATA (pair) [0], 0);
+ (*(Atom **) data_ret) [(i * 2) + 1] =
+ symbol_to_x_atom (d, XVECTOR_DATA (pair) [1], 0);
+ }
+ else
+ signal_error (Qerror,
+ list2 (build_string
+ ("all elements of the vector must be of the same type"),
+ obj));
+ }
+#endif
+ else
+ /* This vector is an INTEGER set, or something like it */
+ {
+ *size_ret = XVECTOR_LENGTH (obj);
+ if (NILP (type)) type = QINTEGER;
+ *format_ret = 16;
+ for (i = 0; i < (int) (*size_ret); i++)
+ if (CONSP (XVECTOR_DATA (obj) [i]))
+ *format_ret = 32;
+ else if (!INTP (XVECTOR_DATA (obj) [i]))
+ signal_error (Qerror, /* Qselection_error */
+ list2 (build_string
+ ("all elements of the vector must be integers or conses of integers"),
+ obj));
+
+ *data_ret = (unsigned char *) xmalloc (*size_ret * (*format_ret/8));
+ for (i = 0; i < (int) (*size_ret); i++)
+ if (*format_ret == 32)
+ (*((unsigned long **) data_ret)) [i] =
+ lisp_to_word (XVECTOR_DATA (obj) [i]);
+ else
+ (*((unsigned short **) data_ret)) [i] =
+ (unsigned short) lisp_to_word (XVECTOR_DATA (obj) [i]);
+ }
+ }
+ else
+ signal_error (Qerror, /* Qselection_error */
+ list2 (build_string ("unrecognized selection data"),
+ obj));
+
+ *type_ret = symbol_to_x_atom (d, type, 0);
+}
+
+static Lisp_Object
+clean_local_selection_data (Lisp_Object obj)
+{
+ if (CONSP (obj) &&
+ INTP (XCAR (obj)) &&
+ CONSP (XCDR (obj)) &&
+ INTP (XCAR (XCDR (obj))) &&
+ NILP (XCDR (XCDR (obj))))
+ obj = Fcons (XCAR (obj), XCDR (obj));
+
+ if (CONSP (obj) &&
+ INTP (XCAR (obj)) &&
+ INTP (XCDR (obj)))
+ {
+ if (XINT (XCAR (obj)) == 0)
+ return XCDR (obj);
+ if (XINT (XCAR (obj)) == -1)
+ return make_int (- XINT (XCDR (obj)));
+ }
+ if (VECTORP (obj))
+ {
+ int i;
+ int len = XVECTOR_LENGTH (obj);
+ Lisp_Object copy;
+ if (len == 1)
+ return clean_local_selection_data (XVECTOR_DATA (obj) [0]);
+ copy = make_vector (len, Qnil);
+ for (i = 0; i < len; i++)
+ XVECTOR_DATA (copy) [i] =
+ clean_local_selection_data (XVECTOR_DATA (obj) [i]);
+ return copy;
+ }
+ return obj;
+}
+
+\f
+/* Called from the event loop to handle SelectionNotify events.
+ I don't think this needs to be reentrant.
+ */
+void
+x_handle_selection_notify (XSelectionEvent *event)
+{
+ if (! reading_selection_reply)
+ message ("received an unexpected SelectionNotify event");
+ else if (event->requestor != reading_selection_reply)
+ message ("received a SelectionNotify event for the wrong window");
+ else if (event->selection != reading_which_selection)
+ message ("received the wrong selection type in SelectionNotify!");
+ else
+ reading_selection_reply = 0; /* we're done now. */
+}
+
+\f
+DEFUN ("x-own-selection-internal", Fx_own_selection_internal, 2, 2, 0, /*
+Assert an X selection of the given TYPE with the given VALUE.
+TYPE is a symbol, typically PRIMARY, SECONDARY, or CLIPBOARD.
+VALUE is typically a string, or a cons of two markers, but may be
+anything that the functions on selection-converter-alist know about.
+*/
+ (selection_name, selection_value))
+{
+ CHECK_SYMBOL (selection_name);
+ if (NILP (selection_value)) error ("selection-value may not be nil.");
+ x_own_selection (selection_name, selection_value);
+ return selection_value;
+}
+
+
+/* Request the selection value from the owner. If we are the owner,
+ simply return our selection value. If we are not the owner, this
+ will block until all of the data has arrived.
+ */
+DEFUN ("x-get-selection-internal", Fx_get_selection_internal, 2, 2, 0, /*
+Return text selected from some X window.
+SELECTION_SYMBOL is a symbol, typically PRIMARY, SECONDARY, or CLIPBOARD.
+TARGET_TYPE is the type of data desired, typically STRING or COMPOUND_TEXT.
+Under Mule, if the resultant data comes back as 8-bit data in type
+TEXT or COMPOUND_TEXT, it will be decoded as Compound Text.
+*/
+ (selection_symbol, target_type))
+{
+ /* This function can GC */
+ Lisp_Object val = Qnil;
+ struct gcpro gcpro1, gcpro2;
+ GCPRO2 (target_type, val); /* we store newly consed data into these */
+ CHECK_SYMBOL (selection_symbol);
+
+#if 0 /* #### MULTIPLE doesn't work yet */
+ if (CONSP (target_type) &&
+ XCAR (target_type) == QMULTIPLE)
+ {
+ CHECK_VECTOR (XCDR (target_type));
+ /* So we don't destructively modify this... */
+ target_type = copy_multiple_data (target_type);
+ }
+ else
+#endif
+ CHECK_SYMBOL (target_type);
+
+ val = x_get_local_selection (selection_symbol, target_type);
+
+ if (NILP (val))
+ {
+ val = x_get_foreign_selection (selection_symbol, target_type);
+ }
+ else
+ {
+ if (CONSP (val) && SYMBOLP (XCAR (val)))
+ {
+ val = XCDR (val);
+ if (CONSP (val) && NILP (XCDR (val)))
+ val = XCAR (val);
+ }
+ val = clean_local_selection_data (val);
+ }
+ UNGCPRO;
+ return val;
+}
+
+DEFUN ("x-disown-selection-internal", Fx_disown_selection_internal, 1, 2, 0, /*
+If we own the named selection, then disown it (make there be no selection).
+*/
+ (selection, timeval))
+{
+ struct device *d = decode_x_device (Qnil);
+ Display *display = DEVICE_X_DISPLAY (d);
+ Time timestamp;
+ Atom selection_atom;
+ XSelectionClearEvent event;
+
+ CHECK_SYMBOL (selection);
+ if (NILP (timeval))
+ timestamp = DEVICE_X_MOUSE_TIMESTAMP (d);
+ else
+ {
+ /* #### This is bogus. See the comment above about problems
+ on OSF/1 and DEC Alphas. Yet another reason why it sucks
+ to have the implementation (i.e. cons of two 16-bit
+ integers) exposed. */
+ time_t the_time;
+ lisp_to_time (timeval, &the_time);
+ timestamp = (Time) the_time;
+ }
+
+ if (NILP (assq_no_quit (selection, Vselection_alist)))
+ return Qnil; /* Don't disown the selection when we're not the owner. */
+
+ selection_atom = symbol_to_x_atom (d, selection, 0);
+
+ XSetSelectionOwner (display, selection_atom, None, timestamp);
+
+ /* It doesn't seem to be guaranteed that a SelectionClear event will be
+ generated for a window which owns the selection when that window sets
+ the selection owner to None. The NCD server does, the MIT Sun4 server
+ doesn't. So we synthesize one; this means we might get two, but
+ that's ok, because the second one won't have any effect.
+ */
+ event.display = display;
+ event.selection = selection_atom;
+ event.time = timestamp;
+ x_handle_selection_clear (&event);
+
+ return Qt;
+}
+
+
+DEFUN ("x-selection-owner-p", Fx_selection_owner_p, 0, 1, 0, /*
+Return t if current emacs process owns the given X Selection.
+The arg should be the name of the selection in question, typically one of
+the symbols PRIMARY, SECONDARY, or CLIPBOARD. (For convenience, the symbol
+nil is the same as PRIMARY, and t is the same as SECONDARY.)
+*/
+ (selection))
+{
+ CHECK_SYMBOL (selection);
+ if (EQ (selection, Qnil)) selection = QPRIMARY;
+ else if (EQ (selection, Qt)) selection = QSECONDARY;
+
+ return NILP (Fassq (selection, Vselection_alist)) ? Qnil : Qt;
+}
+
+DEFUN ("x-selection-exists-p", Fx_selection_exists_p, 0, 1, 0, /*
+Whether there is an owner for the given X Selection.
+The arg should be the name of the selection in question, typically one of
+the symbols PRIMARY, SECONDARY, or CLIPBOARD. (For convenience, the symbol
+nil is the same as PRIMARY, and t is the same as SECONDARY.)
+*/
+ (selection))
+{
+ struct device *d = decode_x_device (Qnil);
+ Display *dpy = DEVICE_X_DISPLAY (d);
+ CHECK_SYMBOL (selection);
+ if (!NILP (Fx_selection_owner_p (selection)))
+ return Qt;
+ return XGetSelectionOwner (dpy, symbol_to_x_atom (d, selection, 0)) != None ?
+ Qt : Qnil;
+}
+
+\f
+#ifdef CUT_BUFFER_SUPPORT
+
+static int cut_buffers_initialized; /* Whether we're sure they all exist */
+
+/* Ensure that all 8 cut buffers exist. ICCCM says we gotta... */
+static void
+initialize_cut_buffers (Display *display, Window window)
+{
+ static unsigned CONST char * CONST data = (unsigned CONST char *) "";
+#define FROB(atom) XChangeProperty (display, window, atom, XA_STRING, 8, \
+ PropModeAppend, data, 0)
+ FROB (XA_CUT_BUFFER0);
+ FROB (XA_CUT_BUFFER1);
+ FROB (XA_CUT_BUFFER2);
+ FROB (XA_CUT_BUFFER3);
+ FROB (XA_CUT_BUFFER4);
+ FROB (XA_CUT_BUFFER5);
+ FROB (XA_CUT_BUFFER6);
+ FROB (XA_CUT_BUFFER7);
+#undef FROB
+ cut_buffers_initialized = 1;
+}
+
+#define CHECK_CUTBUFFER(symbol) \
+ { CHECK_SYMBOL (symbol); \
+ if (!EQ((symbol),QCUT_BUFFER0) && !EQ((symbol),QCUT_BUFFER1) && \
+ !EQ((symbol),QCUT_BUFFER2) && !EQ((symbol),QCUT_BUFFER3) && \
+ !EQ((symbol),QCUT_BUFFER4) && !EQ((symbol),QCUT_BUFFER5) && \
+ !EQ((symbol),QCUT_BUFFER6) && !EQ((symbol),QCUT_BUFFER7)) \
+ signal_error (Qerror, list2 (build_string ("Doesn't name a cutbuffer"), \
+ (symbol))); \
+ }
+
+DEFUN ("x-get-cutbuffer-internal", Fx_get_cutbuffer_internal, 1, 1, 0, /*
+Return the value of the named CUTBUFFER (typically CUT_BUFFER0).
+*/
+ (cutbuffer))
+{
+ struct device *d = decode_x_device (Qnil);
+ Display *display = DEVICE_X_DISPLAY (d);
+ Window window = RootWindow (display, 0); /* Cutbuffers are on frame 0 */
+ Atom cut_buffer_atom;
+ unsigned char *data;
+ int bytes;
+ Atom type;
+ int format;
+ unsigned long size;
+ Lisp_Object ret;
+
+ CHECK_CUTBUFFER (cutbuffer);
+ cut_buffer_atom = symbol_to_x_atom (d, cutbuffer, 0);
+
+ x_get_window_property (display, window, cut_buffer_atom, &data, &bytes,
+ &type, &format, &size, 0);
+ if (!data) return Qnil;
+
+ if (format != 8 || type != XA_STRING)
+ signal_simple_error_2 ("Cut buffer doesn't contain 8-bit STRING data",
+ x_atom_to_symbol (d, type),
+ make_int (format));
+
+ /* We cheat - if the string contains an ESC character, that's
+ technically not allowed in a STRING, so we assume it's
+ COMPOUND_TEXT that we stored there ourselves earlier,
+ in x-store-cutbuffer-internal */
+ ret = (bytes ?
+ make_ext_string (data, bytes,
+ memchr (data, 0x1b, bytes) ?
+ FORMAT_CTEXT : FORMAT_BINARY)
+ : Qnil);
+ xfree (data);
+ return ret;
+}
+
+
+DEFUN ("x-store-cutbuffer-internal", Fx_store_cutbuffer_internal, 2, 2, 0, /*
+Set the value of the named CUTBUFFER (typically CUT_BUFFER0) to STRING.
+*/
+ (cutbuffer, string))
+{
+ struct device *d = decode_x_device (Qnil);
+ Display *display = DEVICE_X_DISPLAY (d);
+ Window window = RootWindow (display, 0); /* Cutbuffers are on frame 0 */
+ Atom cut_buffer_atom;
+ CONST Extbyte *data = XSTRING_DATA (string);
+ Extcount bytes = XSTRING_LENGTH (string);
+ Extcount bytes_remaining;
+ int max_bytes = SELECTION_QUANTUM (display);
+#ifdef MULE
+ CONST Bufbyte *ptr, *end;
+ enum { ASCII, LATIN_1, WORLD } chartypes = ASCII;
+#endif
+
+ if (max_bytes > MAX_SELECTION_QUANTUM)
+ max_bytes = MAX_SELECTION_QUANTUM;
+
+ CHECK_CUTBUFFER (cutbuffer);
+ CHECK_STRING (string);
+ cut_buffer_atom = symbol_to_x_atom (d, cutbuffer, 0);
+
+ if (! cut_buffers_initialized)
+ initialize_cut_buffers (display, window);
+
+ /* We use the STRING encoding (Latin-1 only) if we can, else COMPOUND_TEXT.
+ We cheat and use type = `STRING' even when using COMPOUND_TEXT.
+ The ICCCM requires that this be so, and other clients assume it,
+ as we do ourselves in initialize_cut_buffers. */
+
+#ifdef MULE
+ /* Optimize for the common ASCII case */
+ for (ptr = data, end = ptr + bytes; ptr <= end; )
+ {
+ if (BYTE_ASCII_P (*ptr))
+ {
+ ptr++;
+ continue;
+ }
+
+ if ((*ptr) == LEADING_BYTE_LATIN_ISO8859_1 ||
+ (*ptr) == LEADING_BYTE_CONTROL_1)
+ {
+ chartypes = LATIN_1;
+ ptr += 2;
+ continue;
+ }
+
+ chartypes = WORLD;
+ break;
+ }
+
+ if (chartypes == LATIN_1)
+ GET_STRING_BINARY_DATA_ALLOCA (string, data, bytes);
+ else if (chartypes == WORLD)
+ GET_STRING_CTEXT_DATA_ALLOCA (string, data, bytes);
+#endif /* MULE */
+
+ bytes_remaining = bytes;
+
+ while (bytes_remaining)
+ {
+ int chunk = bytes_remaining < max_bytes ? bytes_remaining : max_bytes;
+ XChangeProperty (display, window, cut_buffer_atom, XA_STRING, 8,
+ (bytes_remaining == bytes
+ ? PropModeReplace : PropModeAppend),
+ data, chunk);
+ data += chunk;
+ bytes_remaining -= chunk;
+ }
+ return string;
+}
+
+
+DEFUN ("x-rotate-cutbuffers-internal", Fx_rotate_cutbuffers_internal, 1, 1, 0, /*
+Rotate the values of the cutbuffers by the given number of steps;
+positive means move values forward, negative means backward.
+*/
+ (n))
+{
+ struct device *d = decode_x_device (Qnil);
+ Display *display = DEVICE_X_DISPLAY (d);
+ Window window = RootWindow (display, 0); /* Cutbuffers are on frame 0 */
+ Atom props [8];
+
+ CHECK_INT (n);
+ if (XINT (n) == 0)
+ return n;
+ if (! cut_buffers_initialized)
+ initialize_cut_buffers (display, window);
+ props[0] = XA_CUT_BUFFER0;
+ props[1] = XA_CUT_BUFFER1;
+ props[2] = XA_CUT_BUFFER2;
+ props[3] = XA_CUT_BUFFER3;
+ props[4] = XA_CUT_BUFFER4;
+ props[5] = XA_CUT_BUFFER5;
+ props[6] = XA_CUT_BUFFER6;
+ props[7] = XA_CUT_BUFFER7;
+ XRotateWindowProperties (display, window, props, 8, XINT (n));
+ return n;
+}
+
+#endif /* CUT_BUFFER_SUPPORT */
+
+
+\f
+/************************************************************************/
+/* initialization */
+/************************************************************************/
+
+void
+syms_of_xselect (void)
+{
+ DEFSUBR (Fx_get_selection_internal);
+ DEFSUBR (Fx_own_selection_internal);
+ DEFSUBR (Fx_disown_selection_internal);
+ DEFSUBR (Fx_selection_owner_p);
+ DEFSUBR (Fx_selection_exists_p);
+
+#ifdef CUT_BUFFER_SUPPORT
+ DEFSUBR (Fx_get_cutbuffer_internal);
+ DEFSUBR (Fx_store_cutbuffer_internal);
+ DEFSUBR (Fx_rotate_cutbuffers_internal);
+#endif /* CUT_BUFFER_SUPPORT */
+
+ /* Unfortunately, timeout handlers must be lisp functions. */
+ defsymbol (&Qx_selection_reply_timeout_internal,
+ "x-selection-reply-timeout-internal");
+ DEFSUBR (Fx_selection_reply_timeout_internal);
+
+ defsymbol (&QPRIMARY, "PRIMARY");
+ defsymbol (&QSECONDARY, "SECONDARY");
+ defsymbol (&QSTRING, "STRING");
+ defsymbol (&QINTEGER, "INTEGER");
+ defsymbol (&QCLIPBOARD, "CLIPBOARD");
+ defsymbol (&QTIMESTAMP, "TIMESTAMP");
+ defsymbol (&QTEXT, "TEXT");
+ defsymbol (&QDELETE, "DELETE");
+ defsymbol (&QMULTIPLE, "MULTIPLE");
+ defsymbol (&QINCR, "INCR");
+ defsymbol (&QEMACS_TMP, "_EMACS_TMP_");
+ defsymbol (&QTARGETS, "TARGETS");
+ defsymbol (&QATOM, "ATOM");
+ defsymbol (&QATOM_PAIR, "ATOM_PAIR");
+ defsymbol (&QCOMPOUND_TEXT, "COMPOUND_TEXT");
+ defsymbol (&QNULL, "NULL");
+
+#ifdef CUT_BUFFER_SUPPORT
+ defsymbol (&QCUT_BUFFER0, "CUT_BUFFER0");
+ defsymbol (&QCUT_BUFFER1, "CUT_BUFFER1");
+ defsymbol (&QCUT_BUFFER2, "CUT_BUFFER2");
+ defsymbol (&QCUT_BUFFER3, "CUT_BUFFER3");
+ defsymbol (&QCUT_BUFFER4, "CUT_BUFFER4");
+ defsymbol (&QCUT_BUFFER5, "CUT_BUFFER5");
+ defsymbol (&QCUT_BUFFER6, "CUT_BUFFER6");
+ defsymbol (&QCUT_BUFFER7, "CUT_BUFFER7");
+#endif /* CUT_BUFFER_SUPPORT */
+
+ deferror (&Qselection_conversion_error,
+ "selection-conversion-error",
+ "selection-conversion error", Qio_error);
+}
+
+void
+vars_of_xselect (void)
+{
+#ifdef CUT_BUFFER_SUPPORT
+ cut_buffers_initialized = 0;
+ Fprovide (intern ("cut-buffer"));
+#endif
+
+ reading_selection_reply = 0;
+ reading_which_selection = 0;
+ selection_reply_timed_out = 0;
+ for_whom_the_bell_tolls = 0;
+ prop_location_tick = 0;
+
+ Vselection_alist = Qnil;
+ staticpro (&Vselection_alist);
+
+ DEFVAR_LISP ("selection-converter-alist", &Vselection_converter_alist /*
+An alist associating selection-types (such as STRING and TIMESTAMP) with
+functions. These functions will be called with three args: the name of the
+selection (typically PRIMARY, SECONDARY, or CLIPBOARD); a desired type to
+which the selection should be converted; and the local selection value
+ (whatever had been passed to `x-own-selection'). These functions should
+return the value to send to the X server, which should be one of:
+
+-- nil (the conversion could not be done)
+-- a cons of a symbol and any of the following values; the symbol
+ explicitly specifies the type that will be sent.
+-- a string (If the type is not specified, then if Mule support exists,
+ the string will be converted to Compound Text and sent in
+ the 'COMPOUND_TEXT format; otherwise (no Mule support),
+ the string will be left as-is and sent in the 'STRING
+ format. If the type is specified, the string will be
+ left as-is (or converted to binary format under Mule).
+ In all cases, 8-bit data it sent.)
+-- a character (With Mule support, will be converted to Compound Text
+ whether or not a type is specified. If a type is not
+ specified, a type of 'STRING or 'COMPOUND_TEXT will be
+ sent, as for strings.)
+-- the symbol 'NULL (Indicates that there is no meaningful return value.
+ Empty 32-bit data with a type of 'NULL will be sent.)
+-- a symbol (Will be converted into an atom. If the type is not specified,
+ a type of 'ATOM will be sent.)
+-- an integer (Will be converted into a 16-bit or 32-bit integer depending
+ on the value. If the type is not specified, a type of
+ 'INTEGER will be sent.)
+-- a cons (HIGH . LOW) of integers (Will be converted into a 32-bit integer.
+ If the type is not specified, a type of
+ 'INTEGER will be sent.)
+-- a vector of symbols (Will be converted into a list of atoms. If the type
+ is not specified, a type of 'ATOM will be sent.)
+-- a vector of integers (Will be converted into a list of 16-bit integers.
+ If the type is not specified, a type of 'INTEGER
+ will be sent.)
+-- a vector of integers and/or conses (HIGH . LOW) of integers
+ (Will be converted into a list of 16-bit integers.
+ If the type is not specified, a type of 'INTEGER
+ will be sent.)
+*/ );
+ Vselection_converter_alist = Qnil;
+
+ DEFVAR_LISP ("x-lost-selection-hooks", &Vx_lost_selection_hooks /*
+A function or functions to be called after the X server has notified us
+that we have lost the selection. The function(s) will be called with one
+argument, a symbol naming the selection (typically PRIMARY, SECONDARY, or
+CLIPBOARD).
+*/ );
+ Vx_lost_selection_hooks = Qunbound;
+
+ DEFVAR_LISP ("x-sent-selection-hooks", &Vx_sent_selection_hooks /*
+A function or functions to be called after we have responded to some
+other client's request for the value of a selection that we own. The
+function(s) will be called with four arguments:
+ - the name of the selection (typically PRIMARY, SECONDARY, or CLIPBOARD);
+ - the name of the selection-type which we were requested to convert the
+ selection into before sending (for example, STRING or LENGTH);
+ - and whether we successfully transmitted the selection.
+We might have failed (and declined the request) for any number of reasons,
+including being asked for a selection that we no longer own, or being asked
+to convert into a type that we don't know about or that is inappropriate.
+This hook doesn't let you change the behavior of emacs's selection replies,
+it merely informs you that they have happened.
+*/ );
+ Vx_sent_selection_hooks = Qunbound;
+
+ DEFVAR_INT ("x-selection-timeout", &x_selection_timeout /*
+If the selection owner doesn't reply in this many seconds, we give up.
+A value of 0 means wait as long as necessary. This is initialized from the
+\"*selectionTimeout\" resource (which is expressed in milliseconds).
+*/ );
+ x_selection_timeout = 0;
+}
+
+void
+Xatoms_of_xselect (struct device *d)
+{
+ Display *D = DEVICE_X_DISPLAY (d);
+
+ /* Non-predefined atoms that we might end up using a lot */
+ DEVICE_XATOM_CLIPBOARD (d) = XInternAtom (D, "CLIPBOARD", False);
+ DEVICE_XATOM_TIMESTAMP (d) = XInternAtom (D, "TIMESTAMP", False);
+ DEVICE_XATOM_TEXT (d) = XInternAtom (D, "TEXT", False);
+ DEVICE_XATOM_DELETE (d) = XInternAtom (D, "DELETE", False);
+ DEVICE_XATOM_MULTIPLE (d) = XInternAtom (D, "MULTIPLE", False);
+ DEVICE_XATOM_INCR (d) = XInternAtom (D, "INCR", False);
+ DEVICE_XATOM_TARGETS (d) = XInternAtom (D, "TARGETS", False);
+ DEVICE_XATOM_NULL (d) = XInternAtom (D, "NULL", False);
+ DEVICE_XATOM_ATOM_PAIR (d) = XInternAtom (D, "ATOM_PAIR", False);
+ DEVICE_XATOM_COMPOUND_TEXT (d) = XInternAtom (D, "COMPOUND_TEXT", False);
+ DEVICE_XATOM_EMACS_TMP (d) = XInternAtom (D, "_EMACS_TMP_", False);
+}
--- /dev/null
+;;; Test basic Lisp functionality
+
+;;(when (not (boundp 'foo)) (setq foo 1))
+;;(incf foo)
+;;(print foo)
+
+(let ((my-vector [1 2 3 4])
+ (my-bit-vector (bit-vector 1 0 1 0))
+ (my-string "1234")
+ (my-list '(1 2 3 4)))
+
+ ;;(Assert (fooooo)) ;; Generate Other failure
+ ;;(Assert (eq 1 2)) ;; Generate Assertion failure
+
+ (Assert (eq (elt my-vector 0) 1))
+ (Assert (eq (elt my-bit-vector 0) 1))
+ (Assert (eq (elt my-string 0) ?1))
+ (Assert (eq (elt my-list 0) 1))
+
+ (Assert (eq 4 (length my-vector)))
+ (Assert (eq 4 (length my-bit-vector)))
+ (Assert (eq 4 (length my-string)))
+
+ (fillarray my-vector 5)
+ (fillarray my-bit-vector 1)
+ (fillarray my-string ?5)
+
+ (Assert (eq 4 (length my-vector)))
+ (Assert (eq 4 (length my-bit-vector)))
+ (Assert (eq 4 (length my-string)))
+
+ (Assert (eq (elt my-vector 0) 5))
+ (Assert (eq (elt my-bit-vector 0) 1))
+ (Assert (eq (elt my-string 0) ?5))
+
+ (Assert (eq (elt my-vector 3) 5))
+ (Assert (eq (elt my-bit-vector 3) 1))
+ (Assert (eq (elt my-string 3) ?5))
+
+ (fillarray my-bit-vector 0)
+ (Assert (eq 4 (length my-bit-vector)))
+ (Assert (eq (elt my-bit-vector 2) 0))
+
+ ;; Test nconc
+ (let ((x (list 0 1 2)))
+ (Assert (eq (nconc) nil))
+ (Assert (eq (nconc nil) nil))
+ (Assert (eq (nconc nil x) x))
+ (Assert (eq (nconc x nil) x))
+ (let ((y (nconc x nil (list 3 4 5) nil)))
+ (Assert (eq (length y) 6))
+ (Assert (eq (nth 3 y) 3))
+ ))
+ )
+
+;;; Old cruft
+;;;(run-tests)
+
+;(defmacro Assert (assertion)
+; `(condition-case error
+; (progn
+; (assert ,assertion)
+; (princ (format "Assertion passed: %S" (quote ,assertion)))
+; (terpri)
+; (incf Assert-successes))
+; (cl-assertion-failed
+; (princ (format "Assertion failed: %S" (quote ,assertion)))
+; (terpri)
+; (incf Assert-failures))
+; (t (princ (format "Test harness error: %S" error))
+; (terpri)
+; (incf Harness-failures)
+; )))
+
+
+;(defun run-tests ()
+; (with-output-to-temp-buffer "*Test-Log*"
+; (let ((Assert-successes 0)
+; (Assert-failures 0)
+; (Harness-failures 0))
+; (basic-lisp-test)
+; (byte-compile 'basic-lisp-test)
+; (basic-lisp-test)
+; (print (format "%d successes, %d assertion failures, %d harness failures"
+; Assert-successes
+; Assert-failures
+; Harness-failures)))))
+
+;(defun the-test ()
--- /dev/null
+;;; Test database functionality
+
+(defun test-database (db)
+ (Assert (databasep db))
+ (put-database "key1" "val1" db)
+ (Assert (equal "val1" (get-database "key1" db)))
+ (remove-database "key1" db)
+ (Assert (equal nil (get-database "key1" db)))
+ (close-database db)
+ (Assert (not (database-live-p db)))
+ (Assert (databasep db))
+ (let ((filename (database-file-name db)))
+ (loop for fn in (list filename (concat filename ".db")) do
+ (when (file-exists-p fn)
+ (delete-file fn))))
+ )
+
+(let ((filename (expand-file-name "test-emacs" (temp-directory))))
+
+ (when (featurep 'dbm)
+ (let ((db (open-database filename 'dbm)))
+ (test-database db)))
+
+ (princ "\n")
+
+ (when (featurep 'berkeley-db)
+ (let ((db (open-database filename 'berkeley-db)))
+ (test-database db)))
+ )
--- /dev/null
+;; test-emacs.el --- Run Emacs Lisp test suites.
+
+;;; Copyright (C) 1998 Free Software Foundation, Inc.
+
+;; Author: Martin Buchholz
+;; Keywords: testing
+
+;; This file is part of XEmacs.
+
+;; XEmacs is free software; you can redistribute it and/or modify it
+;; under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; XEmacs is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;; General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with XEmacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Synched up with: Not in FSF
+
+(defvar test-emacs-verbose
+ (and (not noninteractive) (> (device-baud-rate) search-slow-speed))
+ "*Non-nil means print messages describing progress of emacs-tester.")
+
+(defvar test-emacs-current-file nil)
+
+(defvar emacs-lisp-file-regexp (purecopy "\\.el$")
+ "*Regexp which matches Emacs Lisp source files.")
+
+(defun test-emacs-test-file (filename)
+ "Test a file of Lisp code named FILENAME.
+The output file's name is made by appending `c' to the end of FILENAME."
+ ;; (interactive "fTest file: ")
+ (interactive
+ (let ((file buffer-file-name)
+ (file-name nil)
+ (file-dir nil))
+ (and file
+ (eq (cdr (assq 'major-mode (buffer-local-variables)))
+ 'emacs-lisp-mode)
+ (setq file-name (file-name-nondirectory file)
+ file-dir (file-name-directory file)))
+ (list (read-file-name "Test file: " file-dir nil nil file-name))))
+ ;; Expand now so we get the current buffer's defaults
+ (setq filename (expand-file-name filename))
+
+ ;; If we're testing a file that's in a buffer and is modified, offer
+ ;; to save it first.
+ (or noninteractive
+ (let ((b (get-file-buffer (expand-file-name filename))))
+ (if (and b (buffer-modified-p b)
+ (y-or-n-p (format "save buffer %s first? " (buffer-name b))))
+ (save-excursion (set-buffer b) (save-buffer)))))
+
+ (if (or noninteractive test-emacs-verbose)
+ (message "Testing %s..." filename))
+ (let ((test-emacs-current-file filename)
+ input-buffer)
+ (save-excursion
+ (setq input-buffer (get-buffer-create " *Test Input*"))
+ (set-buffer input-buffer)
+ (erase-buffer)
+ (insert-file-contents filename)
+ ;; Run hooks including the uncompression hook.
+ ;; If they change the file name, then change it for the output also.
+ (let ((buffer-file-name filename)
+ (default-major-mode 'emacs-lisp-mode)
+ (enable-local-eval nil))
+ (normal-mode)
+ (setq filename buffer-file-name)))
+ (test-emacs-from-buffer input-buffer filename)
+ (kill-buffer input-buffer)
+ ))
+
+(defun test-emacs-read-from-buffer (buffer)
+ "Read forms from BUFFER, and turn it into a lambda test form."
+ (let ((body nil))
+ (goto-char (point-min) buffer)
+ (condition-case nil
+ (while t
+ (setq body (cons (read inbuffer) body)))
+ (error nil))
+ `(lambda ()
+ (defvar passes)
+ (defvar assertion-failures)
+ (defvar other-failures)
+ ,@(nreverse body))))
+
+(defun test-emacs-from-buffer (inbuffer filename)
+ "Run tests in buffer INBUFFER, visiting FILENAME."
+ (let ((passes 0)
+ (assertion-failures 0)
+ (other-failures 0))
+ (with-output-to-temp-buffer "*Test-Log*"
+ (defmacro Assert (assertion)
+ `(condition-case error
+ (progn
+ (assert ,assertion)
+ (princ (format "PASS: %S" (quote ,assertion)))
+ (terpri)
+ (incf passes))
+ (cl-assertion-failed
+ (princ (format "Assertion failed: %S" (quote ,assertion)))
+ (terpri)
+ (incf assertion-failures))
+ (t (princ "Error during test execution:\n\t")
+ (display-error error nil)
+ (terpri)
+ (incf other-failures)
+ )))
+
+ (princ "Testing Interpreted Lisp\n\n")
+ (funcall (test-emacs-read-from-buffer inbuffer))
+ (princ "\nTesting Compiled Lisp\n\n")
+ (funcall (byte-compile (test-emacs-read-from-buffer inbuffer)))
+ (princ (format
+ "\nSUMMARY: %d passes, %d assertion failures, %d other failures\n"
+ passes
+ assertion-failures
+ other-failures))
+ (let* ((total (+ passes assertion-failures other-failures))
+ (basename (file-name-nondirectory filename))
+ (summary-msg
+ (if (> total 0)
+ (format "%s: %d of %d (%d%%) tests successful."
+ basename passes total (/ (* 100 passes) total))
+ (format "%s: No tests run" basename))))
+ (message "%s" summary-msg))
+ (fmakunbound 'Assert))))
+
+(defvar test-emacs-results-point-max nil)
+(defmacro displaying-emacs-test-results (&rest body)
+ `(let ((test-emacs-results-point-max test-emacs-results-point-max))
+ ;; Log the file name.
+ (test-emacs-log-file)
+ ;; Record how much is logged now.
+ ;; We will display the log buffer if anything more is logged
+ ;; before the end of BODY.
+ (or test-emacs-results-point-max
+ (save-excursion
+ (set-buffer (get-buffer-create "*Test-Log*"))
+ (setq test-emacs-results-point-max (point-max))))
+ (unwind-protect
+ (condition-case error-info
+ (progn ,@body)
+ (error
+ (test-emacs-report-error error-info)))
+ (save-excursion
+ ;; If there were compilation warnings, display them.
+ (set-buffer "*Test-Log*")
+ (if (= test-emacs-results-point-max (point-max))
+ nil
+ (if temp-buffer-show-function
+ (let ((show-buffer (get-buffer-create "*Test-Log-Show*")))
+ (save-excursion
+ (set-buffer show-buffer)
+ (setq buffer-read-only nil)
+ (erase-buffer))
+ (copy-to-buffer show-buffer
+ (save-excursion
+ (goto-char test-emacs-results-point-max)
+ (forward-line -1)
+ (point))
+ (point-max))
+ (funcall temp-buffer-show-function show-buffer))
+ (select-window
+ (prog1 (selected-window)
+ (select-window (display-buffer (current-buffer)))
+ (goto-char test-emacs-results-point-max)
+ (recenter 1)))))))))
+
+(defun batch-test-emacs-1 (file)
+ (condition-case err
+ (progn (test-emacs-test-file file) t)
+ (error
+ (princ ">>Error occurred processing ")
+ (princ file)
+ (princ ": ")
+ (display-error err nil)
+ (terpri)
+ nil)))
+
+(defun batch-test-emacs ()
+ "Run `test-emacs' on the files remaining on the command line.
+Use this from the command line, with `-batch';
+it won't work in an interactive Emacs.
+Each file is processed even if an error occurred previously.
+For example, invoke \"xemacs -batch -f batch-test-emacs tests/*.el\""
+ ;; command-line-args-left is what is left of the command line (from
+ ;; startup.el)
+ (defvar command-line-args-left) ;Avoid 'free variable' warning
+ (if (not noninteractive)
+ (error "`batch-test-emacs' is to be used only with -batch"))
+ (let ((error nil)
+ (debug-issue-ebola-notices 0))
+ (loop for file in command-line-args-left
+ do
+ (if (file-directory-p (expand-file-name file))
+ (let ((files (directory-files file))
+ source)
+ (while files
+ (if (and (string-match emacs-lisp-file-regexp (car files))
+ (not (auto-save-file-name-p (car files)))
+ (setq source (expand-file-name
+ (car files)
+ file))
+ (if (null (batch-test-emacs-1 source))
+ (setq error t)))
+ (setq files (cdr files)))))
+ (if (null (batch-test-emacs-1 file))
+ (setq error t))))
+ (message "Done")
+ (kill-emacs (if error 1 0))))