1. xemacs
  2. semantic

Commits

viteno  committed e7df606

Andrey Slusar <anray@inet.ua>, <86k6tr8ubb.fsf@santinel.home.ua>

  • Participants
  • Parent commits 5aac522
  • Branches default

Comments (0)

Files changed (2)

File ChangeLog

View file
+2004-10-15  Andrey Slusar  <anray@inet.ua>
+
+	* semanticdb.el: define subst-char-in-string and
+	replace-regexp-in-string if this needed.
+
 2003-10-31  Norbert Koch  <viteno@xemacs.org>
 
 	* Makefile (VERSION): XEmacs package 1.18 released.

File semanticdb.el

View file
       nil)
     ))
 
+;; `subst-char-in-string' undefined in XEmacs <= 21.4
+(unless (fboundp 'subst-char-in-string)
+  (defun subst-char-in-string (fromchar tochar string &optional inplace)
+    "Replace FROMCHAR with TOCHAR in STRING each time it occurs.
+Unless optional argument INPLACE is non-nil, return a new string."
+    (let ((i (length string))
+	  (newstr (if inplace string (copy-sequence string))))
+      (while (> i 0)
+	(setq i (1- i))
+	(if (eq (aref newstr i) fromchar)
+	    (aset newstr i tochar)))
+      newstr)))
+
+;; `replace-regexp-in-string' undefined in XEmacs <= 21.4
+(unless (fboundp 'replace-regexp-in-string)
+  (defun replace-regexp-in-string (regexp rep string &optional
+					  fixedcase literal subexp start)
+    "Replace all matches for REGEXP with REP in STRING.
+
+Return a new string containing the replacements.
+
+Optional arguments FIXEDCASE, LITERAL and SUBEXP are like the
+arguments with the same names of function `replace-match'.  If START
+is non-nil, start replacements at that index in STRING.
+
+REP is either a string used as the NEWTEXT arg of `replace-match' or a
+function.  If it is a function it is applied to each match to generate
+the replacement passed to `replace-match'; the match-data at this
+point are such that match 0 is the function's argument.
+
+To replace only the first match (if any), make REGEXP match up to \\'
+and replace a sub-expression, e.g.
+  (replace-regexp-in-string \"\\(foo\\).*\\'\" \"bar\" \" foo foo\" nil nil 1)
+    => \" bar foo\"
+"
+
+    ;; To avoid excessive consing from multiple matches in long strings,
+    ;; don't just call `replace-match' continually.  Walk down the
+    ;; string looking for matches of REGEXP and building up a (reversed)
+    ;; list MATCHES.  This comprises segments of STRING which weren't
+    ;; matched interspersed with replacements for segments that were.
+    ;; [For a `large' number of replacments it's more efficient to
+    ;; operate in a temporary buffer; we can't tell from the function's
+    ;; args whether to choose the buffer-based implementation, though it
+    ;; might be reasonable to do so for long enough STRING.]
+    (let ((l (length string))
+	  (start (or start 0))
+	  matches str mb me)
+      (save-match-data
+	(while (and (< start l) (string-match regexp string start))
+	  (setq mb (match-beginning 0)
+		me (match-end 0))
+	  ;; If we matched the empty string, make sure we advance by one char
+	  (when (= me mb) (setq me (min l (1+ mb))))
+	  ;; Generate a replacement for the matched substring.
+	  ;; Operate only on the substring to minimize string consing.
+	  ;; Set up match data for the substring for replacement;
+	  ;; presumably this is likely to be faster than munging the
+	  ;; match data directly in Lisp.
+	  (string-match regexp (setq str (substring string mb me)))
+	  (setq matches
+		(cons (replace-match (if (stringp rep)
+					 rep
+				       (funcall rep (match-string 0 str)))
+				     fixedcase literal str subexp)
+		      (cons (substring string start mb) ; unmatched prefix
+			    matches)))
+	  (setq start me))
+	;; Reconstruct a string from the pieces.
+	(setq matches (cons (substring string start l) matches)) ; leftover
+	(apply #'concat (nreverse matches))))))
+
 ;;; Filename manipulation
 ;;
 (defun semanticdb-cache-filename (path)