Function: rx--string-to-intervals
rx--string-to-intervals is a byte-compiled function defined in
rx.el.gz.
Signature
(rx--string-to-intervals STR)
Documentation
Decode STR as intervals: A-Z becomes (?A . ?Z), and the single character X becomes (?X . ?X). Return the intervals in a list.
Source Code
;; Defined in /usr/src/emacs/lisp/emacs-lisp/rx.el.gz
(defun rx--string-to-intervals (str)
"Decode STR as intervals: A-Z becomes (?A . ?Z), and the single
character X becomes (?X . ?X). Return the intervals in a list."
;; We could just do string-to-multibyte on the string and work with
;; that instead of this `decode-char' workaround.
(let ((decode-char
(if (multibyte-string-p str)
#'identity
#'unibyte-char-to-multibyte))
(len (length str))
(i 0)
(intervals nil))
(while (< i len)
(cond ((and (< i (- len 2))
(= (aref str (1+ i)) ?-))
;; Range.
(let ((start (funcall decode-char (aref str i)))
(end (funcall decode-char (aref str (+ i 2)))))
(cond ((and (<= start #x7f) (>= end #x3fff80))
;; Ranges between ASCII and raw bytes are split to
;; avoid having them absorb Unicode characters
;; caught in-between.
(push (cons start #x7f) intervals)
(push (cons #x3fff80 end) intervals))
((<= start end)
(push (cons start end) intervals))
(t
(error "Invalid rx `any' range: %s"
(substring str i (+ i 3)))))
(setq i (+ i 3))))
(t
;; Single character.
(let ((char (funcall decode-char (aref str i))))
(push (cons char char) intervals))
(setq i (+ i 1)))))
intervals))