Function: vc-hg--glob-to-pcre
vc-hg--glob-to-pcre is a byte-compiled function defined in
vc-hg.el.gz.
Signature
(vc-hg--glob-to-pcre GLOB)
Documentation
Transform a glob pattern into a Mercurial file pattern regex.
Source Code
;; Defined in /usr/src/emacs/lisp/vc/vc-hg.el.gz
(defun vc-hg--glob-to-pcre (glob)
"Transform a glob pattern into a Mercurial file pattern regex."
(let ((parts nil) (i 0) (n (length glob)) (group 0) c)
(cl-macrolet ((peek () '(and (< i n) (aref glob i))))
(while (< i n)
(setf c (aref glob i))
(cl-incf i)
(cond ((not (memq c '(?* ?? ?\[ ?\{ ?\} ?, ?\\)))
(push (vc-hg--escape-for-pcre c) parts))
((eq c ?*)
(cond ((eq (peek) ?*)
(cl-incf i)
(cond ((eq (peek) ?/)
(cl-incf i)
(push "(?:.*/)?" parts))
(t
(push ".*" parts))))
(t (push "[^/]*" parts))))
((eq c ??)
(push ?. parts))
((eq c ?\[)
(let ((j i))
(when (and (< j n) (memq (aref glob j) '(?! ?\])))
(cl-incf j))
(while (and (< j n) (not (eq (aref glob j) ?\])))
(cl-incf j))
(cond ((>= j n)
(push "\\[" parts))
(t
(let ((x (substring glob i j)))
(setf x (string-replace
"\\" "\\\\" x))
(setf i (1+ j))
(cond ((eq (aref x 0) ?!)
(setf (aref x 0) ?^))
((eq (aref x 0) ?^)
(setf x (concat "\\" x))))
(push ?\[ parts)
(push x parts)
(push ?\] parts))))))
((eq c ?\{)
(cl-incf group)
(push "(?:" parts))
((eq c ?\})
(push ?\) parts)
(cl-decf group))
((and (eq c ?,) (> group 0))
(push ?| parts))
((eq c ?\\)
(if (eq i n)
(push "\\\\" parts)
(cl-incf i)
(push ?\\ parts)
(push c parts)))
(t
(push (vc-hg--escape-for-pcre c) parts)))))
(concat (vc-hg--parts-to-string parts) "$")))