Diff.st
author Claus Gittinger <cg@exept.de>
Mon, 20 Jan 2020 21:02:47 +0100
changeset 19422 c6ca1c3e0fd7
parent 19125 4716962ddbd8
permissions -rw-r--r--
#REFACTORING by exept class: MultiViewToolApplication added: #askForFile:default:forSave:thenDo: changed: #askForFile:default:thenDo: #askForFile:thenDo: #menuSaveAllAs #menuSaveAs
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
18866
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
     1
"{ Encoding: utf8 }"
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
     2
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
"
10089
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
     4
 Copyright (c) 2007-2010 Jan Vrany, SWING Research Group, Czech Technical University in Prague
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
     5
 Copyright (c) 2009-2010 eXept Software AG
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
10089
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
     7
 Permission is hereby granted, free of charge, to any person
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
     8
 obtaining a copy of this software and associated documentation
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
     9
 files (the 'Software'), to deal in the Software without
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    10
 restriction, including without limitation the rights to use,
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    11
 copy, modify, merge, publish, distribute, sublicense, and/or sell
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    12
 copies of the Software, and to permit persons to whom the
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    13
 Software is furnished to do so, subject to the following
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    14
 conditions:
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    15
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    16
 The above copyright notice and this permission notice shall be
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    17
 included in all copies or substantial portions of the Software.
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    18
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    19
 THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    20
 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    21
 OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    22
 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    23
 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    24
 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    25
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    26
 OTHER DEALINGS IN THE SOFTWARE.
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
"{ Package: 'stx:libtool' }"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
diff changeset
    30
"{ NameSpace: Smalltalk }"
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
diff changeset
    31
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
Object subclass:#Diff
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
	instanceVariableNames:'equivMax heuristic nodiscards xvec yvec fdiag bdiag fdiagoff
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
		bdiagoff filevec cost snakeLimit inhibit'
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
	classVariableNames:''
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
	poolDictionaries:''
11701
d18affe2c767 category
Claus Gittinger <cg@exept.de>
parents: 10089
diff changeset
    37
	category:'Collections-Support'
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
Link subclass:#Change
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
	instanceVariableNames:'inserted deleted line0 line1'
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
	classVariableNames:''
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
	poolDictionaries:''
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
	privateIn:Diff
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
Object subclass:#Data
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
	instanceVariableNames:'bufferedLines equivs undiscarded realindexes nondiscardedLines
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
		changedFlag'
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
	classVariableNames:''
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
	poolDictionaries:''
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
	privateIn:Diff
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
Object subclass:#ForwardScript
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
	instanceVariableNames:''
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
	classVariableNames:''
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
	poolDictionaries:''
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
	privateIn:Diff
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
Object subclass:#ReverseScript
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
	instanceVariableNames:''
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
	classVariableNames:''
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
	poolDictionaries:''
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
	privateIn:Diff
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
!Diff class methodsFor:'documentation'!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
copyright
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
"
10089
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    73
 Copyright (c) 2007-2010 Jan Vrany, SWING Research Group, Czech Technical University in Prague
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    74
 Copyright (c) 2009-2010 eXept Software AG
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    75
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    76
 Permission is hereby granted, free of charge, to any person
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    77
 obtaining a copy of this software and associated documentation
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    78
 files (the 'Software'), to deal in the Software without
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    79
 restriction, including without limitation the rights to use,
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    80
 copy, modify, merge, publish, distribute, sublicense, and/or sell
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    81
 copies of the Software, and to permit persons to whom the
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    82
 Software is furnished to do so, subject to the following
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    83
 conditions:
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
10089
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    85
 The above copyright notice and this permission notice shall be
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    86
 included in all copies or substantial portions of the Software.
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    87
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    88
 THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    89
 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    90
 OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    91
 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    92
 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    93
 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    94
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
d6164a52e289 changed: #copyright
Claus Gittinger <cg@exept.de>
parents: 10014
diff changeset
    95
 OTHER DEALINGS IN THE SOFTWARE.
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
documentation
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
    I'm standard diff implementation written purely in Smalltalk. I can
17505
20c86b638551 #DOCUMENTATION by mawalch
mawalch
parents: 16884
diff changeset
   102
    compute differences between two sequenceable collections, not necessarily
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
    holding strings. Elements are compared using #=.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
    Result of comparison is an edit script, a linked list of Diff::Changes,
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
    each keeping one difference: whether change is insert and/or delete,
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
    and positions in A and B.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
    I'm a port of Java diff.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
    [author:]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
        Jakub Zelenka (zelenj7@fel.cvut.cz)
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
        Vladislav Skoumal (skoumal@skoumal.net)
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
        Jan Vrany (jan.vrany@fit.cvut.cz)
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
    [instance variables:]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
    [class variables:]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
    [see also:]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
documentation_czech
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
    "
