+++ /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
-tagslisp = lisp
-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 ${tagslisp} ${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
+++ /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
-#!/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."
+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-04 MORIOKA Tomohiko <tomo@etl.go.jp>
+
+ * files.el (insert-file-contents-literally): Treat file as binary;
+ call file-name-handlers. [sync with Emacs 20.3.10]
+
1999-06-04 MORIOKA Tomohiko <tomo@etl.go.jp>
* code-files.el (buffer-file-coding-system): Use `raw-text' as
found))))
(defun insert-file-contents-literally (filename &optional visit beg end replace)
- "Like `insert-file-contents', q.v., but only reads in the file.
+ "Like `insert-file-contents', q.v., but only reads in the file literally.
A buffer may be modified in several ways after reading into the buffer due
-to advanced Emacs features, such as file-name-handlers, format decoding,
-find-file-hooks, etc.
- This function ensures that none of these modifications will take place."
- (let ((file-name-handler-alist nil)
- (format-alist nil)
+to advanced Emacs features, such as format decoding, character code
+conversion,find-file-hooks, automatic uncompression, etc.
+
+This function ensures that none of these modifications will take place."
+ (let ((format-alist nil)
(after-insert-file-functions nil)
+ (coding-system-for-read 'binary)
+ (coding-system-for-write 'binary)
+ (jka-compr-compression-info-list nil)
(find-buffer-file-type-function
(if (fboundp 'find-buffer-file-type)
(symbol-function 'find-buffer-file-type)
+++ /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
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$B(!\e(B ?\e$B("\e(B ?\e$B(#\e(B ?\e$B($\e(B ?\e$B(&\e(B ?\e$B(%\e(B ?\e$B('\e(B ?\e$B()\e(B ?\e$B((\e(B ?\e$B(*\e(B ?\e$B(+\e(B 32 ?\e$(G#'\e(B ?\e$(G#+\e(B ?\e$(G#/\e(B 32
- 144 ?\e$(C"F\e(B 146 147 ?\e$B"#\e(B 149 ?\e$B"e\e(B ?\e$A!V\e(B ?\e$A!\\e(B ?\e$A!]\e(B ?\e.A\eN 32 ?\eN0 ?\eN2 ?\eN7 ?\eNw
+ 32 ?\e$(C"F\e(B 32 32 ?\e$B"#\e(B 32 ?\e$B"e\e(B ?\e$A!V\e(B ?\e$A!\\e(B ?\e$A!]\e(B ?\e.A\eN 32 ?\eN0 ?\eN2 ?\eN7 ?\eNw
?\e$(G#D\e(B 32 32 ?\e.L\eNq 32 32 32 32 32 32 32 32 32 32 32 ?\e$(G#E\e(B
32 32 ?\e$(G#G\e(B ?\e.L\eN! 32 32 32 32 32 32 32 32 ?\e$(G#F\e(B 32 32 ?\e.A\eN)
?\e.L\eNn ?\eNP ?\eNQ ?\eNf ?\eNT ?\eNU ?\eNd ?\eNS ?\eNe ?\eNX ?\eNY ?\eNZ ?\eN[ ?\eN\ ?\eN] ?\eN^
--- /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
+++ /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
+ 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.2\eNF 3 4 ?\eNG ?\eNg 7 8 9 10 11 12 13 14 15
+ 16 17 18 19 ?\e.2\eNV 21 22 23 24 ?\eN[ 26 27 28 29 ?\eN\ 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\eNU ?\eN! ?\eN" ?\eN# ?\eN$ ?\eN% ?\eN& ?\eN' ?\eN( ?\eN) ?\eN* ?\eN+ ?\eN, ?\eN- ?\eN. ?\eN/
+ ?\e.2\eN0 ?\eN1 ?\eN2 ?\eN5 ?\eN~ ?\eN> ?\eN6 ?\eN7 ?\eN8 ?\eNv ?\eNw ?\eNo ?\eN| ?\eN{ ?\eNx ?\eNO
+ ?\e.2\eNu ?\e.1\eN! ?\eN" ?\eN# ?\eN$ ?\eN% ?\eN& ?\eN' ?\eN( ?\eN) ?\eN* ?\eN+ ?\eN, ?\eN- ?\eN. ?\eN/
+ ?\e.1\eN0 ?\eN1 ?\eN2 ?\e.2\eN^ ?\eN= ?\e.1\eN5 ?\eN6 ?\eN7 ?\eN8 ?\e.2\eNq ?\eNQ ?\eNW ?\eNX ?\e.1\eN= ?\eN> ?\e.2\eN_
+ ?\e.2\eN` ?\eNa ?\eNb ?\eNc ?\eNd ?\eNe ?\e.1\eNF ?\eNG ?\e.2\eNh ?\eNi ?\eNj ?\eNk ?\eNl ?\eNm ?\eNn ?\e.1\eNO
+ ?\e.2\eNp ?\e.1\eNQ ?\e.2\eNr ?\eNs ?\eNt ?\e.1\eNU ?\eNV ?\eNW ?\eNX ?\e.2\eNy ?\eNz ?\e.1\eN[ ?\eN\ ?\e.2\eN} ?\e.1\eN^ ?\eN_
+ ?\e.1\eN` ?\eNa ?\eNb ?\eNc ?\eNd ?\eNe ?\eNf ?\eNg ?\eNh ?\eNi ?\eNj ?\eNk ?\eNl ?\eNm ?\eNn ?\eNo
+ ?\e.1\eNp ?\eNq ?\eNr ?\eNs ?\eNt ?\eNu ?\eNv ?\eNw ?\eNx ?\eNy ?\eNz ?\eN{ ?\eN| ?\eN} ?\eN~ ?\e.2\eNf ]
+ "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-or-char-int (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.2\eNz ?\eNx 3 ?\eNW ?\eNX ?\eNf 7 8 9 10 11 12 13 14 15
+ 16 ?\e.2\eNQ ?\eN_ ?\eNO ?\eNV ?\eN[ ?\eN} ?\eN\ 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\eN` ?\eNd ?\eNc ?\eNa ?\eNU ?\eN# ?\eN' ?\eNh ?\eNk ?\eN( ?\eNi ?\eN) ?\eN. ?\eNl ?\eNo ?\eNn
+ ?\e.2\eNm ?\eN8 ?\eNr ?\eNv ?\eNu ?\eNs ?\eNw ?\eN5 ?\eN6 ?\eN7 ?\eN^ ?\eN> ?\eN~ ?\eNy ?\eN| ?\eN{
+ 160 ?\e.2\eNe ?\eNb ?\eNj ?\eNt ?\eN= ?\eN_ ?\eNp ?\e.1\eNe ?\eNb ?\eNj ?\eNt ?\eN> ?\eNy ?\eNp ?\e.2\eN"
+ 192 193 194 195 196 ?\e.1\eN` ?\eNd ?\eNc ?\eNa ?\eNU ?\e.2\eNF ?\e.1\eN" ?\eNF ?\eNG ?\eN! ?\e.2\eNG
+ ?\e.2\eN! ?\eN% ?\eN& ?\eNg ?\eN% ?\eN+ ?\e.1\eN# ?\eN% ?\eN& ?\eNg ?\eN$ ?\eN' ?\eNh ?\e.2\eN, ?\e.1\eNk ?\eN(
+ ?\e.1\eNi ?\eN) ?\eN+ ?\eN, ?\eN- ?\eN* ?\eN. ?\eNl ?\eNo ?\e.2\eN- ?\eN* ?\eN0 ?\e.1\eNn ?\eNm ?\eN8 ?\eNr
+ ?\e.2\eN1 ?\e.1\eNv ?\eNu ?\eNs ?\eNw ?\eN0 ?\eN1 ?\eN2 ?\eN/ ?\eN5 ?\eN6 ?\eN7 ?\eN^ ?\eN> ?\eN~ ?\eNy
+ ?\e.2\eN2 ?\e.1\eN| ?\eN{ ?\eNz ?\eNx ?\eNW ?\eNX ?\eNf ?\eNQ ?\eNq ?\eNO ?\eNV ?\eN[ ?\eN} ?\eN\ ?\e.2\eN/]
+ "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-or-char-int (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\eN*ng Vi\eN.t) Ch\eN`o b\eNUn")
+ (documentation . "\
+For Vietnamese, Emacs uses special charasets internally.
+They can be decoded from and encoded to VISCC, VSCII, and VIQR.")
+ ))
+
+;;; vietnamese.el ends here
+++ /dev/null
-(setq package-get-base
-'((bbdb
- (standards-version 1.0
- version "1.01"
- author-version "2.0"
- date "1998-07-19"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution stable
- priority medium
- category "comm"
- dump nil
- description "The Big Brother Data Base"
- filename "bbdb-1.01-pkg.tar.gz"
- md5sum "95ab2746d9cf3a105cab61eb65ecd64d"
- size 274056
- provides (bbdb)
- requires (bbdb edit-utils gnus mh-e rmail supercite vm tm apel mail-lib xemacs-base)
- type regular
-))
-(eudc
- (standards-version 1.0
- version "1.22"
- author-version "1.21"
- date "1998-08-22"
- build-date "1998-09-19"
- 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.22-pkg.tar.gz"
- md5sum "25cd2405e5adcf796923f206d55cd3d6"
- size 45221
- provides (eudc eudc-ldap eudc-ph)
- requires (fsf-compat xemacs-base)
- type regular
-))
-(footnote
- (standards-version 1.0
- version "1.06"
- author-version "0.18x"
- date "1998-08-27"
- build-date "1998-09-19"
- maintainer "SL Baur <steve@xemacs.org>"
- distribution stable
- priority low
- category "comm"
- dump nil
- description "Footnoting in mail message editing modes."
- filename "footnote-1.06-pkg.tar.gz"
- md5sum "796323a84d97bade70a5d78fd9076a2e"
- size 13551
- provides (footnote)
- requires (mail-lib xemacs-base)
- type regular
-))
-(gnats
- (standards-version 1.0
- version "1.06"
- author-version "3.101"
- date "1998-08-01"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution stable
- priority high
- category "comm"
- dump nil
- description "XEmacs bug reports."
- filename "gnats-1.06-pkg.tar.gz"
- md5sum "5759d3cdefcc57f7a36c2f30a5868abe"
- size 186656
- provides (gnats gnats-admin send-pr)
- requires (mail-lib xemacs-base)
- type regular
-))
-(gnus
- (standards-version 1.0
- version "1.28"
- author-version "5.6.43x1"
- date "1998-09-05"
- build-date "1998-09-19"
- 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.28-pkg.tar.gz"
- md5sum "fc47129ff589191a7361d2eac494bde6"
- size 1871939
- provides (gnus message)
- requires (gnus w3 mh-e mailcrypt rmail mail-lib xemacs-base)
- type regular
-))
-(irchat
- (standards-version 1.0
- version "1.01"
- author-version "980625-2"
- date "oc
- key "
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution stable
- priority medium
- category "comm"
- dump nil
- description "ZENIRC IRC Client."
- filename "irchat-1.01-pkg.tar.gz"
- md5sum "c94bd691cb42e5ba23fbfe26daea2dc8"
- size 169192
- provides (irchat)
- requires ()
- type regular
-))
-(mailcrypt
- (standards-version 1.0
- version "1.05"
- author-version "3.4"
- date "1998-01-24"
- build-date "1998-09-19"
- 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.05-pkg.tar.gz"
- md5sum "9ae0b8a3dd2c9b308024813fef24cc3c"
- size 88944
- provides (mailcrypt)
- requires (gnus vm mail-lib xemacs-base)
- type regular
-))
-(mew
- (standards-version 1.0
- version "1.01"
- author-version "1.93b38"
- date "1998-06-21"
- build-date "1998-09-19"
- 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.01-pkg.tar.gz"
- md5sum "769d0647f7a411a8026aab4bf56d93c6"
- size 523578
- provides (mew)
- requires (mew)
- type regular
-))
-(mh-e
- (standards-version 1.0
- version "1.07"
- author-version "21.0"
- date "1998-07-12"
- build-date "1998-09-19"
- 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.07-pkg.tar.gz"
- md5sum "d9ac55c06077c00a4db554dcc6e41dea"
- size 178838
- provides (mh-e)
- requires (mail-lib xemacs-base)
- type regular
-))
-(net-utils
- (standards-version 1.0
- version "1.09"
- author-version "21.0"
- date "1998-07-01"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution stable
- priority low
- category "comm"
- dump nil
- description "Miscellaneous Networking Utilities."
- filename "net-utils-1.09-pkg.tar.gz"
- md5sum "597c6bc3aac41b64768d4eb7ae167805"
- size 115926
- provides (ilisp-browse-cltl2 emacsbug feedmail metamail net-utils rcompile shadowfile webjump webster-www)
- requires (w3 efs mail-lib xemacs-base)
- type single
-))
-(gnus
- (standards-version 1.0
- version "1.01"
- author-version "0.31"
- date "1998-09-08"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution unstable
- priority medium
- category "comm"
- dump nil
- description "The Gnus Newsreader and Mailreader."
- filename "pgnus-1.01-pkg.tar.gz"
- md5sum "2725e2f5f52079a1966f6e2195aab479"
- size 1969810
- provides (gnus message)
- requires (pgnus w3 mh-e mailcrypt rmail mail-lib xemacs-base)
- type regular
-))
-(rmail
- (standards-version 1.0
- version "1.06"
- author-version "21.0"
- date "1998-06-28"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution contrib
- priority low
- category "comm"
- dump nil
- description "An obsolete Emacs mailer."
- filename "rmail-1.06-pkg.tar.gz"
- md5sum "cc42e7660a4eb911b8cbc151f331c36b"
- size 96472
- provides (rmail rmailsum)
- requires (tm apel mail-lib xemacs-base)
- type regular
-))
-(supercite
- (standards-version 1.0
- version "1.09"
- author-version "3.55x2"
- date "1998-08-9"
- build-date "1998-09-19"
- 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.09-pkg.tar.gz"
- md5sum "3b2758fd09e036b9c7ce258d0ee61d5a"
- size 98926
- provides (supercite)
- requires (mail-lib xemacs-base)
- type regular
-))
-(tm
- (standards-version 1.0
- version "1.13"
- author-version "21.0"
- date "1998-08-27"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution stable
- priority low
- category "comm"
- dump nil
- description "Emacs MIME support."
- filename "tm-1.13-pkg.tar.gz"
- md5sum "ba0feda4e61c1006c8e17c641de0b6d2"
- size 336736
- 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.11"
- author-version "6.62"
- date "1998-09-19"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution stable
- priority medium
- category "comm"
- dump nil
- description "An Emacs mailer."
- filename "vm-1.11-pkg.tar.gz"
- md5sum "56e65cbfb38283de030195b33f80be1b"
- size 503615
- provides (vm)
- requires (mail-lib xemacs-base)
- type regular
-))
-(w3
- (standards-version 1.0
- version "1.09"
- author-version "4.0pre23"
- date "1998-07-18"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution experimental
- priority high
- category "comm"
- dump nil
- description "A Web browser."
- filename "w3-1.09-pkg.tar.gz"
- md5sum "ceb4e1e0d9e11102b1ff2a5cb7b77d0f"
- size 638496
- provides (w3 url)
- requires (w3 mail-lib xemacs-base)
- type regular
-))
-(zenirc
- (standards-version 1.0
- version "1.01"
- author-version "2.112"
- date "1998-08-15"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution stable
- priority medium
- category "comm"
- dump nil
- description "ZENIRC IRC Client."
- filename "zenirc-1.01-pkg.tar.gz"
- md5sum "558723a7d70b1608a046068444f5045f"
- size 290655
- provides (zenirc)
- requires (zenirc)
- type regular
-))
-(cookie
- (standards-version 1.0
- version "1.08"
- author-version "21.0"
- date "1998-04-07"
- build-date "1998-09-19"
- 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.08-pkg.tar.gz"
- md5sum "aa71e9df700ad89eb803d1100af331dd"
- size 34274
- provides (cookie1 yow)
- requires (xemacs-base)
- type regular
-))
-(games
- (standards-version 1.0
- version "1.06"
- author-version "1.04"
- date "1998-06-04"
- build-date "1998-09-19"
- maintainer "Glynn Clements <glynn@sensei.co.uk>"
- distribution stable
- priority low
- category "games"
- dump nil
- description "Tetris, Sokoban, and Snake."
- filename "games-1.06-pkg.tar.gz"
- md5sum "6db6e872cdcce09b3e9b1e3425dcc20a"
- size 31993
- provides (gamegrid snake tetris sokoban)
- requires (xemacs-base)
- type regular
-))
-(mine
- (standards-version 1.0
- version "1.08"
- author-version "1.9"
- date "1998-05-09"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution stable
- priority low
- category "games"
- dump nil
- description "Minehunt Game."
- filename "mine-1.08-pkg.tar.gz"
- md5sum "468ed5ccd1b86cd91572a901e156e7e2"
- size 66924
- provides (xmine)
- requires (xemacs-base)
- type regular
-))
-(misc-games
- (standards-version 1.0
- version "1.07"
- author-version "21.0"
- date "1998-03-22"
- build-date "1998-09-19"
- 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.07-pkg.tar.gz"
- md5sum "c7898266da95831f5797e849f740fd4c"
- size 175489
- provides (decipher gomoku hanoi life morse rot13)
- requires (xemacs-base)
- type single
-))
-(Sun
- (standards-version 1.0
- version "1.08"
- author-version "21.0"
- date "1998-07-25"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution sun
- priority low
- category "libs"
- dump nil
- description "Support for Sparcworks."
- filename "Sun-1.08-pkg.tar.gz"
- md5sum "faeaa48c2700604e5742b7a509b2a154"
- size 72951
- 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.06"
- author-version "3.3"
- date "1998-07-23"
- build-date "1998-09-19"
- 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.06-pkg.tar.gz"
- md5sum "56aabd95da4333887bfd9134f5cbe6ac"
- size 38742
- 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.02"
- author-version "7.9"
- date "1998-05-05"
- build-date "1998-09-19"
- maintainer "Mike Sperber <sperber@informatik.uni-tuebingen.de>"
- distribution stable
- priority medium
- category "libs"
- dump nil
- description "Manage file systems."
- filename "dired-1.02-pkg.tar.gz"
- md5sum "fd009a9bcff0f9a14d9f51665fe9c685"
- size 197926
- provides (diff dired)
- requires (xemacs-base)
- type regular
-))
-(edebug
- (standards-version 1.0
- version "1.05"
- author-version "21.0"
- date "1998-03-12"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution stable
- priority low
- category "libs"
- dump nil
- description "An Emacs Lisp debugger."
- filename "edebug-1.05-pkg.tar.gz"
- md5sum "26ff707c557ce5ae53317f391897dde9"
- size 113971
- provides (edebug cl-read cust-print eval-reg cl-specs)
- requires (xemacs-base)
- type regular
-))
-(efs
- (standards-version 1.0
- version "1.10"
- author-version "1.17"
- date "1998-08-23"
- build-date "1998-09-19"
- 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.10-pkg.tar.gz"
- md5sum "5f4fdf921b2800eb5dc0de6241253419"
- size 363608
- provides (efs)
- requires (xemacs-base vm dired)
- type regular
-))
-(fsf-compat
- (standards-version 1.0
- version "1.02"
- author-version "21.0"
- date "1998-03-25"
- build-date "1998-09-19"
- 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.02-pkg.tar.gz"
- md5sum "3beb2ba9863cbee8a857acf5af00a8e8"
- size 18208
- provides (overlay thingatpt timer)
- requires ()
- type single
-))
-(mail-lib
- (standards-version 1.0
- version "1.17"
- author-version "21.0"
- date "1998-06-08"
- build-date "1998-09-19"
- 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.17-pkg.tar.gz"
- md5sum "efe51eec9acce37695c5fb092dabb079"
- size 127025
- 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.03"
- author-version "21.0"
- date "1998-06-30"
- build-date "1998-09-19"
- 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.03-pkg.tar.gz"
- md5sum "9ae6e0154c4fce763cfd453e98f94682"
- size 125773
- provides ()
- requires ()
- type regular
-))
-(sounds-wav
- (standards-version 1.0
- version "1.03"
- author-version "21.0"
- date "1998-06-30"
- build-date "1998-09-19"
- 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.03-pkg.tar.gz"
- md5sum "15a8c6e740202d0c7542c5ebc2837838"
- size 148595
- provides ()
- requires ()
- type regular
-))
-(tooltalk
- (standards-version 1.0
- version "1.07"
- author-version "21.0"
- date "1998-07-25"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution contrib
- priority low
- category "libs"
- dump nil
- description "Support for building with Tooltalk."
- filename "tooltalk-1.07-pkg.tar.gz"
- md5sum "d9a97f43212d794ceebc964dc563dd17"
- size 9213
- provides ()
- requires ()
- type regular
-))
-(xemacs-base
- (standards-version 1.0
- version "1.24"
- author-version "21.0"
- date "1998-08-06"
- build-date "1998-09-19"
- 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.24-pkg.tar.gz"
- md5sum "505536311107548faff51c7a4510ad08"
- size 456033
- 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.16"
- author-version "21.0"
- date "1998-08-19"
- build-date "1998-09-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.16-pkg.tar.gz"
- md5sum "e5b592061957f041afcd45ed5ecc30cf"
- size 85457
- provides (docref eldoc elp find-func hide-copyleft ielm regexp-opt trace)
- requires (xemacs-base)
- type single
-))
-(edict
- (standards-version 1.0
- version "1.05"
- author-version "0.9.8"
- date "1998-07-23"
- build-date "1998-09-19"
- 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.05-pkg.tar.gz"
- md5sum "f3b0db7eb896cbbb0409d04d1f02ebbe"
- size 75070
- 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.10"
- author-version "21.0"
- date "1998-08-11"
- build-date "1998-09-19"
- 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.10-pkg.tar.gz"
- md5sum "2eb3fb60b3cfb1f3d7b63bd8a95426a6"
- size 255348
- 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 fsf-compat xemacs-base)
- type regular
-))
-(leim
- (standards-version 1.0
- version "1.09"
- author-version "21.0"
- date "1998-07-23"
- build-date "1998-09-19"
- 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.09-pkg.tar.gz"
- md5sum "dab730405c3843bd2a14a9821a46d1cf"
- size 1742759
- provides ()
- requires (mule-base fsf-compat xemacs-base)
- type regular
-))
-(locale
- (standards-version 1.0
- version "1.09"
- author-version "21.0"
- date "1998-07-24"
- build-date "1998-09-19"
- 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.09-pkg.tar.gz"
- md5sum "c5d2bb5bcd35e8f2f3033b5ef03398fe"
- size 32872
- provides ()
- requires (mule-base)
- type regular
-))
-(mule-base
- (standards-version 1.0
- version "1.22"
- author-version "21.0"
- date "1998-08-12"
- build-date "1998-09-19"
- 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.22-pkg.tar.gz"
- md5sum "82741caa8f936d8e007b3adf1e9c63c2"
- size 519183
- 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.09"
- author-version "10.38"
- date "1998-07-23"
- build-date "1998-09-19"
- maintainer "SL Baur <steve@altair.xemacs.org>"
- distribution mule
- priority medium
- category "mule"
- dump t
- description "Japanese Language Input Method."
- filename "skk-1.09-pkg.tar.gz"
- md5sum "21b1d3bb5bdfe939fb629719b67c68ac"
- size 1524350
- provides (skk skk-tut)
- requires (viper mule-base xemacs-base)
- type regular
-))
-(calc
- (standards-version 1.0
- version "1.08"
- author-version "2.02fX3"
- date "1998-07-25"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution stable
- priority low
- category "oa"
- dump nil
- description "Emacs calculator"
- filename "calc-1.08-pkg.tar.gz"
- md5sum "b5ffe11d94688709d4131c9d39541866"
- size 1609129
- provides (calc)
- requires ()
- type regular
-))
-(calendar
- (standards-version 1.0
- version "1.07"
- author-version "21.0"
- date "1998-09-01"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution stable
- priority low
- category "oa"
- dump nil
- description "Calendar and diary support."
- filename "calendar-1.07-pkg.tar.gz"
- md5sum "61f7aafd5d103ed66cca835ed3583abe"
- size 251917
- 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.30"
- author-version "21.0"
- date "1998-09-18"
- build-date "1998-09-19"
- 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.30-pkg.tar.gz"
- md5sum "9ed576dd1f01cd57a9f0b699cdce36fe"
- size 595610
- 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.07"
- author-version "2.10"
- date "1998-01-25"
- build-date "1998-09-19"
- 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.07-pkg.tar.gz"
- md5sum "5efd98c58eb5ba6dce1e1a1e4059238d"
- size 47896
- provides (forms forms-mode)
- requires ()
- type regular
-))
-(frame-icon
- (standards-version 1.0
- version "1.04"
- author-version "21.0"
- date "1998-07-14"
- build-date "1998-09-19"
- 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.04-pkg.tar.gz"
- md5sum "60c726b43b7dc20fcdd585796697e497"
- size 33753
- provides (forms forms-mode)
- requires ()
- type regular
-))
-(hm--html-menus
- (standards-version 1.0
- version "1.07"
- author-version "5.9"
- date "1998-01-25"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution stable
- priority low
- category "oa"
- dump nil
- description "HTML editing."
- filename "hm--html-menus-1.07-pkg.tar.gz"
- md5sum "d90b6994d7d0868800b76042a6080bc5"
- size 173431
- 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.10"
- author-version "3.0x2"
- date "1998-09-06"
- build-date "1998-09-19"
- 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.10-pkg.tar.gz"
- md5sum "f3b4ea8328648fde2ef6837e42e0e656"
- size 66285
- provides (ispell)
- requires ()
- type regular
-))
-(pc
- (standards-version 1.0
- version "1.12"
- author-version "21.0"
- date "1998-07-25"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution stable
- priority low
- category "oa"
- dump nil
- description "PC style interface emulation."
- filename "pc-1.12-pkg.tar.gz"
- md5sum "7d0860e82e54ddbd3467980df674f447"
- size 17497
- provides (delbs fusion pc-select pending-del s-region)
- requires (xemacs-base)
- type regular
-))
-(psgml
- (standards-version 1.0
- version "1.09"
- author-version "1.01"
- date "1998-07-06"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution stable
- priority medium
- category "oa"
- dump nil
- description "Validated HTML/SGML editing."
- filename "psgml-1.09-pkg.tar.gz"
- md5sum "86bc71c63fc2e278717b4d91debfa2eb"
- size 427133
- provides (psgml sgml)
- requires (edit-utils)
- type regular
-))
-(sgml
- (standards-version 1.0
- version "1.02"
- author-version "21.0"
- date "1998-01-25"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution contrib
- priority low
- category "oa"
- dump nil
- description "SGML/Linuxdoc-SGML editing."
- filename "sgml-1.02-pkg.tar.gz"
- md5sum "8e959375437e34425058fe348a9f0143"
- size 29523
- provides (sgml linuxdoc-sgml)
- requires (xemacs-base)
- type regular
-))
-(slider
- (standards-version 1.0
- version "1.07"
- author-version "0.3x1"
- date "1998-08-13"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution experimental
- priority low
- category "oa"
- dump nil
- description "User interface tool."
- filename "slider-1.07-pkg.tar.gz"
- md5sum "ebfea81a8d3d52550e76ae4efb5e5399"
- size 12174
- provides (slider color-selector)
- requires ()
- type regular
-))
-(speedbar
- (standards-version 1.0
- version "1.06"
- author-version "0.6.2"
- date "1998-02-07"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution stable
- priority low
- category "oa"
- dump nil
- description "??? Document me."
- filename "speedbar-1.06-pkg.tar.gz"
- md5sum "533b3c4dbfd82d44ed1243c3e285920a"
- size 65542
- provides (speedbar)
- requires (xemacs-base)
- type regular
-))
-(strokes
- (standards-version 1.0
- version "1.02"
- author-version "21.0"
- date "1998-01-25"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution stable
- priority medium
- category "oa"
- dump nil
- description "Mouse enhancement utility."
- filename "strokes-1.02-pkg.tar.gz"
- md5sum "016516c550b4369a40f666f3dda9afcb"
- size 42765
- provides (strokes)
- requires (text-modes edit-utils mail-lib xemacs-base)
- type regular
-))
-(text-modes
- (standards-version 1.0
- version "1.10"
- author-version "21.0"
- date "1998-08-29"
- build-date "1998-09-19"
- 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.10-pkg.tar.gz"
- md5sum "732ecc924eff930b5674453588c0bd2c"
- size 204272
- 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 (ispell fsf-compat xemacs-base)
- type regular
-))
-(time
- (standards-version 1.0
- version "1.05"
- author-version "1.17"
- date "1998-04-24"
- build-date "1998-09-19"
- 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.05-pkg.tar.gz"
- md5sum "b6a082e80e20a4caceed5f30826a4b22"
- size 19932
- provides (time)
- requires (xemacs-base)
- type regular
-))
-(eterm
- (standards-version 1.0
- version "1.06"
- author-version "21.0"
- date "1998-06-28"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution stable
- priority medium
- category "os"
- dump nil
- description "Terminal emulation."
- filename "eterm-1.06-pkg.tar.gz"
- md5sum "086de2e838a20a30d67c4f4bb99171d2"
- size 110620
- provides (eterm)
- requires (xemacs-base)
- type regular
-))
-(igrep
- (standards-version 1.0
- version "1.03"
- author-version "2.83"
- date "1998-08-11"
- build-date "1998-09-19"
- 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.03-pkg.tar.gz"
- md5sum "9a8946cef1c03e74d78382447bc345eb"
- size 15263
- provides (igrep)
- requires (dired xemacs-base)
- type regular
-))
-(ilisp
- (standards-version 1.0
- version "1.05"
- author-version "5.8"
- date "1998-01-24"
- build-date "1998-09-19"
- 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.05-pkg.tar.gz"
- md5sum "a21c63df2265048e3f0fd4e290ee732f"
- size 272263
- provides (ilisp completer)
- requires (xemacs-base)
- type regular
-))
-(os-utils
- (standards-version 1.0
- version "1.10"
- author-version "21.0"
- date "1998-07-14"
- build-date "1998-09-19"
- 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.10-pkg.tar.gz"
- md5sum "d2f6b6f8d3f2dcfb024a0e601d3e81cf"
- size 224824
- 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.04"
- author-version "2.4"
- date "1998-01-24"
- build-date "1998-09-19"
- 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.04-pkg.tar.gz"
- md5sum "3ad505fa09f8300c034e7c44ab211d15"
- size 62718
- provides (view-process-mode)
- requires (xemacs-base)
- type regular
-))
-(ada
- (standards-version 1.0
- version "1.04"
- author-version "2.27"
- date "1998-01-24"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution stable
- priority low
- category "prog"
- dump nil
- description "Ada language support."
- filename "ada-1.04-pkg.tar.gz"
- md5sum "3eb8dc6d057fd9e3c2248f40df0c34f0"
- size 55190
- provides (ada-mode ada-stmt)
- requires ()
- type regular
-))
-(c-support
- (standards-version 1.0
- version "1.08"
- author-version "21.0"
- date "1998-03-25"
- build-date "1998-09-19"
- 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.08-pkg.tar.gz"
- md5sum "e03535f146371f8fa3ea440ecdb18f55"
- size 73625
- provides (c-comment-edit cmacexp ctypes hideif hideshow)
- requires (cc-mode xemacs-base)
- type regular
-))
-(cc-mode
- (standards-version 1.0
- version "1.12"
- author-version "5.22"
- date "1998-03-05"
- build-date "1998-09-19"
- 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.12-pkg.tar.gz"
- md5sum "47a0d9fe2c0753985fa65596b68b8db6"
- size 191141
- provides (cc-mode)
- requires (xemacs-base)
- type regular
-))
-(debug
- (standards-version 1.0
- version "1.05"
- author-version "21.0"
- date "1998-07-09"
- build-date "1998-09-19"
- 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.05-pkg.tar.gz"
- md5sum "bbb9783b4e81cd085adcf2e383cd4fe7"
- size 91169
- provides (dbx gdb-highlight gdb gdbsrc gud history)
- requires (xemacs-base)
- type regular
-))
-(ediff
- (standards-version 1.0
- version "1.10"
- author-version "2.70.2"
- date "1998-04-27"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution stable
- priority medium
- category "prog"
- dump nil
- description "Interface over GNU patch."
- filename "ediff-1.10-pkg.tar.gz"
- md5sum "a2b4d368c71a21e32660f061f1b52086"
- size 274999
- provides (ediff)
- requires (pcl-cvs dired xemacs-base)
- type regular
-))
-(emerge
- (standards-version 1.0
- version "1.03"
- author-version "21.0"
- date "1998-04-07"
- build-date "1998-09-19"
- 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.03-pkg.tar.gz"
- md5sum "2ca964df916ec1f0b0a3f12a85e6741c"
- size 60474
- provides (emerge)
- requires ()
- type regular
-))
-(jde
- (standards-version 1.0
- version "1.05"
- author-version "2.05"
- date "1998-07-09"
- build-date "1998-09-19"
- maintainer "Andy Piper <andyp@parallax.co.uk>"
- distribution stable
- priority medium
- category "prog"
- dump nil
- description "Java language and development support."
- filename "jde-1.05-pkg.tar.gz"
- md5sum "fa4444d0c5cbfef6d3f14e4ed04faef7"
- size 129630
- provides (jde)
- requires (cc-mode debug speedbar edit-utils mail-lib xemacs-base)
- type regular
-))
-(pcl-cvs
- (standards-version 1.0
- version "1.12"
- author-version "21.0"
- date "1998-06-18"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution stable
- priority low
- category "prog"
- dump nil
- description "CVS frontend."
- filename "pcl-cvs-1.12-pkg.tar.gz"
- md5sum "f69a484d2d8c7c829793f0a12c89ec91"
- size 159090
- provides (pcl-cvs dll elib-node generic-sc)
- requires (xemacs-base)
- type regular
-))
-(prog-modes
- (standards-version 1.0
- version "1.10"
- author-version "21.0"
- date "1998-09-04"
- build-date "1998-09-19"
- 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.10-pkg.tar.gz"
- md5sum "61e1d86aba5774f74a5611b1eb7cf62c"
- size 548374
- 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.04"
- author-version "21.0"
- date "1998-04-11"
- build-date "1998-09-19"
- 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.04-pkg.tar.gz"
- md5sum "0815a048274697b7213604e02db0c2a9"
- size 39734
- provides (scheme xscheme cmuscheme cmuscheme48)
- requires (xemacs-base)
- type regular
-))
-(sh-script
- (standards-version 1.0
- version "1.06"
- author-version "2.0e"
- date "1998-05-12"
- build-date "1998-09-19"
- 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.06-pkg.tar.gz"
- md5sum "b87b528df00464cbe1533ffdde81cd8e"
- size 34485
- provides (sh-script executable)
- requires (xemacs-base)
- type regular
-))
-(vc-cc
- (standards-version 1.0
- version "1.08"
- author-version "21.0"
- date "1998-07-24"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution contrib
- priority low
- category "prog"
- dump nil
- description "Version Control for ClearCase (UnFree) systems."
- filename "vc-cc-1.08-pkg.tar.gz"
- md5sum "81e1ce88b7389e872d732441a5fdb29f"
- size 97261
- provides (vc)
- requires (dired xemacs-base)
- type regular
-))
-(vc
- (standards-version 1.0
- version "1.12"
- author-version "21.0"
- date "1998-08-05"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution stable
- priority low
- category "prog"
- dump nil
- description "Version Control for Free systems."
- filename "vc-1.12-pkg.tar.gz"
- md5sum "bf42fcd4d4dd78b5514e0d56e21082fc"
- size 83630
- provides (vc)
- requires (dired xemacs-base)
- type regular
-))
-(vhdl
- (standards-version 1.0
- version "1.05"
- author-version "2.74"
- date "1998-01-24"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution stable
- priority low
- category "prog"
- dump nil
- description "Support for VHDL."
- filename "vhdl-1.05-pkg.tar.gz"
- md5sum "486c16af86f0901d5c5385479b5c0e6a"
- size 65812
- provides (vhdl-mode)
- requires ()
- type regular
-))
-(auctex
- (standards-version 1.0
- version "1.12"
- author-version "9.7p"
- date "1998-08-05"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution stable
- priority medium
- category "wp"
- dump nil
- description "Basic TeX/LaTeX support."
- filename "auctex-1.12-pkg.tar.gz"
- md5sum "a2826368828e89f0113401a38a49082b"
- size 364768
- 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.07"
- author-version "1.34"
- date "1998-08-18"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution stable
- priority low
- category "wp"
- dump nil
- description "Crisp/Brief emulation."
- filename "crisp-1.07-pkg.tar.gz"
- md5sum "1c8ef81e2dce5a0f0f2625dd66fcbcfb"
- size 10273
- provides (crisp scroll-lock)
- requires ()
- type regular
-))
-(edt
- (standards-version 1.0
- version "1.05"
- author-version "21.0"
- date "1998-04-07"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution contrib
- priority low
- category "wp"
- dump nil
- description "DEC EDIT/EDT emulation."
- filename "edt-1.05-pkg.tar.gz"
- md5sum "c2d94f654e748bc3170d21f699faee5d"
- size 48534
- provides (edt)
- requires (xemacs-base)
- type regular
-))
-(reftex
- (standards-version 1.0
- version "1.07"
- author-version "3.38"
- date "1998-08-11"
- build-date "1998-09-19"
- 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.07-pkg.tar.gz"
- md5sum "cb821b60e394f6a285d2a43617384c79"
- size 200286
- provides (reftex)
- requires (fsf-compat xemacs-base)
- type regular
-))
-(texinfo
- (standards-version 1.0
- version "1.12"
- author-version "21.0"
- date "1998-07-20"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution stable
- priority high
- category "wp"
- dump nil
- description "XEmacs TeXinfo support."
- filename "texinfo-1.12-pkg.tar.gz"
- md5sum "ec1ff24ddc7c2e3dd0c121717a6ea6c1"
- size 134975
- provides (makeinfo tex-mode texinfmt texinfo texnfo-tex texnfo-upd)
- requires (xemacs-base)
- type regular
-))
-(textools
- (standards-version 1.0
- version "1.06"
- author-version "21.0"
- date "1998-04-29"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution stabl
- priority medium
- category "wp"
- dump nil
- description "Miscellaneous TeX support."
- filename "textools-1.06-pkg.tar.gz"
- md5sum "6805183aa443242b45689ffe6e46855f"
- size 83197
- provides (bib-mode bibtex refer-to-bibtex)
- requires (xemacs-base)
- type single
-))
-(tpu
- (standards-version 1.0
- version "1.06"
- author-version "4.2X"
- date "1998-07-23"
- build-date "1998-09-19"
- maintainer "Kevin Oberman <oberman@es.net>"
- distribution normal
- priority medium
- category "wp"
- dump nil
- description "DEC EDIT/TPU support."
- filename "tpu-1.06-pkg.tar.gz"
- md5sum "cd777d6be222b85810927858d88fd642"
- size 59897
- provides (tpu)
- requires ()
- type regular
-))
-(viper
- (standards-version 1.0
- version "1.09"
- author-version "3.03"
- date "1998-02-25"
- build-date "1998-09-19"
- maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
- distribution stable
- priority low
- category "wp"
- dump nil
- description "VI emulation support."
- filename "viper-1.09-pkg.tar.gz"
- md5sum "1636a0aece86e5713e8587eea92c81c8"
- size 318061
- provides (viper)
- requires (xemacs-base)
- type regular
-))
-))
-(provide 'package-get-base)
+++ /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
-@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=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
-/* Do not edit this file!
- Automatically generated by XEmacs */
-# define PURESIZE_ADJUSTMENT (0)
+++ /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
+++ /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
+++ /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"
-
-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);
-}
+++ /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_hash_table;
-
-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)
- {
- default: abort ();
- case EOL_LF: return Qlf;
- case EOL_CRLF: return Qcrlf;
- case EOL_CR: return Qcr;
- case EOL_AUTODETECT: return Qnil;
- }
-}
-
-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_hash_table, 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_hash_table,
- &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_hash_table);
- 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_hash_table);
- }
-
- {
- 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 divided 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 */
-
-/* #### 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);
- case FORMAT_CTEXT:
- return Fget_coding_system (Qctext);
- default:
- return Qnil;
- }
-}
-
-CONST Extbyte *
-convert_to_external_format (CONST Bufbyte *ptr,
- Bytecount len,
- Extcount *len_out,
- enum external_data_format fmt)
-{
- Lisp_Object coding_system = external_data_format_to_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 = external_data_format_to_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_hash_table);
- Vcoding_system_hash_table =
- make_lisp_hash_table (50, HASH_TABLE_NON_WEAK, HASH_TABLE_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
-/* 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 */
-
-# include <puresize-adjust.h>
-#define PURESIZE ((RAW_PURESIZE) + (PURESIZE_ADJUSTMENT))
-#define get_PURESIZE() PURESIZE
-
-extern EMACS_INT pure[];
-
-#endif /* PURESIZE_H */
+++ /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;
- 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);
-
- selection_symbol = x_atom_to_symbol (d, event->selection);
-
- local_selection_data = assq_no_quit (selection_symbol, Vselection_alist);
-
-#if 0
- /* This list isn't user-visible, so it can't "go bad." */
- assert (CONSP (local_selection_data));
- assert (CONSP (XCDR (local_selection_data)));
- assert (CONSP (XCDR (XCDR (local_selection_data))));
- assert (NILP (XCDR (XCDR (XCDR (local_selection_data)))));
- assert (CONSP (XCAR (XCDR (XCDR (local_selection_data)))));
- assert (INTP (XCAR (XCAR (XCDR (XCDR (local_selection_data))))));
- assert (INTP (XCDR (XCAR (XCDR (XCDR (local_selection_data))))));
-#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 we've 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 won't, I don't 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))))