|
|
@@ -61,10 +61,10 @@ type |
|
|
TvkObject = class; |
|
|
TvkObject = class; |
|
|
TvkObjectList = class(specialize TutlList<TvkObject>) |
|
|
TvkObjectList = class(specialize TutlList<TvkObject>) |
|
|
public |
|
|
public |
|
|
function IndexOfObj(const aName: DOMstring; const aTypes: TvkObjectTypes): Integer; |
|
|
|
|
|
function FindObj(const aName: DOMstring; const aTypes: TvkObjectTypes; out aObject): Boolean; |
|
|
|
|
|
function GetPascalName(const aName: DOMString; const aPointer: Integer; const aArrSize: WideString = ''): WideString; |
|
|
|
|
|
function GenerateCode(const aName: String; const aCode: TStringTree): Boolean; |
|
|
|
|
|
|
|
|
function IndexOfObj(const aName: WideString; const aTypes: TvkObjectTypes): Integer; |
|
|
|
|
|
function FindObj(const aName: WideString; const aTypes: TvkObjectTypes; out aObject): Boolean; |
|
|
|
|
|
function GetPascalName(const aName: WideString; const aPointer: Integer; const aArrSize: WideString = ''): WideString; |
|
|
|
|
|
function GenerateCode(const aName: WideString; const aCode: TStringTree): Boolean; |
|
|
procedure AddObject(const aObj: TvkObject); |
|
|
procedure AddObject(const aObj: TvkObject); |
|
|
end; |
|
|
end; |
|
|
|
|
|
|
|
|
@@ -72,8 +72,8 @@ type |
|
|
TvkObject = class(TObject) |
|
|
TvkObject = class(TObject) |
|
|
private |
|
|
private |
|
|
fType: TvkObjectType; |
|
|
fType: TvkObjectType; |
|
|
fName: DOMString; |
|
|
|
|
|
fComment: DOMString; |
|
|
|
|
|
|
|
|
fName: WideString; |
|
|
|
|
|
fComment: WideString; |
|
|
fList: TvkObjectList; |
|
|
fList: TvkObjectList; |
|
|
protected |
|
|
protected |
|
|
function GetDependencyOrder: Integer; virtual; |
|
|
function GetDependencyOrder: Integer; virtual; |
|
|
@@ -82,8 +82,8 @@ type |
|
|
{%H-}constructor Create(const aType: TvkObjectType); |
|
|
{%H-}constructor Create(const aType: TvkObjectType); |
|
|
public |
|
|
public |
|
|
property VkType: TvkObjectType read fType; |
|
|
property VkType: TvkObjectType read fType; |
|
|
property Name: DOMString read fName write fName; |
|
|
|
|
|
property Comment: DOMString read fComment write fComment; |
|
|
|
|
|
|
|
|
property Name: WideString read fName write fName; |
|
|
|
|
|
property Comment: WideString read fComment write fComment; |
|
|
property List: TvkObjectList read fList write fList; |
|
|
property List: TvkObjectList read fList write fList; |
|
|
|
|
|
|
|
|
function GetPascalName(const aPointer: Integer; const aArrSize: WideString): WideString; |
|
|
function GetPascalName(const aPointer: Integer; const aArrSize: WideString): WideString; |
|
|
@@ -96,14 +96,14 @@ type |
|
|
//////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////// |
|
|
TvkTypeBase = class(TvkObject) |
|
|
TvkTypeBase = class(TvkObject) |
|
|
private |
|
|
private |
|
|
fParent: DOMString; |
|
|
|
|
|
fAlias: DOMString; |
|
|
|
|
|
|
|
|
fParent: WideString; |
|
|
|
|
|
fAlias: WideString; |
|
|
protected |
|
|
protected |
|
|
function GetDependencyOrder: Integer; override; |
|
|
function GetDependencyOrder: Integer; override; |
|
|
procedure GenPascalName(var aName: WideString; const aPointer: Integer; const aArrSize: WideString); override; |
|
|
procedure GenPascalName(var aName: WideString; const aPointer: Integer; const aArrSize: WideString); override; |
|
|
public |
|
|
public |
|
|
property Parent: DOMString read fParent write fParent; |
|
|
|
|
|
property Alias: DOMString read fAlias write fAlias; |
|
|
|
|
|
|
|
|
property Parent: WideString read fParent write fParent; |
|
|
|
|
|
property Alias: WideString read fAlias write fAlias; |
|
|
|
|
|
|
|
|
procedure GenerateCode(const aCode: TStringTree); override; |
|
|
procedure GenerateCode(const aCode: TStringTree); override; |
|
|
end; |
|
|
end; |
|
|
@@ -117,8 +117,12 @@ type |
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////// |
|
|
TvkHandle = class(TvkTypeBase) |
|
|
TvkHandle = class(TvkTypeBase) |
|
|
|
|
|
private |
|
|
|
|
|
fNonDispatchable: Boolean; |
|
|
public |
|
|
public |
|
|
|
|
|
property NonDispatchable: Boolean read fNonDispatchable write fNonDispatchable; |
|
|
procedure ReadXml(const xml: TDOMNode); override; |
|
|
procedure ReadXml(const xml: TDOMNode); override; |
|
|
|
|
|
procedure GenerateCode(const aCode: TStringTree); override; |
|
|
constructor Create; |
|
|
constructor Create; |
|
|
end; |
|
|
end; |
|
|
|
|
|
|
|
|
@@ -126,8 +130,8 @@ type |
|
|
TvkFunctionBase = class(TvkObject) |
|
|
TvkFunctionBase = class(TvkObject) |
|
|
private type |
|
|
private type |
|
|
TArgument = class(TObject) |
|
|
TArgument = class(TObject) |
|
|
Typ: DOMString; |
|
|
|
|
|
Name: DOMString; |
|
|
|
|
|
|
|
|
Typ: WideString; |
|
|
|
|
|
Name: WideString; |
|
|
IsPointer: Integer; |
|
|
IsPointer: Integer; |
|
|
IsConst: Boolean; |
|
|
IsConst: Boolean; |
|
|
end; |
|
|
end; |
|
|
@@ -169,9 +173,9 @@ type |
|
|
TvkStruct = class(TvkObject) |
|
|
TvkStruct = class(TvkObject) |
|
|
private type |
|
|
private type |
|
|
TMember = class(TObject) |
|
|
TMember = class(TObject) |
|
|
Typ: DOMString; |
|
|
|
|
|
Name: DOMString; |
|
|
|
|
|
ArrSize: DOMString; |
|
|
|
|
|
|
|
|
Typ: WideString; |
|
|
|
|
|
Name: WideString; |
|
|
|
|
|
ArrSize: WideString; |
|
|
IsPointer: Integer; |
|
|
IsPointer: Integer; |
|
|
IsConst: Boolean; |
|
|
IsConst: Boolean; |
|
|
end; |
|
|
end; |
|
|
@@ -197,18 +201,18 @@ type |
|
|
TvkEnum = class(TvkObject) |
|
|
TvkEnum = class(TvkObject) |
|
|
private type |
|
|
private type |
|
|
TValue = class(TObject) |
|
|
TValue = class(TObject) |
|
|
Name: DOMString; |
|
|
|
|
|
|
|
|
Name: WideString; |
|
|
Value: Variant; |
|
|
Value: Variant; |
|
|
IsBit: Boolean; |
|
|
IsBit: Boolean; |
|
|
end; |
|
|
end; |
|
|
TValueList = specialize TutlList<TValue>; |
|
|
TValueList = specialize TutlList<TValue>; |
|
|
private |
|
|
private |
|
|
fExpands: DOMString; |
|
|
|
|
|
|
|
|
fExpands: WideString; |
|
|
fValues: TValueList; |
|
|
fValues: TValueList; |
|
|
protected |
|
|
protected |
|
|
procedure GenPascalName(var aName: WideString; const aPointer: Integer; const aArrSize: WideString); override; |
|
|
procedure GenPascalName(var aName: WideString; const aPointer: Integer; const aArrSize: WideString); override; |
|
|
public |
|
|
public |
|
|
property Expands: DOMString read fExpands write fExpands; |
|
|
|
|
|
|
|
|
property Expands: WideString read fExpands write fExpands; |
|
|
property Values: TValueList read fValues; |
|
|
property Values: TValueList read fValues; |
|
|
procedure ReadXml(const xml: TDOMNode); override; |
|
|
procedure ReadXml(const xml: TDOMNode); override; |
|
|
procedure GenerateCode(const aCode: TStringTree); override; |
|
|
procedure GenerateCode(const aCode: TStringTree); override; |
|
|
@@ -273,6 +277,9 @@ const |
|
|
KEYWORD_VAR = 'VAR'; |
|
|
KEYWORD_VAR = 'VAR'; |
|
|
KEYWORD_CODE = 'CODE'; |
|
|
KEYWORD_CODE = 'CODE'; |
|
|
|
|
|
|
|
|
|
|
|
KEYWORD_INSTANCE_COMMANDS = 'INSTANCE_COMMANDS'; |
|
|
|
|
|
KEYWORD_DEVICE_COMMANDS = 'DEVICE_COMMANDS'; |
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
function PointerCount(const aStr: AnsiString): Integer; |
|
|
function PointerCount(const aStr: AnsiString): Integer; |
|
|
var i: Integer; |
|
|
var i: Integer; |
|
|
@@ -340,7 +347,7 @@ begin |
|
|
rx := TRegExpr.Create('^(T|P)?(Vk)?(.)'); |
|
|
rx := TRegExpr.Create('^(T|P)?(Vk)?(.)'); |
|
|
try |
|
|
try |
|
|
if rx.Exec(String(aType)) |
|
|
if rx.Exec(String(aType)) |
|
|
then result := WideString(LowerCase(rx.Match[3]) + s) |
|
|
|
|
|
|
|
|
then result := WideString(LowerCase(rx.Match[3])) + s |
|
|
else result := 'm' + s; |
|
|
else result := 'm' + s; |
|
|
finally |
|
|
finally |
|
|
FreeAndNil(rx); |
|
|
FreeAndNil(rx); |
|
|
@@ -365,13 +372,13 @@ begin |
|
|
end; |
|
|
end; |
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
procedure WriteResolveWarning(const aName: DOMString); |
|
|
|
|
|
|
|
|
procedure WriteResolveWarning(const aName: WideString); |
|
|
begin |
|
|
begin |
|
|
WriteLn('WARNING! unable to resolve identifier: ' + aName); |
|
|
WriteLn('WARNING! unable to resolve identifier: ' + aName); |
|
|
end; |
|
|
end; |
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
function GetNodeValue(xml: TDOMNode; const aName: WideString): DOMString; |
|
|
|
|
|
|
|
|
function GetNodeValue(xml: TDOMNode; const aName: WideString): WideString; |
|
|
var x: TDOMNode; |
|
|
var x: TDOMNode; |
|
|
begin |
|
|
begin |
|
|
x := xml.FindNode(aName); |
|
|
x := xml.FindNode(aName); |
|
|
@@ -381,7 +388,7 @@ begin |
|
|
end; |
|
|
end; |
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
function TryGetNodeValue(xml: TDOMNode; const aName: WideString; out aValue: DOMString): Boolean; |
|
|
|
|
|
|
|
|
function TryGetNodeValue(xml: TDOMNode; const aName: WideString; out aValue: WideString): Boolean; |
|
|
var x: TDOMNode; |
|
|
var x: TDOMNode; |
|
|
begin |
|
|
begin |
|
|
x := xml.FindNode(aName); |
|
|
x := xml.FindNode(aName); |
|
|
@@ -391,7 +398,7 @@ begin |
|
|
end; |
|
|
end; |
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
function GetNodeValue(xml: TDOMNode; const aName: WideString; const aDefault: DOMString): DOMString; |
|
|
|
|
|
|
|
|
function GetNodeValue(xml: TDOMNode; const aName: WideString; const aDefault: WideString): WideString; |
|
|
var x: TDOMNode; |
|
|
var x: TDOMNode; |
|
|
begin |
|
|
begin |
|
|
x := xml.FindNode(aName); |
|
|
x := xml.FindNode(aName); |
|
|
@@ -401,7 +408,7 @@ begin |
|
|
end; |
|
|
end; |
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
function GetNodeAttrib(xml: TDOMNode; const aName: WideString): DOMString; |
|
|
|
|
|
|
|
|
function GetNodeAttrib(xml: TDOMNode; const aName: WideString): WideString; |
|
|
var x: TDOMNode; |
|
|
var x: TDOMNode; |
|
|
begin |
|
|
begin |
|
|
if xml.HasAttributes then begin |
|
|
if xml.HasAttributes then begin |
|
|
@@ -415,7 +422,7 @@ begin |
|
|
end; |
|
|
end; |
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
function TryGetNodeAttrib(xml: TDOMNode; const aName: WideString; out aValue: DOMString): Boolean; |
|
|
|
|
|
|
|
|
function TryGetNodeAttrib(xml: TDOMNode; const aName: WideString; out aValue: WideString): Boolean; |
|
|
var x: TDOMNode; |
|
|
var x: TDOMNode; |
|
|
begin |
|
|
begin |
|
|
result := true; |
|
|
result := true; |
|
|
@@ -430,7 +437,7 @@ begin |
|
|
end; |
|
|
end; |
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
function GetNodeAttrib(xml: TDOMNode; const aName: WideString; const aDefault: DOMString): DOMString; |
|
|
|
|
|
|
|
|
function GetNodeAttrib(xml: TDOMNode; const aName: WideString; const aDefault: WideString): WideString; |
|
|
var x: TDOMNode; |
|
|
var x: TDOMNode; |
|
|
begin |
|
|
begin |
|
|
result := aDefault; |
|
|
result := aDefault; |
|
|
@@ -577,7 +584,7 @@ end; |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//THeaderGenerator.TvkObjectList//////////////////////////////////////////////////////////////////////////////////////// |
|
|
//THeaderGenerator.TvkObjectList//////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
function THeaderGenerator.TvkObjectList.IndexOfObj(const aName: DOMstring; const aTypes: TvkObjectTypes): Integer; |
|
|
|
|
|
|
|
|
function THeaderGenerator.TvkObjectList.IndexOfObj(const aName: WideString; const aTypes: TvkObjectTypes): Integer; |
|
|
var o: TvkObject; |
|
|
var o: TvkObject; |
|
|
begin |
|
|
begin |
|
|
if (aName = '') then |
|
|
if (aName = '') then |
|
|
@@ -592,7 +599,7 @@ begin |
|
|
end; |
|
|
end; |
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
function THeaderGenerator.TvkObjectList.FindObj(const aName: DOMstring; const aTypes: TvkObjectTypes; out aObject): Boolean; |
|
|
|
|
|
|
|
|
function THeaderGenerator.TvkObjectList.FindObj(const aName: WideString; const aTypes: TvkObjectTypes; out aObject): Boolean; |
|
|
var i: Integer; |
|
|
var i: Integer; |
|
|
begin |
|
|
begin |
|
|
i := IndexOfObj(aName, aTypes); |
|
|
i := IndexOfObj(aName, aTypes); |
|
|
@@ -603,7 +610,7 @@ begin |
|
|
end; |
|
|
end; |
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
function THeaderGenerator.TvkObjectList.GetPascalName(const aName: DOMString; const aPointer: Integer; |
|
|
|
|
|
|
|
|
function THeaderGenerator.TvkObjectList.GetPascalName(const aName: WideString; const aPointer: Integer; |
|
|
const aArrSize: WideString): WideString; |
|
|
const aArrSize: WideString): WideString; |
|
|
var o: TvkObject; |
|
|
var o: TvkObject; |
|
|
begin |
|
|
begin |
|
|
@@ -613,7 +620,7 @@ begin |
|
|
end; |
|
|
end; |
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
function THeaderGenerator.TvkObjectList.GenerateCode(const aName: String; const aCode: TStringTree): Boolean; |
|
|
|
|
|
|
|
|
function THeaderGenerator.TvkObjectList.GenerateCode(const aName: WideString; const aCode: TStringTree): Boolean; |
|
|
var o: TvkObject; |
|
|
var o: TvkObject; |
|
|
begin |
|
|
begin |
|
|
result := FindObj(aName, VK_OBJECT_ALL, o); |
|
|
result := FindObj(aName, VK_OBJECT_ALL, o); |
|
|
@@ -689,7 +696,7 @@ end; |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
class procedure THeaderGenerator.TvkObject.CreateFromXml(const xml: TDOMNode; const aList: TvkObjectList); |
|
|
class procedure THeaderGenerator.TvkObject.CreateFromXml(const xml: TDOMNode; const aList: TvkObjectList); |
|
|
var |
|
|
var |
|
|
s, n: DOMString; |
|
|
|
|
|
|
|
|
s, n: WideString; |
|
|
|
|
|
|
|
|
procedure GenerateVersionEnum; |
|
|
procedure GenerateVersionEnum; |
|
|
var |
|
|
var |
|
|
@@ -760,7 +767,7 @@ var |
|
|
c.Name := GetNodeAttrib(x, 'name'); |
|
|
c.Name := GetNodeAttrib(x, 'name'); |
|
|
c.Value := StrToValue(String(GetNodeAttrib(x, 'value'))); |
|
|
c.Value := StrToValue(String(GetNodeAttrib(x, 'value'))); |
|
|
if (c.Value = Unassigned) then |
|
|
if (c.Value = Unassigned) then |
|
|
raise Exception.Create('Invalid constant value: ' + GetNodeAttrib(x, 'value')); |
|
|
|
|
|
|
|
|
raise Exception.Create('Invalid constant value: ' + String(GetNodeAttrib(x, 'value'))); |
|
|
aList.AddObject(c); |
|
|
aList.AddObject(c); |
|
|
except |
|
|
except |
|
|
FreeAndNil(c); |
|
|
FreeAndNil(c); |
|
|
@@ -846,7 +853,7 @@ begin |
|
|
st := aCode.GetOrCreateItem(KEYWORD_INTF).GetOrCreateItem(KEYWORD_TYPES); |
|
|
st := aCode.GetOrCreateItem(KEYWORD_INTF).GetOrCreateItem(KEYWORD_TYPES); |
|
|
if (st.LinesBefore.Count = 0) then |
|
|
if (st.LinesBefore.Count = 0) then |
|
|
st.LinesBefore.Add('type { simple types }'); |
|
|
st.LinesBefore.Add('type { simple types }'); |
|
|
st := st.GetOrCreateItem(fName); |
|
|
|
|
|
|
|
|
st := st.GetOrCreateItem(String(fName)); |
|
|
if (st.LinesBefore.Count = 0) and (fParent <> '') and Assigned(List) then begin |
|
|
if (st.LinesBefore.Count = 0) and (fParent <> '') and Assigned(List) then begin |
|
|
st.LinesBefore.Add(Format(' %-62s = %s;', [ fName, List.GetPascalName(fParent, 0) ])); |
|
|
st.LinesBefore.Add(Format(' %-62s = %s;', [ fName, List.GetPascalName(fParent, 0) ])); |
|
|
st.LinesBefore.Add(Format(' P%-61s = ^%0:s;', [ fName ])); |
|
|
st.LinesBefore.Add(Format(' P%-61s = ^%0:s;', [ fName ])); |
|
|
@@ -883,9 +890,36 @@ end; |
|
|
procedure THeaderGenerator.TvkHandle.ReadXml(const xml: TDOMNode); |
|
|
procedure THeaderGenerator.TvkHandle.ReadXml(const xml: TDOMNode); |
|
|
begin |
|
|
begin |
|
|
inherited ReadXml(xml); |
|
|
inherited ReadXml(xml); |
|
|
Name := GetNodeValue (xml, 'name'); |
|
|
|
|
|
//Parent := GetNodeAttrib(xml, 'parent', 'VkHandle'); |
|
|
|
|
|
Parent := 'VkHandle'; |
|
|
|
|
|
|
|
|
Name := GetNodeValue (xml, 'name'); |
|
|
|
|
|
fNonDispatchable := (GetNodeValue(xml, 'type') = 'VK_DEFINE_NON_DISPATCHABLE_HANDLE'); |
|
|
|
|
|
Parent := GetNodeAttrib(xml, 'parent', ''); |
|
|
|
|
|
end; |
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
|
|
procedure THeaderGenerator.TvkHandle.GenerateCode(const aCode: TStringTree); |
|
|
|
|
|
var |
|
|
|
|
|
st: TStringTree; |
|
|
|
|
|
s: String; |
|
|
|
|
|
begin |
|
|
|
|
|
if Assigned(fList) and (fParent <> '') then |
|
|
|
|
|
fList.GenerateCode(fParent, aCode); |
|
|
|
|
|
if Assigned(fList) and (fAlias <> '') then |
|
|
|
|
|
fList.GenerateCode(fAlias, aCode); |
|
|
|
|
|
|
|
|
|
|
|
st := aCode.GetOrCreateItem(KEYWORD_INTF).GetOrCreateItem(KEYWORD_TYPES); |
|
|
|
|
|
if (st.LinesBefore.Count = 0) then |
|
|
|
|
|
st.LinesBefore.Add('type { simple types }'); |
|
|
|
|
|
st := st.GetOrCreateItem(String(fName)); |
|
|
|
|
|
if (st.LinesBefore.Count = 0) then begin |
|
|
|
|
|
s := '^_' + String(fName); |
|
|
|
|
|
if fNonDispatchable then |
|
|
|
|
|
s := '{$IFDEF VK_CPU64}' + s + '{$ELSE}VkNonDispatchableHandle{$ENDIF}'; |
|
|
|
|
|
st.LinesBefore.Add(Format(' %-62s = record end;', [ '_' + fName, s ])); |
|
|
|
|
|
st.LinesBefore.Add(Format(' %-62s = %s;', [ fName, s ])); |
|
|
|
|
|
st.LinesBefore.Add(Format(' P%-61s = ^%0:s;', [ fName ])); |
|
|
|
|
|
st.LinesBefore.Add(Format(' PP%-60s = ^P%0:s;', [ fName ])); |
|
|
|
|
|
st.LinesBefore.Add(''); |
|
|
|
|
|
end; |
|
|
end; |
|
|
end; |
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
@@ -933,14 +967,14 @@ begin |
|
|
fList.GenerateCode(a.Typ, aCode); |
|
|
fList.GenerateCode(a.Typ, aCode); |
|
|
end; |
|
|
end; |
|
|
|
|
|
|
|
|
st := aSub.GetOrCreateItem(GetPascalName(0, '')); |
|
|
|
|
|
|
|
|
st := aSub.GetOrCreateItem(String(GetPascalName(0, ''))); |
|
|
if (st.LinesBefore.Count = 0) then begin |
|
|
if (st.LinesBefore.Count = 0) then begin |
|
|
// head |
|
|
// head |
|
|
s := WideString(Format(' %s', [ GetPascalName(0, '') ])); |
|
|
s := WideString(Format(' %s', [ GetPascalName(0, '') ])); |
|
|
if (ReturnValue.Typ = 'void') and (ReturnValue.IsPointer = 0) |
|
|
if (ReturnValue.Typ = 'void') and (ReturnValue.IsPointer = 0) |
|
|
then s := s + ' = procedure(' |
|
|
then s := s + ' = procedure(' |
|
|
else s := s + ' = function ('; |
|
|
else s := s + ' = function ('; |
|
|
st.LinesBefore.Add(s); |
|
|
|
|
|
|
|
|
st.LinesBefore.Add(String(s)); |
|
|
|
|
|
|
|
|
// params |
|
|
// params |
|
|
for i := 0 to fArguments.Count-1 do begin |
|
|
for i := 0 to fArguments.Count-1 do begin |
|
|
@@ -949,10 +983,10 @@ begin |
|
|
if a.IsConst |
|
|
if a.IsConst |
|
|
then s := s + 'const ' |
|
|
then s := s + 'const ' |
|
|
else s := s + ' '; |
|
|
else s := s + ' '; |
|
|
s := s + Format('%-30s%s', [ PrepareName(a.Name, a.Typ)+':', List.GetPascalName(a.Typ, a.IsPointer) ]); |
|
|
|
|
|
|
|
|
s := s + WideString(Format('%-30s%s', [ PrepareName(a.Name, a.Typ)+':', List.GetPascalName(a.Typ, a.IsPointer) ])); |
|
|
if (i < fArguments.Count-1) then |
|
|
if (i < fArguments.Count-1) then |
|
|
s := s + '; '; |
|
|
s := s + '; '; |
|
|
st.LinesBefore.Add(s); |
|
|
|
|
|
|
|
|
st.LinesBefore.Add(String(s)); |
|
|
end; |
|
|
end; |
|
|
|
|
|
|
|
|
// result |
|
|
// result |
|
|
@@ -960,7 +994,7 @@ begin |
|
|
if (ReturnValue.Typ <> 'void') or (ReturnValue.IsPointer > 0) then |
|
|
if (ReturnValue.Typ <> 'void') or (ReturnValue.IsPointer > 0) then |
|
|
s := s + ': ' + List.GetPascalName(ReturnValue.Typ, ReturnValue.IsPointer); |
|
|
s := s + ': ' + List.GetPascalName(ReturnValue.Typ, ReturnValue.IsPointer); |
|
|
s := s + '; {$IFDEF VK_CDECL}cdecl{$ELSE}stdcall{$ENDIF};'; |
|
|
s := s + '; {$IFDEF VK_CDECL}cdecl{$ELSE}stdcall{$ENDIF};'; |
|
|
st.LinesBefore.Add(s); |
|
|
|
|
|
|
|
|
st.LinesBefore.Add(String(s)); |
|
|
st.LinesBefore.Add(''); |
|
|
st.LinesBefore.Add(''); |
|
|
end; |
|
|
end; |
|
|
end; |
|
|
end; |
|
|
@@ -1118,7 +1152,32 @@ end; |
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
procedure THeaderGenerator.TvkCommand.GenerateCode(const aCode: TStringTree); |
|
|
procedure THeaderGenerator.TvkCommand.GenerateCode(const aCode: TStringTree); |
|
|
var st: TStringTree; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function GetStringTree(const aType: WideString): TStringTree; |
|
|
|
|
|
var h: TvkTypeBase; |
|
|
|
|
|
begin |
|
|
|
|
|
result := nil; |
|
|
|
|
|
|
|
|
|
|
|
if (fName = 'vkGetInstanceProcAddr') then |
|
|
|
|
|
exit; |
|
|
|
|
|
|
|
|
|
|
|
if (aType = 'VkInstance') or (fName = 'vkGetDeviceProcAddr') then begin |
|
|
|
|
|
result := aCode.GetOrCreateItem(KEYWORD_INSTANCE_COMMANDS); |
|
|
|
|
|
exit; |
|
|
|
|
|
end; |
|
|
|
|
|
|
|
|
|
|
|
if (aType = 'VkDevice') then begin |
|
|
|
|
|
result := aCode.GetOrCreateItem(KEYWORD_DEVICE_COMMANDS); |
|
|
|
|
|
exit; |
|
|
|
|
|
end; |
|
|
|
|
|
|
|
|
|
|
|
if not Assigned(List) or not List.FindObj(aType, [otHandle, otType], h) or (h.Parent = '') then |
|
|
|
|
|
exit; |
|
|
|
|
|
result := GetStringTree(h.Parent); |
|
|
|
|
|
end; |
|
|
|
|
|
|
|
|
|
|
|
var |
|
|
|
|
|
st: TStringTree; |
|
|
begin |
|
|
begin |
|
|
inherited GenerateCode(aCode); |
|
|
inherited GenerateCode(aCode); |
|
|
st := aCode.GetOrCreateItem(KEYWORD_INTF).GetOrCreateItem(KEYWORD_COMMAND); |
|
|
st := aCode.GetOrCreateItem(KEYWORD_INTF).GetOrCreateItem(KEYWORD_COMMAND); |
|
|
@@ -1126,17 +1185,33 @@ begin |
|
|
st.LinesBefore.Add('type { commands }'); |
|
|
st.LinesBefore.Add('type { commands }'); |
|
|
GenerateFunctionPtr(aCode, st); |
|
|
GenerateFunctionPtr(aCode, st); |
|
|
|
|
|
|
|
|
st := aCode.GetOrCreateItem(KEYWORD_INTF).GetOrCreateItem(KEYWORD_VAR); |
|
|
|
|
|
if (st.LinesBefore.Count = 0) then |
|
|
|
|
|
st.LinesBefore.Add('var'); |
|
|
|
|
|
|
|
|
st := nil; |
|
|
|
|
|
if (Arguments.Count > 0) then |
|
|
|
|
|
st := GetStringTree(Arguments[0].Typ); |
|
|
|
|
|
|
|
|
st := st.GetOrCreateItem(fName); |
|
|
|
|
|
if (st.LinesBefore.Count = 0) then |
|
|
|
|
|
st.LinesBefore.Add(Format(' %-50s%s;', [fName + ':', GetPascalName(0, '')])); |
|
|
|
|
|
|
|
|
if Assigned(st) then begin |
|
|
|
|
|
with st.GetOrCreateItem(KEYWORD_INTF).GetOrCreateItem(String(fName)) do begin |
|
|
|
|
|
if (LinesBefore.Count = 0) then |
|
|
|
|
|
LinesBefore.Add(Format('%-50s%s;', [fName + ':', GetPascalName(0, '')])); |
|
|
|
|
|
end; |
|
|
|
|
|
|
|
|
st := aCode.GetOrCreateItem(KEYWORD_IMPL).GetOrCreateItem(KEYWORD_CODE).GetOrCreateItem(fName); |
|
|
|
|
|
if (st.LinesBefore.Count = 0) then |
|
|
|
|
|
st.LinesBefore.Add(Format(' %-50s := T%0:-50s(vkGetProcAddress(%-50saInstance));', [fName, '''' + fName + ''','])); |
|
|
|
|
|
|
|
|
with st.GetOrCreateItem(KEYWORD_IMPL).GetOrCreateItem(String(fName)) do begin |
|
|
|
|
|
if (LinesBefore.Count = 0) then |
|
|
|
|
|
LinesBefore.Add(Format('%-50s := T%0:-50s(GetProcAddress(''%0:s''));', [fName])); |
|
|
|
|
|
end; |
|
|
|
|
|
end else begin |
|
|
|
|
|
st := aCode.GetOrCreateItem(KEYWORD_INTF).GetOrCreateItem(KEYWORD_VAR); |
|
|
|
|
|
if (st.LinesBefore.Count = 0) then |
|
|
|
|
|
st.LinesBefore.Add('var'); |
|
|
|
|
|
|
|
|
|
|
|
st := st.GetOrCreateItem(String(fName)); |
|
|
|
|
|
if (st.LinesBefore.Count = 0) then |
|
|
|
|
|
st.LinesBefore.Add(Format(' %-50s%s;', [fName + ':', GetPascalName(0, '')])); |
|
|
|
|
|
|
|
|
|
|
|
st := aCode.GetOrCreateItem(KEYWORD_IMPL).GetOrCreateItem(KEYWORD_CODE).GetOrCreateItem(String(fName)); |
|
|
|
|
|
if (st.LinesBefore.Count = 0) then |
|
|
|
|
|
st.LinesBefore.Add(Format('%-50s := T%0:-50s(GetProcAddress(''%0:s''));', [fName])); |
|
|
|
|
|
end; |
|
|
end; |
|
|
end; |
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
@@ -1248,7 +1323,7 @@ begin |
|
|
st := aCode.GetOrCreateItem(KEYWORD_INTF).GetOrCreateItem(KEYWORD_STRUCT); |
|
|
st := aCode.GetOrCreateItem(KEYWORD_INTF).GetOrCreateItem(KEYWORD_STRUCT); |
|
|
if (st.LinesBefore.Count = 0) then |
|
|
if (st.LinesBefore.Count = 0) then |
|
|
st.LinesBefore.Add('type { structures }'); |
|
|
st.LinesBefore.Add('type { structures }'); |
|
|
st := st.GetOrCreateItem(GetPascalName(0, '')); |
|
|
|
|
|
|
|
|
st := st.GetOrCreateItem(String(GetPascalName(0, ''))); |
|
|
if (st.LinesBefore.Count = 0) then begin |
|
|
if (st.LinesBefore.Count = 0) then begin |
|
|
postfix := ';'; |
|
|
postfix := ';'; |
|
|
indent := 50; |
|
|
indent := 50; |
|
|
@@ -1356,7 +1431,7 @@ begin |
|
|
.GetOrCreateItem(KEYWORD_ENUM); |
|
|
.GetOrCreateItem(KEYWORD_ENUM); |
|
|
if (st.LinesBefore.Count = 0) then |
|
|
if (st.LinesBefore.Count = 0) then |
|
|
st.LinesBefore.Add('type { enumerations }'); |
|
|
st.LinesBefore.Add('type { enumerations }'); |
|
|
st := st.GetOrCreateItem(fName); |
|
|
|
|
|
|
|
|
st := st.GetOrCreateItem(String(fName)); |
|
|
if (st.LinesBefore.Count = 0) then begin |
|
|
if (st.LinesBefore.Count = 0) then begin |
|
|
st.LinesBefore.Add(Format(' %s = (', [GetPascalName(0, '')])); |
|
|
st.LinesBefore.Add(Format(' %s = (', [GetPascalName(0, '')])); |
|
|
postfix := ','; |
|
|
postfix := ','; |
|
|
@@ -1405,7 +1480,7 @@ begin |
|
|
.GetOrCreateItem(KEYWORD_CONST); |
|
|
.GetOrCreateItem(KEYWORD_CONST); |
|
|
if (st.LinesBefore.Count = 0) then |
|
|
if (st.LinesBefore.Count = 0) then |
|
|
st.LinesBefore.Add('const'); |
|
|
st.LinesBefore.Add('const'); |
|
|
st := st.GetOrCreateItem(fName); |
|
|
|
|
|
|
|
|
st := st.GetOrCreateItem(String(fName)); |
|
|
if (st.LinesBefore.Count = 0) then |
|
|
if (st.LinesBefore.Count = 0) then |
|
|
st.LinesBefore.Add(Format(' %-62s = %s;', [fName, fValue])); |
|
|
st.LinesBefore.Add(Format(' %-62s = %s;', [fName, fValue])); |
|
|
end; |
|
|
end; |
|
|
@@ -1428,16 +1503,21 @@ var |
|
|
Code: TStringTree; |
|
|
Code: TStringTree; |
|
|
PosMap: TPosMap; |
|
|
PosMap: TPosMap; |
|
|
|
|
|
|
|
|
procedure UpdateComment(const aRoot: TStringTree; const aName: String); |
|
|
|
|
|
|
|
|
procedure UpdateComment(const aNames: array of String); |
|
|
var |
|
|
var |
|
|
i: Integer; |
|
|
i: Integer; |
|
|
s, tmp: String; |
|
|
|
|
|
|
|
|
name, s, tmp: String; |
|
|
st: TStringTree; |
|
|
st: TStringTree; |
|
|
begin |
|
|
begin |
|
|
st := aRoot.GetOrCreateItem(aName); |
|
|
|
|
|
if PosMap.TryGetValue(aName, i) and (st.ItemCount > i) and (CurrentName <> '') then |
|
|
|
|
|
with st.CreateItemAt(aName + CurrentName, i).LinesBefore do begin |
|
|
|
|
|
s := ' ' + CurrentName + ' '; |
|
|
|
|
|
|
|
|
name := ''; |
|
|
|
|
|
st := Code; |
|
|
|
|
|
for s in aNames do begin |
|
|
|
|
|
st := st.GetOrCreateItem(s); |
|
|
|
|
|
name := name + '.' + s; |
|
|
|
|
|
end; |
|
|
|
|
|
if PosMap.TryGetValue(name, i) and (st.ItemCount > i) and (CurrentName <> '') then |
|
|
|
|
|
with st.CreateItemAt(name + String(CurrentName), i).LinesBefore do begin |
|
|
|
|
|
s := ' ' + String(CurrentName) + ' '; |
|
|
if ((Length(s) and 1) = 1) then |
|
|
if ((Length(s) and 1) = 1) then |
|
|
s := s + '='; |
|
|
s := s + '='; |
|
|
tmp := StringOfChar('=', (100 - Length(s)) div 2); |
|
|
tmp := StringOfChar('=', (100 - Length(s)) div 2); |
|
|
@@ -1445,23 +1525,26 @@ var |
|
|
Add(''); |
|
|
Add(''); |
|
|
Add(s); |
|
|
Add(s); |
|
|
end; |
|
|
end; |
|
|
PosMap[aName] := st.ItemCount; |
|
|
|
|
|
|
|
|
PosMap[name] := st.ItemCount; |
|
|
end; |
|
|
end; |
|
|
|
|
|
|
|
|
procedure UpdateComments; |
|
|
procedure UpdateComments; |
|
|
var st: TStringTree; |
|
|
|
|
|
begin |
|
|
begin |
|
|
st := Code.GetOrCreateItem(KEYWORD_INTF); |
|
|
|
|
|
UpdateComment(st, KEYWORD_CONST); |
|
|
|
|
|
UpdateComment(st, KEYWORD_TYPES); |
|
|
|
|
|
UpdateComment(st, KEYWORD_ENUM); |
|
|
|
|
|
UpdateComment(st, KEYWORD_FUNCPTR); |
|
|
|
|
|
UpdateComment(st, KEYWORD_STRUCT); |
|
|
|
|
|
UpdateComment(st, KEYWORD_COMMAND); |
|
|
|
|
|
UpdateComment(st, KEYWORD_VAR); |
|
|
|
|
|
|
|
|
|
|
|
st := Code.GetOrCreateItem(KEYWORD_IMPL); |
|
|
|
|
|
UpdateComment(st, KEYWORD_CODE); |
|
|
|
|
|
|
|
|
UpdateComment([KEYWORD_INTF, KEYWORD_CONST]); |
|
|
|
|
|
UpdateComment([KEYWORD_INTF, KEYWORD_TYPES]); |
|
|
|
|
|
UpdateComment([KEYWORD_INTF, KEYWORD_ENUM]); |
|
|
|
|
|
UpdateComment([KEYWORD_INTF, KEYWORD_FUNCPTR]); |
|
|
|
|
|
UpdateComment([KEYWORD_INTF, KEYWORD_STRUCT]); |
|
|
|
|
|
UpdateComment([KEYWORD_INTF, KEYWORD_COMMAND]); |
|
|
|
|
|
UpdateComment([KEYWORD_INTF, KEYWORD_VAR]); |
|
|
|
|
|
|
|
|
|
|
|
UpdateComment([KEYWORD_IMPL, KEYWORD_VAR]); |
|
|
|
|
|
|
|
|
|
|
|
UpdateComment([KEYWORD_INSTANCE_COMMANDS, KEYWORD_INTF]); |
|
|
|
|
|
UpdateComment([KEYWORD_INSTANCE_COMMANDS, KEYWORD_IMPL]); |
|
|
|
|
|
|
|
|
|
|
|
UpdateComment([KEYWORD_DEVICE_COMMANDS, KEYWORD_INTF]); |
|
|
|
|
|
UpdateComment([KEYWORD_DEVICE_COMMANDS, KEYWORD_IMPL]); |
|
|
end; |
|
|
end; |
|
|
|
|
|
|
|
|
procedure AddGuard(const aTree: TStringTree; const aName: String); |
|
|
procedure AddGuard(const aTree: TStringTree; const aName: String); |
|
|
@@ -1509,16 +1592,16 @@ var |
|
|
var |
|
|
var |
|
|
i: Integer; |
|
|
i: Integer; |
|
|
begin |
|
|
begin |
|
|
i := fObjects.IndexOfObj(aName, VK_OBJECT_ALL); |
|
|
|
|
|
|
|
|
i := fObjects.IndexOfObj(WideString(aName), VK_OBJECT_ALL); |
|
|
if (i >= 0) then |
|
|
if (i >= 0) then |
|
|
fObjects[i].GenerateCode(Code); |
|
|
fObjects[i].GenerateCode(Code); |
|
|
end; |
|
|
end; |
|
|
|
|
|
|
|
|
function GenerateEnum(const xml: TDOMNode): Boolean; |
|
|
function GenerateEnum(const xml: TDOMNode): Boolean; |
|
|
var |
|
|
var |
|
|
name: DOMString; |
|
|
|
|
|
ex: DOMString; |
|
|
|
|
|
value: DOMString; |
|
|
|
|
|
|
|
|
name: WideString; |
|
|
|
|
|
ex: WideString; |
|
|
|
|
|
value: WideString; |
|
|
offset: Integer; |
|
|
offset: Integer; |
|
|
s: String; |
|
|
s: String; |
|
|
c: TvkConst; |
|
|
c: TvkConst; |
|
|
@@ -1528,14 +1611,14 @@ var |
|
|
if TryGetNodeAttrib(xml, 'extends', ex) then begin |
|
|
if TryGetNodeAttrib(xml, 'extends', ex) then begin |
|
|
if (CurrentNumber <= 0) then |
|
|
if (CurrentNumber <= 0) then |
|
|
raise Exception.Create('current extension has no number'); |
|
|
raise Exception.Create('current extension has no number'); |
|
|
offset := StrToInt(GetNodeAttrib(xml, 'offset')); |
|
|
|
|
|
|
|
|
offset := StrToInt(String(GetNodeAttrib(xml, 'offset'))); |
|
|
offset := 1000000000 + 1000 * (CurrentNumber-1) + offset; |
|
|
offset := 1000000000 + 1000 * (CurrentNumber-1) + offset; |
|
|
if (GetNodeAttrib(xml, 'dir', '') = '-') then |
|
|
if (GetNodeAttrib(xml, 'dir', '') = '-') then |
|
|
offset := -1 * offset; |
|
|
offset := -1 * offset; |
|
|
Code |
|
|
Code |
|
|
.GetOrCreateItem(KEYWORD_INTF) |
|
|
.GetOrCreateItem(KEYWORD_INTF) |
|
|
.GetOrCreateItem(KEYWORD_ENUM) |
|
|
.GetOrCreateItem(KEYWORD_ENUM) |
|
|
.GetOrCreateItem(ex) |
|
|
|
|
|
|
|
|
.GetOrCreateItem(String(ex)) |
|
|
.GetOrCreateItem(KEYWORD_ENUM_VALUES) |
|
|
.GetOrCreateItem(KEYWORD_ENUM_VALUES) |
|
|
.LinesBefore.Add(Format(' %-60s = %s,', [name, IntToStr(offset)])); |
|
|
.LinesBefore.Add(Format(' %-60s = %s,', [name, IntToStr(offset)])); |
|
|
end else begin |
|
|
end else begin |
|
|
@@ -1565,10 +1648,10 @@ var |
|
|
if (x.NodeName = 'type') or |
|
|
if (x.NodeName = 'type') or |
|
|
(x.NodeName = 'command') then |
|
|
(x.NodeName = 'command') then |
|
|
begin |
|
|
begin |
|
|
GenerateFeatureCode(GetNodeAttrib(x, 'name')); |
|
|
|
|
|
|
|
|
GenerateFeatureCode(String(GetNodeAttrib(x, 'name'))); |
|
|
end else if (x.NodeName = 'enum') then begin |
|
|
end else if (x.NodeName = 'enum') then begin |
|
|
if not GenerateEnum(x) then |
|
|
if not GenerateEnum(x) then |
|
|
GenerateFeatureCode(GetNodeAttrib(x, 'name')); |
|
|
|
|
|
|
|
|
GenerateFeatureCode(String(GetNodeAttrib(x, 'name'))); |
|
|
end; |
|
|
end; |
|
|
x := x.NextSibling; |
|
|
x := x.NextSibling; |
|
|
end; |
|
|
end; |
|
|
@@ -1577,11 +1660,11 @@ var |
|
|
procedure Generate(const xml: TDOMNode); |
|
|
procedure Generate(const xml: TDOMNode); |
|
|
var |
|
|
var |
|
|
x: TDOMNode; |
|
|
x: TDOMNode; |
|
|
g: DOMString; |
|
|
|
|
|
|
|
|
g: WideString; |
|
|
begin |
|
|
begin |
|
|
UpdateComments; |
|
|
UpdateComments; |
|
|
g := GetNodeAttrib(xml, 'protect', ''); |
|
|
g := GetNodeAttrib(xml, 'protect', ''); |
|
|
CreateGuard(g); |
|
|
|
|
|
|
|
|
CreateGuard(String(g)); |
|
|
try |
|
|
try |
|
|
CurrentName := GetNodeAttrib(xml, 'name'); |
|
|
CurrentName := GetNodeAttrib(xml, 'name'); |
|
|
if not TryStrToInt(String(GetNodeAttrib(xml, 'number', '-1')), CurrentNumber) then |
|
|
if not TryStrToInt(String(GetNodeAttrib(xml, 'number', '-1')), CurrentNumber) then |
|
|
@@ -1594,7 +1677,7 @@ var |
|
|
x := x.NextSibling; |
|
|
x := x.NextSibling; |
|
|
end; |
|
|
end; |
|
|
finally |
|
|
finally |
|
|
CloseGuard(g); |
|
|
|
|
|
|
|
|
CloseGuard(String(g)); |
|
|
UpdateComments; |
|
|
UpdateComments; |
|
|
CurrentName := ''; |
|
|
CurrentName := ''; |
|
|
end; |
|
|
end; |
|
|
@@ -1619,7 +1702,6 @@ var |
|
|
procedure EnableExtensions; |
|
|
procedure EnableExtensions; |
|
|
var |
|
|
var |
|
|
x: TDOMNode; |
|
|
x: TDOMNode; |
|
|
g: String; |
|
|
|
|
|
begin |
|
|
begin |
|
|
x := fDocument.DocumentElement.FindNode('extensions'); |
|
|
x := fDocument.DocumentElement.FindNode('extensions'); |
|
|
if not Assigned(x) then |
|
|
if not Assigned(x) then |
|
|
@@ -1665,32 +1747,47 @@ var |
|
|
|
|
|
|
|
|
procedure PrepareTemplate; |
|
|
procedure PrepareTemplate; |
|
|
var |
|
|
var |
|
|
sl: TStringList; |
|
|
|
|
|
|
|
|
sl, tk: TStringList; |
|
|
s, n: String; |
|
|
s, n: String; |
|
|
st: TStringTree; |
|
|
st: TStringTree; |
|
|
p0, p1: Integer; |
|
|
|
|
|
|
|
|
p0, p1, SpaceCount, i: Integer; |
|
|
begin |
|
|
begin |
|
|
sl := TStringList.Create; |
|
|
sl := TStringList.Create; |
|
|
|
|
|
tk := TStringList.Create; |
|
|
try |
|
|
try |
|
|
|
|
|
tk.Delimiter := '.'; |
|
|
sl.LoadFromFile(aTemplate); |
|
|
sl.LoadFromFile(aTemplate); |
|
|
s := sl.Text; |
|
|
s := sl.Text; |
|
|
p0 := Pos('{%', s); |
|
|
p0 := Pos('{%', s); |
|
|
while (p0 > 0) do begin |
|
|
while (p0 > 0) do begin |
|
|
|
|
|
SpaceCount := 0; |
|
|
|
|
|
while (p0-1 > 0) and (s[p0-1] = ' ') do begin |
|
|
|
|
|
inc(SpaceCount); |
|
|
|
|
|
dec(p0); |
|
|
|
|
|
end; |
|
|
p1 := Pos('%}', s, p0); |
|
|
p1 := Pos('%}', s, p0); |
|
|
if (p1 <= 0) then |
|
|
if (p1 <= 0) then |
|
|
raise Exception.Create('unclosed tag in template'); |
|
|
raise Exception.Create('unclosed tag in template'); |
|
|
n := Trim(Copy(s, p0+2, p1-p0-2)); |
|
|
|
|
|
st := Code.Items[n]; |
|
|
|
|
|
n := Copy(s, p0, p1 - p0 + 2); |
|
|
|
|
|
if Assigned(st) |
|
|
|
|
|
then s := StringReplace(s, n, st.Text, [rfReplaceAll]) |
|
|
|
|
|
else s := StringReplace(s, n, '', [rfReplaceAll]); |
|
|
|
|
|
|
|
|
n := Trim(Copy(s, p0+SpaceCount+2, p1-p0-SpaceCount-2)); |
|
|
|
|
|
tk.DelimitedText := n; |
|
|
|
|
|
st := Code; |
|
|
|
|
|
for n in tk do |
|
|
|
|
|
st := st.GetOrCreateItem(n); |
|
|
|
|
|
n := Copy(s, p0, p1 - p0 + 2); |
|
|
|
|
|
if Assigned(st) then begin |
|
|
|
|
|
sl.Text := st.Text; |
|
|
|
|
|
for i := 0 to sl.Count-1 do |
|
|
|
|
|
sl[i] := StringOfChar(' ', SpaceCount) + sl[i]; |
|
|
|
|
|
s := StringReplace(s, n, sl.Text, [rfReplaceAll]) |
|
|
|
|
|
end else |
|
|
|
|
|
s := StringReplace(s, n, '', [rfReplaceAll]); |
|
|
p0 := Pos('{%', s, p0); |
|
|
p0 := Pos('{%', s, p0); |
|
|
end; |
|
|
end; |
|
|
sl.Text := Trim(s); |
|
|
sl.Text := Trim(s); |
|
|
RemoveEmptyLines(sl); |
|
|
RemoveEmptyLines(sl); |
|
|
sl.SaveToFile(aOutput); |
|
|
sl.SaveToFile(aOutput); |
|
|
finally |
|
|
finally |
|
|
|
|
|
FreeAndNil(tk); |
|
|
FreeAndNil(sl); |
|
|
FreeAndNil(sl); |
|
|
end; |
|
|
end; |
|
|
end; |
|
|
end; |
|
|
@@ -1776,7 +1873,7 @@ end; |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
procedure THeaderGenerator.Clear; |
|
|
procedure THeaderGenerator.Clear; |
|
|
|
|
|
|
|
|
procedure CreateBaseType(const aName, aAlias, aParent: DOMString); |
|
|
|
|
|
|
|
|
procedure CreateBaseType(const aName, aAlias, aParent: WideString); |
|
|
var t: TvkTypeBase; |
|
|
var t: TvkTypeBase; |
|
|
begin |
|
|
begin |
|
|
t := TvkTypeBase.Create(otType); |
|
|
t := TvkTypeBase.Create(otType); |
|
|
|