Diff.st
author Jan Vrany <jan.vrany@labware.com>
Wed, 05 Oct 2022 11:57:26 +0100
branchjv
changeset 19637 28f5bfaa093d
parent 17132 17d361c666c2
permissions -rw-r--r--
`NewSystemBrowser`: avoid updating package info when changed class is not selected This speeds up loading of packages when browser is open as it does not (needlessly) update package info which may involve scm round-trip.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
diff changeset
     1
"{ Encoding: utf8 }"
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
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
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
    compute differences between two sequenceable collections, not neccesaarily
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
    "
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
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
############################################################################################################################
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
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.
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
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
*****************************************************************************************************************************
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   136
diff := FelDiff new felDiff.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
*****************************************************************************************************************************
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
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
############################################################################################################################
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
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
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
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).
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
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
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
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
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
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
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
diff changeset
   173
Undiscarded- Øádky soubory, které jsou shodné.
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
diff changeset
   174
RealIndexes     - indexy øádkù v poli(je potøeba pøièíst jedna)
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
diff changeset
   175
                        - to znamená že index prvního 3->3 pozice v prvním vstupním poli
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
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 
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
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
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
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
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
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
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
diff changeset
   189
inserted- kolik znakù bylo vloženo
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
diff changeset
   190
deleted - kolik znakù bylo smazáno
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
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)
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
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
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
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
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
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
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
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
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
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
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
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
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
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
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
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
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
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
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
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
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
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
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
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
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
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
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
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
"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
! !
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   264
!Diff class methodsFor:'instance creation'!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
new
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
    "return an initialized instance"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
    ^ self basicNew initialize.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
! !
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
!Diff class methodsFor:'diffing'!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
between: a and: b 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
    ^self between: a and: b reverse: false
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
    "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
   279
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
between: a and: b reverse: reverse
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   283
    ^self new
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
        a: a b: b;
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   285
        diff: reverse
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   287
    "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
   288
! !
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   289
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
!Diff methodsFor:'diffing'!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   292
a:gA b:gB 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
    "Prepare to find differences between two arrays.  Each element of
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   294
     the arrays is translated to an"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   295
    "equivalence number"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   296
    " based on
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   297
the result of <code>equals</code>.  The original Object arrays
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   298
are no longer needed for computing the differences.  They will
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   299
be needed again later to print the results of the comparison as
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   300
an edit script, if desired."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   301
    
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   302
    |h data|
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   303
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   304
    h := Dictionary new:(gA size + gB size).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   305
    data := Data new.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   306
    data fileData.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   307
    data 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   308
        fileData:gA
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   309
        hashTable:h
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   310
        felDiff:self.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   311
    self filevec at:1 put:data.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   312
    data := Data new.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   313
    data fileData.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   314
    data 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   315
        fileData:gB
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   316
        hashTable:h
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   317
        felDiff:self.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   318
    self filevec at:2 put:data.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   319
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   320
    "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
   321
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   322
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   323
diff
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   324
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   325
    ^self diff: false
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   326
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   327
    "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
   328
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   329
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   330
diff:reverse 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   331
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   332
    ^reverse 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   333
        ifTrue:[self diffUsingScript: ReverseScript new]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   334
        ifFalse:[self diffUsingScript: ForwardScript new]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   335
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   336
    "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
   337
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   338
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   339
diffUsingScript:bld 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   340
    "Get the results of comparison as an edit script.  The script
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   341
         is described by a list of changes.  The standard ScriptBuilder
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   342
         implementations provide for forward and reverse edit scripts.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   343
         Alternate implementations could, for instance, list common elements
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   344
         instead of differences.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   345
         @param bld an object to build the script from change flags
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   346
         @return the head of a list of changes
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   347
     Some lines are obviously insertions or deletions
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   348
           because they don't match anything.  Detect them now,
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   349
           and avoid even thinking about them in the main comparison algorithm."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   350
    
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   351
    |diags first second ret|
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   352
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   353
    self discardConfusingLines.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   354
     "Now do the main comparison algorithm, considering just the
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   355
     undiscarded lines."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   356
    first := filevec at:1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   357
    second := filevec at:2.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   358
    xvec := first undiscarded.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   359
    yvec := second undiscarded.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   360
    diags := (first nondiscardedLines) + (second nondiscardedLines) + 3.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   361
    fdiag := Array new:diags withAll:0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   362
    fdiagoff := second nondiscardedLines + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   363
    bdiag := Array new:diags withAll:0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   364
    bdiagoff := second nondiscardedLines + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   365
    self 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   366
        compareseq:0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   367
        xlim:first nondiscardedLines
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   368
        yoff:0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   369
        ylim:second nondiscardedLines.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   370
    fdiag := nil.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   371
    bdiag := nil.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   372
    self shiftBoundaries.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   373
    ret := bld 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   374
                buildScript:first changedFlag
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   375
                length0:first bufferedLines
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   376
                changed1:second changedFlag
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   377
                length1:second bufferedLines.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   378
    ^ ret.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   379
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   380
    "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
   381
