h2pas: finished tool to comment fucntions that are too complex for h2pas

git-svn-id: trunk@14110 -
This commit is contained in:
mattias 2008-02-12 13:26:13 +00:00
parent f659dee1cc
commit e585127ec0
4 changed files with 43 additions and 15 deletions

View File

@ -102,7 +102,7 @@ end;
function ReadTilCBracketClose(const Source: string; var Position: integer
): boolean;
// Position must start on a bracket
// at end Position will be right after closing bracket
// at end Position will be right behind closing bracket
var
Len: Integer;
CloseBracket: Char;

View File

@ -320,7 +320,8 @@ type
phReplaceMacro0PointerWithNULL, // Replace macro values 0 pointer like (char *)0
phConvertFunctionTypesToPointers, // Convert function types to pointers
phConvertEnumsToTypeDef, // Convert anonymous enums to ypedef enums
phCommentComplexCMacros // Comment macros too complex for hpas
phCommentComplexCMacros, // Comment macros too complex for hpas
phCommentComplexCFunctions // Comment functions too complex for hpas
);
TPreH2PasToolsOptions = set of TPreH2PasToolsOption;
const
@ -3650,6 +3651,8 @@ begin
TConvertEnumsToTypeDef,Result) then exit;
if not Run(phCommentComplexCMacros,
TCommentComplexCMacros,Result) then exit;
if not Run(phCommentComplexCFunctions,
TCommentComplexCFunctions,Result) then exit;
Result:=mrOk;
end;
@ -4574,6 +4577,7 @@ var
Changed: Boolean;
p: Integer;
AtomStart: Integer;
DefinitionStart: Integer;
procedure AdjustAfterReplace(var APosition: integer;
FromPos, ToPos, NewLength: integer);
@ -4591,22 +4595,20 @@ var
Src:=copy(Src,1,FromPos-1)+NewSrc+copy(Src,ToPos,length(Src));
AdjustAfterReplace(p,FromPos,ToPos,length(NewSrc));
AdjustAfterReplace(AtomStart,FromPos,ToPos,length(NewSrc));
AdjustAfterReplace(DefinitionStart,FromPos,ToPos,length(NewSrc));
Changed:=true;
end;
function ReadFunction: boolean;
var
FuncStart: LongInt;
FuncEnd: LongInt;
begin
Result:=false;
DebugLn(['ReadFunction START "',copy(Src,AtomStart,p-AtomStart),'"']);
// a C function works like this:
// [modifiers, macros] type name(param list){ statements }
FuncStart:=AtomStart;
// read type
if not IsIdentStartChar[Src[AtomStart]] then exit;
ReadNextCAtom(Src,p,AtomStart);
if p>SrcLen then exit;
// 'type' can be an identifier or identifier* or something with brackets
// read name
if not IsIdentStartChar[Src[AtomStart]] then exit;
ReadNextCAtom(Src,p,AtomStart);
@ -4624,7 +4626,10 @@ var
// function found
FuncEnd:=p;
Result:=true;
DebugLn(['TCommentComplexCFunctions.Execute.ReadFunction ',copy(Src,FuncStart,FuncEnd-FuncStart)]);
DebugLn(['TCommentComplexCFunctions.Execute.ReadFunction Function="',copy(Src,DefinitionStart,FuncEnd-DefinitionStart),'"']);
// IMPORTANT: add in reverse order
Replace(FuncEnd,FuncEnd,'*/');
Replace(DefinitionStart,DefinitionStart,'/*');
end;
var
@ -4637,13 +4642,37 @@ begin
SrcLen:=length(Src);
p:=1;
AtomStart:=1;
DefinitionStart:=0;
repeat
// read next definition
ReadNextCAtom(Src,p,AtomStart);
if p>SrcLen then break;
if IsIdentStartChar[Src[p]] then begin
OldP:=p;
if not ReadFunction then begin
p:=OldP;
if Src[AtomStart]=';' then begin
// definition end found
DefinitionStart:=0;
continue;
end else if Src[AtomStart]='{' then begin
// block found = definition end found
DefinitionStart:=0;
p:=AtomStart;
if not ReadTilCBracketClose(Src,p) then break;
continue;
end else begin
// in definition
if DefinitionStart<1 then
DefinitionStart:=AtomStart;
if Src[AtomStart] in ['(','['] then begin
// skip bracket
p:=AtomStart;
if not ReadTilCBracketClose(Src,p) then break;
end else if IsIdentStartChar[Src[AtomStart]] then begin
// identifier found => check if function
OldP:=p;
if ReadFunction then begin
DefinitionStart:=0;
end else begin
p:=OldP;
end;
end;
end;
until false;

View File

@ -217,6 +217,7 @@ begin
TextConverterToolClasses.RegisterClass(TConvertFunctionTypesToPointers);
TextConverterToolClasses.RegisterClass(TConvertEnumsToTypeDef);
TextConverterToolClasses.RegisterClass(TCommentComplexCMacros);
TextConverterToolClasses.RegisterClass(TCommentComplexCFunctions);
TextConverterToolClasses.RegisterClass(TPostH2PasTools);
TextConverterToolClasses.RegisterClass(TReplaceUnitFilenameWithUnitName);
TextConverterToolClasses.RegisterClass(TRemoveDoubleSemicolons);

View File

@ -1,5 +1,3 @@
{ This is an automatically generated lazarus resource file }
LazarusResources.Add('TMainForm','FORMDATA',[
'TPF0'#9'TMainForm'#8'MainForm'#4'Left'#3'$'#1#6'Height'#3'K'#1#3'Top'#3#209#0
+#5'Width'#3#144#1#18'HorzScrollBar.Page'#3#143#1#18'VertScrollBar.Page'#3'J'