Initial version

This commit is contained in:
ocoursiere
2002-09-22 12:35:24 +00:00
parent d6e0e93eed
commit 6834943bb4
2 changed files with 209 additions and 0 deletions

View File

@@ -0,0 +1,4 @@
This tool use libstubgen.so to parse C++ headers and generate
the corresponding XML description.
This tool is part of the BeFPC poject.

View File

@@ -0,0 +1,205 @@
{ headertoxml - A tool from the befpc project
Copyright (C) 2002 Olivier Coursiere
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
}
program headertoxml;
{
<?xml version="1.0"?>
<CLASSES>
<CLASSE NAME="">
<FUNCTION NAME="">
<PARAMS>
<PARAM NAME="" TYPE=""/>
<PARAM NAME="" TYPE=""/>
</PARAMS>
<RESULT TYPE=""/>
</FUNCTION>
</CLASSE>
</CLASSES>
}
uses
Classes, SysUtils, stubgen;
const
Eol = #10;
type
TXMLWriter = class(TObject)
private
FFileName : string;
FLevel : integer;
FList : TStringList;
procedure StartTag(TagName : string);
procedure EndTags;
public
constructor Create(FileName : string);
destructor Destroy; override;
procedure StartClasses;
procedure EndClasses;
procedure StartClasse(Elem : PSyntaxelem);
procedure EndClasse;
procedure StartFunction(Elem : PSyntaxelem);
procedure EndFunction;
procedure StartParams;
procedure EndParams;
procedure StartParam(Elem : PArgument);
procedure StartResult(aType : PChar);
end;
constructor TXMLWriter.Create(FileName : string);
begin
inherited Create;
FLevel := 0;
FList := TStringList.Create;
FFileName := ChangeFileExt(FileName, '.xml');
end;
destructor TXMLWriter.Destroy;
begin
FList.SaveToFile(FFileName);
FList.Free;
inherited;
end;
procedure TXMLWriter.StartTag(TagName : string);
begin
Inc(FLevel);
end;
procedure TXMLWriter.EndTags;
var
i : integer;
begin
for i := 0 to FLevel - 1 do
begin
// Write
end;
end;
procedure TXMLWriter.StartClasses;
begin
FList.Add('<CLASSES>');
end;
procedure TXMLWriter.EndClasses;
begin
FList.Add('</CLASSES>');
end;
procedure TXMLWriter.StartClasse(Elem : PSyntaxelem);
begin
FList.Add(Format('<CLASSE NAME="%s">', [Elem^.aName]));
end;
procedure TXMLWriter.EndClasse;
begin
FList.Add('</CLASSE>');
end;
procedure TXMLWriter.StartFunction(Elem : PSyntaxelem);
begin
FList.Add(Format('<FUNCTION NAME="%s">', [Elem^.aName]));
end;
procedure TXMLWriter.EndFunction;
begin
FList.Add('</FUNCTION>');
end;
procedure TXMLWriter.StartParams;
begin
FList.Add('<PARAMS>');
end;
procedure TXMLWriter.EndParams;
begin
FList.Add('</PARAMS>');
end;
procedure TXMLWriter.StartParam(Elem : PArgument);
begin
FList.Add(Format('<PARAM NAME="%s" TYPE="%s"\>', [Elem^.aName, Elem^.aType]));
end;
procedure TXMLWriter.StartResult(aType : PChar);
begin
if aType <> nil then
FList.Add(Format('<RESULT TYPE="%s"\>', [aType]));
end;
var
Elem : PSyntaxelem;
fic : PChar;
s : string;
XMLWriter : TXMLWriter;
Current : PSyntaxelem;
CurrentArg : PArgument;
begin
WriteLn('Bonjour !');
if ParamCount > 0 then
begin
WriteLn(Paramstr(1));
init_tables;
s := Paramstr(1);
fic := @s[1];
Elem := scan(fic);
XMLWriter := TXMLWriter.Create(s);
try
XMLWriter.StartClasses;
XMLWriter.StartClasse(Elem);
XMLWriter.StartFunction(Elem^.children);
CurrentArg := Elem^.args;
if CurrentArg <> nil then
begin
WriteLn('Arguments');
XMLWriter.StartParam(CurrentArg);
while CurrentArg^.Next <> nil do
begin
CurrentArg := CurrentArg^.Next;
XMLWriter.StartParam(CurrentArg);
end;
end;
XMLWriter.StartResult(Elem^.ret_type);
XMLWriter.EndFunction;
Current := Elem^.children;
while Current^.next <> nil do
begin
Current := Current^.next;
XMLWriter.StartFunction(Current);
CurrentArg := Current^.args;
if CurrentArg <> nil then
begin
XMLWriter.StartParam(CurrentArg);
while CurrentArg^.next <> nil do
begin
CurrentArg := CurrentArg^.next;
XMLWriter.StartParam(CurrentArg);
end;
end;
XMLWriter.StartResult(Current^.ret_type);
XMLWriter.EndFunction;
end;
XMLWriter.EndFunction;
XMLWriter.EndClasse;
XMLWriter.EndClasses;
finally
XMLWriter.Free;
end;
free_tables;
end;
end.