changeset 108774:895ee2ff8cc3

Merge from mainline.
author Katsumi Yamaoka <yamaoka@jpl.org>
date Tue, 25 May 2010 07:23:37 +0000
parents 2903660f846b (current diff) cb7a5eb4b822 (diff)
children 99df2c060155
files lisp/obsolete/complete.el
diffstat 67 files changed, 691 insertions(+), 474 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Mon May 24 22:47:09 2010 +0000
+++ b/ChangeLog	Tue May 25 07:23:37 2010 +0000
@@ -1,3 +1,12 @@
+2010-05-25  Glenn Morris  <rgm@gnu.org>
+
+	* configure.in (LD_SWITCH_SYSTEM): Move some gnu-linux stuff...
+	(LD_SWITCH_SYSTEM_TEMACS): ... to here.
+
+	* configure.in (LD_SWITCH_SYSTEM_EXTRA): Remove.
+	(LD_SWITCH_SYSTEM_TEMACS): Put darwin stuff from LD_SWITCH_SYSTEM_EXTRA
+	here instead.
+
 2010-05-24  Romain Francoise  <romain@orebokech.com>
 
 	* make-dist: Look for version in src/emacs.c.
--- a/configure	Mon May 24 22:47:09 2010 +0000
+++ b/configure	Tue May 25 07:23:37 2010 +0000
@@ -820,7 +820,6 @@
 PRE_ALLOC_OBJ
 POST_ALLOC_OBJ
 LD_SWITCH_SYSTEM_TEMACS
-LD_SWITCH_SYSTEM_EXTRA
 YMF_PASS_LDFLAGS
 LINKER
 LIB_GCC
@@ -5930,16 +5929,17 @@
 
 ac_link="$ac_link $LD_SWITCH_SYSTEM"
 
-## This is fun.  Some settings of LD_SWITCH_SYSTEM reference
-## LD_SWITCH_X_SITE_AUX, which has not been defined yet.  When using
-## cpp, it was expanded to null.  Thus LD_SWITCH_SYSTEM had different
-## values in configure and the Makefiles.  How helpful.
-## FIXME why not use LD_SWITCH_SYSTEM_TEMACS (or somesuch) instead?
+## This setting of LD_SWITCH_SYSTEM references LD_SWITCH_X_SITE_AUX,
+## which has not been defined yet.  When this was handled with cpp,
+## it was expanded to null when configure sourced the s/*.h file.
+## Thus LD_SWITCH_SYSTEM had different values in configure and the Makefiles.
+## FIXME it would be cleaner to put this in LD_SWITCH_SYSTEM_TEMACS
+## (or somesuch), but because it is supposed to go at the _front_
+## of LD_SWITCH_SYSTEM, we cannot do that in exactly the same way.
+## Compare with the gnu-linux case below, which added to the end
+## of LD_SWITCH_SYSTEM, and so can instead go at the front of
+## LD_SWITCH_SYSTEM_TEMACS.
 case "$opsys" in
-  gnu-linux)
-   ## LD_SWITCH_X_SITE_AUX is a -R option saying where to find X at run-time.
-   LD_SWITCH_SYSTEM="$LD_SWITCH_SYSTEM \$(LD_SWITCH_X_SITE_AUX)" ;;
-
   netbsd|openbsd)
    ## _AUX_RPATH is like _AUX, but uses -rpath instead of -R.
    LD_SWITCH_SYSTEM="\$(LD_SWITCH_X_SITE_AUX_RPATH) $LD_SWITCH_SYSTEM" ;;
@@ -26595,42 +26595,47 @@
   aix4-2) LD_SWITCH_SYSTEM_TEMACS="-Wl,-bnodelcsect" ;;
 
   darwin)
-  ## The -headerpad option tells ld (see man page) to leave room at the
-  ## end of the header for adding load commands.  Needed for dumping.
-  ## 0x690 is the total size of 30 segment load commands (at 56
-  ## each); under Cocoa 31 commands are required.
-  if test "$HAVE_NS" = "yes"; then
-    libs_nsgui="-framework AppKit"
-    headerpad_extra=6C8
-  else
-    libs_nsgui=
-    headerpad_extra=690
-  fi
-  LD_SWITCH_SYSTEM_TEMACS="-prebind $libs_nsgui -Xlinker -headerpad -Xlinker $headerpad_extra"
-  ;;
+   ## The -headerpad option tells ld (see man page) to leave room at the
+   ## end of the header for adding load commands.  Needed for dumping.
+   ## 0x690 is the total size of 30 segment load commands (at 56
+   ## each); under Cocoa 31 commands are required.
+   if test "$HAVE_NS" = "yes"; then
+     libs_nsgui="-framework AppKit"
+     headerpad_extra=6C8
+   else
+     libs_nsgui=
+     headerpad_extra=690
+   fi
+   LD_SWITCH_SYSTEM_TEMACS="-prebind $libs_nsgui -Xlinker -headerpad -Xlinker $headerpad_extra"
+
+   ## This is here because src/Makefile.in did some extra fiddling around
+   ## with LD_SWITCH_SYSTEM.  The cpp logic was:
+   ##   #ifndef LD_SWITCH_SYSTEM
+   ##   #if !defined (__GNUC__) && ((defined (BSD_SYSTEM) && !defined (COFF)))
+   ## Since all the *bsds define LD_SWITCH_SYSTEM, this simplifies to:
+   ## not using gcc, darwin system not on an alpha (ie darwin, since
+   ## darwin + alpha does not occur).
+   ## Because this was done in src/Makefile.in, the resulting part of
+   ## LD_SWITCH_SYSTEM was not used in configure (ie, in ac_link).
+   ## It therefore seems cleaner to put this in LD_SWITCH_SYSTEM_TEMACS,
+   ## rather than LD_SWITCH_SYSTEM.
+   test "x$LD_SWITCH_SYSTEM" = "x" && test "x$GCC" != "xyes" && \
+     LD_SWITCH_SYSTEM_TEMACS="-X $LD_SWITCH_SYSTEM_TEMACS"
+   ;;
+
+  ## LD_SWITCH_X_SITE_AUX is a -R option saying where to find X at run-time.
+  ## When handled by cpp, this was in LD_SWITCH_SYSTEM.  However, at
+  ## the point where configure sourced the s/*.h file, LD_SWITCH_X_SITE_AUX
+  ## had not yet been defined and was expanded to null.  Hence LD_SWITCH_SYSTEM
+  ## had different values in configure (in ac_link) and src/Makefile.in.
+  ## It seems clearer therefore to put this piece in LD_SWITCH_SYSTEM_TEMACS.
+  gnu-linux) LD_SWITCH_SYSTEM_TEMACS="\$(LD_SWITCH_X_SITE_AUX)" ;;
 
   *) LD_SWITCH_SYSTEM_TEMACS= ;;
 esac
 
 
 
-## This exists because src/Makefile.in did some extra fiddling around
-## with LD_SWITCH_SYSTEM.  The cpp logic was:
-##   #ifndef LD_SWITCH_SYSTEM
-##   #if !defined (__GNUC__) && ((defined (BSD_SYSTEM) && !defined (COFF)))
-## Since all the *bsds define LD_SWITCH_SYSTEM, this simplifies to:
-## not using gcc, darwin system not on an alpha (ie darwin, since
-## darwin + alpha does not occur).
-## Note that unlike L_S_S, this is not used in ac_link.
-if test "x$LD_SWITCH_SYSTEM" = "x" && test "x$GCC" != "xyes" && \
-   test "$opsys" = "darwin"; then
-  LD_SWITCH_SYSTEM_EXTRA="-X"
-else
-  LD_SWITCH_SYSTEM_EXTRA=
-fi
-
-
-
 LINKER=
 ORDINARY_LINK=
 case "$opsys" in
@@ -28154,7 +28159,6 @@
 done
 
 # Build src/Makefile from ${srcdir}/src/Makefile.c
-# and lib-src/Makefile from ${srcdir}/lib-src/Makefile.c
 # This must be done after src/config.h is built, since we rely on that file.
 
 echo creating src/epaths.h
--- a/configure.in	Mon May 24 22:47:09 2010 +0000
+++ b/configure.in	Tue May 25 07:23:37 2010 +0000
@@ -955,16 +955,17 @@
 
 ac_link="$ac_link $LD_SWITCH_SYSTEM"
 
-## This is fun.  Some settings of LD_SWITCH_SYSTEM reference
-## LD_SWITCH_X_SITE_AUX, which has not been defined yet.  When using
-## cpp, it was expanded to null.  Thus LD_SWITCH_SYSTEM had different
-## values in configure and the Makefiles.  How helpful.
-## FIXME why not use LD_SWITCH_SYSTEM_TEMACS (or somesuch) instead?
+## This setting of LD_SWITCH_SYSTEM references LD_SWITCH_X_SITE_AUX,
+## which has not been defined yet.  When this was handled with cpp,
+## it was expanded to null when configure sourced the s/*.h file.
+## Thus LD_SWITCH_SYSTEM had different values in configure and the Makefiles.
+## FIXME it would be cleaner to put this in LD_SWITCH_SYSTEM_TEMACS
+## (or somesuch), but because it is supposed to go at the _front_
+## of LD_SWITCH_SYSTEM, we cannot do that in exactly the same way.
+## Compare with the gnu-linux case below, which added to the end
+## of LD_SWITCH_SYSTEM, and so can instead go at the front of
+## LD_SWITCH_SYSTEM_TEMACS.
 case "$opsys" in
-  gnu-linux)
-   ## LD_SWITCH_X_SITE_AUX is a -R option saying where to find X at run-time.
-   LD_SWITCH_SYSTEM="$LD_SWITCH_SYSTEM \$(LD_SWITCH_X_SITE_AUX)" ;;
-
   netbsd|openbsd)
    ## _AUX_RPATH is like _AUX, but uses -rpath instead of -R.
    LD_SWITCH_SYSTEM="\$(LD_SWITCH_X_SITE_AUX_RPATH) $LD_SWITCH_SYSTEM" ;;
@@ -3272,42 +3273,47 @@
   aix4-2) LD_SWITCH_SYSTEM_TEMACS="-Wl,-bnodelcsect" ;;
 
   darwin)
-  ## The -headerpad option tells ld (see man page) to leave room at the
-  ## end of the header for adding load commands.  Needed for dumping.
-  ## 0x690 is the total size of 30 segment load commands (at 56
-  ## each); under Cocoa 31 commands are required.
-  if test "$HAVE_NS" = "yes"; then
-    libs_nsgui="-framework AppKit"
-    headerpad_extra=6C8
-  else
-    libs_nsgui=
-    headerpad_extra=690
-  fi
-  LD_SWITCH_SYSTEM_TEMACS="-prebind $libs_nsgui -Xlinker -headerpad -Xlinker $headerpad_extra"
-  ;;
+   ## The -headerpad option tells ld (see man page) to leave room at the
+   ## end of the header for adding load commands.  Needed for dumping.
+   ## 0x690 is the total size of 30 segment load commands (at 56
+   ## each); under Cocoa 31 commands are required.
+   if test "$HAVE_NS" = "yes"; then
+     libs_nsgui="-framework AppKit"
+     headerpad_extra=6C8
+   else
+     libs_nsgui=
+     headerpad_extra=690
+   fi
+   LD_SWITCH_SYSTEM_TEMACS="-prebind $libs_nsgui -Xlinker -headerpad -Xlinker $headerpad_extra"
+ 
+   ## This is here because src/Makefile.in did some extra fiddling around
+   ## with LD_SWITCH_SYSTEM.  The cpp logic was:
+   ##   #ifndef LD_SWITCH_SYSTEM
+   ##   #if !defined (__GNUC__) && ((defined (BSD_SYSTEM) && !defined (COFF)))
+   ## Since all the *bsds define LD_SWITCH_SYSTEM, this simplifies to:
+   ## not using gcc, darwin system not on an alpha (ie darwin, since
+   ## darwin + alpha does not occur).
+   ## Because this was done in src/Makefile.in, the resulting part of
+   ## LD_SWITCH_SYSTEM was not used in configure (ie, in ac_link).
+   ## It therefore seems cleaner to put this in LD_SWITCH_SYSTEM_TEMACS,
+   ## rather than LD_SWITCH_SYSTEM.
+   test "x$LD_SWITCH_SYSTEM" = "x" && test "x$GCC" != "xyes" && \
+     LD_SWITCH_SYSTEM_TEMACS="-X $LD_SWITCH_SYSTEM_TEMACS"
+   ;;
+
+  ## LD_SWITCH_X_SITE_AUX is a -R option saying where to find X at run-time.
+  ## When handled by cpp, this was in LD_SWITCH_SYSTEM.  However, at
+  ## the point where configure sourced the s/*.h file, LD_SWITCH_X_SITE_AUX
+  ## had not yet been defined and was expanded to null.  Hence LD_SWITCH_SYSTEM
+  ## had different values in configure (in ac_link) and src/Makefile.in.
+  ## It seems clearer therefore to put this piece in LD_SWITCH_SYSTEM_TEMACS.
+  gnu-linux) LD_SWITCH_SYSTEM_TEMACS="\$(LD_SWITCH_X_SITE_AUX)" ;;
 
   *) LD_SWITCH_SYSTEM_TEMACS= ;;
 esac
 AC_SUBST(LD_SWITCH_SYSTEM_TEMACS)
 
 
