mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-07 14:27:59 +02:00
200 lines
3.2 KiB
ObjectPascal
200 lines
3.2 KiB
ObjectPascal
|
|
type
|
|
stlpos=^stlink;
|
|
stlink=
|
|
packed object
|
|
next,prev:stlpos;
|
|
data:string;
|
|
procedure save(var f:file);
|
|
procedure load(var f:file);
|
|
end;
|
|
list_of_string=
|
|
packed object
|
|
parent:pointer;
|
|
anchor:stlpos;
|
|
last:stlpos;
|
|
len:longint;
|
|
constructor init(p:pointer);
|
|
function first:stlpos;
|
|
function next(p:stlpos):stlpos;
|
|
function prev(p:stlpos):stlpos;
|
|
function ret(p:stlpos):string;
|
|
function pret(p:stlpos):pointer;
|
|
function insert(p:stlpos;d:string):stlpos;
|
|
function remove(p:stlpos):stlpos;
|
|
function empty:boolean;
|
|
destructor term;
|
|
procedure save(var f:file);
|
|
procedure load(var f:file);
|
|
end;
|
|
|
|
stack_of_string=
|
|
packed object (list_of_string)
|
|
procedure pop(var s:string);
|
|
procedure push(const s:string);
|
|
end;
|
|
|
|
procedure writestring(var f:file;s:string);
|
|
begin
|
|
blockwrite(f,s,length(s)+1);
|
|
end;
|
|
|
|
procedure readstring(var f:file;var s:string);
|
|
var b:byte;
|
|
begin
|
|
blockread(f,b,1);
|
|
seek(f,filepos(f)-1);
|
|
blockread(f,s,b+1);
|
|
end;
|
|
|
|
constructor list_of_string.init(p:pointer);
|
|
begin
|
|
parent:=p;
|
|
new(anchor);
|
|
anchor^.next:=nil;
|
|
anchor^.prev:=nil;
|
|
last:=anchor;
|
|
len:=0;
|
|
end;
|
|
|
|
function list_of_string.first:stlpos;
|
|
begin
|
|
first:=anchor^.next;
|
|
end;
|
|
|
|
function list_of_string.next(p:stlpos):stlpos;
|
|
begin
|
|
next:=p^.next;
|
|
end;
|
|
|
|
function list_of_string.prev(p:stlpos):stlpos;
|
|
begin
|
|
prev:=p^.prev;
|
|
end;
|
|
|
|
function list_of_string.ret(p:stlpos):string;
|
|
begin
|
|
ret:=p^.data;
|
|
end;
|
|
|
|
function list_of_string.pret(p:stlpos):pointer;
|
|
begin
|
|
pret:=@(p^.data);
|
|
end;
|
|
|
|
function list_of_string.insert(p:stlpos;d:string):stlpos;
|
|
var t:stlpos;
|
|
begin
|
|
new(t);
|
|
t^.prev:=p;
|
|
t^.next:=p^.next;
|
|
p^.next:=t;
|
|
if t^.next<>nil then
|
|
t^.next^.prev:=t
|
|
else
|
|
last:=t;
|
|
t^.data:=d;
|
|
inc(len);
|
|
insert:=t;
|
|
end;
|
|
|
|
function list_of_string.remove(p:stlpos):stlpos;
|
|
begin
|
|
if p^.prev<>nil then
|
|
p^.prev^.next:=p^.next;
|
|
if p^.next<>nil then
|
|
p^.next^.prev:=p^.prev
|
|
else
|
|
last:=p^.prev;
|
|
dispose(p);
|
|
dec(len);
|
|
remove:=p^.next;
|
|
end;
|
|
|
|
function list_of_string.empty:boolean;
|
|
begin
|
|
empty:=(last=anchor);
|
|
end;
|
|
|
|
destructor list_of_string.term;
|
|
begin
|
|
while not empty do
|
|
remove(last);
|
|
dispose(anchor);
|
|
last:=nil;
|
|
end;
|
|
|
|
procedure stlink.save(var f:file);
|
|
begin
|
|
writestring(f,data);
|
|
end;
|
|
|
|
procedure list_of_string.save(var f:file);
|
|
var
|
|
l,i:longint;
|
|
p:stlpos;
|
|
begin
|
|
l:=len;
|
|
blockwrite(f,l,sizeof(longint));
|
|
p:=first;
|
|
for i:=1 to l do
|
|
begin
|
|
p^.save(f);
|
|
p:=next(p);
|
|
end;
|
|
end;
|
|
|
|
procedure stlink.load(var f:file);
|
|
begin
|
|
readstring(f,data);
|
|
end;
|
|
|
|
procedure list_of_string.load(var f:file);
|
|
var
|
|
l,i:longint;
|
|
d:stlink;
|
|
begin
|
|
blockread(f,l,sizeof(longint));
|
|
for i:=1 to l do
|
|
begin
|
|
d.load(f);
|
|
insert(last,d.data);
|
|
end;
|
|
end;
|
|
|
|
procedure stack_of_string.pop(var s:string);
|
|
begin
|
|
if not empty then
|
|
begin
|
|
s:=first^.data;
|
|
remove(first);
|
|
end;
|
|
end;
|
|
|
|
procedure stack_of_string.push(const s:string);
|
|
begin
|
|
insert(anchor,s);
|
|
end;
|
|
|
|
var
|
|
gs:stack_of_string;
|
|
opaddr : ^string;
|
|
begin
|
|
gs.init(nil);
|
|
gs.push('test');
|
|
|
|
{perfectly compiles}
|
|
opaddr:=@((gs.first)^.data);
|
|
writeln(opaddr^);
|
|
if (opaddr^<>'test') then
|
|
halt(1);
|
|
|
|
{reports error ") expected ^ but found"}
|
|
opaddr:=@(gs.first^.data);
|
|
writeln(opaddr^);
|
|
if (opaddr^<>'test') then
|
|
halt(1);
|
|
|
|
|
|
end.
|