Function: search-within-boundaries
search-within-boundaries is a byte-compiled function defined in
isearch.el.gz.
Signature
(search-within-boundaries SEARCH-FUN GET-FUN NEXT-FUN STRING &optional BOUND NOERROR COUNT)
Source Code
;; Defined in /usr/src/emacs/lisp/isearch.el.gz
(defun search-within-boundaries ( search-fun get-fun next-fun
string &optional bound noerror count)
(let* ((old (point))
;; Check if point is already on the property.
(beg (when (funcall get-fun old) old))
end found (i 0)
(subregexp
(and isearch-regexp
(save-match-data
(catch 'subregexp
(while (string-match "\\^\\|\\$" string i)
(setq i (match-end 0))
(when (subregexp-context-p string (match-beginning 0))
;; The ^/$ is not inside a char-range or escaped.
(throw 'subregexp t))))))))
;; Otherwise, try to search for the next property.
(unless beg
(setq beg (funcall next-fun old))
(when beg (goto-char beg)))
;; Non-nil `beg' means there are more properties.
(while (and beg (not found))
;; Search for the end of the current property.
(setq end (funcall next-fun beg))
;; Handle ^/$ specially by matching in a temporary buffer.
(if subregexp
(let* ((prop-beg
(if (or (if isearch-forward (bobp) (eobp))
(null (funcall get-fun
(+ (point)
(if isearch-forward -1 1)))))
;; Already at the beginning of the field.
beg
;; Get the real beginning of the field when
;; the search was started in the middle.
(let ((isearch-forward (not isearch-forward)))
;; Search in the reverse direction.
(funcall next-fun beg))))
(substring (buffer-substring prop-beg end))
(offset (if isearch-forward prop-beg end))
match-data)
(with-temp-buffer
(insert substring)
(goto-char (- beg offset -1))
;; Apply ^/$ regexp on the whole extracted substring.
(setq found (funcall
(or search-fun (isearch-search-fun-default))
string (and bound (max (point-min)
(min (point-max)
(- bound offset -1))))
noerror count))
;; Adjust match data as if it's matched in original buffer.
(when found
(setq found (+ found offset -1)
match-data (mapcar (lambda (m) (+ m offset -1))
(match-data)))))
(when found (goto-char found))
(when match-data (set-match-data
(mapcar (lambda (m) (copy-marker m))
match-data))))
(setq found (funcall
(or search-fun (isearch-search-fun-default))
string (if bound (if isearch-forward
(min bound end)
(max bound end))
end)
noerror count)))
;; Get the next text property.
(unless found
(setq beg (funcall next-fun end))
(when beg (goto-char beg))))
(unless found (goto-char old))
found))