Function: compilation--previous-directory

compilation--previous-directory is a byte-compiled function defined in compile.el.gz.

Signature

(compilation--previous-directory POS)

Documentation

Like (previous-single-property-change POS 'compilation-directory), but faster.

Source Code

;; Defined in /usr/src/emacs/lisp/progmodes/compile.el.gz
(defun compilation--previous-directory (pos)
  "Like (previous-single-property-change POS \\='compilation-directory), but faster."
  ;; This avoids an N² behavior when there's no/few compilation-directory
  ;; entries, in which case each call to previous-single-property-change
  ;; ends up having to walk very far back to find the last change.
  (if (and compilation--previous-directory-cache
           (< pos (car compilation--previous-directory-cache))
           (or (null (cdr compilation--previous-directory-cache))
               (< (cdr compilation--previous-directory-cache) pos)))
      ;; No need to call previous-single-property-change.
      (cdr compilation--previous-directory-cache)

    (let* ((cache (and compilation--previous-directory-cache
                       (<= (car compilation--previous-directory-cache) pos)
                       (car compilation--previous-directory-cache)))
           (prev
            (previous-single-property-change
             pos 'compilation-directory nil cache))
           (res
            (cond
             ((null cache)
              (setq compilation--previous-directory-cache
                    (cons (copy-marker pos) (if prev (copy-marker prev))))
              prev)
             ((and prev (= prev cache))
              (set-marker (car compilation--previous-directory-cache) pos)
              (cdr compilation--previous-directory-cache))
             (t
              (set-marker cache pos)
              (setcdr compilation--previous-directory-cache
                      (copy-marker prev))
              prev))))
      (if (markerp res) (marker-position res) res))))