* liece-compat.el (replace-in-string): Follow a change in XEmacs.
authorueno <ueno>
Tue, 2 Oct 2001 05:25:39 +0000 (05:25 +0000)
committerueno <ueno>
Tue, 2 Oct 2001 05:25:39 +0000 (05:25 +0000)
lisp/liece-compat.el

index 04771ac..58568b2 100644 (file)
@@ -120,52 +120,35 @@ Otherwise, this function always returns false.
          (setq liece-read-passwd 'ange-ftp-read-passwd))))
   (funcall liece-read-passwd prompt))
 
-;; from XEmacs's subr.el
+;; XEmacs.
 (defun-maybe replace-in-string (str regexp newtext &optional literal)
   "Replace all matches in STR for REGEXP with NEWTEXT string,
  and returns the new string.
 Optional LITERAL non-nil means do a literal replacement.
-Otherwise treat \\ in NEWTEXT string as special:
-  \\& means substitute original matched text,
-  \\N means substitute match for \(...\) number N,
-  \\\\ means insert one \\."
-  (let ((rtn-str "")
-       (start 0)
-       (special)
-       match prev-start)
-    (while (setq match (string-match regexp str start))
-      (setq prev-start start
-           start (match-end 0)
-           rtn-str
-           (concat
-            rtn-str
-            (substring str prev-start match)
-            (cond (literal newtext)
-                  (t (mapconcat
-                      (lambda (c)
-                        (if special
-                            (progn
-                              (setq special nil)
-                              (cond ((eq c ?\\) "\\")
-                                    ((eq c ?&)
-                                     (substring str
-                                                (match-beginning 0)
-                                                (match-end 0)))
-                                    ((and (>= c ?0) (<= c ?9))
-                                     (if (> c (+ ?0 (length
-                                                     (match-data))))
-                                         ;; Invalid match num
-                                         (error "Invalid match num: %c" c)
-                                       (setq c (- c ?0))
-                                       (substring str
-                                                  (match-beginning c)
-                                                  (match-end c))))
-                                    (t (char-to-string c))))
-                          (if (eq c ?\\) (progn (setq special t) nil)
-                            (char-to-string c))))
-                      newtext ""))))))
-    (concat rtn-str (substring str start))))
-  
+Otherwise treat `\\' in NEWTEXT as special:
+  `\\&' in NEWTEXT means substitute original matched text.
+  `\\N' means substitute what matched the Nth `\\(...\\)'.
+       If Nth parens didn't match, substitute nothing.
+  `\\\\' means insert one `\\'.
+  `\\u' means upcase the next character.
+  `\\l' means downcase the next character.
+  `\\U' means begin upcasing all following characters.
+  `\\L' means begin downcasing all following characters.
+  `\\E' means terminate the effect of any `\\U' or `\\L'."
+  (if (> (length str) 50)
+      (with-temp-buffer
+       (insert str)
+       (goto-char 1)
+         (while (re-search-forward regexp nil t)
+           (replace-match newtext t literal))
+         (buffer-string))
+  (let ((start 0) newstr)
+    (while (string-match regexp str start)
+      (setq newstr (replace-match newtext t literal str)
+           start (+ (match-end 0) (- (length newstr) (length str)))
+           str newstr))
+    str)))
+
 (provide 'liece-compat)
 
 ;;; liece-compat.el ends here