DEADSOFTWARE

89b242a5958dd719999dc26328a5cba00dd06d2d
[d2df-editor.git] / src / editor / g_resources.pas
1 unit g_resources;
3 interface
5 procedure g_ReadResource (wad, section, name: String; out data: PByte; out len: Integer);
6 procedure g_ReadSubResource (wad, section0, name0, section1, name1: String; out data: PByte; out len: Integer);
8 implementation
10 uses sfs, xstreams, utils, Classes;
12 procedure g_ReadResource (wad, section, name: String; out data: PByte; out len: Integer);
13 var
14 stream: TStream;
15 str: String;
16 i: Integer;
17 begin
18 section := utf2win(section);
19 name := utf2win(name);
20 data := nil;
21 len := 0;
22 if SFSAddDataFileTemp(wad, TRUE) then
23 begin
24 str := SFSGetLastVirtualName(section + '\' + name);
25 stream := SFSFileOpen(wad + '::' + str);
26 if stream <> nil then
27 begin
28 len := stream.Size;
29 GetMem(data, len);
30 //stream.ReadBuffer(data, len); (* leads to segfault *)
31 for i := 0 to len - 1 do
32 data[i] := stream.ReadByte();
33 stream.Destroy
34 end
35 end;
36 end;
38 procedure g_ReadSubResource (wad, section0, name0, section1, name1: String; out data: PByte; out len: Integer);
39 var
40 stream0, stream1: TStream;
41 str0, str1: String;
42 xdata: Pointer;
43 i, xlen: Integer;
44 begin
45 data := nil;
46 len := 0;
47 if (wad = '') OR (section0 = '') OR (name0 = '') OR (section1 = '') OR (name1 = '') then Exit;
48 section0 := utf2win(section0);
49 name0 := utf2win(name0);
50 section1 := utf2win(section1);
51 name1 := utf2win(name1);
52 if SFSAddDataFileTemp(wad, TRUE) then
53 begin
54 str0 := SFSGetLastVirtualName(section0 + '\' + name0);
55 stream0 := SFSFileOpen(wad + '::' + str0);
56 if stream0 <> nil then
57 begin
58 if SFSAddSubDataFile(wad + '\' + str0, stream0, TRUE) then
59 begin
60 str1 := SFSGetLastVirtualName(section1 + '\' + name1);
61 stream1 := SFSFileOpenEx(wad + '\' + str0 + '::' + str1);
62 if stream1 <> nil then
63 begin
64 len := stream1.Size;
65 GetMem(data, len);
66 //stream1.ReadBuffer(data, len); (* leads to segfault *)
67 for i := 0 to len - 1 do
68 data[i] := stream1.ReadByte();
69 stream1.Destroy
70 end
71 end
72 end
73 else
74 begin
75 stream0.Destroy
76 end
77 end
78 end;
80 end.