! !
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   382
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   383
!Diff methodsFor:'initialization'!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   384
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   385
initialize
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   386
    "konstruktor"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   387
    
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   388
    equivMax := 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   389
    heuristic := false.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   390
    nodiscards := false.
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
diff changeset
   391
    xvec := #().
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
diff changeset
   392
    yvec := #().
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
diff changeset
   393
    fdiag := #().
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
diff changeset
   394
    bdiag := #().
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   395
    filevec := Array new:2.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   396
    snakeLimit := 20.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   397
    inhibit := false.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   398
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   399
    "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
   400
! !
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   401
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   402
!Diff methodsFor:'private'!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   403
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   404
compareseq:gXoff xlim:gXlim yoff:gYoff ylim:gYlim
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   405
    "Compare in detail contiguous subsequences of the two files
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   406
     which are known, as a whole, to match each other.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   407
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   408
     The results are recorded in the vectors filevec[N].changedflag, by
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   409
     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
   410
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   411
     The subsequence of file 0 is [XOFF, XLIM) and likewise for file 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   412
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   413
     Note that XLIM, YLIM are exclusive bounds.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   414
     All line numbers are origin-0 and discarded lines are not counted."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   415
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   416
    |xoff xlim yoff ylim c d f b|
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   417
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   418
    xoff := gXoff.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   419
    xlim := gXlim.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   420
    yoff := gYoff.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   421
    ylim := gYlim.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   422
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   423
    "Slide down the bottom initial diagonal."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   424
    [(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
   425
    [
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   426
        xoff := xoff + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   427
        yoff := yoff + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   428
    ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   429
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   430
    "Slide up the top initial diagonal."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   431
    [(xlim > xoff) and: [(ylim > yoff) and: [(xvec at: xlim) = (yvec at: ylim)]]] whileTrue:
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   432
    [
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   433
        xlim := xlim - 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   434
        ylim := ylim - 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   435
    ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   436
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   437
    "Handle simple cases."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   438
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   439
    (xoff = xlim) ifTrue:
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   440
    [
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   441
        [yoff < 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
            ((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
   444
            yoff := yoff + 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
    ifFalse:
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   448
    [
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   449
        (yoff = ylim) 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
            [xoff < xlim] 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: 1) changedFlag) at: (2 + ((filevec at: 1) realindexes at: xoff+1)) put: true.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   454
                xoff := xoff + 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
            "Find a point of correspondence in the middle of the files."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   460
            d := self diag: xoff xlim: xlim yoff: yoff ylim: ylim.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   461
            c := cost.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   462
            f := fdiag at: (fdiagoff + d+1).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   463
            b := bdiag at: (bdiagoff + d+1).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   464
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   465
            (c = 1) ifTrue:
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   466
            [
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   467
                "This should be impossible, because it implies that
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   468
                 one of the two subsequences is empty,
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   469
                 and that case was handled above without calling `diag'.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   470
                 Let's verify that this is true."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   471
                d := Exception new.
12692
57fa03b7e099 class: Diff
Claus Gittinger <cg@exept.de>
parents: 11701
diff changeset
   472
                d raiseSignal.
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   473
            ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   474
            ifFalse:
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   475
            [
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   476
                 "Use that point to split this problem into two subproblems."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   477
                 self compareseq: xoff xlim: b yoff: yoff ylim: (b - d).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   478
                 "This used to use f instead of b,
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   479
                  but that is incorrect!!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   480
                  It is not necessarily the case that diagonal d
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   481
                  has a snake from b to f."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   482
                 self compareseq: b xlim: xlim yoff: (b - d) ylim: ylim.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   483
            ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   484
        ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   485
    ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   486
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   487
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   488
diag: anXoff xlim: anXlim yoff: aYoff ylim: aYlim
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   489
    |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
   490
    fd := fdiag.    "Give the compiler a chance."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   491
    bd := bdiag.    "Additional help for the compiler."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   492
    xv := xvec.     "Still more help for the compiler."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   493
    yv := yvec.     "And more and more . . ."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   494
    dmin := anXoff-aYlim.   "Minimum valid diagonal."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   495
    dmax := anXlim-aYoff.   "Maximum valid diagonal."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   496
    fmid := anXoff-aYoff.   "Center diagonal of top-down search."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   497
    bmid := anXlim-aYlim.   "Center diagonal of bottom-up search."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   498
    fmin := fmid.   "Limits of top-down search."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   499
    fmax := fmid.   " --||-- "
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   500
    bmin := bmid.   "Limits of bottom-up search."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   501
    bmax := bmid.   " --||-- "
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   502
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   503
    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
   504
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   505
    "Added + 1 to all arrays since StX uses index 1 as first"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   506
    fd at:(fdiagoff+fmid + 1) put: anXoff.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   507
    bd at:(bdiagoff+bmid + 1) put: anXlim.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   508
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   509
    c := 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   510
    cont := true.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   511
    [cont = true] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   512
        d := nil.   "Active diagonal."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   513
        bigsnake := false.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   514
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   515
        "Extend the top-down search by an edit step in each diagonal."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   516
        (fmin > dmin) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   517
            fmin := fmin-1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   518
            fd at:(fdiagoff + fmin - 1 + 1) put: -1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   519
        ]   ifFalse:[ fmin := fmin + 1. ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   520
        (fmax < dmax) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   521
            fmax := fmax+1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   522
            fd at:(fdiagoff + fmax + 1 + 1) put: -1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   523
        ]   ifFalse:[ fmax := fmax - 1. ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   524
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   525
        d := fmax.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   526
        [(d >= fmin)] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   527
            tlo := fd at:(fdiagoff + d - 1 + 1).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   528
            thi := fd at:(fdiagoff + d + 1 + 1).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   529
            (tlo >= thi) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   530
                x := tlo + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   531
            ]   ifFalse:[ x := thi. ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   532
            oldx := x.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   533
            y := x - d.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   534
            [(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
   535
                x := x+1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   536
                y := y+1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   537
            ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   538
            ((x-oldx) > snakeLimit) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   539
                bigsnake := true.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   540
            ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   541
            fd at: (fdiagoff + d + 1) put: x.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   542
            (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
   543
                cost := (2 * c) - 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   544
                ^d.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   545
            ]   ifFalse:[ d := d - 2.].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   546
        ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   547
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   548
        "Similar extend the bottom-up search."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   549
        (bmin > dmin) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   550
            bmin := bmin - 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   551
            bd at:(bdiagoff + bmin - 1 + 1) put: 2147483647.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   552
        ]   ifFalse:[ bmin := bmin + 1.].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   553
        (bmax < dmax) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   554
            bmax := bmax + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   555
            bd at:(bdiagoff + bmax + 1 + 1) put: 2147483647.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   556
        ] ifFalse:[ bmax := bmax - 1.].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   557
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   558
        d := bmax.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   559
        [(d >= bmin)] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   560
            tlo := bd at:(bdiagoff + d - 1 + 1).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   561
            thi := bd at:(bdiagoff + d + 1 + 1).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   562
            (tlo < thi) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   563
                x := tlo.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   564
            ]   ifFalse:[ x := thi - 1. ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   565
            oldx := x.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   566
            y := x - d.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   567
            [(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
   568
                x := x-1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   569
                y := y-1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   570
            ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   571
            ((x-oldx) > snakeLimit) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   572
                bigsnake := true.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   573
            ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   574
            bd at: (bdiagoff + d + 1) put: x.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   575
            ((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
   576
                cost := (2 * c).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   577
                ^d.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   578
            ]   ifFalse:[ d := d - 2.].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   579
        ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   580
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   581
        "Heuristic: check occasionally for a diagonal that has made
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   582
        lots of progress compared with the edit distance.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   583
        If we have any such, find the one that has made the most
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   584
        progress and return it as if it had succeeded.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   585
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   586
        With this heuristic, for files with a constant small density
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   587
        of changes, the algorithm is linear in the file size."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   588
        ((c>200) and:[bigsnake and:[heuristic]]) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   589
            best := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   590
            bestpos := -1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   591
            d := fmax.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   592
            [(d >= fmin)] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   593
                dd := d - fmid.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   594
                x := fd at: (fdiagoff + d + 1).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   595
                y := x - d.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   596
                v := ((x - anXoff) * 2) - dd.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   597
                temp := ((dd abs) + c) * 12.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   598
                (v > temp) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   599
                    ((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
   600
                        "We have a good enough best diagonal;
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   601
                        now insist that it end with a significant snake."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   602
                        k := 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   603
                        cont2 := true.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   604
                        [(xvec at:(x-k + 1)) = (yvec at:(y-k + 1)) and:[cont2]] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   605
                            (k = snakeLimit) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   606
                                best := v.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   607
                                bestpos := d.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   608
                                cont2 := false.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   609
                            ]   ifFalse:[ k := k + 1.].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   610
                        ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   611
                    ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   612
                ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   613
                d := d - 2.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   614
            ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   615
            (best > 0) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   616
                cost := (2 * c) - 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   617
                ^bestpos.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   618
            ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   619
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   620
            best := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   621
            d := bmax.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   622
            [(d >= bmin)] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   623
                dd := d - bmid.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   624
                x := bd at: (bdiagoff + d + 1).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   625
                y := x - d.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   626
                v := ((anXlim - x) * 2) + dd.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   627
                temp := ((dd abs) + c) * 12.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   628
                (v > temp) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   629
                    ((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
   630
                        "We have a good enough best diagonal;
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   631
                        now insist that it end with a significant snake."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   632
                        k := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   633
                        cont2 := true.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   634
                        [((xvec at:(x+k + 1)) = (yvec at:(y+k + 1))) and:[cont2]] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   635
                            (k = snakeLimit) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   636
                                best := v.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   637
                                bestpos := d.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   638
                                cont2 := false.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   639
                            ]   ifFalse:[ k := k + 1.].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   640
                        ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   641
                    ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   642
                ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   643
                d := d - 2.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   644
            ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   645
            (best > 0) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   646
                cost := (2 * c) - 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   647
                ^bestpos.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   648
            ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   649
        ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   650
        c := c + 1.
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
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   654
discardConfusingLines
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   655
    "Discard lines from one file that have no matches in the other file."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   656
    
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   657
    |first second|
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   658
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   659
    first := filevec at:1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   660
    second := filevec at:2.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   661
    first discardConfusingLines:second  felDiff:self.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   662
    second discardConfusingLines: first felDiff:self.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   663
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   664
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   665
equivMax
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   666
    ^ equivMax
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   667
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   668
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   669
equivMax:something
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   670
    equivMax := something.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   671
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   672
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   673
filevec
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   674
    ^ filevec
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   675
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   676
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   677
nodiscards
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   678
    ^ nodiscards
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   679
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   680
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   681
nodiscards:something
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   682
    nodiscards := something.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   683
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   684
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   685
shiftBoundaries
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   686
    "Adjust inserts/deletes of blank lines to join changes
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   687
         as much as possible."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   688
    
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   689
    |first second|
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   690
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   691
    (inhibit) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   692
        ^ nil.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   693
    ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   694
    first := filevec at:1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   695
    second := filevec at:2.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   696
    first shiftBoundaries:second.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   697
    second shiftBoundaries:first.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   698
! !
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   699
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   700
!Diff::Change class methodsFor:'documentation'!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   701
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   702
documentation
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   703
"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   704
     The result of comparison is an ""edit script"": a chain of change objects.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   705
     Each change represents one place where some lines are deleted
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   706
     and some are inserted.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   707
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   708
     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
   709
     DELETED is the number of lines deleted here from file 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   710
     INSERTED is the number of lines inserted here in file 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   711
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   712
     If DELETED is 0 then LINE0 is the number of the line before
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   713
     which the insertion was done; vice versa for INSERTED and LINE1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   714
"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   715
! !
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   716
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   717
!Diff::Change methodsFor:'accessing'!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   718
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   719
deleted
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   720
    "Line number of 1st deleted line."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   721
    ^ deleted
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   722
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   723
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   724
inserted
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   725
    "# lines of file 0 changed here."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   726
    ^ inserted
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   727
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   728
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   729
line0
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
    ^ line0
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
line1
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   735
    "Line number of 1st inserted line."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   736
    ^ line1
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
!Diff::Change methodsFor:'enumerating'!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   740
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   741
do: aBlock
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   742
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   743
    | chg |
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   744
    chg := self.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   745
    [ chg notNil ] whileTrue:
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   746
        [aBlock value: chg.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   747
        chg := chg nextLink].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   748
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   749
    "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
   750
! !
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   751
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   752
!Diff::Change methodsFor:'instance creation'!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   753
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   754
newLine0:aLine0 line1:aLine1 deleted:aDeleted inserted:aInserted next: nextChange 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   755
    "Cons an additional entry onto the front of an edit script OLD.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   756
     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
   757
     DELETED is the number of lines deleted here from file 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   758
     INSERTED is the number of lines inserted here in file 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   759
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   760
     If DELETED is 0 then LINE0 is the number of the line before
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   761
     which the insertion was done; vice versa for INSERTED and LINE1."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   762
    
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   763
    line0 := aLine0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   764
    line1 := aLine1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   765
    deleted := aDeleted.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   766
    inserted := aInserted.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   767
    nextLink := nextChange.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   768
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   769
    "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
   770
! !
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   771
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   772
!Diff::Data methodsFor:'accessing'!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   773
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   774
bufferedLines
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   775
    ^ bufferedLines
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   776
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   777
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   778
changedFlag
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   779
    ^ changedFlag
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   780
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   781
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   782
nondiscardedLines
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   783
    ^ nondiscardedLines
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   784
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   785
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   786
realindexes
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   787
    ^ realindexes
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   788
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   789
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   790
undiscarded
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   791
    ^ undiscarded
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   792
! !
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   793
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   794
!Diff::Data methodsFor:'default'!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   795
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   796
clear
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   797
    "Allocate changed array for the results of comparison. 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   798
     Allocate a flag for each line of each file, saying whether that line
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   799
     is an insertion or deletion. allocate an extra element, always zero, 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   800
     at each end of each vector."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   801
    
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   802
    changedFlag := Array new:bufferedLines + 2 withAll:false
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   803
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   804
    "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
   805
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   806
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   807
discard:discards felDiff:fellDiffClass
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   808
"Actually discard the lines.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   809
      @param discards flags lines to be discarded"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   810
|end j i|
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   811
end:=bufferedLines.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   812
j:=0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   813
i:=0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   814
[i<end]whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   815
    (fellDiffClass nodiscards or:[(discards at:i+1)=0])ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   816
        undiscarded at:j+1 put:(equivs at:i+1).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   817
        realindexes at:j+1 put:i.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   818
        j:=j+1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   819
        ]ifFalse:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   820
        changedFlag at:(i+1+1) put:true.        
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   821
        ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   822
nondiscardedLines :=j.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   823
i:=i+1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   824
    ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   825
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   826
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   827
discardConfusingLines: f felDiff: felDiff 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   828
"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   829
Discard lines that have no matches in another file.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   830
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   831
       A line which is discarded will not be considered by the actual
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   832
       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
   833
       The file's `realindexes' table maps virtual line numbers
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   834
       (which don't count the discarded lines) into real line numbers;
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   835
       this is how the actual comparison algorithm produces results
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   836
       that are comprehensible when the discarded lines are counted.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   837
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   838
       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
   839
       so that it will be printed in the output.  
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   840
      @param f the other file
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   841
"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   842
        | discarded |
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   843
        self clear.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   844
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   845
        "Set up table of which lines are going to be discarded."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   846
        discarded := self discardable: (f equivCount: felDiff).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   847
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   848
        "Don't really discard the provisional lines except when they occur
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   849
         in a run of discardables, with nonprovisionals at the beginning
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   850
         and end."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   851
        self filterDiscards: discarded.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   852
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   853
        "Actually discard the lines."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   854
        self discard: discarded felDiff: felDiff.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   855
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   856
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   857
discardable: counts 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   858
" Mark to be discarded each line that matches no line of another file.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   859
       If a line matches many lines, mark it as provisionally discardable.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   860
       @see equivCount()
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   861
       @param counts The count of each equivalence number for the other file.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   862
       @return 0=nondiscardable, 1=discardable or 2=provisionally discardable
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   863
        for each line"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   864
    | nmatch i end discards equivs2 many tem |
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   865
    end := bufferedLines.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   866
    discards := Array new: end.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   867
    equivs2 := equivs.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   868
    many := 5.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   869
    tem := (end / 64).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   870
	tem :=tem asInteger.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   871
    tem := tem >> 2.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   872
	i:=1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   873
	[i<=end]whileTrue:[discards at:i put:0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   874
	i:=i+1.].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   875
"Multiply MANY by approximate square root of number of lines.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   876
     That is the threshold for provisionally discardable lines. "
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   877
    [tem > 0]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   878
        whileTrue: [many := many * 2.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   879
	tem := tem >> 2
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   880
	].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   881
            i := 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   882
            [i <= end]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   883
                whileTrue: [(equivs2 at: i)
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   884
                            = 0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   885
                        ifFalse: [nmatch := counts
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   886
                                        at: (equivs2 at: i)+1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   887
                            nmatch = 0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   888
                                ifTrue: [discards at: i put: 1]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   889
                                ifFalse: [nmatch > many
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   890
                                        ifTrue: [discards at: i put: 2]]].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   891
                    i := i + 1].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   892
            
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   893
    ^ discards
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   894
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   895
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   896
equivCount: felDiff
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   897
        | pom i equivCount size|
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   898
        equivCount := Array new: (felDiff equivMax) withAll: 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   899
                i:=1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   900
                size:=equivCount size.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   901
                [i<=size]whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   902
                equivCount at:i put:0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   903
                i:=i+1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   904
                ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   905
        
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   906
        i := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   907
        [i < bufferedLines]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   908
                whileTrue: [
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   909
                                        pom:=equivs at: i+1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   910
                        pom := equivCount at: pom+1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   911
                                        pom := pom + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   912
                        equivCount at: (equivs at: i+1)+1 put: pom.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   913
                                        i := i + 1.].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   914
        ^ equivCount
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   915
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   916
    "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
   917
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   918
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   919
fileData
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   920
"konstruktor"
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
diff changeset
   921
    equivs := #().
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
diff changeset
   922
    undiscarded := #().
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
diff changeset
   923
    realindexes := #().
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   924
    nondiscardedLines := 0.
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
diff changeset
   925
    changedFlag := #().
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   926
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   927
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   928
fileData: data hashTable: h felDiff:fellDiffClass
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   929
    | i size ir|
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   930
    bufferedLines := data size.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   931
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   932
    equivs := Array new: bufferedLines withAll: 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   933
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   934
    undiscarded := Array new: bufferedLines withAll: 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   935
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   936
    realindexes := Array new: bufferedLines withAll: 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   937
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   938
    size := data size.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   939
    i := 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   940
    [i<=size]whileTrue: [ir := h at: (data at: i) ifAbsent: nil.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   941
            ir isNil
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   942
                ifTrue: [ 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   943
                    equivs at: i put:fellDiffClass equivMax.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   944
                                fellDiffClass equivMax:( fellDiffClass equivMax + 1).
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   945
                    h at: (data at: i) put: (equivs at: i)]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   946
                ifFalse: [equivs at: i put: ir].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   947
i:=i+1].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   948
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   949
    "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
   950
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   951
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   952
filterDiscards:discards 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   953
    "Don't really discard the provisional lines except when they occur
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   954
           in a run of discardables, with nonprovisionals at the beginning
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   955
           and end."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   956
    
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   957
    |end i j length provisional bool consec minimum tem|
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   958
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   959
    end := bufferedLines.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   960
    i := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   961
    [ i < end ] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   962
        "Cancel provisional discards not in middle of run of discards."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   963
        ((discards at:i + 1) isNil) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   964
            discards at:i + 1 put:0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   965
        ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   966
        (discards at:i + 1) = 2 ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   967
            discards at:i + 1 put:0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   968
        ] ifFalse:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   969
            (discards at:i + 1) = 0 ifFalse:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   970
                "We have found a nonprovisional discard."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   971
                provisional := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   972
                j := i.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   973
                bool := true.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   974
                 "Find end of this run of discardable lines.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   975
                 Count how many are provisionally discardable."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   976
                [ bool and:[ j < end ] ] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   977
                    (discards at:j + 1) = 2 ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   978
                        provisional := provisional + 1
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   979
                    ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   980
                    (discards at:j + 1) = 0 ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   981
                        bool := false
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   982
                    ] ifFalse:[ j := j + 1 ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   983
                ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   984
                 "Cancel provisional discards at end, and shrink the run."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   985
                [
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   986
                    j > i and:[ (discards at:j - 1 + 1) = 2 ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   987
                ] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   988
                    j := j - 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   989
                    discards at:j + 1 put:0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   990
                    provisional := provisional - 1
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   991
                ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   992
                 "Now we have the length of a run of discardable lines
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   993
                 whose first and last are not provisional."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   994
                length := j - i.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   995
                (provisional * 4 > length) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   996
                    [ j > i ] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   997
                        j := j - 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   998
                        (discards at:j + 1) = 2 ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   999
                            discards at:j + 1 put:0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1000
                        ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1001
                    ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1002
                ] ifFalse:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1003
                    "MINIMUM is approximate square root of LENGTH/4.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1004
                                   A subrun of two or more provisionals can stand
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1005
                                   when LENGTH is at least 16.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1006
                                   A subrun of 4 or more can stand when LENGTH >= 64."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1007
                    minimum := 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1008
                    tem := (length / 4) asInteger.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1009
                    tem := tem >> 2.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1010
                    [ tem > 0 ] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1011
                        minimum := minimum * 2.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1012
                        tem := tem >> 2
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1013
                    ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1014
                    minimum := minimum + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1015
                     "Cancel any subrun of MINIMUM or more provisionals
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1016
                     within the larger run."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1017
                    j := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1018
                    consec := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1019
                    [ j < length ] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1020
                        (discards at:i + j + 1) ~= 2 ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1021
                            consec := 0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1022
                        ] ifFalse:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1023
                            consec := consec + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1024
                            minimum = consec ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1025
                                "Back up to start of subrun, to cancel it all."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1026
                                j := j - consec
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1027
                            ] ifFalse:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1028
                                discards at:i + j + 1 put:0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1029
                            ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1030
                        ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1031
                        j := j + 1
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1032
                    ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1033
                     "Scan from beginning of run
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1034
                     until we find 3 or more nonprovisionals in a row
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1035
                     or until the first nonprovisional at least 8 lines in.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1036
                     Until that point, cancel any provisionals."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1037
                    j := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1038
                    consec := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1039
                    bool := true.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1040
                    [
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1041
                        bool and:[ j < length ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1042
                    ] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1043
                        (j >= 8 and:[ (discards at:i + j + 1) = 1 ]) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1044
                            bool := false
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1045
                        ] ifFalse:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1046
                            (discards at:i + j + 1) = 2 ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1047
                                consec := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1048
                                discards at:i + j + 1 put:0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1049
                            ] ifFalse:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1050
                                (discards at:i + j + 1) = 0 ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1051
                                    consec := 0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1052
                                ] ifFalse:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1053
                                    consec := consec + 1
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1054
                                ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1055
                            ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1056
                        ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1057
                        (consec = 3) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1058
                            bool := false
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1059
                        ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1060
                        j := j + 1
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1061
                    ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1062
                     "I advances to the last line of the run."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1063
                    i := i + length - 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1064
                    bool := true.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1065
                     "Same thing, from end. "
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1066
                    j := 0.
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
                    [
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1069
                        bool and:[ j < length ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1070
                    ] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1071
                        (j >= 8 and:[ (discards at:i - j + 1) = 1 ]) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1072
                            bool := false
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1073
                        ] ifFalse:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1074
                            (discards at:i - j + 1) = 2 ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1075
                                consec := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1076
                                discards at:i - j + 1 put:0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1077
                            ] ifFalse:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1078
                                (discards at:i - j + 1) = 0 ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1079
                                    consec := 0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1080
                                ] ifFalse:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1081
                                    consec := consec + 1
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1082
                                ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1083
                            ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1084
                        ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1085
                        (consec = 3) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1086
                            bool := false
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1087
                        ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1088
                        j := j + 1
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1089
                    ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1090
                ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1091
            ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1092
        ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1093
        i := i + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1094
    ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1095
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1096
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1097
shiftBoundaries:f 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1098
    "Adjust inserts/deletes of blank lines to join changes
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1099
           as much as possible.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1100
           We do something when a run of changed lines include a blank
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1101
           line at one end and have an excluded blank line at the other.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1102
           We are free to choose which blank line is included.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1103
           `compareseq' always chooses the one at the beginning,
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1104
           but usually it is cleaner to consider the following blank line
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1105
           to be the change.  The only exception is if the preceding blank line
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1106
           would join this change to other changes.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1107
          param f the file being compared against"
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1108
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1109
    |changed otherChanged i j iEnd preceding otherPreceding bool start end otherStart bool2|
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1110
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1111
    changed := changedFlag.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1112
    otherChanged := f changedFlag.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1113
    i := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1114
    j := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1115
    iEnd := bufferedLines.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1116
    preceding := -1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1117
    otherPreceding := -1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1118
    bool := true.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1119
    bool2 := true.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1120
    [ bool ] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1121
        [
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1122
"Scan forwards to find beginning of another run of changes.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1123
         Also keep track of the corresponding point in the other file. "
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1124
            i < iEnd and:[ ((changed at:(i + 1+1)) = false)]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1125
        ] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1126
            [otherChanged at:( 1 + j +1)] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1127
"Non-corresponding lines in the other file
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1128
           will count as the preceding batch of changes."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1129
                j := j + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1130
                otherPreceding := j.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1131
            ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1132
                        j:=j+1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1133
                i := i + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1134
        ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1135
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1136
        (i >= iEnd) ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1137
            bool := false.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1138
        ] ifFalse:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1139
            start := i.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1140
            otherStart := j.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1141
            bool2 := true.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1142
"Now find the end of this run of changes."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1143
            [ bool2 ] whileTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1144
                [i < iEnd and:[ changed at:(i + 1+1) ]] 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1145
                    whileTrue:[ i := i + 1. ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1146
                end := i.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1147
"If the first changed line matches the following unchanged one,
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1148
         and this run does not follow right after a previous run,
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1149
         and there are no lines deleted from the other file here,
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1150
         then classify the first changed line as unchanged
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1151
         and the following line as changed in its place.  */
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1152
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1153
          /* You might ask, how could this run follow right after another?
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1154
         Only because the previous run was shifted here."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1155
                (end ~= iEnd and:[((equivs at:start+1) = (equivs at:end+1))
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1156
                            and:[((otherChanged at:(j + 1+1)) = false) 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1157
                            and:[false = ((preceding >= 0 and:[start = preceding]) or:[ otherPreceding >= 0 and:[ otherStart = otherPreceding ]])
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1158
                                 ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1159
                            ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1160
                    ]) 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1161
                        ifTrue:[
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1162
                            changed at:(1 + end+1) put:true.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1163
                            end := end + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1164
                            changed at:(1 + start+1) put:false.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1165
                            start := start + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1166
" Since one line-that-matches is now before this run
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1167
             instead of after, we must advance in the other file
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1168
             to keep in synch."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1169
                            i := i + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1170
                            j := j + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1171
                        ]
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1172
                        ifFalse:[ bool2 := false ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1173
            ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1174
            preceding := i.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1175
            otherPreceding := j.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1176
        ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1177
    ].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1178
! !
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1179
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1180
!Diff::ForwardScript methodsFor:'default'!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1181
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1182
buildScript:aChanged0 length0:aLen0 changed1:aChanged1 length1:aLen1 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1183
    "Scan the tables of which lines are inserted and deleted,
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1184
           producing an edit script in forward order."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1185
    
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1186
    |script i0 i1 line0 line1|
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1187
    script := nil.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1188
    i0 := aLen0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1189
    i1 := aLen1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1190
    [i0 >= 0 or:[i1 >= 0]] whileTrue:
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1191
            [((aChanged0 at:i0 + 1) or:[aChanged1 at:i1 + 1]) 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1192
                ifTrue:
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1193
                    [line0 := i0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1194
                    line1 := i1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1195
                     "Find # lines changed here in each file."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1196
                    [aChanged0 at:i0 + 1] whileTrue:[i0 := i0 - 1].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1197
                    [aChanged1 at:i1 + 1] whileTrue:[i1 := i1 - 1].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1198
                     "Record this change."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1199
                    script := Diff::Change new 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1200
                                newLine0:i0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1201
                                line1:i1
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1202
                                deleted:line0 - i0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1203
                                inserted:line1 - i1
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1204
                                next:script.].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1205
             "We have reached lines in the two files that match each other."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1206
            i0 := i0 - 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1207
            i1 := i1 - 1.].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1208
    ^script.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1209
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1210
    "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
  1211
! !
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1212
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1213
!Diff::ReverseScript methodsFor:'default'!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1214
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1215
buildScript:aChanged0 length0:aLen0 changed1:aChanged1 length1:aLen1 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1216
    "Scan the tables of which lines are inserted and deleted,
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1217
     producing an edit script in reverse order."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1218
    
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1219
    |script i0 i1 line0 line1|
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1220
    script := nil.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1221
    i0 := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1222
    i1 := 0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1223
    [i0 < aLen0 or:[i1 < aLen1]] whileTrue:
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1224
            [((aChanged0 at:(1 + i0 + 1)) or:[aChanged1 at:(1 + i1 + 1)]) 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1225
                ifTrue:
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1226
                    [line0 := i0.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1227
                    line1 := i1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1228
                     "Find # lines changed here in each file."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1229
                    [aChanged0 at:(1 + i0 + 1)] whileTrue:[i0 := i0 + 1].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1230
                    [aChanged1 at:(1 + i1 + 1)] whileTrue:[i1 := i1 + 1].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1231
                     "Record this change."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1232
                    script := Diff::Change new 
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1233
                                newLine0:line0
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1234
                                line1:line1
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1235
                                deleted:(i0 - line0)
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1236
                                inserted:(i1 - line1)
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1237
                                next:script.].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1238
             "We have reached lines in the two files that match each other."
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1239
            i0 := i0 + 1.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1240
            i1 := i1 + 1.].
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1241
    ^script.
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1242
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1243
    "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
  1244
! !
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1245
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1246
!Diff class methodsFor:'documentation'!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1247
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1248
version_CVS
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
diff changeset
  1249
    ^ '$Header$'
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1250
!
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1251
12431
9f0c59c742d5 Added LintRuleSettingsApplication and LintRuleEditDialog to define user-defined rule sets.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12401
diff changeset
  1252
version_HG
9f0c59c742d5 Added LintRuleSettingsApplication and LintRuleEditDialog to define user-defined rule sets.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12401
diff changeset
  1253
9f0c59c742d5 Added LintRuleSettingsApplication and LintRuleEditDialog to define user-defined rule sets.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12401
diff changeset
  1254
    ^ '$Changeset: <not expanded> $'
9f0c59c742d5 Added LintRuleSettingsApplication and LintRuleEditDialog to define user-defined rule sets.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12401
diff changeset
  1255
!
9f0c59c742d5 Added LintRuleSettingsApplication and LintRuleEditDialog to define user-defined rule sets.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12401
diff changeset
  1256
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1257
version_SVN
16884
5537c231bbba #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 12692
diff changeset
  1258
    ^ '$Id$'
10014
7dcec1c4fff0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1259
! !
12692
57fa03b7e099 class: Diff
Claus Gittinger <cg@exept.de>
parents: 11701
diff changeset
  1260