Skip to content

Commit cb1eeb1

Browse files
committed
computing diffs directly against sequences
1 parent c877b2f commit cb1eeb1

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

diff.lisp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,17 @@
8989
(let ((code (intern-string interner line)))
9090
(push code interned-file)))
9191
(push (coerce (nreverse interned-file) 'simple-vector) interned-files)))))
92+
93+
(defun intern-seqs (&rest seqs)
94+
(let ((interner (make-interner))
95+
(interned-seqs nil))
96+
(dolist (seq seqs (values interner (nreverse interned-seqs)))
97+
(let ((interned-seq nil))
98+
(loop :for line :in seq :do
99+
(let ((code (intern-string interner line)))
100+
(push code interned-seq)))
101+
(push (coerce (nreverse interned-seq) 'simple-vector) interned-seqs)))))
102+
92103

93104
;;; Computing longest common subsequences between two sequences whose
94105
;;; elements compare equal via EQL. The algorithm used here is based
@@ -244,6 +255,12 @@
244255
(defun compute-raw-diff (origin modified)
245256
(convert-lcs-to-diff (compute-lcs origin modified)))
246257

258+
(defun compute-raw-seq-diff (original-seq modified-seq)
259+
(multiple-value-bind (interner interned-seqs)
260+
(intern-seqs original-seq modified-seq)
261+
(declare (ignorable interner))
262+
(convert-lcs-to-diff (apply #'compute-lcs interned-seqs))))
263+
247264

248265
;;; producing diffs in "unified diff" format
249266

@@ -488,6 +505,19 @@ DIFF:UNIFIED-DIFF or DIFF:CONTEXT-DIFF."
488505
modified-pathname modified)))
489506
(walk-diff-regions context diff-regions)))))
490507

508+
(defun generate-seq-diff (diff-kind original-seq modified-seq)
509+
"Compute a diff between ORIGINAL-PATHNAME and MODIFIED-PATHNAME."
510+
(multiple-value-bind (interner interned-seqs)
511+
(intern-seqs original-seq modified-seq)
512+
(let* ((original (first interned-seqs))
513+
(modified (second interned-seqs))
514+
(lcs (compute-lcs original modified)))
515+
(let ((diff-regions (convert-lcs-to-diff lcs))
516+
(context (create-diff-generator diff-kind interner
517+
"original" original
518+
"modified" modified)))
519+
(walk-diff-regions context diff-regions)))))
520+
491521
(defun format-diff (diff-kind original-pathname modified-pathname &optional (stream *standard-output*))
492522
(render-diff (generate-diff diff-kind
493523
original-pathname

package.lisp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
(:use :cl)
55
(:export #:*diff-context-lines*
66
#:generate-diff
7+
#:generate-seq-diff
78
#:unified-diff #:context-diff
89

910
#:render-diff
@@ -28,6 +29,7 @@
2829
#:chunk-lines
2930

3031
#:compute-raw-diff
32+
#:compute-raw-seq-diff
3133
#:common-diff-region
3234
#:modified-diff-region
3335
#:original-start

0 commit comments

Comments
 (0)