From: Stefan Monnier Date: Wed, 4 Apr 2012 16:06:59 +0000 (-0400) Subject: * lisp/comint.el (comint--common-quoted-suffix): Check string boundary X-Git-Tag: emacs-24.0.96~111^2~31 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=305d9f44b0e69c07661efa687c4569f68eaf6d19;p=emacs.git * lisp/comint.el (comint--common-quoted-suffix): Check string boundary before comparing. * lisp/pcomplete.el (pcomplete--common-quoted-suffix): Idem. Fixes: debbugs:11158 --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 64177b03c47..bbb4419ee94 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,9 @@ +2012-04-04 Stefan Monnier + + * comint.el (comint--common-quoted-suffix): Check string boundary + before comparing (bug#11158). + * pcomplete.el (pcomplete--common-quoted-suffix): Idem. + 2012-04-04 Chong Yidong * minibuffer.el (completion-extra-properties): Doc fix. diff --git a/lisp/comint.el b/lisp/comint.el index 9306bf8dbb2..68fedeb88a9 100644 --- a/lisp/comint.el +++ b/lisp/comint.el @@ -3069,24 +3069,25 @@ Returns t if successful." (defun comint--common-quoted-suffix (s1 s2) ;; FIXME: Copied in pcomplete.el. "Find the common suffix between S1 and S2 where S1 is the expanded S2. -S1 is expected to be the unquoted and expanded version of S1. +S1 is expected to be the unquoted and expanded version of S2. Returns (PS1 . PS2), i.e. the shortest prefixes of S1 and S2, such that S1 = (concat PS1 SS1) and S2 = (concat PS2 SS2) and SS1 = (unquote SS2)." (let* ((cs (comint--common-suffix s1 s2)) (ss1 (substring s1 (- (length s1) cs))) (qss1 (comint-quote-filename ss1)) - qc) + qc s2b) (if (and (not (equal ss1 qss1)) (setq qc (comint-quote-filename (substring ss1 0 1))) - (eq t (compare-strings s2 (- (length s2) cs (length qc) -1) - (- (length s2) cs -1) + (setq s2b (- (length s2) cs (length qc) -1)) + (>= s2b 0) ;bug#11158. + (eq t (compare-strings s2 s2b (- (length s2) cs -1) qc nil nil))) ;; The difference found is just that one char is quoted in S2 ;; but not in S1, keep looking before this difference. (comint--common-quoted-suffix (substring s1 0 (- (length s1) cs)) - (substring s2 0 (- (length s2) cs (length qc) -1))) + (substring s2 0 s2b)) (cons (substring s1 0 (- (length s1) cs)) (substring s2 0 (- (length s2) cs)))))) diff --git a/lisp/pcomplete.el b/lisp/pcomplete.el index 2d885a2b40f..cad2ffb2a2c 100644 --- a/lisp/pcomplete.el +++ b/lisp/pcomplete.el @@ -387,24 +387,25 @@ modified to be an empty string, or the desired separation string." (defun pcomplete--common-quoted-suffix (s1 s2) ;; FIXME: Copied in comint.el. "Find the common suffix between S1 and S2 where S1 is the expanded S2. -S1 is expected to be the unquoted and expanded version of S1. +S1 is expected to be the unquoted and expanded version of S2. Returns (PS1 . PS2), i.e. the shortest prefixes of S1 and S2, such that S1 = (concat PS1 SS1) and S2 = (concat PS2 SS2) and SS1 = (unquote SS2)." (let* ((cs (comint--common-suffix s1 s2)) (ss1 (substring s1 (- (length s1) cs))) (qss1 (pcomplete-quote-argument ss1)) - qc) + qc s2b) (if (and (not (equal ss1 qss1)) (setq qc (pcomplete-quote-argument (substring ss1 0 1))) - (eq t (compare-strings s2 (- (length s2) cs (length qc) -1) - (- (length s2) cs -1) + (setq s2b (- (length s2) cs (length qc) -1)) + (>= s2b 0) ;bug#11158. + (eq t (compare-strings s2 s2b (- (length s2) cs -1) qc nil nil))) ;; The difference found is just that one char is quoted in S2 ;; but not in S1, keep looking before this difference. (pcomplete--common-quoted-suffix (substring s1 0 (- (length s1) cs)) - (substring s2 0 (- (length s2) cs (length qc) -1))) + (substring s2 0 s2b)) (cons (substring s1 0 (- (length s1) cs)) (substring s2 0 (- (length s2) cs))))))