123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- unit PasPrep;
- interface
- uses
- Comments;
- const
- PasNesting:longbool=true;
- procedure do_pascal(__buf:pointer;size:longint;proc:pointer);
- implementation
- type
- at=array[1..1]of char;
- pat=^at;
- str255=string[255];
- procedure do_pascal(__buf:pointer;size:longint;proc:pointer);
- var
- old,i:longint;
- buf:pat absolute __buf;
- const
- GetWord_Pos:longint=0;
- LastWord:str255='';
- StringBody:longbool=false;
- procedure GetWord;
- begin
- LastWord:='';
- if GetWord_Pos>size then
- exit;
- while buf^[GetWord_Pos]<=#32 do
- begin
- if GetWord_Pos>size then
- exit;
- inc(GetWord_Pos);
- end;
- repeat
- if buf^[GetWord_Pos]=''''then
- StringBody:=not StringBody;
- LastWord:=LastWord+upcase(buf^[GetWord_Pos]);
- inc(GetWord_Pos);
- if GetWord_Pos>size then
- break;
- if(buf^[GetWord_Pos]in[#0..#32,';'])and not StringBody then
- break;
- until false;
- while(length(LastWord)>1)and(lastWord[1]=';')do
- begin
- inc(GetWord_Pos);
- delete(LastWord,1,1);
- end;
- end;
- function IsTypeDef(pos:longint):longbool;
- var
- i:longint;
- begin
- IsTypeDef:=false;
- for i:=pos downto 1 do
- if buf^[i]>=#32 then
- begin
- IsTypeDef:=buf^[i]in['=',':'];
- exit;
- end;
- end;
- procedure JumpToNext;
- var iLastword: Longint;
- begin
- repeat
- iLastword:=GetWord_Pos;
- if GetWord_Pos>size then
- exit;
- GetWord;
- i:=GetWord_Pos;
- if(LastWord='EXTERNAL')or(LastWord='FORWARD')or(LastWord='INLINE')then
- break
- else if (LastWord='CONST')then begin
- GetWord_Pos:=iLastword;
- break;
- end;
- until false;
- end;
- procedure JumpToEnd;
- var
- mainBegin:str255;
- procedure do_body;
- var
- level:longint;
- begin
- level:=1;
- while level>0 do
- begin
- if GetWord_Pos>size then
- exit;
- GetWord;
- if (LastWord='BEGIN')or(LastWord='ASM')or(LastWord='CASE')then
- inc(level)
- else if (LastWord='END')then
- dec(level);
- end;
- end;
- begin
- mainBegin:='BEGIN';
- repeat
- if GetWord_Pos>size then
- exit;
- GetWord;
- i:=GetWord_Pos;
- if((LastWord='PROCEDURE')or(lastword='FUNCTION')or(lastword='OPERATOR'))and not isTypedef(old)then
- JumpToEnd
- else if(LastWord='EXTERNAL')or(LastWord='FORWARD')or(LastWord='INLINE')then
- exit
- else if (LastWord='ASSEMBLER')then
- mainBegin:='ASM';
- until LastWord=mainBegin;
- do_body;
- end;
- procedure do_consts(savefunc:pointer);
- type
- Tpushfunc=procedure(const key,value:str255;CaseSent:longbool);
- var
- old,k,kk:longint;
- s:str255;
- ss:array[1..2]of str255;
- pushfunc:Tpushfunc absolute SaveFunc;
- begin
- repeat
- if GetWord_Pos>size then
- exit;
- old:=GetWord_Pos;
- GetWord;
- if(((LastWord='PROCEDURE')or(lastword='FUNCTION')or(lastword='OPERATOR'))and not isTypedef(old))
- or(lastword='TYPE')
- or(lastword='CONST')
- or(lastword='VAR')then
- begin
- GetWord_Pos:=old;
- exit;
- end
- else
- begin
- s:=LastWord;
- while LastWord<>';'do
- begin
- GetWord;
- if GetWord_Pos>size then
- exit;
- s:=s+LastWord;
- end;
- if s[length(s)]=';'then
- dec(s[0]);
- if s<>''then
- if pos(':',s)=0 then
- if pos('=',s)>0 then
- begin
- ss[1]:='';
- ss[2]:='';
- kk:=1;
- for k:=1 to length(s)do
- begin
- if s[k]>#32 then
- begin
- if(s[k]='=')and(kk=1)then
- inc(kk)
- else
- ss[kk]:=ss[kk]+s[k];
- end;
- end;
- TpushFunc(PushFunc)(ss[1],ss[2],false);
- end;
- end;
- until false;
- end;
- begin
- ClearComments(PasNesting,buf,size);
- i:=1;
- GetWord_Pos:=0;
- while i<=size do
- begin
- old:=GetWord_Pos;
- GetWord;
- i:=GetWord_Pos;
- if (lastword='OPERATOR')and not isTypedef(old)then
- JumpToEnd
- else if ((LastWord='PROCEDURE')or(lastword='FUNCTION')) and not isTypedef(old) then
- JumpToNext
- else if LastWord='CONST'then
- Do_Consts(proc)
- else if LastWord='IMPLEMENTATION'then
- exit;
- end;
- end;
- end.
|