-## This exists because src/Makefile.in did some extra fiddling around
-## with LD_SWITCH_SYSTEM.  The cpp logic was:
-##   #ifndef LD_SWITCH_SYSTEM
-##   #if !defined (__GNUC__) && ((defined (BSD_SYSTEM) && !defined (COFF)))
-## Since all the *bsds define LD_SWITCH_SYSTEM, this simplifies to:
-## not using gcc, darwin system not on an alpha (ie darwin, since
-## darwin + alpha does not occur).
-## Note that unlike L_S_S, this is not used in ac_link.
-if test "x$LD_SWITCH_SYSTEM" = "x" && test "x$GCC" != "xyes" && \
-   test "$opsys" = "darwin"; then
-  LD_SWITCH_SYSTEM_EXTRA="-X"
-else
-  LD_SWITCH_SYSTEM_EXTRA=
-fi
-AC_SUBST(LD_SWITCH_SYSTEM_EXTRA)
-
-
 LINKER=
 ORDINARY_LINK=
 case "$opsys" in
@@ -3786,7 +3792,6 @@
 done
 
 # Build src/Makefile from ${srcdir}/src/Makefile.c
-# and lib-src/Makefile from ${srcdir}/lib-src/Makefile.c
 # This must be done after src/config.h is built, since we rely on that file.
 
 echo creating src/epaths.h
--- a/etc/ChangeLog	Mon May 24 22:47:09 2010 +0000
+++ b/etc/ChangeLog	Tue May 25 07:23:37 2010 +0000
@@ -1,3 +1,7 @@
+2010-05-24  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* NEWS: Add sections for Emacs-23.3.
+
 2010-05-08  Chong Yidong  <cyd@stupidchicken.com>
 
 	* PROBLEMS: Document gcc-4.5 bug (Bug#6031).
@@ -43,8 +47,7 @@
 
 2010-03-24  Francesc Rocher  <rocher@member.fsf.org>
 
-	* MORE.STUFF: Remove CEDET entry, now distributed as part of
-	Emacs.
+	* MORE.STUFF: Remove CEDET entry, now distributed as part of Emacs.
 
 2010-03-22  Teodor Zlatanov  <tzz@lifelogs.com>
 
--- a/etc/NEWS.23	Mon May 24 22:47:09 2010 +0000
+++ b/etc/NEWS.23	Tue May 25 07:23:37 2010 +0000
@@ -15,6 +15,33 @@
 with a prefix argument or by typing C-u C-h C-n.
 
 
+* Installation Changes in Emacs 23.3
+
+* Startup Changes in Emacs 23.3
+
+* Changes in Emacs 23.3
+
+
+* Editing Changes in Emacs 23.3
+
+
+* Changes in Specialized Modes and Packages in Emacs 23.3
+
+
+* New Modes and Packages in Emacs 23.3
+
+
+* Incompatible Lisp Changes in Emacs 23.3
+
+
+* Lisp changes in Emacs 23.3
+
+** New function byte-to-string, like char-to-string but for bytes.
+
+
+* Changes in Emacs 23.3 on non-free operating systems
+
+
 * Installation Changes in Emacs 23.2
 
 ** New configure options for Emacs developers.
--- a/lisp/ChangeLog	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/ChangeLog	Tue May 25 07:23:37 2010 +0000
@@ -1,3 +1,58 @@
+2010-05-25  Glenn Morris  <rgm@gnu.org>
+
+	* net/rcirc.el (rcirc-default-user-name, rcirc-default-full-name):
+	Add :version.
+
+2010-05-25  Ryan Yeske  <rcyeske@gmail.com>
+
+	* net/rcirc.el (rcirc-server-alist): Add :pass.
+	(rcirc-default-user-name): Change to "user".
+	(rcirc-default-full-name): Change to "unknown".
+	(rcirc-user-name-history): Add variable.
+	(rcirc): When prompting for connection paramaters, also prompt for
+	username and password.
+	(rcirc-connect): Take a PASS argument.	If PASS is non-nil, send
+	value to server when connecting.
+
+2010-05-25  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* emacs-lisp/smie.el (smie-set-prec2tab): Check override before use.
+	(smie-merge-prec2s): Pass the tables as separate args.
+	(smie-bnf-precedence-table): Adjust call accordingly.
+	(smie-prec2-levels): Set levels at the end.
+
+	Replace Lisp calls to delete-backward-char by delete-char.
+	* bs.el, expand.el, ido.el, image-dired.el, lpr.el, pcomplete.el,
+	skeleton.el, term.el, time.el, wid-edit.el, woman.el,
+	calc/calc-graph.el, calc/calc-help.el, calc/calc-incom.el,
+	calc/calc.el, emacs-cl-extra.el, emacs-cl-loaddefs.el,
+	emulation/cua-rect.el, emulation/viper-ex.el, eshell/esh-test.el,
+	eshell/eshell.el, gnus/gnus-uu.el, gnus/nndoc.el, gnus/nnrss.el,
+	gnus/rfc2047.el, gnus/utf7.el, international/utf-7.el,
+	language/ethio-util.el, mh-e/mh-alias.el, mh-e/mh-search.el,
+	net/imap.el, net/rcirc.el, obsolete/complete.el, play/decipher.el,
+	progmodes/ada-mode.el, progmodes/cc-awk.el, progmodes/dcl-mode.el,
+	progmodes/ps-mode.el, progmodes/verilog-mode.el,
+	progmodes/vhdl-mode.el, textmodes/bibtex.el, textmodes/fill.el,
+	textmodes/reftex-auc.el, textmodes/rst.el, textmodes/sgml-mode.el,
+	textmodes/table.el, textmodes/texinfmt.el: Replace Lisp calls to
+	delete-backward-char by calls to delete-char.
+
+2010-05-25  Kenichi Handa  <handa@m17n.org>
+
+	* language/hebrew.el (hebrew-shape-gstring): New function.
+	Register it in composition-function-table for all Hebrew combining
+	characters.
+
+2010-05-24  Uday S Reddy  <u.s.reddy@cs.bham.ac.uk>  (tiny change)
+
+	* textmodes/fill.el (fill-region): Don't fill past the end (bug#6201).
+
+2010-05-24  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* subr.el (read-quoted-char): Resolve modifiers after key
+	remapping (bug#6212).
+
 2010-05-22  Chong Yidong  <cyd@stupidchicken.com>
 
 	* image.el (image-refresh): Define as an alias for image-flush.
@@ -13,9 +68,9 @@
 
 2010-05-21  Alan Mackenzie  <acm@muc.de>
 
-	* progmodes/cc-engine.el (c-parse-state-get-strategy): Replace
-	parameter `here' with `here-' and `here-plus', which sandwich any
-	pertinent CPP construct.
+	* progmodes/cc-engine.el (c-parse-state-get-strategy):
+	Replace parameter `here' with `here-' and `here-plus', which sandwich
+	any pertinent CPP construct.
 	(c-remove-stale-state-cache-backwards): Fix a bug which happens
 	when doing (c-parse-state) in a CPP construct: Exclude any "new"
 	CPP construct from taking part in the scanning.
@@ -23,8 +78,8 @@
 2010-05-21  Michael Albinus  <michael.albinus@gmx.de>
 
 	* net/tramp.el (tramp-do-copy-or-rename-file)
-	(tramp-handle-file-local-copy, tramp-maybe-open-connection): Tune
-	`with-progress-reporter' messages.
+	(tramp-handle-file-local-copy, tramp-maybe-open-connection):
+	Tune `with-progress-reporter' messages.
 	(tramp-handle-vc-registered):
 	* net/tramp-fish.el (tramp-fish-handle-file-local-copy)
 	(tramp-fish-handle-insert-file-contents)
--- a/lisp/bs.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/bs.el	Tue May 25 07:23:37 2010 +0000
@@ -1152,7 +1152,7 @@
     (dolist (buffer list)
       (bs--insert-one-entry buffer)
       (insert "\n"))
-    (delete-backward-char 1)
+    (delete-char -1)
     (bs--set-window-height)
     (bs--goto-current-buffer)
     (font-lock-fontify-buffer)
--- a/lisp/calc/calc-graph.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/calc/calc-graph.el	Tue May 25 07:23:37 2010 +0000
@@ -433,7 +433,7 @@
 	   (while (memq (preceding-char) '(?\s ?\t))
 	     (forward-char -1))
 	   (if (eq (preceding-char) ?\,)
-	       (delete-backward-char 1))))
+	       (delete-char -1))))
        (with-current-buffer calcbuf
 	 (setq cache-env (list calc-angle-mode
 			       calc-complex-mode
--- a/lisp/calc/calc-help.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/calc/calc-help.el	Tue May 25 07:23:37 2010 +0000
@@ -128,7 +128,7 @@
               (dig2 (char-after (match-beginning 3))))
           (delete-region (match-end 1) (match-end 0))
           (goto-char (match-beginning 1))
-          (delete-backward-char 1)
+          (delete-char -1)
           (delete-char 5)
           (insert (format "%c .. %c" (min dig1 dig2) (max dig1 dig2)))))
       (goto-char (point-min)))))
--- a/lisp/calc/calc-incom.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/calc/calc-incom.el	Tue May 25 07:23:37 2010 +0000
@@ -176,9 +176,9 @@
 (defun calc-digit-dots ()
   (if (eq calc-prev-char ?.)
       (progn
-	(delete-backward-char 1)
+	(delete-char -1)
 	(if (calc-minibuffer-contains ".*\\.\\'")
-	    (delete-backward-char 1))
+	    (delete-char -1))
 	(setq calc-prev-char 'dots
 	      last-command-event 32)
 	(if calc-prev-prev-char
@@ -188,7 +188,7 @@
             (erase-buffer))
 	  (exit-minibuffer)))
     ;; just ignore extra decimal point, anticipating ".."
-    (delete-backward-char 1)))
+    (delete-char -1)))
 
 (defun calc-dots ()
   (interactive)
--- a/lisp/calc/calc.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/calc/calc.el	Tue May 25 07:23:37 2010 +0000
@@ -2386,7 +2386,7 @@
 	    (progn
 	      (require 'calc-ext)
 	      (calc-digit-dots))
-	  (delete-backward-char 1)
+	  (delete-char -1)
 	  (beep)
 	  (calc-temp-minibuffer-message " [Bad format]"))))))
   (setq calc-prev-prev-char calc-prev-char
--- a/lisp/emacs-lisp/bytecomp.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/emacs-lisp/bytecomp.el	Tue May 25 07:23:37 2010 +0000
@@ -353,7 +353,7 @@
 (defvar byte-compile-interactive-only-functions
   '(beginning-of-buffer end-of-buffer replace-string replace-regexp
     insert-file insert-buffer insert-file-literally previous-line next-line
-    goto-line comint-run)
+    goto-line comint-run delete-backward-char)
   "List of commands that are not meant to be called from Lisp.")
 
 (defvar byte-compile-not-obsolete-vars nil
--- a/lisp/emacs-lisp/cl-extra.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/emacs-lisp/cl-extra.el	Tue May 25 07:23:37 2010 +0000
@@ -685,7 +685,7 @@
     (setq last (point))
     (goto-char (1+ pt))
     (while (search-forward "(quote " last t)
-      (delete-backward-char 7)
+      (delete-char -7)
       (insert "'")
       (forward-sexp)
       (delete-char 1))
--- a/lisp/emacs-lisp/cl-loaddefs.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/emacs-lisp/cl-loaddefs.el	Tue May 25 07:23:37 2010 +0000
@@ -10,7 +10,7 @@
 ;;;;;;  ceiling* floor* isqrt lcm gcd cl-progv-before cl-set-frame-visible-p
 ;;;;;;  cl-map-overlays cl-map-intervals cl-map-keymap-recursively
 ;;;;;;  notevery notany every some mapcon mapcan mapl maplist map
-;;;;;;  cl-mapcar-many equalp coerce) "cl-extra" "cl-extra.el" "d93072a26c59f663a92b10df8bc28187")
+;;;;;;  cl-mapcar-many equalp coerce) "cl-extra" "cl-extra.el" "deb3495d75c36a222e5238eadb8e347c")
 ;;; Generated autoloads from cl-extra.el
 
 (autoload 'coerce "cl-extra" "\
--- a/lisp/emacs-lisp/smie.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/emacs-lisp/smie.el	Tue May 25 07:23:37 2010 +0000
@@ -72,7 +72,7 @@
   (let* ((key (cons x y))
          (old (gethash key table)))
     (if (and old (not (eq old val)))
-        (if (gethash key override)
+        (if (and override (gethash key override))
             ;; FIXME: The override is meant to resolve ambiguities,
             ;; but it also hides real conflicts.  It would be great to
             ;; be able to distinguish the two cases so that overrides
@@ -104,7 +104,7 @@
                 (smie-set-prec2tab prec2-table other-op op op1)))))))
     prec2-table))
 