18866
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   127
první fáze:
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
#############################################################################################################################
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
first := #('prvni' 'druhy' 'treti' 'treti' 'paty' 'zeleny' 'ruzovy' ).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
second := #('prvni' 'treti' 'zeleny' 'ruzovy' 'treti' 'bbb' 'ccc' 'aaa' 'aaa' 'hhh' 'iii' 'mmm' 'nnn' 'ppp' 'aaa' 'aaa' ).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
############################################################################################################################
18866
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   132
First a second pøedstavujou dvì pole, které chceme porovnávat. Jednotlivé položky v poli si lze pøedstavit jako øádky, pøípadnì jako slova v øádku.
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   133
Podle toho, co je potøeba porovnávat.
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
*****************************************************************************************************************************
18866
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   136
diff := Diff new diff.
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
*****************************************************************************************************************************
18866
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   138
Zde probíhá inicializace defaultníh promìnných. Funguje to jako konstruktor.
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
############################################################################################################################
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
diff diff: first b: second
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
############################################################################################################################
18866
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   143
První fáze nutná pro porovnávání polí.  Vzniknou dvì instance tøíde filedata uložené do pole. Tyto instance budou obsahovat následující údaje:
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
filevec[1].equivs=#(1 2 3 3 4 5 6)
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
filevec[1].bufferedLines=7
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
filevec[1].changedFlag=#()
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
filevec[2].equivs=#(1 3 6 7 3 8 9 10 10 11 12 13 14 15 10 10)
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
filevec[2].bufferedLines=16
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
filevec[2].changedFlag=#()
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
18866
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   153
V zásadì se vytvoøila structura Dictionary, která jednotlivé øádky(slova) pøevedla na èísla. Pole equvs pak pøedstavuje èíselnì slova(øádky).
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   154
èísla, která se nalézají v obou dbou polí equivs znaèí, že soubory sdílí alespoò nìjaké slovo(øádek).
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
*****************************************************************************************************************************
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
change:= diff diff2: true.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
*****************************************************************************************************************************
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
18866
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   160
Zde již dochází k porovnání obou dvou polí s øádky(slovy). Lze si vybrat mezi forwardscriptem a reversescriptem. 
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
1) metoda discardconfusinglines
18866
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   163
výsledek:
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   164
filevec[1].undiscardeded=#(1 3 3 5 6 0 0)
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   165
filevec[1].realIndexes=  #(0 2 3 5 6 0 0)
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   166
filevec[1].nondiscardedLines=5
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
filevec[1].changedFlag=#(false false true false false true false false false)
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
filevec[2].undiscardeded=#(1 3 5 6 3 0 0 0 0 0 0 0 0 0 0 0)
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   170
filevec[2].realIndexes=  #(0 1 2 3 4 0 0 0 0 0 0 0 0 0 0 0)
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
filevec[2].nondiscardedLines=5
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   172
18866
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   173
Undiscarded- Øádky soubory, které jsou shodné.
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   174
RealIndexes     - indexy øádkù v poli(je potøeba pøièíst jedna)
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   175
                        - to znamená že index prvního 3->3 pozice v prvním vstupním poli
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   176
                        - index druhého 3->2 pozice v druhém vstupním poli a 3->5 pozice v druhém vstupním poli 
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   177
NondiscardedLines- znaèí kolik èádkù(slov) je shodných v obou polích.
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   178
18866
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   179
2)Následuje porovnávání jednotlivých polí a vytvoøení výsledku
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   180
18866
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   181
3)Výsledek Reverse skript
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   182
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   183
inserted=12('treti' 'bbb' 'ccc' 'aaa' 'aaa' 'hhh' 'iii' 'mmm' 'nnn' 'ppp' 'aaa' 'aaa')
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   184
deleted=0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
line0=7('ruzovy')
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
line1=4('ruzovy')
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   187
link=next
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
18866
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   189
inserted- kolik znakù bylo vloženo
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   190
deleted - kolik znakù bylo smazáno
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   191
line0 - poøadí znaku za kterým bylo nìco vloženo(smazáno) v prvním poli(poslední znak který je shodný v obou polích)
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   192
line1 - poøadí znaku za kterým bylo nìco smazáno(vloženo) v prvním poli(poslední znak který je shodný v obou polích)
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
18866
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   194
Takže po znaku na pozici 4, je 12 vložených znakù oproti prvnímu 
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
18866
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   196
Zbytek pole vypadá takto:
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
first := #('prvni' 'druhy' 'treti' 'treti' 'paty' 'zeleny' 'ruzovy' ).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
second := #('prvni' 'treti' 'zeleny' 'ruzovy').
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
18866
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   201
link není null a tudíž odkazuje na další informace o zmìnách.
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
inserted=0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
deleted=2('treti' 'paty')
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
line0=3('treti')
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
line1=2('treti')
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
link=next
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
18866
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   208
zbytek pole vypadá takto:
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   209
first := #('prvni' 'druhy' 'treti' 'zeleny' 'ruzovy' ).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
second := #('prvni' 'treti' 'zeleny' 'ruzovy').
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   211
18866
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   212
link není null a tudíž odkazuje na další informace o zmìnách.
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
inserted=0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
deleted=1('druhy')
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
line0=1('prvni')
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
line1=1('prvni')
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
link=nil
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
18866
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   219
zbytek pole vypadá takto:
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
first :=  #('prvni' 'treti' 'zeleny' 'ruzovy' ).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
second := #('prvni' 'treti' 'zeleny' 'ruzovy').
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
18866
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   223
link je nil. Neexistuje žádná zmìna a tato pole jsou shodná.
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
18866
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   225
4)Výsledek Forward skript
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
inserted=0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
deleted=1('druhy')
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
line0=1('prvni')
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
line1=1('prvni')
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
link=next
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
18866
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   233
zbytek pole vypadá takto:
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
first :=  #('prvni' 'treti' 'treti' 'paty' 'zeleny' 'ruzovy' ).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   235
second := #('prvni' 'treti' 'zeleny' 'ruzovy' 'treti' 'bbb' 'ccc' 'aaa' 'aaa' 'hhh' 'iii' 'mmm' 'nnn' 'ppp' 'aaa' 'aaa' ).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
18866
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   237
link není nil jdeme na odkaz:
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   238
inserted=0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
deleted=2('treti' 'paty')
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
line0=3('treti')
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
line1=2('treti')
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
link=next
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   243
18866
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   244
zbytek pole vypadá takto:
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
first :=  #('prvni' 'treti' 'zeleny' 'ruzovy' ).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   246
second := #('prvni' 'treti' 'zeleny' 'ruzovy' 'treti' 'bbb' 'ccc' 'aaa' 'aaa' 'hhh' 'iii' 'mmm' 'nnn' 'ppp' 'aaa' 'aaa' ).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   247
18866
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   248
link není nil jdeme na odkaz:
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   249
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
inserted=12('treti' 'bbb' 'ccc' 'aaa' 'aaa' 'hhh' 'iii' 'mmm' 'nnn' 'ppp' 'aaa' 'aaa')
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   251
deleted=0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   252
line0=7('ruzovy')
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   253
line1=4('ruzovy')
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   254
link=nil
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
18866
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   256
zbytek pole vypadá takto:
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   257
first :=  #('prvni' 'treti' 'zeleny' 'ruzovy' ).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
second := #('prvni' 'treti' 'zeleny' 'ruzovy').
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   259
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   260
Konec
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
"
18866
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   262
!
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   263
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   264
examples
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   265
"
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   266
    |first second diff|
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   267
    
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   268
    first := #('prvni' 'druhy' 'treti' 'treti' 'paty' 'zeleny' 'ruzovy' ).
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   269
    second := #('prvni' 'treti' 'zeleny' 'ruzovy' 'treti' 'bbb' 'ccc' 'aaa' 'aaa' 'hhh' 'iii' 'mmm' 'nnn' 'ppp' 'aaa' 'aaa' ).
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   270
    diff := Diff between:first and:second
