summaryrefslogtreecommitdiff
path: root/diff-lcs/tags/release-1.0/lib/diff/lcs/callbacks.rb
blob: eb0be606256445e9dffdddd2c2e84e7a4d865832 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#! /usr/env/bin ruby
#--
# Copyright 2004 Austin Ziegler <diff-lcs@halostatue.ca>
#   adapted from:
#     Algorithm::Diff (Perl) by Ned Konz <perl@bike-nomad.com>
#     Smalltalk by Mario I. Wolczko <mario@wolczko.com>
#   implements McIlroy-Hunt diff algorithm
#
# This program is free software. It may be redistributed and/or modified under
# the terms of the GPL version 2 (or later), the Perl Artistic licence, or the
# Ruby licence.
# 
# $Id$
#++

require 'diff/lcs/change'

class Diff::LCS::SequenceCallbacks #:nodoc:
  class << self
    def match(event)
      event
    end
    def discard_a(event)
      event
    end
    def discard_b(event)
      event
    end
  end
end

class Diff::LCS::BalancedCallbacks #:nodoc:
  class << self
    def match(event)
      event
    end
    def discard_a(event)
      event
    end
    def discard_b(event)
      event
    end
  end
end

class Diff::LCS::DiffCallbacks #:nodoc:
  attr_accessor :hunk
  attr_accessor :diffs

  def initialize
    @hunk = []
    @diffs = []
  end

  def match(event)
    @diffs << @hunk unless @hunk.empty?
    @hunk = []
  end

  def discard_a(event)
    @hunk << Diff::LCS::Change.new('-', event.old_ix, event.old_el)
  end

  def discard_b(event)
    @hunk << Diff::LCS::Change.new('+', event.new_ix, event.new_el)
  end
end

class Diff::LCS::SDiffCallbacks #:nodoc:
  attr_accessor :diffs

  def initialize
    @diffs = []
  end

  def match(event)
    @diffs << Diff::LCS::Change.new('u', event.old_el, event.new_el)
  end

  def discard_a(event)
    @diffs << Diff::LCS::Change.new('-', event.old_el, nil)
  end

  def discard_b(event)
    @diffs << Diff::LCS::Change.new('+', nil, event.new_el)
  end

  def change(event)
    @diffs << Diff::LCS::Change.new('!', event.old_el, event.new_el)
  end
end

class Diff::LCS::YieldingCallbacks #:nodoc:
  class << self
    def method_missing(symbol, *args)
      yield args if block_given?
    end
  end
end