[Back to TEXTFILE SWAG index] [Back to Main SWAG index] [Original]
{
I have been exploring a faster way to read lines from text
files. This one seems to be 30% faster than readln even with
a full settextbuffer of $FFFF. However, it only works for
files smaller than 64K ($FFF1) and all lines, including the
last one, must end in the CR/LF word (readln recognizes the
EOF (01Ah) char also as an end of line). Please repost any
improvements. }
program readtext;
Uses CRT;
const
maxsize = $FFF0;
type
barr = array[0..maxsize] of byte;
ptrbarr = ^barr;
var
f : file;
s : string;
p : longint;
fsiz : longint;
fbuf : ptrbarr;
function pos13(pnt:pointer): word; assembler;
asm
les di,[pnt] {load pointer in es:di}
mov cx,$00FF {load maximum size to scan in cx}
mov bx,cx {save maximum size to scan in bx}
mov al,$0D {load in al byte to match = 0Dh}
cld {increment di}
repne scasb {search loop}
je @found {jump if found}
mov ax,0 {if not found report result = 0}
jmp @fin {goto end}
@found: {if found...}
sub bx,cx {get position matched}
mov ax,bx {report result = position matched}
@fin:
end;
procedure readx(fbuf:ptrbarr;var s:string;var p:longint);
var
q : word;
b : ptrbarr;
begin
b:= addr(fbuf^[p]); {point to first byte in remaining block}
q:= pos13(b); {get position of first $0D occurence}
move(b^,s[1],pred(q)); {transfer preceeding bytes to string}
s[0]:= char(pred(q)); {assign size byte to Pascal string}
inc(p,succ(q)); {adjust pointer skipping 1 byte ($0A)}
end;
begin
ClrScr;
if paramcount = 0 then
BEGIN
writeLn( 'Enter FILENAME on commandline');
halt;
END;
assign(f,paramstr(1));
reset(f,1);
fsiz:= filesize(f);
if fsiz > maxsize then halt;
getmem(fbuf,fsiz);
blockread(f,fbuf^,fsiz);
close(f);
p := 0; {initialize pointer to position in fbuf^}
while p < fsiz do begin
readx(fbuf,s,p);
writeln(s);
end;
dispose(fbuf);
end.
[Back to TEXTFILE SWAG index] [Back to Main SWAG index] [Original]