-(defun smie-merge-prec2s (tables)
+(defun smie-merge-prec2s (&rest tables)
   (if (null (cdr tables))
       (car tables)
     (let ((prec2 (make-hash-table :test 'equal)))
@@ -121,8 +121,8 @@
         (first-nts-table ())
         (last-nts-table ())
         (prec2 (make-hash-table :test 'equal))
-        (override (smie-merge-prec2s
-                   (mapcar 'smie-precs-precedence-table precs)))
+        (override (apply 'smie-merge-prec2s
+                         (mapcar 'smie-precs-precedence-table precs)))
         again)
     (dolist (rules bnf)
       (let ((nt (car rules))
@@ -234,7 +234,7 @@
               (to (cdar eqs)))
           (setq eqs (cdr eqs))
           (if (eq to from)
-              (debug)                   ;Can it happen?
+              nil                   ;Nothing to do.
             (dolist (other-eq eqs)
               (if (eq from (cdr other-eq)) (setcdr other-eq to))
               (when (eq from (car other-eq))
@@ -271,16 +271,20 @@
         (incf i 10))
       ;; Propagate equalities back to their source.
       (dolist (eq (nreverse eqs))
-        (assert (null (caar eq)))
+        (assert (or (null (caar eq)) (eq (car eq) (cdr eq))))
         (setcar (car eq) (cadr eq)))
       ;; Finally, fill in the remaining vars (which only appeared on the
       ;; right side of the < constraints).
-      ;; Tho leaving them at nil is not a bad choice, since it makes
-      ;; it clear that these don't bind at all.
-      ;; (dolist (x table)
-      ;;   (unless (nth 1 x) (setf (nth 1 x) i))
-      ;;   (unless (nth 2 x) (setf (nth 2 x) i)))
-      )
+      (dolist (x table)
+        ;; When both sides are nil, it means this operator binds very
+        ;; very tight, but it's still just an operator, so we give it
+        ;; the highest precedence.
+        ;; OTOH if only one side is nil, it usually means it's like an
+        ;; open-paren, which is very important for indentation purposes,
+        ;; so we keep it nil, to make it easier to recognize.
+        (unless (or (nth 1 x) (nth 2 x))
+          (setf (nth 1 x) i)
+          (setf (nth 2 x) i))))
     table))
 
 ;;; Parsing using a precedence level table.
--- a/lisp/emulation/cua-rect.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/emulation/cua-rect.el	Tue May 25 07:23:37 2010 +0000
@@ -1344,7 +1344,7 @@
          pad)
         (if (bolp)
             nil
-          (delete-backward-char 1)
+          (delete-char -1)
           (if (cua--rectangle-right-side t)
               (cua--rectangle-insert-col (current-column))
             (setq indent (- l (current-column))))))
--- a/lisp/emulation/viper-ex.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/emulation/viper-ex.el	Tue May 25 07:23:37 2010 +0000
@@ -750,7 +750,7 @@
 			  (format "[^\\\\]\\(\\\\\\\\\\)*\\\\%c" c)))
 		    (setq cont nil)
 		  ;; we are at an escaped delimiter: unescape it and continue
-		  (delete-backward-char 2)
+		  (delete-char -2)
 		  (insert c)
 		  (if (eolp)
 		      ;; if at eol, exit loop and go to next line
--- a/lisp/eshell/esh-test.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/eshell/esh-test.el	Tue May 25 07:23:37 2010 +0000
@@ -101,7 +101,7 @@
       (eshell-redisplay))
     (let ((truth (eval command)))
       (with-current-buffer test-buffer
-	(delete-backward-char 6)
+	(delete-char -6)
 	(insert-before-markers
 	 "[" (let (str)
 	       (if truth
--- a/lisp/eshell/eshell.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/eshell/eshell.el	Tue May 25 07:23:37 2010 +0000
@@ -404,7 +404,7 @@
 	  (assert (not (eshell-interactive-process)))
 	  (goto-char (point-max))
 	  (while (and (bolp) (not (bobp)))
-	    (delete-backward-char 1)))
+	    (delete-char -1)))
 	(assert (and buf (buffer-live-p buf)))
 	(unless arg
 	  (let ((len (if (not intr) 2
--- a/lisp/expand.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/expand.el	Tue May 25 07:23:37 2010 +0000
@@ -368,7 +368,7 @@
     nil))
 
 (defun expand-do-expansion ()
-  (delete-backward-char (length last-abbrev-text))
+  (delete-char (- (length last-abbrev-text)))
   (let* ((vect (symbol-value last-abbrev))
 	 (text (aref vect 0))
 	 (position (aref vect 1))
--- a/lisp/gnus/gnus-uu.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/gnus/gnus-uu.el	Tue May 25 07:23:37 2010 +0000
@@ -1488,7 +1488,7 @@
       (when gnus-uu-kill-carriage-return
 	(save-excursion
 	  (while (search-forward "\r" nil t)
-	    (delete-backward-char 1))))
+	    (delete-char -1))))
 
       (while (or (re-search-forward gnus-uu-begin-string nil t)
 		 (re-search-forward gnus-uu-body-line nil t))
--- a/lisp/gnus/nndoc.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/gnus/nndoc.el	Tue May 25 07:23:37 2010 +0000
@@ -741,7 +741,7 @@
 	(setq p (1+ (nth 3 blk)))))
     (goto-char begin)
     (while (re-search-forward "\r$" nil t)
-      (delete-backward-char 1))
+      (delete-char -1))
     (when head
       (goto-char begin)
       (when (search-forward "\n\n" nil t)
--- a/lisp/gnus/nnrss.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/gnus/nnrss.el	Tue May 25 07:23:37 2010 +0000
@@ -682,7 +682,7 @@
       (rfc2047-encode-region (point-min) (point-max)))
     (goto-char (point-min))
     (while (search-forward "\n" nil t)
-      (delete-backward-char 1))
+      (delete-char -1))
     (buffer-string)))
 
 ;;; Snarf functions
--- a/lisp/gnus/rfc2047.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/gnus/rfc2047.el	Tue May 25 07:23:37 2010 +0000
@@ -427,7 +427,7 @@
 		      ;; since encoded words can't occur in quotes.
 		      (progn
 			(goto-char end)
-			(delete-backward-char 1)
+			(delete-char -1)
 			(goto-char start)
 			(delete-char 1)
 			(when last-encoded
@@ -897,7 +897,7 @@
 		  (goto-char beg)
 		  (while (search-forward "\\" nil 'move)
 		    (unless (memq (char-after) '(?\"))
-		      (delete-backward-char 1))
+		      (delete-char -1))
 		    (forward-char)))
 		(forward-char))
 	    (error
--- a/lisp/gnus/utf7.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/gnus/utf7.el	Tue May 25 07:23:37 2010 +0000
@@ -112,7 +112,7 @@
 		 (skip-chars-forward not-direct-encoding-chars)))
 	    (if (and (= fc esc-char)
 		     (= run-length 1))	; Lone esc-char?
-		(delete-backward-char 1) ; Now there's one too many
+		(delete-char -1)        ; Now there's one too many
 	      (utf7-fragment-encode p (point) for-imap))
 	    (insert "-")))))))
 
@@ -153,7 +153,7 @@
 	      (save-excursion
 		(utf7-fragment-decode p (point) for-imap)
 		(goto-char p)
-		(delete-backward-char 1)))))))))
+		(delete-char -1)))))))))
 
 (defun utf7-fragment-decode (start end &optional for-imap)
   "Decode base64 encoded fragment from START to END of UTF-7 text in buffer.
--- a/lisp/ido.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/ido.el	Tue May 25 07:23:37 2010 +0000
@@ -2815,7 +2815,7 @@
    ((eq this-original-command 'viper-del-backward-char-in-insert)
     (funcall this-original-command))
    (t
-    (delete-backward-char (prefix-numeric-value count)))))
+    (delete-char (- (prefix-numeric-value count))))))
 
 (defun ido-delete-backward-word-updir (count)
   "Delete all chars backwards, or at beginning of buffer, go up one level."
--- a/lisp/image-dired.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/image-dired.el	Tue May 25 07:23:37 2010 +0000
@@ -937,7 +937,7 @@
                ;; If on empty line at end of buffer
                (when (and (eobp)
                           (looking-at "^$"))
-                 (delete-backward-char 1))))))
+                 (delete-char -1))))))
        files)
       (save-buffer)
       (kill-buffer buf))))
--- a/lisp/international/utf-7.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/international/utf-7.el	Tue May 25 07:23:37 2010 +0000
@@ -62,7 +62,7 @@
 		(decode-coding-region p (point) 'utf-16be)
 		(save-excursion
 		  (goto-char p)
-		  (delete-backward-char 1)))))))
+		  (delete-char -1)))))))
       (- (point-max) (point-min)))))
 
 ;;;###autoload
--- a/lisp/language/ethio-util.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/language/ethio-util.el	Tue May 25 07:23:37 2010 +0000
@@ -869,7 +869,7 @@
     (goto-char (point-min))
     (while (re-search-forward "[ሀ-፼]" nil t)
       (setq ucode (preceding-char))
-      (delete-backward-char 1)
+      (delete-char -1)
       (insert
        (format (if ethio-java-save-lowercase "\\u%4x" "\\u%4X")
 	       ucode)))))
--- a/lisp/language/hebrew.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/language/hebrew.el	Tue May 25 07:23:37 2010 +0000
@@ -85,6 +85,35 @@
   :mime-charset 'cp862)
 (define-coding-system-alias 'ibm862 'cp862)
 
