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