aboutsummaryrefslogtreecommitdiffstats
path: root/lisp/emacs-lisp/regexp-opt.el
diff options
context:
space:
mode:
authorStefan Monnier <[email protected]>2000-08-09 15:49:33 +0000
committerStefan Monnier <[email protected]>2000-08-09 15:49:33 +0000
commit5cda4b07fac74073c254e99a083867fa38e894c4 (patch)
treea1f19f9cfdcf72138996ae520d24c1c8e4361e2d /lisp/emacs-lisp/regexp-opt.el
parent96190aa1cb85d3e01098d2326cb433ea4cd8e30d (diff)
(make-bool-vector): Remove.
(regexp-opt-group): Use a list of chars for `letters'. (regexp-opt-charset): `chars' is now a list of chars. Use a char-table rather than a vector so it works for multibyte chars.
Diffstat (limited to 'lisp/emacs-lisp/regexp-opt.el')
-rw-r--r--lisp/emacs-lisp/regexp-opt.el36
1 files changed, 21 insertions, 15 deletions
diff --git a/lisp/emacs-lisp/regexp-opt.el b/lisp/emacs-lisp/regexp-opt.el
index a7ff7b54a5..e07e15db6f 100644
--- a/lisp/emacs-lisp/regexp-opt.el
+++ b/lisp/emacs-lisp/regexp-opt.el
@@ -122,9 +122,6 @@ in REGEXP."
(eval-when-compile
(require 'cl))
-(unless (fboundp 'make-bool-vector)
- (defalias 'make-bool-vector 'make-vector))
-
(defun regexp-opt-group (strings &optional paren lax)
"Return a regexp to match a string in STRINGS.
If PAREN non-nil, output regexp parentheses around returned regexp.
@@ -169,7 +166,7 @@ so we can use character sets rather than grouping parenthesis."
(let (letters rest)
;; Collect one-char strings
(dolist (s strings)
- (if (= (length s) 1) (push s letters) (push s rest)))
+ (if (= (length s) 1) (push (string-to-char s) letters) (push s rest)))
(if rest
;; several one-char strings: take them and recurse
@@ -227,13 +224,13 @@ so we can use character sets rather than grouping parenthesis."
;; The basic idea is to find character ranges. Also we take care in the
;; position of character set meta characters in the character set regexp.
;;
- (let* ((charwidth 256) ; Yeah, right.
- (charmap (make-bool-vector charwidth nil))
+ (let* ((charmap (make-char-table 'case-table))
+ (start -1) (end -2)
(charset "")
(bracket "") (dash "") (caret ""))
;;
;; Make a character map but extract character set meta characters.
- (dolist (char (mapcar 'string-to-char chars))
+ (dolist (char chars)
(case char
(?\]
(setq bracket "]"))
@@ -245,14 +242,23 @@ so we can use character sets rather than grouping parenthesis."
(aset charmap char t))))
;;
;; Make a character set from the map using ranges where applicable.
- (dotimes (char charwidth)
- (let ((start char))
- (while (and (< char charwidth) (aref charmap char))
- (incf char))
- (cond ((> char (+ start 3))
- (setq charset (format "%s%c-%c" charset start (1- char))))
- ((> char start)
- (setq charset (format "%s%c" charset (setq char start)))))))
+ (map-char-table
+ (lambda (c v)
+ (when v
+ (if (= (1- c) end) (setq end c)
+ (if (> end (+ start 2))
+ (setq charset (format "%s%c-%c" charset start end))
+ (while (>= end start)
+ (setq charset (format "%s%c" charset start))
+ (incf start)))
+ (setq start c end c))))
+ charmap)
+ (when (>= end start)
+ (if (> end (+ start 2))
+ (setq charset (format "%s%c-%c" charset start end))
+ (while (>= end start)
+ (setq charset (format "%s%c" charset start))
+ (incf start))))
;;
;; Make sure a caret is not first and a dash is first or last.
(if (and (string-equal charset "") (string-equal bracket ""))