+;; Composition function for hebrew.
+(defun hebrew-shape-gstring (gstring)
+  (setq gstring (font-shape-gstring gstring))
+  (let ((header (lgstring-header gstring))
+	(nchars (lgstring-char-len gstring))
+	(nglyphs (lgstring-glyph-len gstring))
+	(base-width (lglyph-width (lgstring-glyph gstring 0))))
+    (while (> nglyphs 1)
+      (setq nglyphs (1- nglyphs))
+      (let* ((glyph (lgstring-glyph gstring nglyphs))
+	     (adjust (and glyph (lglyph-adjustment glyph))))
+	(if adjust
+	    (setq nglyphs 0)
+	  (if (>= (lglyph-lbearing glyph) 0)
+	      (lglyph-set-adjustment glyph (- base-width) 0 0))))))
+  gstring)
+
+(let ((pattern1 "[\u05D0-\u05F2][\u0591-\u05BF\u05C1-\u05C5\u05C7]+")
+      (pattern2 "[\u05D0-\u05F2]\u200D[\u0591-\u05BF\u05C1-\u05C5\u05C7]+"))
+  (set-char-table-range
+   composition-function-table '(#x591 . #x5C7)
+   (list (vector pattern2 2 'hebrew-shape-gstring)
+	 (vector pattern1 1 'hebrew-shape-gstring)
+	 ["[\u0591-\u05C7]" 0 font-shape-gstring]))
+  (set-char-table-range
+   composition-function-table #x5C0 nil)
+  (set-char-table-range
+   composition-function-table #x5C6 nil))
+
 (provide 'hebrew)
 
 ;; arch-tag: 3ca04f32-3f1e-498e-af46-8267498ba5d9
--- a/lisp/lpr.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/lpr.el	Tue May 25 07:23:37 2010 +0000
@@ -291,7 +291,7 @@
       (let (c)
 	(while (re-search-forward "[\^@-\^h\^k\^n-\^_\177-\377]" nil t)
 	  (setq c (preceding-char))
-	  (delete-backward-char 1)
+	  (delete-char -1)
 	  (insert (if (< c ?\s)
 		      (format "\\^%c" (+ c ?@))
 		    (format "\\%02x" c))))))))
--- a/lisp/mh-e/mh-alias.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/mh-e/mh-alias.el	Tue May 25 07:23:37 2010 +0000
@@ -234,7 +234,7 @@
         (let ((user-arg (if user "-user" "-nouser")))
           (mh-exec-cmd-quiet t "ali" user-arg "-nolist" alias))
         (goto-char (point-max))
-        (if (looking-at "^$") (delete-backward-char 1))
+        (if (looking-at "^$") (delete-char -1))
         (buffer-substring (point-min)(point-max)))
     (error (progn
              (message "%s" (error-message-string err))
--- a/lisp/mh-e/mh-search.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/mh-e/mh-search.el	Tue May 25 07:23:37 2010 +0000
@@ -1511,7 +1511,7 @@
       (delete-char 1))
     (goto-char (point-max))
     (while (and (not (bobp)) (memq (char-before) '(?  ?\t ?\n ?\r ?_)))
-      (delete-backward-char 1))
+      (delete-char -1))
     (subst-char-in-region (point-min) (point-max) ?  ?_ t)
     (subst-char-in-region (point-min) (point-max) ?\t ?_ t)
     (subst-char-in-region (point-min) (point-max) ?\n ?_ t)
--- a/lisp/net/imap.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/net/imap.el	Tue May 25 07:23:37 2010 +0000
@@ -2095,7 +2095,7 @@
 	(while (setq end (imap-find-next-line))
 	  (save-restriction
 	    (narrow-to-region (point-min) end)
-	    (delete-backward-char (length imap-server-eol))
+	    (delete-char (- (length imap-server-eol)))
 	    (goto-char (point-min))
 	    (unwind-protect
 		(cond ((eq imap-state 'initial)
--- a/lisp/net/rcirc.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/net/rcirc.el	Tue May 25 07:23:37 2010 +0000
@@ -1,6 +1,7 @@
 ;;; rcirc.el --- default, simple IRC client.
 
-;; Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+;; Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
 
 ;; Author: Ryan Yeske
 ;; URL: http://www.nongnu.org/rcirc
@@ -85,6 +86,10 @@
 VALUE must be a string.  If absent, `rcirc-default-full-name' is
 used.
 
+`:pass'
+
+VALUE must be a string.
+
 `:channels'
 
 VALUE must be a list of strings describing which channels to join
@@ -95,6 +100,7 @@
 					     (:port integer)
 					     (:user-name string)
 					     (:full-name string)
+					     (:pass string)
 					     (:channels (repeat string)))))
   :group 'rcirc)
 
@@ -108,15 +114,15 @@
   :type 'string
   :group 'rcirc)
 
-(defcustom rcirc-default-user-name (user-login-name)
+(defcustom rcirc-default-user-name "user"
   "Your user name sent to the server when connecting."
+  :version "24.1"                       ; changed default
   :type 'string
   :group 'rcirc)
 
-(defcustom rcirc-default-full-name (if (string= (user-full-name) "")
-				       rcirc-default-user-name
-				     (user-full-name))
+(defcustom rcirc-default-full-name "unknown"
   "The full name sent to the server when connecting."
+  :version "24.1"                       ; changed default
   :type 'string
   :group 'rcirc)
 
@@ -369,6 +375,9 @@
 (defvar rcirc-nick-name-history nil
   "History variable for \\[rcirc] call.")
 
+(defvar rcirc-user-name-history nil
+  "History variable for \\[rcirc] call.")
+
 ;;;###autoload
 (defun rcirc (arg)
   "Connect to all servers in `rcirc-server-alist'.
@@ -393,6 +402,12 @@
 				(or (plist-get server-plist :nick)
 				    rcirc-default-nick)
 				'rcirc-nick-name-history))
+	     (user-name (read-string "IRC Username: "
+                                     (or (plist-get server-plist :user-name)
+                                         rcirc-default-user-name)
+                                     'rcirc-user-name-history))
+	     (pass (read-passwd "IRC Password: " nil
+				(plist-get server-plist :pass)))
 	     (channels (split-string
 			(read-string "IRC Channels: "
 				     (mapconcat 'identity
@@ -400,7 +415,7 @@
 							   :channels)
 						" "))
 			"[, ]+" t)))
-	(rcirc-connect server port nick rcirc-default-user-name
+	(rcirc-connect server port nick user-name pass
 		       rcirc-default-full-name
 		       channels))
     ;; connect to servers in `rcirc-server-alist'
@@ -411,6 +426,7 @@
 	      (port (or (plist-get (cdr c) :port) rcirc-default-port))
 	      (user-name (or (plist-get (cdr c) :user-name)
 			     rcirc-default-user-name))
+              (pass (plist-get (cdr c) :pass))
 	      (full-name (or (plist-get (cdr c) :full-name)
 			     rcirc-default-full-name))
 	      (channels (plist-get (cdr c) :channels)))
@@ -421,7 +437,7 @@
 		  (setq connected p)))
 	      (if (not connected)
 		  (condition-case e
-		      (rcirc-connect server port nick user-name
+		      (rcirc-connect server port nick user-name pass
 				     full-name channels)
 		    (quit (message "Quit connecting to %s" server)))
 		(with-current-buffer (process-buffer connected)
@@ -453,8 +469,8 @@
 (defvar rcirc-process nil)
 
 ;;;###autoload
-(defun rcirc-connect (server &optional port nick user-name full-name
-			     startup-channels)
+(defun rcirc-connect (server &optional port nick user-name pass
+                             full-name startup-channels)
   (save-excursion
     (message "Connecting to %s..." server)
     (let* ((inhibit-eol-conversion)
@@ -503,10 +519,11 @@
       (add-hook 'auto-save-hook 'rcirc-log-write)
 
       ;; identify
+      (when pass
+        (rcirc-send-string process (concat "PASS " pass)))
       (rcirc-send-string process (concat "NICK " nick))
       (rcirc-send-string process (concat "USER " user-name
-                                      " hostname servername :"
-                                      full-name))
+                                         " 0 * :" full-name))
 
       ;; setup ping timer if necessary
       (unless rcirc-keepalive-timer
@@ -1067,8 +1084,8 @@
     (goto-char (point-max))
     (when (not (equal 0 (- (point) rcirc-prompt-end-marker)))
       ;; delete a trailing newline
-      (when (eq (point) (point-at-bol))
-	(delete-backward-char 1))
+      (when (bolp)
+	(delete-char -1))
       (let ((input (buffer-substring-no-properties
 		    rcirc-prompt-end-marker (point))))
 	(dolist (line (split-string input "\n"))
--- a/lisp/obsolete/complete.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/obsolete/complete.el	Tue May 25 07:23:37 2010 +0000
@@ -699,7 +699,7 @@
 	(if (and (eq mode 'word)
 		 (not PC-word-failed-flag))
 	    (let ((PC-word-failed-flag t))
-	      (delete-backward-char 1)
+	      (delete-char -1)
 	      (PC-do-completion 'word))
                (when abbreviated
                  (delete-region beg end)
--- a/lisp/pcomplete.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/pcomplete.el	Tue May 25 07:23:37 2010 +0000
@@ -553,7 +553,7 @@
 				pcomplete-expand-and-complete
 				pcomplete-reverse)))
       (progn
-	(delete-backward-char pcomplete-last-completion-length)
+	(delete-char (- pcomplete-last-completion-length))
 	(if (eq this-command 'pcomplete-reverse)
 	    (progn
               (push (car (last pcomplete-current-completions))
@@ -616,7 +616,7 @@
     (pcomplete)
     (when (and pcomplete-current-completions
 	       (> (length pcomplete-current-completions) 0)) ;??
-      (delete-backward-char pcomplete-last-completion-length)
+      (delete-char (- pcomplete-last-completion-length))
       (while pcomplete-current-completions
 	(unless (pcomplete-insert-entry
 		 "" (car pcomplete-current-completions) t
@@ -639,7 +639,7 @@
   (when (and pcomplete-cycle-completions
 	     pcomplete-current-completions
 	     (eq last-command 'pcomplete-argument))
-    (delete-backward-char pcomplete-last-completion-length)
+    (delete-char (- pcomplete-last-completion-length))
     (setq pcomplete-current-completions nil
 	  pcomplete-last-completion-raw nil))
   (let ((pcomplete-show-list t))
@@ -1207,7 +1207,7 @@
       ;; FIXME: Here we presume that quoting `stub' gives us the exact
       ;; text in the buffer before point, which is not guaranteed;
       ;; e.g. it is not the case in eshell when completing ${FOO}tm[TAB].
-      (delete-backward-char (length (pcomplete-quote-argument stub)))
+      (delete-char (- (length (pcomplete-quote-argument stub))))
       ;; if there is already a backslash present to handle the first
       ;; character, don't bother quoting it
       (when (eq (char-before) ?\\)
--- a/lisp/play/decipher.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/play/decipher.el	Tue May 25 07:23:37 2010 +0000
@@ -1060,7 +1060,7 @@
 ;;          (insert ?\()
 ;;          (while (setq undo-map (pop undo-rec))
 ;;            (insert (cdr undo-map) (car undo-map) ?\ ))
-;;          (delete-backward-char 1)
+;;          (delete-char -1)
 ;;          (insert ")\n"))))))
 
 ;; arch-tag: 8f094d88-ffe1-4f99-afe3-a5e81dd939d9
--- a/lisp/progmodes/ada-mode.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/progmodes/ada-mode.el	Tue May 25 07:23:37 2010 +0000
@@ -1645,7 +1645,7 @@
 		     (insert " ")
 		     (ada-adjust-case)
 		     ;; horrible dekludge
-		     (delete-backward-char 1)
+		     (delete-char -1)
 		     ;; some special keys and their bindings
 		     (cond
 		      ((eq lastk ?\n)
--- a/lisp/progmodes/cc-awk.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/progmodes/cc-awk.el	Tue May 25 07:23:37 2010 +0000
@@ -244,7 +244,7 @@
 
 ;; REGEXPS USED FOR FINDING THE POSITION OF A "virtual semicolon"
 (defconst c-awk-_-harmless-nonws-char-re "[^#/\"\\\\\n\r \t]")
-;;;; NEW VERSION!  (which will be restricted to the current line)
+;; NEW VERSION!  (which will be restricted to the current line)
 (defconst c-awk-one-line-non-syn-ws*-re
   (concat "\\([ \t]*"
               "\\(" c-awk-_-harmless-nonws-char-re "\\|"
@@ -503,7 +503,7 @@
         (insert-char ?\n 1) ; ...artificial eol is needed for comment detection.
         (setq extra-nl t))
       (prog1 (c-awk-get-NL-prop-prev-line do-lim)
-        (if extra-nl (delete-backward-char 1))))))
+        (if extra-nl (delete-char -1))))))
 
 (defsubst c-awk-prev-line-incomplete-p (&optional do-lim)
   ;; Is there an incomplete statement at the end of the previous line?
@@ -519,14 +519,14 @@
   ;; This function might do hidden buffer changes.
   (memq (c-awk-get-NL-prop-cur-line do-lim) '(?\\ ?\{)))
 
-;;;; NOTES ON "VIRTUAL SEMICOLONS"
-;;;;
-;;;; A "virtual semicolon" is what terminates a statement when there is no ;
-;;;; or } to do the job.  Like point, it is considered to lie _between_ two
-;;;; characters.  As from mid-March 2004, it is considered to lie just after
-;;;; the last non-syntactic-whitespace character on the line; (previously, it
-;;;; was considered an attribute of the EOL on the line).  A real semicolon
-;;;; never counts as a virtual one.
+;; NOTES ON "VIRTUAL SEMICOLONS"
+;;
+;; A "virtual semicolon" is what terminates a statement when there is no ;
+;; or } to do the job.  Like point, it is considered to lie _between_ two
+;; characters.  As from mid-March 2004, it is considered to lie just after
+;; the last non-syntactic-whitespace character on the line; (previously, it
+;; was considered an attribute of the EOL on the line).  A real semicolon
+;; never counts as a virtual one.
 
 (defun c-awk-at-vsemi-p (&optional pos)
   ;; Is there a virtual semicolon at POS (or POINT)?
--- a/lisp/progmodes/dcl-mode.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/progmodes/dcl-mode.el	Tue May 25 07:23:37 2010 +0000
@@ -1549,13 +1549,11 @@
   (interactive "*P")
   (delete-indentation arg)
   (let ((type (dcl-get-line-type)))
-    (if (and (or (equal type '$)
-		 (equal type '-)
-		 (equal type 'empty-$))
+    (if (and (member type '($ - empty-$))
 	     (not (bobp))
-	     (= (char-after (1- (point))) ?-))
+	     (= (char-before) ?-))
 	(progn
-	  (delete-backward-char 1)
+	  (delete-char -1)
 	  (fixup-whitespace)))))
 
 
--- a/lisp/progmodes/ps-mode.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/progmodes/ps-mode.el	Tue May 25 07:23:37 2010 +0000
@@ -681,7 +681,7 @@
     (if (or (not ps-mode-auto-indent)
 	    (< ps-mode-tab 1)
 	    (not (re-search-backward "^[ \t]+\\=" nil t)))
-	(delete-backward-char 1)
+	(call-interactively 'delete-backward-char)
       (setq target (ps-mode-target-column))
       (while (> column target)
 	(setq target (+ target ps-mode-tab)))
--- a/lisp/progmodes/verilog-mode.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/progmodes/verilog-mode.el	Tue May 25 07:23:37 2010 +0000
@@ -9305,11 +9305,11 @@
 		 (delete-char 1)
 		 (insert ");")
 		 (search-forward "\n")	;; Added by inst-port
-		 (delete-backward-char 1)
+		 (delete-char -1)
 		 (if (search-forward ")" nil t) ;; From user, moved up a line
-		     (delete-backward-char 1))
+		     (delete-char -1))
 		 (if (search-forward ";" nil t) ;; Don't error if user had syntax error and forgot it
-		     (delete-backward-char 1)))))))))
+		     (delete-char -1)))))))))
 
 (defun verilog-auto-inst-param ()
   "Expand AUTOINSTPARAM statements, as part of \\[verilog-auto].
@@ -9412,9 +9412,9 @@
 		 (delete-char 1)
 		 (insert ")")
 		 (search-forward "\n")	;; Added by inst-port
-		 (delete-backward-char 1)
+		 (delete-char -1)
 		 (if (search-forward ")" nil t) ;; From user, moved up a line
-		     (delete-backward-char 1)))))))))
+		     (delete-char -1)))))))))
 
 (defun verilog-auto-reg ()
   "Expand AUTOREG statements, as part of \\[verilog-auto].
--- a/lisp/progmodes/vhdl-mode.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/progmodes/vhdl-mode.el	Tue May 25 07:23:37 2010 +0000
@@ -7994,7 +7994,7 @@
 		       (condition-case () (forward-sexp)
 			 (error (goto-char (point-max))))
 		       (< (point) end))
-	   (delete-backward-char 1))
+	   (delete-char -1))
 	 ;; add closing parenthesis
 	 (when (> (point) end)
 	   (goto-char end)
@@ -8105,7 +8105,7 @@
   (interactive "p")
   (if (and vhdl-stutter-mode (= count 1) (not (vhdl-in-literal)))
       (if (= (preceding-char) last-input-event)
-	  (progn (delete-backward-char 1) (insert-char ?\" 1))
+	  (progn (delete-char -1) (insert-char ?\" 1))
 	(insert-char ?\' 1))
     (self-insert-command count)))
 
@@ -8172,7 +8172,7 @@
       (unless (vhdl-template-field
 	       (concat "[type" (and (vhdl-standard-p 'ams) " or nature") "]")
 	       nil t)
-	(delete-backward-char 3))
+	(delete-char -3))
       (vhdl-insert-keyword " IS ")
       (vhdl-template-field "name" ";")
       (vhdl-comment-insert-inline))))
@@ -8536,7 +8536,7 @@
 	       (vhdl-template-field "library name" "." nil nil nil nil
 				    (vhdl-work-library))
 	       (vhdl-template-field "configuration name" ";"))
-	      (t (delete-backward-char 1) (insert ";") t))))))
+	      (t (delete-char -1) (insert ";") t))))))
 
 
 (defun vhdl-template-configuration-decl ()
@@ -8703,7 +8703,7 @@
 	(vhdl-insert-keyword " OPEN ")
 	(unless (vhdl-template-field "[READ_MODE | WRITE_MODE | APPEND_MODE]"
 				     nil t)
-	  (delete-backward-char 6)))
+	  (delete-char -6)))
       (vhdl-insert-keyword " IS ")
       (when (vhdl-standard-p '87)
 	(vhdl-template-field "[IN | OUT]" " " t))
@@ -9031,7 +9031,7 @@
 	      (insert "\n")
 	      (indent-to margin))
 	    (delete-region end-pos (point))
