;;;-*- Mode: Lisp; Package: REGEXP -*- (in-package :regexp) (defmethod substring-match ((fsa regexp-dfa) (string string) &key minimal (start 0)) (declare #.cl-user::*highly-optimized*) (declare (fixnum start)) (with-slots (fsa-start-state fsa-final-states fsa-delta) fsa (let ((end nil)) (loop do (loop with state = fsa-start-state and i = start when (set-member-p state fsa-final-states) do (setq end i) until (or (= i (length string)) (null state) (and minimal end)) do (setf state (regexp-delta-get (char string i) state fsa-delta)) (incf i)) until (or end (= start (length string))) do (incf start)) (when end (values start end))))) (defmethod buffer-regexp-match ((fsa regexp-dfa) mark &key (minimal t)) (let* ((start (ccl:buffer-position mark)) (size (ccl:buffer-size mark))) (declare #.cl-user::*highly-optimized*) (declare (fixnum start)) (with-slots (fsa-start-state fsa-final-states fsa-delta) fsa (let ((end nil)) (loop do (loop with state = fsa-start-state and i = start when (set-member-p state fsa-final-states) do (setq end i) until (or (= i size) (null state) (and minimal end)) do (setf state (regexp-delta-get (ccl:buffer-char mark i) state fsa-delta)) (incf i)) until (or end (= start size)) do (incf start)) (when end (values start end))))))