{$GOTO ON}
{$mode delphi}
uses
sysutils;
function fopen (p1:pchar; p2:pchar):pointer ; cdecl external 'msvcrt.dll' name 'fopen';
function fread (p1:pointer;i1:integer;i2:integer;_FILE: pointer):integer ; cdecl external 'msvcrt.dll' name 'fread';
function fwrite (p1:pointer;i1:integer;i2:integer;_FILE: pointer):integer ; cdecl external 'msvcrt.dll' name 'fwrite';
function fseek (_FILE:pointer;i1:integer;i2:integer):integer ; cdecl external 'msvcrt.dll' name 'fseek';
function ftell (_FILE:pointer):integer; cdecl external 'msvcrt.dll' name 'ftell';
function fclose (_FILE:pointer):integer cdecl external 'msvcrt.dll' name 'fclose';
Type
intArray = Array of longword;
function instr(somestring:ansistring;partstring:ansistring):boolean;
var
i,j,ln,lnp:longword;
label
skip;
begin
if (somestring='') then exit(false);
ln:=length(somestring);
lnp:=length(partstring);
i:=0;
repeat
i:=i+1;
if somestring[i] <> partstring[1] then goto skip ;
if somestring[i] = partstring[1] then
begin
for j:=0 to lnp-1 do
begin
if somestring[j+i]<>partstring[j+1] then goto skip;
end;
exit(true);
i:=i+lnp-1;
end ;
skip:
until i>=ln-0 ;
exit(false);
end;
function tally(somestring:ansistring;partstring:ansistring;var arr:intarray ):longword;
var
i,j,ln,lnp,count,num:longword;
filler:boolean=false;
label
skip,start,return;
begin
ln:=length(somestring);
lnp:=length(partstring);
start:
count:=0;
i:=0;
repeat
i:=i+1;
if somestring[i] <> partstring[1] then goto skip ;
if somestring[i] = partstring[1] then
begin
for j:=0 to lnp-1 do
begin
if somestring[j+i]<>partstring[j+1] then goto skip;
end;
count:=count+1;
if filler = true then arr[count]:=i ;
i:=i+lnp-1;
end ;
skip:
until i>=ln-0 ;
SetLength(arr,count);
arr[0]:=count;
num:=count;
if filler=true then goto return;
filler:=true;
goto start;
return:
result:=num;
end; {tally}
function filelen(filename:pchar):integer;
var
fp:pointer;
r:pchar='rt+';
length:integer;
SEEK_END:integer=2;
begin
fp:=fopen(filename,r);
if fp = nil then
begin
writeln( 'Unable to open ',filename);
exit
end;
fseek(fp, 0, SEEK_END);
length:=ftell(fp);
fclose(fp);
exit(length);
end;
procedure savefilestring(content:ansistring;filename:pchar);
var
w:pchar='wb';
fp:pointer;
begin
fp:=fopen(filename,w);
if fp = nil then
begin
writeln( 'Unable to save ',filename);
exit
end;
fwrite(@content[1], 1, length(content), fp);
fclose(fp);
end;
procedure loadfilestring(var content:ansistring;filename:pchar);
var
w:pchar='rb';
fp:pointer;
l:longint;
begin
l:=filelen(filename);
setlength(content,l);
fp:=fopen(filename,w);
if fp = nil then
begin
writeln( 'Unable to open ',filename);
exit
end;
fread(@content[1], 1,l, fp);
fclose(fp);
end;
procedure createfile(filename:ansistring);
var
i:longint;
s:ansistring='1234567890'+#10+'44466'+#10;
g:ansistring='';
begin
writeln('creating file . . .');
for i:=1 to 5000000 do g:=g+s;
writeln('string created');
savefilestring(g,pchar(filename));
writeln('saved');
end;
var
i,t,count:longint;
g:ansistring='';
tmp:ansistring='';
a1:intarray;
tm:int64;
begin
count:=0;
createfile('test.txt'); //<< do once
loadfilestring(g,'test.txt');
tm:=gettickcount64;
t:=tally(g,#10,a1);
writeln('Number of lines ',t);
for i:=1 to high(a1) do
begin
tmp:=g[a1[i]..a1[i+1]];
if instr(tmp,'46') then count:=count+1;
end;
writeln('Number of lines containing 46 = ',count);
writeln('Time taken (load and examine) ',(gettickcount64-tm)/1000,' seconds');
writeln('File size = ',filelen('test.txt') div 1000000,' mb');
writeln;
writeln('sample of file');
writeln(leftstr(g,198));
writeln('Press return to finish');
readln;
end.