-	    (delete-backward-char 1)
+	    (delete-char -1)
 	    (insert ")")
 	    (when vhdl-auto-align (vhdl-align-region-groups start (point) 1))
 	    t)
@@ -9405,7 +9405,7 @@
     (vhdl-insert-keyword "REPORT ")
     (if (equal "\"\"" (vhdl-template-field
 		       "string expression" nil t start (point) t))
-	(delete-backward-char 2)
+	(delete-char -2)
       (setq start (point))
       (vhdl-insert-keyword " SEVERITY ")
       (unless (vhdl-template-field "[NOTE | WARNING | ERROR | FAILURE]" nil t)
@@ -9553,7 +9553,7 @@
 		    "[scalar type | ARRAY | RECORD | ACCESS | FILE]" nil t)
 		   ""))))
 	(cond ((equal definition "")
-	       (delete-backward-char 4)
+	       (delete-char -4)
 	       (insert ";"))
 	      ((equal definition "ARRAY")
 	       (delete-region (point) (progn (forward-word -1) (point)))
@@ -10053,13 +10053,13 @@
       (if (not (or (and string (progn (insert string) t))
 		   (vhdl-template-field "[comment]" nil t)))
 	  (delete-region position (point))
-	(while (= (preceding-char) ? ) (delete-backward-char 1))
-; 	(when (> (current-column) end-comment-column)
-; 	  (setq position (point-marker))
-; 	  (re-search-backward "-- ")
-; 	  (insert "\n")
-; 	  (indent-to comment-column)
-; 	  (goto-char position))
+	(while (= (preceding-char) ?\ ) (delete-char -1))
+	;; (when (> (current-column) end-comment-column)
+	;;   (setq position (point-marker))
+	;;   (re-search-backward "-- ")
+	;;   (insert "\n")
+	;;   (indent-to comment-column)
+	;;   (goto-char position))
 	))))
 
 (defun vhdl-comment-block ()
@@ -10192,7 +10192,7 @@
     (when semicolon-pos (goto-char semicolon-pos))
     (if not-empty
 	(progn (delete-char 1) (insert ")"))
-      (delete-backward-char 2))))
+      (delete-char -2))))
 
 (defun vhdl-template-generic-list (optional &optional no-value)
   "Read from user a generic spec argument list."
--- a/lisp/skeleton.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/skeleton.el	Tue May 25 07:23:37 2010 +0000
@@ -358,7 +358,7 @@
 	     (< element 0))
 	(if skeleton-untabify
 	    (backward-delete-char-untabify (- element))
-	  (delete-backward-char (- element)))
+	  (delete-char element))
       (insert (if (not literal)
 		  (funcall skeleton-transformation-function element)
 		element))))
--- a/lisp/term.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/term.el	Tue May 25 07:23:37 2010 +0000
@@ -1170,7 +1170,7 @@
 	    (let* ((str (car cur)) (len (length str)) (start (- (point) len)))
 	      (if (and (>= start (point-min))
 		       (string= str (buffer-substring start (point))))
-		  (progn (delete-backward-char len)
+		  (progn (delete-char (- len))
 			 (setq term-kill-echo-list (cdr cur))
 			 (setq term-current-column nil)
 			 (setq term-current-row nil)
--- a/lisp/textmodes/bibtex.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/textmodes/bibtex.el	Tue May 25 07:23:37 2010 +0000
@@ -2094,7 +2094,7 @@
                                 ;; if match not at left subfield boundary...
                                 (if (< (1+ (nth 1 bounds)) (match-beginning 0))
                                     (insert (bibtex-field-right-delimiter) " # ")
-                                  (delete-backward-char 1))))))))
+                                  (delete-char -1))))))))
 
                     ;; use book title of crossref'd entry
                     (if (and (memq 'inherit-booktitle format)
--- a/lisp/textmodes/fill.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/textmodes/fill.el	Tue May 25 07:23:37 2010 +0000
@@ -657,7 +657,7 @@
       (if (and oneleft
 	       (not (and use-hard-newlines
 			 (get-text-property (1- (point)) 'hard))))
-	  (delete-backward-char 1)
+	  (delete-char -1)
 	(backward-char 1)
 	(setq oneleft t)))
     (setq to (copy-marker (point) t))
@@ -1036,7 +1036,7 @@
 	  (fill-forward-paragraph -1))
 	(if (< (point) beg)
 	    (goto-char beg))
-	(if (>= (point) initial)
+	(if (and (>= (point) initial) (< (point) end))
 	    (setq fill-pfx
 		  (fill-region-as-paragraph (point) end justify nosqueeze))
 	  (goto-char end))))
--- a/lisp/textmodes/reftex-auc.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/textmodes/reftex-auc.el	Tue May 25 07:23:37 2010 +0000
@@ -58,7 +58,7 @@
       ;; Create a new label, with a temporary brace for `reftex-what-macro'
       (unwind-protect
           (progn (insert "{") (setq label (or (reftex-label nil t) "")))
-        (delete-backward-char 1)))
+        (delete-char -1)))
      ((and (not definition) (reftex-plug-flag 2))
       ;; Reference a label with RefTeX
       (setq label (reftex-reference nil t)))
--- a/lisp/textmodes/rst.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/textmodes/rst.el	Tue May 25 07:23:37 2010 +0000
@@ -1787,7 +1787,7 @@
       (delete-region init-point (+ init-point (length initial-indent)))
 
       ;; Delete the last newline added.
-      (delete-backward-char 1)
+      (delete-char -1)
     )))
 
 (defun rst-toc-insert-node (node level indent pfx)
--- a/lisp/textmodes/sgml-mode.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/textmodes/sgml-mode.el	Tue May 25 07:23:37 2010 +0000
@@ -526,7 +526,7 @@
     (insert-char ?/ 1)
     (indent-according-to-mode))
    ((eq sgml-quick-keys 'close)
-    (delete-backward-char 1)
+    (delete-char -1)
     (sgml-close-tag))
    (t
     (sgml-slash-matching arg))))
@@ -583,7 +583,7 @@
   (insert ?&)
   (or char
       (setq char (read-quoted-char "Enter char or octal number")))
-  (delete-backward-char 1)
+  (delete-char -1)
   (insert char)
   (undo-boundary)
   (sgml-namify-char))
@@ -601,7 +601,7 @@
 	   ((encode-char char 'ucs)))))
     (if (not name)
 	(error "Don't know the name of `%c'" char)
-      (delete-backward-char 1)
+      (delete-char -1)
       (insert (format (if (numberp name) "&#%d;" "&%s;") name)))))
 
 (defun sgml-name-self ()
@@ -707,7 +707,7 @@
 	      (sgml-value (assoc (downcase attribute) alist))
 	      (setq i (1- i))))
 	  (if (eq (preceding-char) ?\s)
-	      (delete-backward-char 1)))
+	      (delete-char -1)))
 	car)))
 
 (defun sgml-auto-attributes (arg)
@@ -1117,7 +1117,7 @@
 	  (setq alist (skeleton-read '(completing-read "Value: " (cdr alist))))
 	  (if (string< "" alist)
 	      (insert alist ?\")
-	    (delete-backward-char 2)))
+	    (delete-char -2)))
       (insert "=\"")
       (if (cdr alist)
           (insert (skeleton-read '(completing-read "Value: " alist)))
--- a/lisp/textmodes/table.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/textmodes/table.el	Tue May 25 07:23:37 2010 +0000
@@ -919,12 +919,12 @@
 (defvar table-source-info-plist nil
   "General storage for temporary information used while generating source.")
 
-;;; The following history containers not only keep the history of user
-;;; entries but also serve as the default value providers.  When an
-;;; interactive command is invoked it offers a user the latest entry
-;;; of the history as a default selection.  Therefore the values below
-;;; are the first default value when a command is invoked for the very
-;;; first time when there is no real history existing yet.
+;; The following history containers not only keep the history of user
+;; entries but also serve as the default value providers.  When an
+;; interactive command is invoked it offers a user the latest entry
+;; of the history as a default selection.  Therefore the values below
+;; are the first default value when a command is invoked for the very
+;; first time when there is no real history existing yet.
 (defvar table-cell-span-direction-history '("right"))
 (defvar table-cell-split-orientation-history '("horizontally"))
 (defvar table-cell-split-contents-to-history '("split"))
@@ -948,19 +948,19 @@
 (defvar table-capture-columns-history '(""))
 (defvar table-target-history '("cell"))
 
-;;; Some entries in `table-cell-bindings' are duplicated in
-;;; `table-command-remap-alist'.  There is a good reason for
-;;; this.  Common key like return key may be taken by some other
-;;; function than normal `newline' function.  Thus binding return key
-;;; directly for `*table--cell-newline' ensures that the correct enter
-;;; operation in a table cell.  However
-;;; `table-command-remap-alist' has an additional role than
-;;; replacing commands.  It is also used to construct a table command
-;;; list.  This list is very important because it is used to check if
-;;; the previous command was one of them in this list or not.  If the
-;;; previous command is found in the list the current command will not
-;;; refill the table cache.  If the command were not listed fast
-;;; typing can cause unwanted cache refill.
+;; Some entries in `table-cell-bindings' are duplicated in
+;; `table-command-remap-alist'.  There is a good reason for
+;; this.  Common key like return key may be taken by some other
+;; function than normal `newline' function.  Thus binding return key
+;; directly for `*table--cell-newline' ensures that the correct enter
+;; operation in a table cell.  However
+;; `table-command-remap-alist' has an additional role than
+;; replacing commands.  It is also used to construct a table command
+;; list.  This list is very important because it is used to check if
+;; the previous command was one of them in this list or not.  If the
+;; previous command is found in the list the current command will not
+;; refill the table cache.  If the command were not listed fast
+;; typing can cause unwanted cache refill.
 (defconst table-cell-bindings
   '(([(control i)]	. table-forward-cell)
     ([(control I)]	. table-backward-cell)
--- a/lisp/textmodes/texinfmt.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/textmodes/texinfmt.el	Tue May 25 07:23:37 2010 +0000
@@ -2507,7 +2507,7 @@
       (error "Not found: @verb start brace"))
     (delete-region texinfo-command-start (+ 2 texinfo-command-end))
     (search-forward  delimiter))
-  (delete-backward-char 1)
+  (delete-char -1)
   (unless (looking-at "}")
     (error "Not found: @verb end brace"))
   (delete-char 1))
--- a/lisp/time.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/time.el	Tue May 25 07:23:37 2010 +0000
@@ -524,7 +524,7 @@
 	(insert (pop result)
 		(make-string (1+ (- max-width (pop result))) ?\s)
 		(pop result) "\n")))
-    (delete-backward-char 1)))
+    (delete-char -1)))
 
 ;;;###autoload
 (defun display-time-world ()
--- a/lisp/url/ChangeLog	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/url/ChangeLog	Tue May 25 07:23:37 2010 +0000
@@ -1,3 +1,7 @@
+2010-05-19  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* url-util.el (url-unhex-string): Don't accidentally decode as latin-1.
+
 2010-05-07  Chong Yidong  <cyd@stupidchicken.com>
 
 	* Version 23.2 released.
--- a/lisp/url/url-util.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/url/url-util.el	Tue May 25 07:23:37 2010 +0000
@@ -322,10 +322,10 @@
 		   tmp (substring str 0 start)
 		   (cond
 		    (allow-newlines
-		     (char-to-string code))
+		     (byte-to-string code))
 		    ((or (= code ?\n) (= code ?\r))
 		     " ")
-		    (t (char-to-string code))))
+		    (t (byte-to-string code))))
 	      str (substring str (match-end 0)))))
     (setq tmp (concat tmp str))
     tmp))
--- a/lisp/wid-edit.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/wid-edit.el	Tue May 25 07:23:37 2010 +0000
@@ -1334,7 +1334,7 @@
 		     (goto-char end)
 		     (while (and (eq (preceding-char) ?\s)
 				 (> (point) begin))
-		       (delete-backward-char 1)))))))
+		       (delete-char -1)))))))
 	(widget-specify-secret field))
       (widget-apply field :notify field))))
 