e4358e48a6f3 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 17505
diff changeset
   271
"
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
! !
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
!Diff class methodsFor:'instance creation'!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
new
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
    "return an initialized instance"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
    ^ self basicNew initialize.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
! !
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
!Diff class methodsFor:'diffing'!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   283
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
between: a and: b 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   285
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
    ^self between: a and: b reverse: false
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   287
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   288
    "Created: / 16-02-2010 / 23:08:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   289
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
between: a and: b reverse: reverse
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   292
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
    ^self new
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   294
        a: a b: b;
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   295
        diff: reverse
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   296
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   297
    "Created: / 16-02-2010 / 23:04:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   298
! !
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   299
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   300
!Diff methodsFor:'diffing'!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   301
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   302
a:gA b:gB 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   303
    "Prepare to find differences between two arrays.  Each element of
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   304
     the arrays is translated to an"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   305
    "equivalence number"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   306
    " based on
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   307
the result of <code>equals</code>.  The original Object arrays
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   308
are no longer needed for computing the differences.  They will
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   309
be needed again later to print the results of the comparison as
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   310
an edit script, if desired."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   311
    
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   312
    |h data|
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   313
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   314
    h := Dictionary new:(gA size + gB size).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   315
    data := Data new.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   316
    data fileData.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   317
    data 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   318
        fileData:gA
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   319
        hashTable:h
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   320
        felDiff:self.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   321
    self filevec at:1 put:data.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   322
    data := Data new.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   323
    data fileData.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   324
    data 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   325
        fileData:gB
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   326
        hashTable:h
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   327
        felDiff:self.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   328
    self filevec at:2 put:data.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   329
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   330
    "Modified: / 12-02-2010 / 14:22:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   331
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   332
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   333
diff
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   334
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   335
    ^self diff: false
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   336
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   337
    "Created: / 16-02-2010 / 22:50:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   338
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   339
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   340
diff:reverse 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   341
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   342
    ^reverse 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   343
        ifTrue:[self diffUsingScript: ReverseScript new]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   344
        ifFalse:[self diffUsingScript: ForwardScript new]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   345
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   346
    "Modified: / 16-02-2010 / 22:51:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   347
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   348
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   349
diffUsingScript:bld 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   350
    "Get the results of comparison as an edit script.  The script
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   351
         is described by a list of changes.  The standard ScriptBuilder
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   352
         implementations provide for forward and reverse edit scripts.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   353
         Alternate implementations could, for instance, list common elements
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   354
         instead of differences.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   355
         @param bld an object to build the script from change flags
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   356
         @return the head of a list of changes
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   357
     Some lines are obviously insertions or deletions
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   358
           because they don't match anything.  Detect them now,
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   359
           and avoid even thinking about them in the main comparison algorithm."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   360
    
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   361
    |diags first second ret|
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   362
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   363
    self discardConfusingLines.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   364
     "Now do the main comparison algorithm, considering just the
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   365
     undiscarded lines."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   366
    first := filevec at:1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   367
    second := filevec at:2.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   368
    xvec := first undiscarded.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   369
    yvec := second undiscarded.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   370
    diags := (first nondiscardedLines) + (second nondiscardedLines) + 3.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   371
    fdiag := Array new:diags withAll:0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   372
    fdiagoff := second nondiscardedLines + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   373
    bdiag := Array new:diags withAll:0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   374
    bdiagoff := second nondiscardedLines + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   375
    self 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   376
        compareseq:0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   377
        xlim:first nondiscardedLines
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   378
        yoff:0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   379
        ylim:second nondiscardedLines.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   380
    fdiag := nil.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   381
    bdiag := nil.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   382
    self shiftBoundaries.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   383
    ret := bld 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   384
                buildScript:first changedFlag
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   385
                length0:first bufferedLines
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   386
                changed1:second changedFlag
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   387
                length1:second bufferedLines.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   388
    ^ ret.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   389
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   390
    "Modified: / 12-02-2010 / 13:57:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   391
! !
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   392
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   393
!Diff methodsFor:'initialization'!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   394
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   395
initialize
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   396
    "konstruktor"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   397
    
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   398
    equivMax := 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   399
    heuristic := false.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   400
    nodiscards := false.
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
diff changeset
   401
    xvec := #().
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
diff changeset
   402
    yvec := #().
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
diff changeset
   403
    fdiag := #().
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
diff changeset
   404
    bdiag := #().
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   405
    filevec := Array new:2.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   406
    snakeLimit := 20.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   407
    inhibit := false.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   408
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   409
    "Modified: / 16-02-2010 / 22:51:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   410
