1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
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.
|