| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- 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.
|