|
89 | 89 | (let ((code (intern-string interner line)))
|
90 | 90 | (push code interned-file)))
|
91 | 91 | (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 | + |
92 | 103 |
|
93 | 104 | ;;; Computing longest common subsequences between two sequences whose
|
94 | 105 | ;;; elements compare equal via EQL. The algorithm used here is based
|
|
244 | 255 | (defun compute-raw-diff (origin modified)
|
245 | 256 | (convert-lcs-to-diff (compute-lcs origin modified)))
|
246 | 257 |
|
| 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 | + |
247 | 264 |
|
248 | 265 | ;;; producing diffs in "unified diff" format
|
249 | 266 |
|
@@ -488,6 +505,19 @@ DIFF:UNIFIED-DIFF or DIFF:CONTEXT-DIFF."
|
488 | 505 | modified-pathname modified)))
|
489 | 506 | (walk-diff-regions context diff-regions)))))
|
490 | 507 |
|
| 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 | + |
491 | 521 | (defun format-diff (diff-kind original-pathname modified-pathname &optional (stream *standard-output*))
|
492 | 522 | (render-diff (generate-diff diff-kind
|
493 | 523 | original-pathname
|
|
0 commit comments