mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-07 06:47:55 +02:00
124 lines
2.3 KiB
ObjectPascal
124 lines
2.3 KiB
ObjectPascal
unit Comments;
|
|
interface
|
|
procedure ClearComments(nesting:longbool;__buf:pointer;size:longint);
|
|
implementation
|
|
procedure ClearComments(nesting:longbool;__buf:pointer;size:longint);
|
|
type
|
|
tat=array[1..2]of char;
|
|
pat=^tat;
|
|
pblock=^tblock;
|
|
tblock=record
|
|
next:pblock;
|
|
_begin,_end:longint;
|
|
end;
|
|
type
|
|
str255=string[255];
|
|
var
|
|
CommLevel:longint;
|
|
buf:pat absolute __buf;
|
|
i,j:longint;
|
|
comm:pblock;
|
|
function TwoChars(const s):str255;
|
|
var
|
|
d:tat absolute s;
|
|
ii:longint;
|
|
begin
|
|
TwoChars:=' ';
|
|
if succ(i)>=size then
|
|
TwoChars:=''
|
|
else
|
|
begin
|
|
ii:=2;
|
|
TwoChars[1]:=d[1];
|
|
TwoChars[ii]:=d[ii];
|
|
end;
|
|
end;
|
|
function FindFrom(position:longint;const Origin:str255):longint;
|
|
var
|
|
j,k:longint;
|
|
begin
|
|
FindFrom:=size;
|
|
for j:=position to Size-length(Origin)do
|
|
begin
|
|
for k:=1 to length(Origin)do
|
|
begin
|
|
if buf^[j+k-1]<>Origin[k]then
|
|
break
|
|
else if k=length(Origin)then
|
|
begin
|
|
FindFrom:=j;
|
|
exit;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
procedure BeginComment(i:longint);
|
|
var
|
|
c:pBlock;
|
|
begin
|
|
new(c);
|
|
c^.next:=comm;
|
|
c^._begin:=i;
|
|
c^._end:=size;
|
|
comm:=c;
|
|
CommLevel:=1;
|
|
end;
|
|
procedure EndComment(i:longint);
|
|
begin
|
|
if comm<>nil then
|
|
comm^._end:=i;
|
|
dec(CommLevel);
|
|
end;
|
|
procedure DeleteComments;
|
|
var
|
|
i:longint;
|
|
c,cc:pblock;
|
|
begin
|
|
c:=comm;
|
|
while c<>nil do
|
|
begin
|
|
for i:=c^._begin to c^._end do
|
|
buf^[i]:=#32;
|
|
cc:=c;
|
|
c:=c^.next;
|
|
dispose(cc);
|
|
end;
|
|
end;
|
|
begin
|
|
commLevel:=0;
|
|
comm:=nil;
|
|
i:=1;
|
|
while i<size do
|
|
begin
|
|
if commlevel=0 then
|
|
begin
|
|
if buf^[i]=''''then
|
|
i:=FindFrom(succ(i),'''');
|
|
if TwoChars(buf^[i])='//'then
|
|
begin
|
|
BeginComment(i);
|
|
j:=FindFrom(succ(i),#13);
|
|
if j=size then
|
|
j:=FindFrom(succ(i),'#10');
|
|
i:=j;
|
|
EndComment(i);
|
|
end;
|
|
if(buf^[i]='{')or(TwoChars(buf^[i])='(*')then
|
|
BeginComment(i);
|
|
end
|
|
else
|
|
begin
|
|
if(buf^[i]='{')or(TwoChars(buf^[i])='(*')then
|
|
begin
|
|
if nesting then
|
|
inc(CommLevel);
|
|
end;
|
|
if(buf^[i]='}')or(TwoChars(buf^[i])='*)')then
|
|
EndComment(succ(i));
|
|
end;
|
|
inc(i);
|
|
end;
|
|
DeleteComments;
|
|
end;
|
|
end.
|