! !
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   411
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   412
!Diff methodsFor:'private'!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   413
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   414
compareseq:gXoff xlim:gXlim yoff:gYoff ylim:gYlim
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   415
    "Compare in detail contiguous subsequences of the two files
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   416
     which are known, as a whole, to match each other.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   417
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   418
     The results are recorded in the vectors filevec[N].changedflag, by
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   419
     storing a 1 in the element for each line that is an insertion or deletion.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   420
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   421
     The subsequence of file 0 is [XOFF, XLIM) and likewise for file 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   422
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   423
     Note that XLIM, YLIM are exclusive bounds.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   424
     All line numbers are origin-0 and discarded lines are not counted."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   425
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   426
    |xoff xlim yoff ylim c d f b|
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   427
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   428
    xoff := gXoff.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   429
    xlim := gXlim.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   430
    yoff := gYoff.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   431
    ylim := gYlim.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   432
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   433
    "Slide down the bottom initial diagonal."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   434
    [(xoff < xlim) and: [(yoff < ylim) and: [(xvec at: xoff + 1) = (yvec at: yoff + 1)]]] whileTrue:
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   435
    [
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   436
        xoff := xoff + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   437
        yoff := yoff + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   438
    ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   439
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   440
    "Slide up the top initial diagonal."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   441
    [(xlim > xoff) and: [(ylim > yoff) and: [(xvec at: xlim) = (yvec at: ylim)]]] whileTrue:
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   442
    [
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   443
        xlim := xlim - 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   444
        ylim := ylim - 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   445
    ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   446
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   447
    "Handle simple cases."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   448
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   449
    (xoff = xlim) ifTrue:
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   450
    [
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   451
        [yoff < ylim] whileTrue:
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   452
        [
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   453
            ((filevec at: 2) changedFlag) at: (2 + ((filevec at: 2) realindexes at: yoff+1)) put: true.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   454
            yoff := yoff + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   455
        ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   456
    ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   457
    ifFalse:
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   458
    [
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   459
        (yoff = ylim) ifTrue:
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   460
        [
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   461
            [xoff < xlim] whileTrue:
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   462
            [
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   463
                ((filevec at: 1) changedFlag) at: (2 + ((filevec at: 1) realindexes at: xoff+1)) put: true.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   464
                xoff := xoff + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   465
            ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   466
        ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   467
        ifFalse:
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   468
        [
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   469
            "Find a point of correspondence in the middle of the files."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   470
            d := self diag: xoff xlim: xlim yoff: yoff ylim: ylim.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   471
            c := cost.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   472
            f := fdiag at: (fdiagoff + d+1).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   473
            b := bdiag at: (bdiagoff + d+1).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   474
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   475
            (c = 1) ifTrue:
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   476
            [
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   477
                "This should be impossible, because it implies that
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   478
                 one of the two subsequences is empty,
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   479
                 and that case was handled above without calling `diag'.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   480
                 Let's verify that this is true."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   481
                d := Exception new.
12692
57fa03b7e099 class: Diff
Claus Gittinger <cg@exept.de>
parents: 11701
diff changeset
   482
                d raiseSignal.
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   483
            ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   484
            ifFalse:
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   485
            [
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   486
                 "Use that point to split this problem into two subproblems."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   487
                 self compareseq: xoff xlim: b yoff: yoff ylim: (b - d).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   488
                 "This used to use f instead of b,
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   489
                  but that is incorrect!!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   490
                  It is not necessarily the case that diagonal d
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   491
                  has a snake from b to f."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   492
                 self compareseq: b xlim: xlim yoff: (b - d) ylim: ylim.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   493
            ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   494
        ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   495
    ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   496
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   497
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   498
diag: anXoff xlim: anXlim yoff: aYoff ylim: aYlim
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   499
    |fd bd xv yv dmin dmax fmid fmax bmid bmax fmin bmin odd c cont d bigsnake tlo thi x oldx y best bestpos dd v temp k cont2|
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   500
    fd := fdiag.    "Give the compiler a chance."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   501
    bd := bdiag.    "Additional help for the compiler."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   502
    xv := xvec.     "Still more help for the compiler."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   503
    yv := yvec.     "And more and more . . ."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   504
    dmin := anXoff-aYlim.   "Minimum valid diagonal."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   505
    dmax := anXlim-aYoff.   "Maximum valid diagonal."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   506
    fmid := anXoff-aYoff.   "Center diagonal of top-down search."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   507
    bmid := anXlim-aYlim.   "Center diagonal of bottom-up search."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   508
    fmin := fmid.   "Limits of top-down search."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   509
    fmax := fmid.   " --||-- "
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   510
    bmin := bmid.   "Limits of bottom-up search."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   511
    bmax := bmid.   " --||-- "
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   512
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   513
    odd := (fmid-bmid) odd. "True if southeast corner is on an odd diagonal with respect to the northwest."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   514
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   515
    "Added + 1 to all arrays since StX uses index 1 as first"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   516
    fd at:(fdiagoff+fmid + 1) put: anXoff.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   517
    bd at:(bdiagoff+bmid + 1) put: anXlim.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   518
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   519
    c := 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   520
    cont := true.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   521
    [cont = true] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   522
        d := nil.   "Active diagonal."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   523
        bigsnake := false.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   524
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   525
        "Extend the top-down search by an edit step in each diagonal."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   526
        (fmin > dmin) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   527
            fmin := fmin-1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   528
            fd at:(fdiagoff + fmin - 1 + 1) put: -1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   529
        ]   ifFalse:[ fmin := fmin + 1. ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   530
        (fmax < dmax) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   531
            fmax := fmax+1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   532
            fd at:(fdiagoff + fmax + 1 + 1) put: -1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   533
        ]   ifFalse:[ fmax := fmax - 1. ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   534
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   535
        d := fmax.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   536
        [(d >= fmin)] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   537
            tlo := fd at:(fdiagoff + d - 1 + 1).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   538
            thi := fd at:(fdiagoff + d + 1 + 1).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   539
            (tlo >= thi) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   540
                x := tlo + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   541
            ]   ifFalse:[ x := thi. ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   542
            oldx := x.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   543
            y := x - d.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   544
            [(x < anXlim) and: [(y < aYlim) and: [((xv at: (x+1)) = (yv at: (y+1)))]]] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   545
                x := x+1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   546
                y := y+1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   547
            ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   548
            ((x-oldx) > snakeLimit) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   549
                bigsnake := true.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   550
            ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   551
            fd at: (fdiagoff + d + 1) put: x.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   552
            (odd and: [bmin <= d and: [d <= bmax and:[(bd at:(bdiagoff + d + 1)) <= (fd at:(fdiagoff + d + 1))]]]) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   553
                cost := (2 * c) - 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   554
                ^d.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   555
            ]   ifFalse:[ d := d - 2.].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   556
        ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   557
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   558
        "Similar extend the bottom-up search."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   559
        (bmin > dmin) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   560
            bmin := bmin - 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   561
            bd at:(bdiagoff + bmin - 1 + 1) put: 2147483647.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   562
        ]   ifFalse:[ bmin := bmin + 1.].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   563
        (bmax < dmax) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   564
            bmax := bmax + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   565
            bd at:(bdiagoff + bmax + 1 + 1) put: 2147483647.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   566
        ] ifFalse:[ bmax := bmax - 1.].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   567
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   568
        d := bmax.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   569
        [(d >= bmin)] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   570
            tlo := bd at:(bdiagoff + d - 1 + 1).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   571
            thi := bd at:(bdiagoff + d + 1 + 1).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   572
            (tlo < thi) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   573
                x := tlo.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   574
            ]   ifFalse:[ x := thi - 1. ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   575
            oldx := x.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   576
            y := x - d.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   577
            [(x > anXoff) and: [(y > aYoff) and: [((xv at: (x-1+1)) = (yv at: (y-1+1)))]]] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   578
                x := x-1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   579
                y := y-1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   580
            ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   581
            ((x-oldx) > snakeLimit) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   582
                bigsnake := true.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   583
            ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   584
            bd at: (bdiagoff + d + 1) put: x.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   585
            ((odd = false) and: [fmin <= d and: [d <= fmax and:[(bd at:(bdiagoff + d + 1)) <= (fd at:(fdiagoff + d + 1))]]]) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   586
                cost := (2 * c).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   587
                ^d.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   588
            ]   ifFalse:[ d := d - 2.].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   589
        ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   590
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   591
        "Heuristic: check occasionally for a diagonal that has made
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   592
        lots of progress compared with the edit distance.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   593
        If we have any such, find the one that has made the most
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   594
        progress and return it as if it had succeeded.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   595
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   596
        With this heuristic, for files with a constant small density
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   597
        of changes, the algorithm is linear in the file size."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   598
        ((c>200) and:[bigsnake and:[heuristic]]) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   599
            best := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   600
            bestpos := -1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   601
            d := fmax.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   602
            [(d >= fmin)] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   603
                dd := d - fmid.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   604
                x := fd at: (fdiagoff + d + 1).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   605
                y := x - d.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   606
                v := ((x - anXoff) * 2) - dd.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   607
                temp := ((dd abs) + c) * 12.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   608
                (v > temp) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   609
                    ((v > best) and:[(anXoff + snakeLimit <= x) and:[(x < anXlim) and:[(aYoff + snakeLimit <= y) and:[(y < aYlim)]]]]) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   610
                        "We have a good enough best diagonal;
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   611
                        now insist that it end with a significant snake."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   612
                        k := 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   613
                        cont2 := true.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   614
                        [(xvec at:(x-k + 1)) = (yvec at:(y-k + 1)) and:[cont2]] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   615
                            (k = snakeLimit) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   616
                                best := v.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   617
                                bestpos := d.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   618
                                cont2 := false.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   619
                            ]   ifFalse:[ k := k + 1.].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   620
                        ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   621
                    ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   622
                ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   623
                d := d - 2.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   624
            ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   625
            (best > 0) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   626
                cost := (2 * c) - 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   627
                ^bestpos.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   628
            ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   629
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   630
            best := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   631
            d := bmax.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   632
            [(d >= bmin)] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   633
                dd := d - bmid.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   634
                x := bd at: (bdiagoff + d + 1).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   635
                y := x - d.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   636
                v := ((anXlim - x) * 2) + dd.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   637
                temp := ((dd abs) + c) * 12.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   638
                (v > temp) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   639
                    ((v > best) and:[(anXoff < x) and:[(x <= (anXlim - snakeLimit)) and:[(aYoff < y) and:[(y <= (aYlim - snakeLimit))]]]]) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   640
                        "We have a good enough best diagonal;
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   641
                        now insist that it end with a significant snake."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   642
                        k := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   643
                        cont2 := true.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   644
                        [((xvec at:(x+k + 1)) = (yvec at:(y+k + 1))) and:[cont2]] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   645
                            (k = snakeLimit) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   646
                                best := v.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   647
                                bestpos := d.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   648
                                cont2 := false.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   649
                            ]   ifFalse:[ k := k + 1.].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   650
                        ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   651
                    ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   652
                ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   653
                d := d - 2.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   654
            ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   655
            (best > 0) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   656
                cost := (2 * c) - 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   657
                ^bestpos.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   658
            ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   659
        ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   660
        c := c + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   661
    ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   662
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   663
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   664
discardConfusingLines
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   665
    "Discard lines from one file that have no matches in the other file."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   666
    
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   667
    |first second|
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   668
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   669
    first := filevec at:1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   670
    second := filevec at:2.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   671
    first discardConfusingLines:second  felDiff:self.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   672
    second discardConfusingLines: first felDiff:self.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   673
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   674
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   675
equivMax
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   676
    ^ equivMax
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   677
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   678
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   679
equivMax:something
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   680
    equivMax := something.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   681
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   682
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   683
filevec
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   684
    ^ filevec
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   685
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   686
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   687
nodiscards
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   688
    ^ nodiscards
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   689
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   690
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   691
nodiscards:something
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   692
    nodiscards := something.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   693
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   694
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   695
shiftBoundaries
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   696
    "Adjust inserts/deletes of blank lines to join changes
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   697
         as much as possible."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   698
    
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   699
    |first second|
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   700
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   701
    (inhibit) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   702
        ^ nil.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   703
    ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   704
    first := filevec at:1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   705
    second := filevec at:2.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   706
    first shiftBoundaries:second.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   707
    second shiftBoundaries:first.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   708
! !
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   709
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   710
!Diff::Change class methodsFor:'documentation'!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   711
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   712
documentation
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   713
"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   714
     The result of comparison is an ""edit script"": a chain of change objects.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   715
     Each change represents one place where some lines are deleted
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   716
     and some are inserted.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   717
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   718
     LINE0 and LINE1 are the first affected lines in the two files (origin 0).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   719
     DELETED is the number of lines deleted here from file 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   720
     INSERTED is the number of lines inserted here in file 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   721
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   722
     If DELETED is 0 then LINE0 is the number of the line before
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   723
     which the insertion was done; vice versa for INSERTED and LINE1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   724
"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   725
! !
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   726
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   727
!Diff::Change methodsFor:'accessing'!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   728
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   729
deleted
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   730
    "Line number of 1st deleted line."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   731
    ^ deleted
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   732
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   733
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   734
inserted
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   735
    "# lines of file 0 changed here."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   736
    ^ inserted
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   737
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   738
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   739
line0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   740
    "Line number of 1st deleted line."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   741
    ^ line0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   742
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   743
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   744
line1
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   745
    "Line number of 1st inserted line."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   746
    ^ line1
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   747
! !
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   748
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   749
!Diff::Change methodsFor:'enumerating'!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   750
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   751
do: aBlock
19022
f1714d61521c #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 18866
diff changeset
   752
    | chg |
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   753
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   754
    chg := self.
19022
f1714d61521c #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 18866
diff changeset
   755
    [ chg notNil ] whileTrue:[
f1714d61521c #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 18866
diff changeset
   756
        aBlock value: chg.
f1714d61521c #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 18866
diff changeset
   757
        chg := chg nextLink
f1714d61521c #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 18866
diff changeset
   758
    ].
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   759
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   760
    "Created: / 16-02-2010 / 22:53:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   761
! !
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   762
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   763
!Diff::Change methodsFor:'instance creation'!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   764
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   765
newLine0:aLine0 line1:aLine1 deleted:aDeleted inserted:aInserted next: nextChange 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   766
    "Cons an additional entry onto the front of an edit script OLD.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   767
     LINE0 and LINE1 are the first affected lines in the two files (origin 0).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   768
     DELETED is the number of lines deleted here from file 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   769
     INSERTED is the number of lines inserted here in file 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   770
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   771
     If DELETED is 0 then LINE0 is the number of the line before
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   772
     which the insertion was done; vice versa for INSERTED and LINE1."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   773
    
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   774
    line0 := aLine0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   775
    line1 := aLine1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   776
    deleted := aDeleted.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   777
    inserted := aInserted.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   778
    nextLink := nextChange.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   779
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   780
    "Modified: / 12-02-2010 / 13:42:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   781
! !
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   782
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   783
!Diff::Data methodsFor:'accessing'!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   784
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   785
bufferedLines
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   786
    ^ bufferedLines
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   787
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   788
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   789
changedFlag
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   790
    ^ changedFlag
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   791
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   792
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   793
nondiscardedLines
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   794
    ^ nondiscardedLines
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   795
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   796
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   797
realindexes
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   798
    ^ realindexes
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   799
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   800
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   801
undiscarded
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   802
    ^ undiscarded
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   803
! !
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   804
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   805
!Diff::Data methodsFor:'default'!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   806
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   807
clear
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   808
    "Allocate changed array for the results of comparison. 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   809
     Allocate a flag for each line of each file, saying whether that line
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   810
     is an insertion or deletion. allocate an extra element, always zero, 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   811
     at each end of each vector."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   812
    
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   813
    changedFlag := Array new:bufferedLines + 2 withAll:false
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   814
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   815
    "Modified: / 12-02-2010 / 13:55:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   816
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   817
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   818
discard:discards felDiff:fellDiffClass
19125
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   819
    "Actually discard the lines.
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   820
      @param discards flags lines to be discarded"
19125
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   821
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   822
    |end j i|
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   823
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   824
    end:=bufferedLines.
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   825
    j:=0.
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   826
    i:=0.
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   827
    [i<end] whileTrue:[
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   828
        (fellDiffClass nodiscards or:[(discards at:i+1)=0]) ifTrue:[
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   829
            undiscarded at:j+1 put:(equivs at:i+1).
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   830
            realindexes at:j+1 put:i.
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   831
            j:=j+1.
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   832
        ] ifFalse:[
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   833
            changedFlag at:(i+1+1) put:true.        
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   834
        ].
19125
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   835
        nondiscardedLines :=j.
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   836
        i:=i+1.
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   837
    ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   838
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   839
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   840
discardConfusingLines: f felDiff: felDiff 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   841
"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   842
Discard lines that have no matches in another file.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   843
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   844
       A line which is discarded will not be considered by the actual
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   845
       comparison algorithm; it will be as if that line were not in the file.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   846
       The file's `realindexes' table maps virtual line numbers
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   847
       (which don't count the discarded lines) into real line numbers;
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   848
       this is how the actual comparison algorithm produces results
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   849
       that are comprehensible when the discarded lines are counted.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   850
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   851
       When we discard a line, we also mark it as a deletion or insertion
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   852
       so that it will be printed in the output.  
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   853
      @param f the other file
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   854
"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   855
        | discarded |
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   856
        self clear.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   857
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   858
        "Set up table of which lines are going to be discarded."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   859
        discarded := self discardable: (f equivCount: felDiff).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   860
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   861
        "Don't really discard the provisional lines except when they occur
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   862
         in a run of discardables, with nonprovisionals at the beginning
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   863
         and end."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   864
        self filterDiscards: discarded.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   865
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   866
        "Actually discard the lines."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   867
        self discard: discarded felDiff: felDiff.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   868
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   869
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   870
discardable: counts 
19125
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   871
    " Mark to be discarded each line that matches no line of another file.
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   872
       If a line matches many lines, mark it as provisionally discardable.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   873
       @see equivCount()
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   874
       @param counts The count of each equivalence number for the other file.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   875
       @return 0=nondiscardable, 1=discardable or 2=provisionally discardable
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   876
        for each line"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   877
    | nmatch i end discards equivs2 many tem |
19125
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   878
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   879
    end := bufferedLines.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   880
    discards := Array new: end.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   881
    equivs2 := equivs.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   882
    many := 5.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   883
    tem := (end / 64).
19125
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   884
    tem :=tem asInteger.
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   885
    tem := tem >> 2.
19125
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   886
    i:=1.
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   887
    [i<=end] whileTrue:[
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   888
        discards at:i put:0.
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   889
        i:=i+1.
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   890
    ].
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   891
    "Multiply MANY by approximate square root of number of lines.
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   892
     That is the threshold for provisionally discardable lines. "
19125
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   893
    [tem > 0] whileTrue: [
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   894
        many := many * 2.
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   895
        tem := tem >> 2
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   896
    ].
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   897
    i := 1.
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   898
    [i <= end] whileTrue: [
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   899
        (equivs2 at: i) = 0 ifFalse: [
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   900
            nmatch := counts at: (equivs2 at: i)+1.
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   901
            nmatch = 0
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   902
                ifTrue: [discards at: i put: 1]
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   903
                ifFalse: [
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   904
                    nmatch > many ifTrue: [discards at: i put: 2]]
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   905
        ].
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   906
        i := i + 1
4716962ddbd8 #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 19022
diff changeset
   907
   ].
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   908
            
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   909
    ^ discards
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   910
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   911
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   912
equivCount: felDiff
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   913
        | pom i equivCount size|
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   914
        equivCount := Array new: (felDiff equivMax) withAll: 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   915
                i:=1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   916
                size:=equivCount size.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   917
                [i<=size]whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   918
                equivCount at:i put:0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   919
                i:=i+1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   920
                ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   921
        
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   922
        i := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   923
        [i < bufferedLines]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   924
                whileTrue: [
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   925
                                        pom:=equivs at: i+1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   926
                        pom := equivCount at: pom+1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   927
                                        pom := pom + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   928
                        equivCount at: (equivs at: i+1)+1 put: pom.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   929
                                        i := i + 1.].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   930
        ^ equivCount
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   931
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   932
    "Modified: / 12-02-2010 / 13:56:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   933
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   934
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   935
fileData
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   936
"konstruktor"
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
diff changeset
   937
    equivs := #().
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
diff changeset
   938
    undiscarded := #().
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
diff changeset
   939
    realindexes := #().
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   940
    nondiscardedLines := 0.
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
diff changeset
   941
    changedFlag := #().
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   942
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   943
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   944
fileData: data hashTable: h felDiff:fellDiffClass
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   945
    | i size ir|
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   946
    bufferedLines := data size.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   947
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   948
    equivs := Array new: bufferedLines withAll: 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   949
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   950
    undiscarded := Array new: bufferedLines withAll: 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   951
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   952
    realindexes := Array new: bufferedLines withAll: 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   953
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   954
    size := data size.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   955
    i := 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   956
    [i<=size]whileTrue: [ir := h at: (data at: i) ifAbsent: nil.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   957
            ir isNil
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   958
                ifTrue: [ 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   959
                    equivs at: i put:fellDiffClass equivMax.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   960
                                fellDiffClass equivMax:( fellDiffClass equivMax + 1).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   961
                    h at: (data at: i) put: (equivs at: i)]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   962
                ifFalse: [equivs at: i put: ir].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   963
i:=i+1].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   964
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   965
    "Modified: / 12-02-2010 / 13:56:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   966
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   967
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   968
filterDiscards:discards 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   969
    "Don't really discard the provisional lines except when they occur
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   970
           in a run of discardables, with nonprovisionals at the beginning
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   971
           and end."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   972
    
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   973
    |end i j length provisional bool consec minimum tem|
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   974
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   975
    end := bufferedLines.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   976
    i := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   977
    [ i < end ] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   978
        "Cancel provisional discards not in middle of run of discards."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   979
        ((discards at:i + 1) isNil) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   980
            discards at:i + 1 put:0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   981
        ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   982
        (discards at:i + 1) = 2 ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   983
            discards at:i + 1 put:0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   984
        ] ifFalse:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   985
            (discards at:i + 1) = 0 ifFalse:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   986
                "We have found a nonprovisional discard."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   987
                provisional := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   988
                j := i.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   989
                bool := true.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   990
                 "Find end of this run of discardable lines.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   991
                 Count how many are provisionally discardable."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   992
                [ bool and:[ j < end ] ] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   993
                    (discards at:j + 1) = 2 ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   994
                        provisional := provisional + 1
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   995
                    ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   996
                    (discards at:j + 1) = 0 ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   997
                        bool := false
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   998
                    ] ifFalse:[ j := j + 1 ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   999
                ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1000
                 "Cancel provisional discards at end, and shrink the run."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1001
                [
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1002
                    j > i and:[ (discards at:j - 1 + 1) = 2 ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1003
                ] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1004
                    j := j - 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1005
                    discards at:j + 1 put:0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1006
                    provisional := provisional - 1
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1007
                ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1008
                 "Now we have the length of a run of discardable lines
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1009
                 whose first and last are not provisional."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1010
                length := j - i.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1011
                (provisional * 4 > length) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1012
                    [ j > i ] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1013
                        j := j - 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1014
                        (discards at:j + 1) = 2 ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1015
                            discards at:j + 1 put:0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1016
                        ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1017
                    ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1018
                ] ifFalse:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1019
                    "MINIMUM is approximate square root of LENGTH/4.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1020
                                   A subrun of two or more provisionals can stand
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1021
                                   when LENGTH is at least 16.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1022
                                   A subrun of 4 or more can stand when LENGTH >= 64."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1023
                    minimum := 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1024
                    tem := (length / 4) asInteger.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1025
                    tem := tem >> 2.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1026
                    [ tem > 0 ] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1027
                        minimum := minimum * 2.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1028
                        tem := tem >> 2
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1029
                    ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1030
                    minimum := minimum + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1031
                     "Cancel any subrun of MINIMUM or more provisionals
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1032
                     within the larger run."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1033
                    j := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1034
                    consec := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1035
                    [ j < length ] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1036
                        (discards at:i + j + 1) ~= 2 ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1037
                            consec := 0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1038
                        ] ifFalse:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1039
                            consec := consec + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1040
                            minimum = consec ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1041
                                "Back up to start of subrun, to cancel it all."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1042
                                j := j - consec
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1043
                            ] ifFalse:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1044
                                discards at:i + j + 1 put:0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1045
                            ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1046
                        ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1047
                        j := j + 1
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1048
                    ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1049
                     "Scan from beginning of run
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1050
                     until we find 3 or more nonprovisionals in a row
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1051
                     or until the first nonprovisional at least 8 lines in.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1052
                     Until that point, cancel any provisionals."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1053
                    j := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1054
                    consec := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1055
                    bool := true.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1056
                    [
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1057
                        bool and:[ j < length ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1058
                    ] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1059
                        (j >= 8 and:[ (discards at:i + j + 1) = 1 ]) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1060
                            bool := false
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1061
                        ] ifFalse:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1062
                            (discards at:i + j + 1) = 2 ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1063
                                consec := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1064
                                discards at:i + j + 1 put:0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1065
                            ] ifFalse:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1066
                                (discards at:i + j + 1) = 0 ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1067
                                    consec := 0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1068
                                ] ifFalse:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1069
                                    consec := consec + 1
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1070
                                ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1071
                            ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1072
                        ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1073
                        (consec = 3) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1074
                            bool := false
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1075
                        ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1076
                        j := j + 1
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1077
                    ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1078
                     "I advances to the last line of the run."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1079
                    i := i + length - 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1080
                    bool := true.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1081
                     "Same thing, from end. "
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1082
                    j := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1083
                    consec := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1084
                    [
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1085
                        bool and:[ j < length ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1086
                    ] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1087
                        (j >= 8 and:[ (discards at:i - j + 1) = 1 ]) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1088
                            bool := false
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1089
                        ] ifFalse:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1090
                            (discards at:i - j + 1) = 2 ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1091
                                consec := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1092
                                discards at:i - j + 1 put:0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1093
                            ] ifFalse:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1094
                                (discards at:i - j + 1) = 0 ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1095
                                    consec := 0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1096
                                ] ifFalse:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1097
                                    consec := consec + 1
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1098
                                ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1099
                            ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1100
                        ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1101
                        (consec = 3) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1102
                            bool := false
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1103
                        ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1104
                        j := j + 1
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1105
                    ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1106
                ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1107
            ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1108
        ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1109
        i := i + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1110
    ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1111
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1112
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1113
shiftBoundaries:f 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1114
    "Adjust inserts/deletes of blank lines to join changes
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1115
           as much as possible.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1116
           We do something when a run of changed lines include a blank
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1117
           line at one end and have an excluded blank line at the other.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1118
           We are free to choose which blank line is included.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1119
           `compareseq' always chooses the one at the beginning,
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1120
           but usually it is cleaner to consider the following blank line
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1121
           to be the change.  The only exception is if the preceding blank line
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1122
           would join this change to other changes.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1123
          param f the file being compared against"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1124
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1125
    |changed otherChanged i j iEnd preceding otherPreceding bool start end otherStart bool2|
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1126
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1127
    changed := changedFlag.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1128
    otherChanged := f changedFlag.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1129
    i := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1130
    j := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1131
    iEnd := bufferedLines.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1132
    preceding := -1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1133
    otherPreceding := -1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1134
    bool := true.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1135
    bool2 := true.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1136
    [ bool ] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1137
        [
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1138
"Scan forwards to find beginning of another run of changes.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1139
         Also keep track of the corresponding point in the other file. "
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1140
            i < iEnd and:[ ((changed at:(i + 1+1)) = false)]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1141
        ] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1142
            [otherChanged at:( 1 + j +1)] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1143
"Non-corresponding lines in the other file
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1144
           will count as the preceding batch of changes."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1145
                j := j + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1146
                otherPreceding := j.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1147
            ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1148
                        j:=j+1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1149
                i := i + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1150
        ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1151
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1152
        (i >= iEnd) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1153
            bool := false.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1154
        ] ifFalse:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1155
            start := i.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1156
            otherStart := j.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1157
            bool2 := true.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1158
"Now find the end of this run of changes."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1159
            [ bool2 ] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1160
                [i < iEnd and:[ changed at:(i + 1+1) ]] 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1161
                    whileTrue:[ i := i + 1. ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1162
                end := i.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1163
"If the first changed line matches the following unchanged one,
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1164
         and this run does not follow right after a previous run,
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1165
         and there are no lines deleted from the other file here,
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1166
         then classify the first changed line as unchanged
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1167
         and the following line as changed in its place.  */
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1168
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1169
          /* You might ask, how could this run follow right after another?
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1170
         Only because the previous run was shifted here."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1171
                (end ~= iEnd and:[((equivs at:start+1) = (equivs at:end+1))
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1172
                            and:[((otherChanged at:(j + 1+1)) = false) 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1173
                            and:[false = ((preceding >= 0 and:[start = preceding]) or:[ otherPreceding >= 0 and:[ otherStart = otherPreceding ]])
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1174
                                 ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1175
                            ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1176
                    ]) 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1177
                        ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1178
                            changed at:(1 + end+1) put:true.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1179
                            end := end + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1180
                            changed at:(1 + start+1) put:false.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1181
                            start := start + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1182
" Since one line-that-matches is now before this run
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1183
             instead of after, we must advance in the other file
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1184
             to keep in synch."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1185
                            i := i + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1186
                            j := j + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1187
                        ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1188
                        ifFalse:[ bool2 := false ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1189
            ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1190
            preceding := i.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1191
            otherPreceding := j.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1192
        ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1193
    ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1194
! !
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1195
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1196
!Diff::ForwardScript methodsFor:'default'!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1197
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1198
buildScript:aChanged0 length0:aLen0 changed1:aChanged1 length1:aLen1 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1199
    "Scan the tables of which lines are inserted and deleted,
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1200
           producing an edit script in forward order."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1201
    
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1202
    |script i0 i1 line0 line1|
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1203
    script := nil.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1204
    i0 := aLen0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1205
    i1 := aLen1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1206
    [i0 >= 0 or:[i1 >= 0]] whileTrue:
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1207
            [((aChanged0 at:i0 + 1) or:[aChanged1 at:i1 + 1]) 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1208
                ifTrue:
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1209
                    [line0 := i0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1210
                    line1 := i1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1211
                     "Find # lines changed here in each file."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1212
                    [aChanged0 at:i0 + 1] whileTrue:[i0 := i0 - 1].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1213
                    [aChanged1 at:i1 + 1] whileTrue:[i1 := i1 - 1].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1214
                     "Record this change."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1215
                    script := Diff::Change new 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1216
                                newLine0:i0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1217
                                line1:i1
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1218
                                deleted:line0 - i0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1219
                                inserted:line1 - i1
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1220
                                next:script.].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1221
             "We have reached lines in the two files that match each other."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1222
            i0 := i0 - 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1223
            i1 := i1 - 1.].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1224
    ^script.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1225
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1226
    "Modified: / 16-02-2010 / 22:49:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1227
! !
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1228
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1229
!Diff::ReverseScript methodsFor:'default'!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1230
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1231
buildScript:aChanged0 length0:aLen0 changed1:aChanged1 length1:aLen1 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1232
    "Scan the tables of which lines are inserted and deleted,
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1233
     producing an edit script in reverse order."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1234
    
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1235
    |script i0 i1 line0 line1|
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1236
    script := nil.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1237
    i0 := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1238
    i1 := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1239
    [i0 < aLen0 or:[i1 < aLen1]] whileTrue:
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1240
            [((aChanged0 at:(1 + i0 + 1)) or:[aChanged1 at:(1 + i1 + 1)]) 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1241
                ifTrue:
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1242
                    [line0 := i0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1243
                    line1 := i1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1244
                     "Find # lines changed here in each file."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1245
                    [aChanged0 at:(1 + i0 + 1)] whileTrue:[i0 := i0 + 1].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1246
                    [aChanged1 at:(1 + i1 + 1)] whileTrue:[i1 := i1 + 1].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1247
                     "Record this change."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1248
                    script := Diff::Change new 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1249
                                newLine0:line0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1250
                                line1:line1
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1251
                                deleted:(i0 - line0)
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1252
                                inserted:(i1 - line1)
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1253
                                next:script.].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1254
             "We have reached lines in the two files that match each other."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1255
            i0 := i0 + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1256
            i1 := i1 + 1.].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1257
    ^script.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1258
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1259
    "Modified: / 12-02-2010 / 14:15:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1260
! !
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1261
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1262
!Diff class methodsFor:'documentation'!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1263
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1264
version_CVS
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
diff changeset
  1265
    ^ '$Header$'
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1266
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1267
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1268
version_SVN
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
diff changeset
  1269
    ^ '$Id$'
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1270
! !
12692
57fa03b7e099 class: Diff
Claus Gittinger <cg@exept.de>
parents: 11701
diff changeset
  1271