source: VisualSwapcodes/Unit1.pas @ 98

Last change on this file since 98 was 98, checked in by alloc, 15 years ago
File size: 8.6 KB
Line 
1unit Unit1;
2interface
3uses
4  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
5  Dialogs, StdCtrls, VirtualTrees, StrUtils, ExtCtrls;
6
7type
8  TForm1 = class(TForm)
9    vst: TVirtualStringTree;
10    list: TListBox;
11    Splitter1: TSplitter;
12    procedure FormCreate(Sender: TObject);
13    procedure listClick(Sender: TObject);
14    procedure vstGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
15      Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
16  private
17  public
18  end;
19
20  TSwapList = class;
21
22  TSwapItem = class
23    name: String;
24    size: Integer;
25    parent: TSwapList;
26  end;
27
28  TSwapList = class(TSwapItem)
29    childs: array of TSwapItem;
30    count: Integer;
31    constructor Create;
32    function AddElem(name: String; size: Integer): Integer;
33    function AddArray(name: String; count: Integer): Integer;
34    function CloseArray: TSwapList;
35    function Child(index: Integer): TSwapItem;
36  end;
37
38  TType = record
39    name: String;
40    SwapList: TSwapList;
41  end;
42
43  TTypes = array of TType;
44
45  PNodeData = ^TNodeData;
46  TNodeData = record
47    TypeName:  String;
48    Address:   Integer;
49    Size:      Integer;
50  end;
51
52var
53  Form1: TForm1;
54  Types: TTypes;
55  descfile: Text;
56
57implementation
58
59{$R *.dfm}
60
61function AddVSTEntry(AVST: TCustomVirtualStringTree; ANode: PVirtualNode;
62  ARecord: TNodeData): PVirtualNode;
63var
64  Data: PNodeData;
65begin
66  Result := AVST.AddChild(ANode);
67  Data   := AVST.GetNodeData(Result);
68  AVST.ValidateNode(Result, False);
69  Data^ := ARecord;
70end;
71
72procedure TForm1.FormCreate(Sender: TObject);
73var
74  state: Integer;
75  line, datas: String;
76  i: Integer;
77  current_list: TSwapList;
78begin
79  VST.NodeDataSize := SizeOf(TNodeData);
80
81  state := 0;
82  current_list := nil;
83  AssignFile(descfile, ExtractFilePath(Application.ExeName)+'\templates.txt.gz');
84  Reset(descfile);
85  while not EoF(descfile) do
86  begin
87    ReadLn(descfile, line);
88    if state = 0 then
89    begin
90      if Pos('gSwapCodes_', line) = 1 then
91      begin
92        SetLength(Types, Length(Types) + 1);
93        Types[High(Types)].name := MidStr(line, Pos('_', line)+1, 4);
94        Types[High(Types)].SwapList := TSwapList.Create;
95        Types[High(Types)].SwapList.parent := nil;
96        current_list := Types[High(Types)].SwapList;
97        state := 1;
98        datas := MidStr(line, Pos('db ', line) + 3, PosEx(' ', line, Pos('db ', line) + 3) - Pos('db ', line) - 3 );
99        if datas = 'SWAPC_8BYTE' then
100          current_list.AddElem('SWAPC_8BYTE', 8)
101        else if datas = 'SWAPC_4BYTE' then
102          current_list.AddElem('SWAPC_4BYTE', 4)
103        else if datas = 'SWAPC_2BYTE' then
104          current_list.AddElem('SWAPC_2BYTE', 2)
105        else if datas = 'SWAPC_1BYTE' then
106          current_list.AddElem('SWAPC_1BYTE', 1)
107        else if datas = 'SWAPC_FIXARR_S' then
108        begin
109          ReadLn(descfile, line);
110          if Pos('h', line) > 0 then
111            datas := MidStr(line, Pos('db ', line) + 3, Pos('h', line) - (Pos('db ', line) + 3) )
112          else
113            datas := MidStr(line, Pos('db ', line) + 3, Length(Line) - (Pos('db ', line) + 3) );
114          i := current_list.AddArray('SWAPC_FIXARR_S', StrToInt('$'+datas));
115          current_list := TSwapList(current_list.Child(i));
116        end else if datas = 'SWAPC_VARARR_S' then
117        begin
118          ReadLn(descfile, line);
119          i := current_list.AddArray('SWAPC_VARARR_S', 0);
120          current_list := TSwapList(current_list.Child(i));
121        end else if datas = 'SWAPC_TMPL_PTR' then
122        begin
123          ReadLn(descfile, line);
124          datas := MidStr(line, Pos('dd ', line) + 4, 4);
125          current_list.AddElem('SWAPC_TMPL_PTR: ' + datas, 4);
126        end;
127      end;
128      if Pos('gTemplate_', line) = 1 then
129      begin
130        datas := MidStr(line, Pos('_', line)+1, 4);
131        for i := 0 to High(Types) do
132          if Types[i].name = datas then
133            Break;
134        if i < Length(Types) then
135        begin
136          if Pos('"', line) = 0 then
137            ReadLn(descfile, line);
138          datas := MidStr(line, Pos('"', line) + 1, PosEx('"', line, Pos('"', line) + 1) - (Pos('"', line) + 1) );
139          Types[i].name := Types[i].name + ' - ' + datas;
140        end;
141      end;
142    end else begin
143      if PosEx(' ', line, Pos(' d', line) + 4) > 0 then
144        datas := MidStr(line, Pos(' d', line) + 4, PosEx(' ', line, Pos(' d', line) + 4) - (Pos(' d', line) + 4) )
145      else
146        datas := MidStr(line, Pos(' d', line) + 4, Length(line) - Pos(' d', line) );
147      if datas = 'SWAPC_8BYTE' then
148        current_list.AddElem('SWAPC_8BYTE', 8)
149      else if datas = 'SWAPC_4BYTE' then
150        current_list.AddElem('SWAPC_4BYTE', 4)
151      else if datas = 'SWAPC_2BYTE' then
152        current_list.AddElem('SWAPC_2BYTE', 2)
153      else if datas = 'SWAPC_1BYTE' then
154        current_list.AddElem('SWAPC_1BYTE', 1)
155      else if datas = 'SWAPC_FIXARR_S' then
156      begin
157        ReadLn(descfile, line);
158        if Pos('h', line) > 0 then
159          datas := MidStr(line, Pos('db ', line) + 3, Pos('h', line) - (Pos('db ', line) + 3) )
160        else
161          datas := MidStr(line, Pos('db ', line) + 3, Length(Line) - (Pos('db ', line) + 2) );
162        i := current_list.AddArray('SWAPC_FIXARR_S', StrToInt('$'+datas));
163        current_list := TSwapList(current_list.Child(i));
164        Inc(State);
165      end else if datas = 'SWAPC_FIXARR_E' then
166      begin
167        Dec(State);
168        current_list := current_list.CloseArray;
169      end else if datas = 'SWAPC_VARARR_S' then
170      begin
171        ReadLn(descfile, line);
172        i := current_list.AddArray('SWAPC_VARARR_S', 0);
173        current_list := TSwapList(current_list.Child(i));
174      end else if datas = 'SWAPC_VARARR_E' then
175      begin
176        Dec(State);
177        current_list := current_list.CloseArray;
178      end else if datas = 'SWAPC_TMPL_PTR' then
179      begin
180        ReadLn(descfile, line);
181        datas := MidStr(line, Pos('dd ', line) + 4, 4);
182        current_list.AddElem('SWAPC_TMPL_PTR: ' + datas, 4);
183      end;
184    end;
185  end;
186  CloseFile(descfile);
187
188  list.Items.Clear;
189  for i := 0 to High(Types) do
190    list.Items.Add(Types[i].name);
191end;
192
193
194{ TSwapList }
195
196function TSwapList.AddArray(name: String; count: Integer): Integer;
197begin
198  SetLength(childs, Length(childs) + 1);
199  Result := High(childs);
200  childs[Result] := TSwapList.Create;
201  childs[Result].name := name;
202  childs[Result].size := 0;
203  childs[Result].parent := Self;
204  TSwapList(childs[Result]).count := count;
205end;
206
207function TSwapList.AddElem(name: String; size: Integer): Integer;
208begin
209  SetLength(childs, Length(childs) + 1);
210  Result := High(childs);
211  childs[Result] := TSwapItem.Create;
212  childs[Result].name := name;
213  childs[Result].size := size;
214  childs[Result].parent := Self;
215  Self.size := Self.size + size;
216end;
217
218function TSwapList.Child(index: Integer): TSwapItem;
219begin
220  Result := childs[index];
221end;
222
223function TSwapList.CloseArray: TSwapList;
224begin
225  Self.size := Self.size * Self.count;
226  Result := Self.parent;
227end;
228
229constructor TSwapList.Create;
230begin
231  SetLength(childs, 0);
232  count := -1;
233end;
234
235procedure TForm1.listClick(Sender: TObject);
236var
237  i:    LongWord;
238  Data:    TNodeData;
239  node:    PVirtualNode;
240  name:    String;
241  address: Integer;
242
243  procedure AddChilds(parent: PVirtualNode; SwapList: TSwapList);
244  var
245    i: Integer;
246  begin
247    if Length(SwapList.childs) > 0 then
248    begin
249      for i := 0 to High(SwapList.childs) do
250      begin
251        data.TypeName := SwapList.Child(i).name;
252        data.Size := SwapList.Child(i).size;
253        data.Address := address;
254        if parent = nil then
255          address := address + data.Size;
256        node := AddVSTEntry(VST, parent, data);
257        if SwapList.Child(i) is TSwapList then
258          AddChilds(node, TSwapList(SwapList.Child(i)));
259      end;
260    end;
261  end;
262
263begin
264  VST.Clear;
265  VST.BeginUpdate;
266
267  address := 0;
268
269  name := list.Items.Strings[list.ItemIndex];
270  for i := 0 to High(Types) do
271    if Types[i].name = name then
272      Break;
273
274  if i < Length(Types) then
275  begin
276    AddChilds(nil, Types[i].SwapList);
277  end;
278
279  VST.EndUpdate;
280end;
281
282procedure TForm1.vstGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
283  Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
284var
285  data: PNodeData;
286begin
287  data := vst.GetNodeData(node);
288  if TextType = ttNormal then
289  begin
290    case Column of
291      0: CellText := data.TypeName;
292      1: CellText := '0x' + IntToHex(data.Address, 8);
293      2: CellText := IntToStr(data.Size);
294    end;
295  end;
296end;
297
298end.
Note: See TracBrowser for help on using the repository browser.