DH (Delphi Helper) is a command line tool that searches for duplicated sections in Delphi source files (.pas, .dpr, .inc) and presents them. The program understands the lexical structure of the source files so that the changes in letter case, whitespace, and variable naming do not affect the results. The duplicated sections can be in the same file or in different files. It is pretty fast too: the search in the source code delivered with Delphi XE5 Enterprise takes about 4 minutes.
You can download the demo version here. It is limited to 10 source files and 5000 tokens in a file.
Just start dh.exe in a directory with the source code or use the --dir parameter to specify a directory. The program scans all Delphi source files recursively.
>dh.exe --dir C:\Users\IEUser\Downloads\mORMot2-master
...
=========================
Found duplicated code of 232 tokens:
C:\Users\IEUser\Downloads\mORMot2-master\src\core\mormot.core.data.pas:7424:11
inc(IP, ElemSize);
end;
while Compare(JP^, Pivot^) > 0 do
begin
dec(J);
dec(JP, ElemSize);
end;
if I <= J then
begin
if I <> J then
Exchg(IP, JP, ElemSize);
if p = I then
p := J
else if p = J then
p := I;
inc(I);
dec(J);
end;
until I > J;
if J - L < R - I then
begin
// use recursion only for smaller range
if L < J then
QuickSort(L, J);
L := I;
end
else
begin
if I < R then
QuickSort(I, R);
R := J;
end;
until L >= R;
end;
procedure TDynArrayQuickSort.QuickSortEvent(L, R: PtrInt);
var
I, J: PtrInt;
begin
if L < R then
repeat
I := L;
J := R;
p := (L + R) shr 1;
repeat
Pivot := Value + PtrUInt(p) * ElemSize;
IP := Value + PtrUInt(I) * ElemSize;
JP := Value + PtrUInt(J) * ElemSize;
while CompareEvent(IP^, Pivot^
C:\Users\IEUser\Downloads\mORMot2-master\src\core\mormot.core.data.pas:7475:11
inc(IP, ElemSize);
end;
while CompareEvent(JP^, Pivot^) > 0 do
begin
dec(J);
dec(JP, ElemSize);
end;
if I <= J then
begin
if I <> J then
Exchg(IP, JP, ElemSize);
if p = I then
p := J
else if p = J then
p := I;
inc(I);
dec(J);
end;
until I > J;
if J - L < R - I then
begin
// use recursion only for smaller range
if L < J then
QuickSortEvent(L, J);
L := I;
end
else
begin
if I < R then
QuickSortEvent(I, R);
R := J;
end;
until L >= R;
end;
procedure TDynArrayQuickSort.QuickSortEventReverse(L, R: PtrInt);
var
I, J: PtrInt;
begin
if L < R then
repeat
I := L;
J := R;
p := (L + R) shr 1;
repeat
Pivot := Value + PtrUInt(p) * ElemSize;
IP := Value + PtrUInt(I) * ElemSize;
JP := Value + PtrUInt(J) * ElemSize;
while CompareEvent(IP^, Pivot^
=========================
Found duplicated code of 680 tokens:
C:\Users\IEUser\Downloads\mORMot2-master\src\core\mormot.core.collections.pas:1790:7
...
Send me 10 Euros via PayPal or contact me at tim.lebedkov@gmail.com.
March 12, 2022