@@ -1477,7 +1477,7 @@
      ;; Parse escapes in format.
      (while (re-search-forward "%\\(.\\)" nil t)
        (let ((escape (char-after (match-beginning 1))))
-	 (delete-backward-char 2)
+	 (delete-char -2)
 	 (cond ((eq escape ?%)
 		(insert ?%))
 	       ((eq escape ?\[)
@@ -1510,7 +1510,7 @@
 		    (setq doc-begin (point))
 		    (insert doc)
 		    (while (eq (preceding-char) ?\n)
-		      (delete-backward-char 1))
+		      (delete-char -1))
 		    (insert ?\n)
 		    (setq doc-end (point)))))
 	       ((eq escape ?h)
@@ -2258,7 +2258,7 @@
      ;; Parse % escapes in format.
      (while (re-search-forward "%\\([bv%]\\)" nil t)
        (let ((escape (char-after (match-beginning 1))))
-	 (delete-backward-char 2)
+	 (delete-char -2)
 	 (cond ((eq escape ?%)
 		(insert ?%))
 	       ((eq escape ?b)
@@ -2441,7 +2441,7 @@
      ;; Parse % escapes in format.
      (while (re-search-forward "%\\([bv%]\\)" nil t)
        (let ((escape (char-after (match-beginning 1))))
-	 (delete-backward-char 2)
+	 (delete-char -2)
 	 (cond ((eq escape ?%)
 		(insert ?%))
 	       ((eq escape ?b)
@@ -2720,7 +2720,7 @@
      ;; Parse % escapes in format.
      (while (re-search-forward "%\\(.\\)" nil t)
        (let ((escape (char-after (match-beginning 1))))
-	 (delete-backward-char 2)
+	 (delete-char -2)
 	 (cond ((eq escape ?%)
 		(insert ?%))
 	       ((eq escape ?i)
--- a/lisp/woman.el	Mon May 24 22:47:09 2010 +0000
+++ b/lisp/woman.el	Tue May 25 07:23:37 2010 +0000
@@ -2443,7 +2443,7 @@
 	    (while (and
 		    (<= (setq N (1+ N)) 0)
 		    (cond ((memq (preceding-char) '(?\  ?\t))
-			   (delete-backward-char 1) t)
+			   (delete-char -1) t)
 			  ((memq (following-char) '(?\  ?\t))
 			   (delete-char 1) t)
 			  (t nil))))
@@ -3121,7 +3121,7 @@
 	  (if unquote (delete-char 1) (forward-char))
 	  (re-search-forward "\"\\|$"))
 	(if (eq (preceding-char) ?\")
-	    (if unquote (delete-backward-char 1))
+	    (if unquote (delete-char -1))
 	  (WoMan-warn "Unpaired \" in .%s arguments." request)))
     ;; (re-search-forward "[^\\\n] \\|$")	; inconsistent
     (skip-syntax-forward "^ "))
@@ -4346,7 +4346,7 @@
 tab stop columns or pairs (COLUMN . TYPE) where TYPE is R or C."
   ;; Based on tab-to-tab-stop in indent.el.
   ;; R & C tabs probably not quite right!
-  (delete-backward-char 1)
+  (delete-char -1)
   (let ((tabs tab-stop-list))
     (while (and tabs (>= (current-column)
 			 (woman-get-tab-stop (car tabs))))
@@ -4400,7 +4400,7 @@
 	  (delete-char 1)
 	  (insert woman-unpadded-space-char)
 	  (goto-char (match-end 0))
-	  (delete-backward-char 1)
+	  (delete-char -1)
 	  (insert-before-markers woman-unpadded-space-char)
 	  (subst-char-in-region
 	   (match-beginning 0) (match-end 0)
--- a/msdos/ChangeLog	Mon May 24 22:47:09 2010 +0000
+++ b/msdos/ChangeLog	Tue May 25 07:23:37 2010 +0000
@@ -1,3 +1,7 @@
+2010-05-25  Glenn Morris  <rgm@gnu.org>
+
+	* sed1v2.inp (LD_SWITCH_SYSTEM_EXTRA): No longer present.
+
 2010-05-21  Glenn Morris  <rgm@gnu.org>
 
 	* sed1v2.inp(@ns_frag@): Edit to nothing.
--- a/msdos/sed1v2.inp	Mon May 24 22:47:09 2010 +0000
+++ b/msdos/sed1v2.inp	Tue May 25 07:23:37 2010 +0000
@@ -51,7 +51,6 @@
 /^LD_SWITCH_X_SITE_AUX *=/s/@LD_SWITCH_X_SITE_AUX@//
 /^LD_SWITCH_X_SITE_AUX_RPATH *=/s/@LD_SWITCH_X_SITE_AUX_RPATH@//
 /^LD_SWITCH_SYSTEM *=/s/@LD_SWITCH_SYSTEM@//
-/^LD_SWITCH_SYSTEM_EXTRA *=/s/@LD_SWITCH_SYSTEM_EXTRA@//
 /^TEMACS_LDFLAGS2 *=/s/@TEMACS_LDFLAGS2@/$(LDFLAGS)/
 /^LIBS_SYSTEM *=/s/@LIBS_SYSTEM@//
 /^LIB_GCC *=/s/@LIB_GCC@/-Lgcc/
--- a/src/ChangeLog	Mon May 24 22:47:09 2010 +0000
+++ b/src/ChangeLog	Tue May 25 07:23:37 2010 +0000
@@ -1,3 +1,46 @@
+2010-05-25  Glenn Morris  <rgm@gnu.org>
+
+	* Makefile.in (@NS_IMPL_GNUSTEP_INC@, NS_IMPL_GNUSTEP_TEMACS_LDFLAGS):
+	Move before TEMACS_LDFLAGS.
+	(TEMACS_LDFLAGS): Use $NS_IMPL_GNUSTEP_TEMACS_LDFLAGS.
+	(temacs${EXEEXT}): Do not use $NS_IMPL_GNUSTEP_TEMACS_LDFLAGS.
+
+	* Makefile.in (NOT_C_CODE): No longer define.
+	(config.h): No longer include.
+
+	* Makefile.in (LD_SWITCH_SYSTEM_TEMACS): Move definition after some
+	variables it may reference.
+
+	* Makefile.in (LD_SWITCH_SYSTEM_EXTRA): Remove.
+	(TEMACS_LDFLAGS): Remove LD_SWITCH_SYSTEM_EXTRA.
+
+2010-05-25  Kenichi Handa  <handa@m17n.org>
+
+	* dispextern.h (struct composition_it): New members rule_idx and
+	charpos.
+
+	* xdisp.c (set_iterator_to_next): While scanning backward, assume
+	that the character positions of IT point the last character of the
+	current grapheme cluster.
+	(next_element_from_composition): Don't change character positions
+	of IT.
+	(append_composite_glyph): Set glyph->charpos to
+	it->cmp_it.charpos.
+
+	* composite.c (autocmp_chars): Change the first argument to RULE,
+	and try composition with RULE only.
+	(composition_compute_stop_pos): Record the index number of the
+	composition rule in CMP_IT->rule_idx.
+	(composition_reseat_it): Call autocmp_chars repeatedly until the
+	correct rule of the composition is found.
+	(composition_update_it): Set CMP_IT->charpos.  Assume the CHARPOS
+	is at the last character of the current grapheme cluster when
+	CMP_IT->reversed_p is nonzero.
+
+2010-05-24  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* editfns.c (Fbyte_to_string): New function.
+
 2010-05-24  Stefan Monnier  <monnier@iro.umontreal.ca>
 
 	* process.c (Fmake_network_process): Set :host to nil if it's not used.
@@ -5,8 +48,7 @@
 
 2010-05-23  Eli Zaretskii  <eliz@gnu.org>
 
-	* dispextern.h (init_iterator): Sync prototype with changed
-	definition.
+	* dispextern.h (init_iterator): Sync prototype with changed definition.
 
 2010-05-19  Eli Zaretskii  <eliz@gnu.org>
 
--- a/src/Makefile.in	Mon May 24 22:47:09 2010 +0000
+++ b/src/Makefile.in	Tue May 25 07:23:37 2010 +0000
@@ -96,12 +96,6 @@
 ## substituted in this or any other Makefile. Cf C_SWITCH_X_SITE.
 LD_SWITCH_X_SITE=
 
-## This holds any special options for linking temacs only (ie, not
-## used by configure).  Not used elsewhere because it sometimes
-## contains options that have to do with using Emacs's crt0, 
-## which are only good with temacs.
-LD_SWITCH_SYSTEM_TEMACS=@LD_SWITCH_SYSTEM_TEMACS@
-
 ## Next two must come before LD_SWITCH_SYSTEM.
 ## If needed, a -R option that says where to find X windows at run time.
 LD_SWITCH_X_SITE_AUX=@LD_SWITCH_X_SITE_AUX@
@@ -110,10 +104,21 @@
 
 ## System-specific LDFLAGS.
 LD_SWITCH_SYSTEM=@LD_SWITCH_SYSTEM@
-LD_SWITCH_SYSTEM_EXTRA=@LD_SWITCH_SYSTEM_EXTRA@
+
+## This holds any special options for linking temacs only (ie, not
+## used by configure).  Not used elsewhere because it sometimes
+## contains options that have to do with using Emacs's crt0, 
+## which are only good with temacs.
+LD_SWITCH_SYSTEM_TEMACS=@LD_SWITCH_SYSTEM_TEMACS@
+
+## If NS_IMPL_GNUSTEP, some definitions and includes are expanded here.
+@NS_IMPL_GNUSTEP_INC@
+
+## This uses ${CONFIG_SYSTEM_LIBS} from @NS_IMPL_GNUSTEP_INC@.
+NS_IMPL_GNUSTEP_TEMACS_LDFLAGS=@NS_IMPL_GNUSTEP_TEMACS_LDFLAGS@
 
 ## Flags to pass to ld only for temacs.
-TEMACS_LDFLAGS = $(LD_SWITCH_SYSTEM) $(LD_SWITCH_SYSTEM_EXTRA) $(LD_SWITCH_SYSTEM_TEMACS)
+TEMACS_LDFLAGS = $(LD_SWITCH_SYSTEM) $(LD_SWITCH_SYSTEM_TEMACS) $(NS_IMPL_GNUSTEP_TEMACS_LDFLAGS)
 
 ## $LDFLAGS, or empty if NS_IMPL_GNUSTEP (for some reason).
 TEMACS_LDFLAGS2 = @TEMACS_LDFLAGS2@
@@ -302,16 +307,6 @@
 # ========================== start of cpp stuff =======================
 /* From here on, comments must be done in C syntax.  */
 
-#define NOT_C_CODE
-#include "config.h"
-
-/* If NS_IMPL_GNUSTEP, some definitions and includes are expanded here.  */
-@NS_IMPL_GNUSTEP_INC@
-
-/* FIXME move to LD_SWITCH_SYSTEM_TEMACS?
-   This uses ${CONFIG_SYSTEM_LIBS}, presumably set by the above include.  */
-NS_IMPL_GNUSTEP_TEMACS_LDFLAGS=@NS_IMPL_GNUSTEP_TEMACS_LDFLAGS@
-
 /* DO NOT use -R.  There is a special hack described in lastfile.c
    which is used instead.  Some initialized data areas are modified
    at initial startup, then labeled as part of the text area when
@@ -648,8 +643,7 @@
 #define YMF_PASS_LDFLAGS(flags) @YMF_PASS_LDFLAGS@
 
 temacs${EXEEXT}: $(START_FILES) stamp-oldxmenu ${obj} ${otherobj} prefix-args${EXEEXT}
-	$(LD) YMF_PASS_LDFLAGS ( ${TEMACS_LDFLAGS} \
-	  ${NS_IMPL_GNUSTEP_TEMACS_LDFLAGS} ) \
+	$(LD) YMF_PASS_LDFLAGS ( ${TEMACS_LDFLAGS} ) \
 	  ${TEMACS_LDFLAGS2} \
 	  -o temacs ${START_FILES} ${obj} ${otherobj} ${LIBES}
 
--- a/src/cmds.c	Mon May 24 22:47:09 2010 +0000
+++ b/src/cmds.c	Tue May 25 07:23:37 2010 +0000
@@ -278,7 +278,9 @@
        doc: /* Delete the previous N characters (following if N is negative).
 Optional second arg KILLFLAG non-nil means kill instead (save in kill ring).
 Interactively, N is the prefix arg, and KILLFLAG is set if
-N was explicitly specified.  */)
+N was explicitly specified.
+This is meant for interactive use only; from Lisp, better use `delete-char'
+with a negated argument.  */)
      (n, killflag)
      Lisp_Object n, killflag;
 {
--- a/src/composite.c	Mon May 24 22:47:09 2010 +0000
+++ b/src/composite.c	Tue May 25 07:23:37 2010 +0000
@@ -915,15 +915,16 @@
 }
 
 
-/* Try to compose the characters at CHARPOS according to CFT_ELEMENT
-   which is an element of composition-function-table (which see).
-   LIMIT limits the characters to compose.  STRING, if not nil, is a
-   target string.  WIN is a window where the characters are being
-   displayed.  */
+/* Try to compose the characters at CHARPOS according to composition
+   rule RULE ([PATTERN PREV-CHARS FUNC]).  LIMIT limits the characters
+   to compose.  STRING, if not nil, is a target string.  WIN is a
+   window where the characters are being displayed.  If characters are
+   successfully composed, return the composition as a glyph-string
+   object.  Otherwise return nil.  */
 
 static Lisp_Object
-autocmp_chars (cft_element, charpos, bytepos, limit, win, face, string)
-     Lisp_Object cft_element;
+autocmp_chars (rule, charpos, bytepos, limit, win, face, string)
+     Lisp_Object rule;
      EMACS_INT charpos, bytepos, limit;
      struct window *win;
      struct face *face;
@@ -932,90 +933,66 @@
   int count = SPECPDL_INDEX ();
   FRAME_PTR f = XFRAME (win->frame);
   Lisp_Object pos = make_number (charpos);
+  EMACS_INT to;
   EMACS_INT pt = PT, pt_byte = PT_BYTE;
-  int lookback;
+  Lisp_Object re, font_object, lgstring;
+  int len;
 
   record_unwind_save_match_data ();
-  for (lookback = -1; CONSP (cft_element); cft_element = XCDR (cft_element))
+  re = AREF (rule, 0);
+  if (NILP (re))
+    len = 1;
+  else if (! STRINGP (re))
+    return unbind_to (count, Qnil);
+  else if ((len = fast_looking_at (re, charpos, bytepos, limit, -1, string))
+	   > 0)
     {
-      Lisp_Object elt = XCAR (cft_element);
-      Lisp_Object re;
-      Lisp_Object font_object = Qnil, gstring;
-      EMACS_INT len, to;
-
-      if (! VECTORP (elt) || ASIZE (elt) != 3)
-	continue;
-      if (lookback < 0)
-	{
-	  lookback = XFASTINT (AREF (elt, 1));
-	  if (limit > charpos + MAX_COMPOSITION_COMPONENTS)
-	    limit = charpos + MAX_COMPOSITION_COMPONENTS;
-	}
-      else if (lookback != XFASTINT (AREF (elt, 1)))
-	break;
-      re = AREF (elt, 0);
-      if (NILP (re))
-	len = 1;
-      else if ((len = fast_looking_at (re, charpos, bytepos, limit, -1, string))
-	       > 0)
-	{
-	  if (NILP (string))
-	    len = BYTE_TO_CHAR (bytepos + len) - charpos;
-	  else
-	    len = string_byte_to_char (string, bytepos + len) - charpos;
-	}
-      if (len > 0)
-	{
-	  limit = to = charpos + len;
+      if (NILP (string))
+	len = BYTE_TO_CHAR (bytepos + len) - charpos;
+      else
+	len = string_byte_to_char (string, bytepos + len) - charpos;
+    }
+  if (len <= 0)
+    return unbind_to (count, Qnil);
+  to = limit = charpos + len;
 #ifdef HAVE_WINDOW_SYSTEM
-	  if (FRAME_WINDOW_P (f))
-	    {
-	      font_object = font_range (charpos, &to, win, face, string);
-	      if (! FONT_OBJECT_P (font_object)
-		  || (! NILP (re)
-		      && to < limit
-		      && (fast_looking_at (re, charpos, bytepos, to, -1, string) <= 0)))
-		{
-		  if (NILP (string))
-		    TEMP_SET_PT_BOTH (pt, pt_byte);
-		  return unbind_to (count, Qnil);
-		}
-	    }
-	  else
+  if (FRAME_WINDOW_P (f))
+    {
+      font_object = font_range (charpos, &to, win, face, string);
+      if (! FONT_OBJECT_P (font_object)
+	  || (! NILP (re)
+	      && to < limit
+	      && (fast_looking_at (re, charpos, bytepos, to, -1, string) <= 0)))
+	return unbind_to (count, Qnil);
+    }
+  else
 #endif	/* not HAVE_WINDOW_SYSTEM */
-	    font_object = win->frame;
-	  gstring = Fcomposition_get_gstring (pos, make_number (to),
-					      font_object, string);
-	  if (NILP (LGSTRING_ID (gstring)))
-	    {
-	      Lisp_Object args[6];
+    font_object = win->frame;
+  lgstring = Fcomposition_get_gstring (pos, make_number (to), font_object,
+				       string);
+  if (NILP (LGSTRING_ID (lgstring)))
+    {
+      Lisp_Object args[6];
 
-	      /* Save point as marker before calling out to lisp.  */
-	      if (NILP (string))
-		{
-		  Lisp_Object m = Fmake_marker ();
-		  set_marker_both (m, Qnil, pt, pt_byte);
-		  record_unwind_protect (restore_point_unwind, m);
-		}
+      /* Save point as marker before calling out to lisp.  */
+      if (NILP (string))
+	{
+	  Lisp_Object m = Fmake_marker ();
+	  set_marker_both (m, Qnil, pt, pt_byte);
+	  record_unwind_protect (restore_point_unwind, m);
+	}
 
-	      args[0] = Vauto_composition_function;
-	      args[1] = AREF (elt, 2);
-	      args[2] = pos;
-	      args[3] = make_number (to);
-	      args[4] = font_object;
-	      args[5] = string;
-	      gstring = safe_call (6, args);
-	    }
-	  else if (NILP (string))
-	    {
-	      TEMP_SET_PT_BOTH (pt, pt_byte);
-	    }
-	  return unbind_to (count, gstring);
-	}
+      args[0] = Vauto_composition_function;
+      args[1] = AREF (rule, 2);
+      args[2] = pos;
+      args[3] = make_number (to);
+      args[4] = font_object;
+      args[5] = string;
+      lgstring = safe_call (6, args);
+      if (NILP (string))
+	TEMP_SET_PT_BOTH (pt, pt_byte);
     }
-  if (NILP (string))
-    TEMP_SET_PT_BOTH (pt, pt_byte);
-  return unbind_to (count, Qnil);
+  return unbind_to (count, lgstring);
 }
 
 static Lisp_Object _work_val;
@@ -1126,8 +1103,9 @@
 	  if (! NILP (val))
 	    {
 	      Lisp_Object elt;
+	      int ridx;
 
-	      for (; CONSP (val); val = XCDR (val))
+	      for (ridx = 0; CONSP (val); val = XCDR (val), ridx++)
 		{
 		  elt = XCAR (val);
 		  if (VECTORP (elt) && ASIZE (elt) == 3
@@ -1137,6 +1115,7 @@
 		}
 	      if (CONSP (val))
 		{
+		  cmp_it->rule_idx = ridx;
 		  cmp_it->lookback = XFASTINT (AREF (elt, 1));
 		  cmp_it->stop_pos = charpos - 1 - cmp_it->lookback;
 		  cmp_it->ch = c;
@@ -1167,45 +1146,54 @@
       limit = bytepos + len;
       while (CHAR_COMPOSABLE_P (c))
 	{
-	  for (val = CHAR_TABLE_REF (Vcomposition_function_table, c);
-	       CONSP (val); val = XCDR (val))
+	  val = CHAR_TABLE_REF (Vcomposition_function_table, c);
+	  if (! NILP (val))
 	    {
-	      Lisp_Object elt = XCAR (val);
-	      int back, len;
+	      Lisp_Object elt;
+	      int ridx, back, len;
 
-	      if (VECTORP (elt) && ASIZE (elt) == 3
-		  && NATNUMP (AREF (elt, 1))
-		  && charpos - (back = XFASTINT (AREF (elt, 1))) > endpos)
+	      for (ridx = 0; CONSP (val); val = XCDR (val), ridx++)
 		{
-		  EMACS_INT cpos = charpos - back, bpos;
+		  elt = XCAR (val);
+		  if (VECTORP (elt) && ASIZE (elt) == 3
+		      && NATNUMP (AREF (elt, 1))
+		      && charpos - (back = XFASTINT (AREF (elt, 1))) > endpos)
+		    {
+		      EMACS_INT cpos = charpos - back, bpos;
 
-		  if (back == 0)
-		    bpos = bytepos;
-		  else
-		    bpos = (NILP (string) ? CHAR_TO_BYTE (cpos)
-			    : string_char_to_byte (string, cpos));
-		  if (STRINGP (AREF (elt, 0)))
-		    len = fast_looking_at (AREF (elt, 0), cpos, bpos,
-					   start + 1, limit, string);
-		  else
-		    len = 1;
-		  if (len > 0)
-		    {
-		      /* Make CPOS point to the last character of match.
-			 Note that LEN is byte-length.  */
-		      bpos += len;
-		      if (NILP (string))
-			cpos = BYTE_TO_CHAR (bpos) - 1;
+		      if (back == 0)
+			bpos = bytepos;
+		      else
+			bpos = (NILP (string) ? CHAR_TO_BYTE (cpos)
+				: string_char_to_byte (string, cpos));
+		      if (STRINGP (AREF (elt, 0)))
+			len = fast_looking_at (AREF (elt, 0), cpos, bpos,
+					       start + 1, limit, string);
 		      else
-			cpos = string_byte_to_char (string, bpos) - 1;
-		      back = cpos - (charpos - back);
-		      if (cmp_it->stop_pos < cpos
-			  || (cmp_it->stop_pos == cpos
-			      && cmp_it->lookback < back))
+			len = 1;
+		      if (len > 0)
 			{
-			  cmp_it->stop_pos = cpos;
-			  cmp_it->ch = c;
-			  cmp_it->lookback = back;
+			  /* Make CPOS point to the last character of
+			     match.  Note that LEN is byte-length.  */
+			  if (len > 1)
+			    {
+			      bpos += len;
+			      if (NILP (string))
+				cpos = BYTE_TO_CHAR (bpos) - 1;
+			      else
+				cpos = string_byte_to_char (string, bpos) - 1;
+			    }
+			  back = cpos - (charpos - back);
+			  if (cmp_it->stop_pos < cpos
+			      || (cmp_it->stop_pos == cpos
+				  && cmp_it->lookback < back))
+			    {
+			      cmp_it->rule_idx = ridx;
+			      cmp_it->stop_pos = cpos;
+			      cmp_it->ch = c;
+			      cmp_it->lookback = back;
+			      cmp_it->nchars = back + 1;
+			    }
 			}
 		    }
 		}
@@ -1293,7 +1281,7 @@
   if (cmp_it->ch == -2)
     {
       composition_compute_stop_pos (cmp_it, charpos, bytepos, endpos, string);
-      if (cmp_it->stop_pos != charpos)
+      if (cmp_it->ch == -2 || cmp_it->stop_pos != charpos)
 	/* The current position is not composed.  */
 	return 0;
     }
@@ -1314,55 +1302,75 @@
     }
   else if (w)
     {
-      Lisp_Object val, elt;
-      int i;
+      Lisp_Object lgstring = Qnil;
+      Lisp_Object val, elt, re;
+      int len, i;
 
       val = CHAR_TABLE_REF (Vcomposition_function_table, cmp_it->ch);
+      for (i = 0; i < cmp_it->rule_idx; i++, val = XCDR (val));
       if (charpos < endpos)
 	{
 	  for (; CONSP (val); val = XCDR (val))
 	    {
 	      elt = XCAR (val);
-	      if (cmp_it->lookback == XFASTINT (AREF (elt, 1)))
+	      if (! VECTORP (elt) || ASIZE (elt) != 3
+		  || ! INTEGERP (AREF (elt, 1)))
+		continue;
+	      if (XFASTINT (AREF (elt, 1)) != cmp_it->lookback)
+		goto no_composition;		  
+	      lgstring = autocmp_chars (elt, charpos, bytepos, endpos,
+					w, face, string);
+	      if (composition_gstring_p (lgstring))
 		break;
+	      lgstring = Qnil;
+	      /* Composition failed perhaps because the font doesn't
+		 support sufficient range of characters.  Try the
+		 other composition rules if any.  */
 	    }
-	  if (NILP (val))
-	    goto no_composition;
-
-	  val = autocmp_chars (val, charpos, bytepos, endpos, w, face, string);
-	  if (! composition_gstring_p (val))
-	    goto no_composition;
 	  cmp_it->reversed_p = 0;
 	}
       else
 	{
-	  EMACS_INT saved_charpos = charpos, saved_bytepos = bytepos;
+	  EMACS_INT cpos = charpos, bpos = bytepos;
 
-	  if (cmp_it->lookback > 0)
+	  while (1)
 	    {
-	      charpos -= cmp_it->lookback;
-	      if (charpos < endpos)
+	      elt = XCAR (val);
+	      if (cmp_it->lookback > 0)
+		{
+		  cpos -= cmp_it->lookback;
+		  if (STRINGP (string))
+		    bpos = string_char_to_byte (string, cpos);
+		  else
+		    bpos = CHAR_TO_BYTE (cpos);
+		}
+	      lgstring = autocmp_chars (elt, cpos, bpos, charpos + 1, w, face,
+					string);
+	      if (composition_gstring_p (lgstring)
+		  && cpos + LGSTRING_CHAR_LEN (lgstring) - 1 == charpos)
+		break;
+	      /* Composition failed or didn't cover the current
+		 character.  */
+	      if (cmp_it->lookback == 0)
 		goto no_composition;
-	      if (STRINGP (string))
-		bytepos = string_char_to_byte (string, charpos);
-	      else
-		bytepos = CHAR_TO_BYTE (charpos);
-	    }
-	  val = autocmp_chars (val, charpos, bytepos, saved_charpos + 1,
-			       w, face, string);
-	  if (! composition_gstring_p (val)
-	      || charpos + LGSTRING_CHAR_LEN (val) <= saved_charpos)
-	    {
-	      charpos = saved_charpos, bytepos = saved_bytepos;
-	      goto no_composition;
+	      lgstring = Qnil;
+	      /* Try to find a shorter compostion that starts after CPOS.  */
+	      composition_compute_stop_pos (cmp_it, charpos, bytepos, cpos,
+					    string);
+	      if (cmp_it->ch == -2 || cmp_it->stop_pos < charpos)
+		goto no_composition;
+	      val = CHAR_TABLE_REF (Vcomposition_function_table, cmp_it->ch);
+	      for (i = 0; i < cmp_it->rule_idx; i++, val = XCDR (val));
 	    }
 	  cmp_it->reversed_p = 1;
 	}
-      if (NILP (LGSTRING_ID (val)))
-	val = composition_gstring_put_cache (val, -1);
-      cmp_it->id = XINT (LGSTRING_ID (val));
-      for (i = 0; i < LGSTRING_GLYPH_LEN (val); i++)
-	if (NILP (LGSTRING_GLYPH (val, i)))
+      if (NILP (lgstring))
+	goto no_composition;
+      if (NILP (LGSTRING_ID (lgstring)))
+	lgstring = composition_gstring_put_cache (lgstring, -1);
+      cmp_it->id = XINT (LGSTRING_ID (lgstring));
+      for (i = 0; i < LGSTRING_GLYPH_LEN (lgstring); i++)
+	if (NILP (LGSTRING_GLYPH (lgstring, i)))
 	  break;
       cmp_it->nglyphs = i;
       cmp_it->from = 0;
@@ -1378,10 +1386,10 @@
   if (charpos < endpos)
     {
       charpos++;
-      if (STRINGP (string))
-	bytepos += MULTIBYTE_LENGTH_NO_CHECK (SDATA (string) + bytepos);
+      if (NILP (string))
+	INC_POS (bytepos);
       else
-	INC_POS (bytepos);
+	bytepos += MULTIBYTE_FORM_LENGTH (SDATA (string) + bytepos, 0);
     }
   else
     {
@@ -1393,11 +1401,20 @@
   return 0;
 }
 
-/* Update nchars, nbytes, and width of the current grapheme cluster
-   which is identified by CMP_IT->from (if the composition is static
-   or automatic in l2r context) or CMPT_IT->to (if the composition is
-   automatic in r2l context).  In addition, in the former case, update
-   CMP_IT->to, and in the latter case, update CMP_IT->from.  */
+/* Update charpos, nchars, nbytes, and width of the current grapheme
+   cluster.
+
+   If the composition is static or automatic in L2R context, the
+   cluster is identified by CMP_IT->from, and CHARPOS is the position
+   of the first character of the cluster.  In this case, update
+   CMP_IT->to too.
+
+   If the composition is automatic in R2L context, the cluster is
+   identified by CMP_IT->to, and CHARPOS is the position of the last
+   character of the cluster.  In this case, update CMP_IT->from too.
+
+   The return value is the character code of the first character of
+   the cluster, or -1 if the composition is somehow broken.  */
 
 int
 composition_update_it (cmp_it, charpos, bytepos, string)
@@ -1409,8 +1426,10 @@
 
   if (cmp_it->ch < 0)
     {
+      /* static composition */
       struct composition *cmp = composition_table[cmp_it->id];
 
+      cmp_it->charpos = charpos;
       cmp_it->to = cmp_it->nglyphs;
       if (cmp_it->nglyphs == 0)
 	c = -1;
@@ -1423,70 +1442,64 @@
 	    c = ' ';
 	}
       cmp_it->width = cmp->width;
+      charpos += cmp_it->nchars;
+      if (STRINGP (string))
+	cmp_it->nbytes = string_char_to_byte (string, charpos) - bytepos;
+      else
+	cmp_it->nbytes = CHAR_TO_BYTE (charpos) - bytepos;
     }
   else
     {
+      /* automatic composition */
       Lisp_Object gstring = composition_gstring_from_id (cmp_it->id);
+      Lisp_Object glyph;
+      int from, to;
 
       if (cmp_it->nglyphs == 0)
 	{
-	  c = -1;
 	  cmp_it->nchars = LGSTRING_CHAR_LEN (gstring);
 	  cmp_it->width = 0;
+	  cmp_it->from = cmp_it->to = 0;
+	  return -1;
 	}
-      else if (! cmp_it->reversed_p)
+      if (! cmp_it->reversed_p)
 	{
-	  Lisp_Object glyph = LGSTRING_GLYPH (gstring, cmp_it->from);
-	  int from = LGLYPH_FROM (glyph);
-
-	  c = XINT (LGSTRING_CHAR (gstring, from));
-	  cmp_it->nchars = LGLYPH_TO (glyph) - from + 1;
-	  cmp_it->width = (LGLYPH_WIDTH (glyph) > 0
-			   ? CHAR_WIDTH (LGLYPH_CHAR (glyph)) : 0);
+	  glyph = LGSTRING_GLYPH (gstring, cmp_it->from);
+	  from = LGLYPH_FROM (glyph);
 	  for (cmp_it->to = cmp_it->from + 1; cmp_it->to < cmp_it->nglyphs;
 	       cmp_it->to++)
 	    {
 	      glyph = LGSTRING_GLYPH (gstring, cmp_it->to);
 	      if (LGLYPH_FROM (glyph) != from)
 		break;
-	      if (LGLYPH_WIDTH (glyph) > 0)
-		cmp_it->width += CHAR_WIDTH (LGLYPH_CHAR (glyph));
 	    }
+	  cmp_it->charpos = charpos;
 	}
       else
 	{
-	  int from_idx = cmp_it->to - 1;
-	  Lisp_Object glyph = LGSTRING_GLYPH (gstring, from_idx);
-	  int from = LGLYPH_FROM (glyph);
-
-	  c = XINT (LGSTRING_CHAR (gstring, from));
-	  cmp_it->nchars = LGLYPH_TO (glyph) - from + 1;
-	  cmp_it->width = (LGLYPH_WIDTH (glyph) > 0
-			   ? CHAR_WIDTH (LGLYPH_CHAR (glyph)) : 0);
-	  for (from_idx--; from_idx >= 0; from_idx--)
+	  glyph = LGSTRING_GLYPH (gstring, cmp_it->to - 1);
+	  from = LGLYPH_FROM (glyph);
+	  cmp_it->charpos = charpos - (LGLYPH_TO (glyph) - from);
+	  for (cmp_it->from = cmp_it->to - 1; cmp_it->from > 0;
+	       cmp_it->from--)
 	    {
-	      glyph = LGSTRING_GLYPH (gstring, from_idx);
+	      glyph = LGSTRING_GLYPH (gstring, cmp_it->from - 1);
 	      if (LGLYPH_FROM (glyph) != from)
 		break;
-	      if (LGLYPH_WIDTH (glyph) > 0)
-		cmp_it->width += CHAR_WIDTH (LGLYPH_CHAR (glyph));
 	    }
-	  cmp_it->from = from_idx + 1;
-	  charpos -= cmp_it->nchars - 1;
-	  bytepos += CHAR_BYTES (c);
-	  if (STRINGP (string))
-	    cmp_it->nbytes = bytepos - string_char_to_byte (string, charpos);
-	  else
-	    cmp_it->nbytes = bytepos - CHAR_TO_BYTE (charpos);
-	  return c;
+	}
+      glyph = LGSTRING_GLYPH (gstring, cmp_it->from);
+      cmp_it->nchars = LGLYPH_TO (glyph) + 1 - from;
+      cmp_it->nbytes = 0;
+      cmp_it->width = 0;
+      for (i = cmp_it->nchars - 1; i >= 0; i--)
+	{
+	  c = XINT (LGSTRING_CHAR (gstring, i));
+	  cmp_it->nbytes += CHAR_BYTES (c);
+	  cmp_it->width = (LGLYPH_WIDTH (glyph) > 0
+			   ? CHAR_WIDTH (LGLYPH_CHAR (glyph)) : 0);
 	}
     }
-
-  charpos += cmp_it->nchars;
-  if (STRINGP (string))
-    cmp_it->nbytes = string_char_to_byte (string, charpos) - bytepos;
-  else
-    cmp_it->nbytes = CHAR_TO_BYTE (charpos) - bytepos;
   return c;
 }
 
@@ -1655,7 +1668,7 @@
 		    check.pos_byte = cur.pos_byte;
 		  else
 		    check.pos_byte = CHAR_TO_BYTE (check.pos);
-		  val = autocmp_chars (check_val, check.pos, check.pos_byte,
+		  val = autocmp_chars (elt, check.pos, check.pos_byte,
 				       tail, w, NULL, string);
 		  need_adjustment = 1;
 		  if (! NILP (val))
@@ -2059,7 +2072,7 @@
 a function to call to compose that character.
 
 The element at index C in the table, if non-nil, is a list of
-this form: ([PATTERN PREV-CHARS FUNC] ...)
+composition rules of this form: ([PATTERN PREV-CHARS FUNC] ...)
 
 PATTERN is a regular expression which C and the surrounding
 characters must match.
--- a/src/dispextern.h	Mon May 24 22:47:09 2010 +0000
+++ b/src/dispextern.h	Tue May 25 07:23:37 2010 +0000
@@ -1976,17 +1976,31 @@
      are not iterating over a composition now.  */
   int id;
   /* If non-negative, character that triggers the automatic
-     composition at `stop_pos', and this is an automatic compositoin.
+     composition at `stop_pos', and this is an automatic composition.
      If negative, this is a static composition.  This is set to -2
      temporarily if searching of composition reach a limit or a
      newline.  */
   int ch;
-  /* If this an automatic composition, how many characters to look back
-     from the position where a character triggering the composition
-     exists.  */
+  /* If this is an automatic composition, index of a rule for making
+     the automatic composition.  Provided that ELT is an element of
+     Vcomposition_function_table for CH, (nth ELT RULE_IDX) is the
+     rule for the composition.  */
+  int rule_idx;
+  /* If this is an automatic composition, how many characters to look
+     back from the position where a character triggering the
+     composition exists.  */
   int lookback;
   /* If non-negative, number of glyphs of the glyph-string.  */
   int nglyphs;
+  /* Nonzero iff the composition is created while buffer is scanned in
+     reverse order, and thus the grapheme clusters must be rendered
+     from the last to the first.  */
+  int reversed_p;
+
+  /** The following members contain information about the current
+      grapheme cluster.  */
+  /* Position of the first character of the current grapheme cluster.  */
+  EMACS_INT charpos;
   /* Number of characters and bytes of the current grapheme cluster.  */
   int nchars, nbytes;
   /* Indices of the glyphs for the current grapheme cluster.  */
@@ -1995,10 +2009,6 @@
      graphic display and in units of canonical characters on a
      terminal display.  */
   int width;
-  /* Nonzero iff the composition is created while buffer is scanned in
-     reverse order, and thus the grapheme clusters must be rendered
-     from the last to the first.  */
-  int reversed_p;
 };
 
 struct it
--- a/src/editfns.c	Mon May 24 22:47:09 2010 +0000
+++ b/src/editfns.c	Tue May 25 07:23:37 2010 +0000
@@ -220,6 +220,16 @@
   return make_string_from_bytes (str, 1, len);
 }
 
+DEFUN ("byte-to-string", Fbyte_to_string, Sbyte_to_string, 1, 1, 0,
+       doc: /* Convert arg BYTE to a string containing that byte.  */)
+     (byte)
+     Lisp_Object byte;
+{
+  CHECK_NUMBER (byte);
+  unsigned char b = XINT (byte);
+  return make_string_from_bytes (&b, 1, 1);
+}
+
 DEFUN ("string-to-char", Fstring_to_char, Sstring_to_char, 1, 1, 0,
        doc: /* Convert arg STRING to a character, the first character of that string.
 A multibyte character is handled correctly.  */)
@@ -4686,6 +4696,7 @@
   defsubr (&Sgoto_char);
   defsubr (&Sstring_to_char);
   defsubr (&Schar_to_string);
+  defsubr (&Sbyte_to_string);
   defsubr (&Sbuffer_substring);
   defsubr (&Sbuffer_substring_no_properties);
   defsubr (&Sbuffer_string);
--- a/src/xdisp.c	Mon May 24 22:47:09 2010 +0000
+++ b/src/xdisp.c	Tue May 25 07:23:37 2010 +0000
@@ -6339,10 +6339,10 @@
 	      /* Update IT's char/byte positions to point to the last
 		 character of the previous grapheme cluster, or the
 		 character visually after the current composition.  */
-	      bidi_move_to_visually_next (&it->bidi_it);
+	      for (i = 0; i < it->cmp_it.nchars; i++)
+		bidi_move_to_visually_next (&it->bidi_it);
 	      IT_BYTEPOS (*it) = it->bidi_it.bytepos;
 	      IT_CHARPOS (*it) = it->bidi_it.charpos;
-
 	      if (it->cmp_it.from > 0)
 		{
 		  /* Proceed to the previous grapheme cluster.  */
@@ -7108,19 +7108,6 @@
       it->object = it->w->buffer;
       it->c = composition_update_it (&it->cmp_it, IT_CHARPOS (*it),
 				     IT_BYTEPOS (*it), Qnil);
-      if (it->cmp_it.reversed_p)
-	{
-	  /* Now it->position points the last character of the current
-	     grapheme cluster.  Adjust it to point the first one.  We
-	     have to do it here so that append_composite_glyph sets
-	     correct (struct glyph)->charpos.  */
-	  int i;
-	  for (i = 0; i < it->cmp_it.nchars - 1; i++)
-	    bidi_move_to_visually_next (&it->bidi_it);
-	  IT_CHARPOS (*it) = it->bidi_it.charpos;
-	  IT_BYTEPOS (*it) = it->bidi_it.bytepos;
-	  it->position = it->current.pos;
-	}
     }
   return 1;
 }
@@ -21943,7 +21930,7 @@
 	    g[1] = *g;
 	  glyph = it->glyph_row->glyphs[it->area];
 	}
-      glyph->charpos = CHARPOS (it->position);
+      glyph->charpos = it->cmp_it.charpos;
       glyph->object = it->object;
       glyph->pixel_width = it->pixel_width;
       glyph->ascent = it->ascent;