author | nemo |
Fri, 03 May 2013 23:46:15 -0400 | |
changeset 8955 | b8cae4fe8edb |
parent 8927 | 3da5182d8682 |
child 8978 | e6ef8fe314bd |
permissions | -rw-r--r-- |
7959 | 1 |
unit uPhysFSLayer; |
8063 | 2 |
|
7959 | 3 |
interface |
8077 | 4 |
uses SDLh, LuaPas; |
7959 | 5 |
|
8558 | 6 |
const PhysfsLibName = {$IFDEF PHYSFS_INTERNAL}'libhw_physfs'{$ELSE}'libphysfs'{$ENDIF}; |
8540
cf808329bb6f
this should hijack the linker name and always pick the bundled physfs when another version is already prsent
koda
parents:
8533
diff
changeset
|
7 |
const PhyslayerLibName = 'libphyslayer'; |
8073 | 8 |
|
8540
cf808329bb6f
this should hijack the linker name and always pick the bundled physfs when another version is already prsent
koda
parents:
8533
diff
changeset
|
9 |
{$IFNDEF WIN32} |
cf808329bb6f
this should hijack the linker name and always pick the bundled physfs when another version is already prsent
koda
parents:
8533
diff
changeset
|
10 |
{$linklib physfs} |
cf808329bb6f
this should hijack the linker name and always pick the bundled physfs when another version is already prsent
koda
parents:
8533
diff
changeset
|
11 |
{$linklib physlayer} |
8926
8fde68cfeb71
link stdc++ (for physfs on linux) only when targetting 32bit
koda
parents:
8714
diff
changeset
|
12 |
|
8927 | 13 |
{statically linking physfs brings IOKit dependency on OSX} |
14 |
{divdi3 is found in stdc++ on linux x86 and in gcc_s.1 on osx ppc32} |
|
8926
8fde68cfeb71
link stdc++ (for physfs on linux) only when targetting 32bit
koda
parents:
8714
diff
changeset
|
15 |
{$IFDEF PHYSFS_INTERNAL} |
8fde68cfeb71
link stdc++ (for physfs on linux) only when targetting 32bit
koda
parents:
8714
diff
changeset
|
16 |
{$IFDEF DARWIN} |
8fde68cfeb71
link stdc++ (for physfs on linux) only when targetting 32bit
koda
parents:
8714
diff
changeset
|
17 |
{$linkframework IOKit} |
8927 | 18 |
{$IFDEF CPU32} |
19 |
{$linklib gcc_s.1} |
|
20 |
{$ENDIF} |
|
8926
8fde68cfeb71
link stdc++ (for physfs on linux) only when targetting 32bit
koda
parents:
8714
diff
changeset
|
21 |
{$ELSE} |
8fde68cfeb71
link stdc++ (for physfs on linux) only when targetting 32bit
koda
parents:
8714
diff
changeset
|
22 |
{$IFDEF CPU32} |
8fde68cfeb71
link stdc++ (for physfs on linux) only when targetting 32bit
koda
parents:
8714
diff
changeset
|
23 |
{$linklib stdc++} |
8fde68cfeb71
link stdc++ (for physfs on linux) only when targetting 32bit
koda
parents:
8714
diff
changeset
|
24 |
{$ENDIF} |
8fde68cfeb71
link stdc++ (for physfs on linux) only when targetting 32bit
koda
parents:
8714
diff
changeset
|
25 |
{$ENDIF} |
8540
cf808329bb6f
this should hijack the linker name and always pick the bundled physfs when another version is already prsent
koda
parents:
8533
diff
changeset
|
26 |
{$ENDIF} |
8533
2d7703d6bc22
this should make physfs happy to link on windows too, forcing every function in its proper dll and skipping linklib
koda
parents:
8528
diff
changeset
|
27 |
{$ENDIF} |
2d7703d6bc22
this should make physfs happy to link on windows too, forcing every function in its proper dll and skipping linklib
koda
parents:
8528
diff
changeset
|
28 |
|
7959 | 29 |
procedure initModule; |
30 |
procedure freeModule; |
|
31 |
||
8028 | 32 |
type PFSFile = pointer; |
33 |
||
8025 | 34 |
function rwopsOpenRead(fname: shortstring): PSDL_RWops; |
35 |
function rwopsOpenWrite(fname: shortstring): PSDL_RWops; |
|
8022 | 36 |
|
8028 | 37 |
function pfsOpenRead(fname: shortstring): PFSFile; |
38 |
function pfsClose(f: PFSFile): boolean; |
|
39 |
||
40 |
procedure pfsReadLn(f: PFSFile; var s: shortstring); |
|
8107 | 41 |
procedure pfsReadLnA(f: PFSFile; var s: ansistring); |
8031 | 42 |
function pfsBlockRead(f: PFSFile; buf: pointer; size: Int64): Int64; |
43 |
function pfsEOF(f: PFSFile): boolean; |
|
44 |
||
45 |
function pfsExists(fname: shortstring): boolean; |
|
8028 | 46 |
|
8533
2d7703d6bc22
this should make physfs happy to link on windows too, forcing every function in its proper dll and skipping linklib
koda
parents:
8528
diff
changeset
|
47 |
function physfsReader(L: Plua_State; f: PFSFile; sz: Psize_t) : PChar; cdecl; external PhyslayerLibName; |
2d7703d6bc22
this should make physfs happy to link on windows too, forcing every function in its proper dll and skipping linklib
koda
parents:
8528
diff
changeset
|
48 |
procedure physfsReaderSetBuffer(buf: pointer); cdecl; external PhyslayerLibName; |
8077 | 49 |
|
7959 | 50 |
implementation |
8310
a98c349bc06b
minor adjustments to libengine, moc is correctly created as definitions are set before calling it, params are better numbered and we don't subclass qthread but rather use moveToThread()
koda
parents:
8283
diff
changeset
|
51 |
uses uUtils, uVariables, sysutils; |
7959 | 52 |
|
8073 | 53 |
function PHYSFS_init(argv0: PChar) : LongInt; cdecl; external PhysfsLibName; |
54 |
function PHYSFS_deinit() : LongInt; cdecl; external PhysfsLibName; |
|
8533
2d7703d6bc22
this should make physfs happy to link on windows too, forcing every function in its proper dll and skipping linklib
koda
parents:
8528
diff
changeset
|
55 |
function PHYSFSRWOPS_openRead(fname: PChar): PSDL_RWops; cdecl ; external PhyslayerLibName; |
2d7703d6bc22
this should make physfs happy to link on windows too, forcing every function in its proper dll and skipping linklib
koda
parents:
8528
diff
changeset
|
56 |
function PHYSFSRWOPS_openWrite(fname: PChar): PSDL_RWops; cdecl; external PhyslayerLibName; |
7959 | 57 |
|
8073 | 58 |
function PHYSFS_mount(newDir, mountPoint: PChar; appendToPath: LongBool) : LongInt; cdecl; external PhysfsLibName; |
59 |
function PHYSFS_openRead(fname: PChar): PFSFile; cdecl; external PhysfsLibName; |
|
60 |
function PHYSFS_eof(f: PFSFile): LongBool; cdecl; external PhysfsLibName; |
|
61 |
function PHYSFS_readBytes(f: PFSFile; buffer: pointer; len: Int64): Int64; cdecl; external PhysfsLibName; |
|
62 |
function PHYSFS_close(f: PFSFile): LongBool; cdecl; external PhysfsLibName; |
|
63 |
function PHYSFS_exists(fname: PChar): LongBool; cdecl; external PhysfsLibName; |
|
7959 | 64 |
|
8533
2d7703d6bc22
this should make physfs happy to link on windows too, forcing every function in its proper dll and skipping linklib
koda
parents:
8528
diff
changeset
|
65 |
procedure hedgewarsMountPackages(); cdecl; external PhyslayerLibName; |
8052 | 66 |
|
8025 | 67 |
function rwopsOpenRead(fname: shortstring): PSDL_RWops; |
68 |
begin |
|
69 |
exit(PHYSFSRWOPS_openRead(Str2PChar(fname))); |
|
70 |
end; |
|
71 |
||
72 |
function rwopsOpenWrite(fname: shortstring): PSDL_RWops; |
|
7959 | 73 |
begin |
8025 | 74 |
exit(PHYSFSRWOPS_openWrite(Str2PChar(fname))); |
75 |
end; |
|
8022 | 76 |
|
8028 | 77 |
function pfsOpenRead(fname: shortstring): PFSFile; |
78 |
begin |
|
79 |
exit(PHYSFS_openRead(Str2PChar(fname))); |
|
80 |
end; |
|
81 |
||
82 |
function pfsEOF(f: PFSFile): boolean; |
|
83 |
begin |
|
84 |
exit(PHYSFS_eof(f)) |
|
85 |
end; |
|
86 |
||
87 |
function pfsClose(f: PFSFile): boolean; |
|
88 |
begin |
|
89 |
exit(PHYSFS_close(f)) |
|
90 |
end; |
|
91 |
||
8031 | 92 |
function pfsExists(fname: shortstring): boolean; |
93 |
begin |
|
94 |
exit(PHYSFS_exists(Str2PChar(fname))) |
|
95 |
end; |
|
96 |
||
8028 | 97 |
|
98 |
procedure pfsReadLn(f: PFSFile; var s: shortstring); |
|
99 |
var c: char; |
|
100 |
begin |
|
101 |
s[0]:= #0; |
|
102 |
||
8034 | 103 |
while (PHYSFS_readBytes(f, @c, 1) = 1) and (c <> #10) do |
8028 | 104 |
if (c <> #13) and (s[0] < #255) then |
105 |
begin |
|
106 |
inc(s[0]); |
|
107 |
s[byte(s[0])]:= c |
|
108 |
end |
|
109 |
end; |
|
110 |
||
8107 | 111 |
procedure pfsReadLnA(f: PFSFile; var s: ansistring); |
112 |
var c: char; |
|
113 |
b: shortstring; |
|
114 |
begin |
|
115 |
s:= ''; |
|
116 |
b[0]:= #0; |
|
117 |
||
118 |
while (PHYSFS_readBytes(f, @c, 1) = 1) and (c <> #10) do |
|
119 |
if (c <> #13) then |
|
120 |
begin |
|
121 |
inc(b[0]); |
|
122 |
b[byte(b[0])]:= c; |
|
123 |
if b[0] = #255 then |
|
124 |
begin |
|
125 |
s:= s + b; |
|
126 |
b[0]:= #0 |
|
127 |
end |
|
128 |
end; |
|
129 |
||
130 |
s:= s + b |
|
131 |
end; |
|
132 |
||
8031 | 133 |
function pfsBlockRead(f: PFSFile; buf: pointer; size: Int64): Int64; |
134 |
var r: Int64; |
|
135 |
begin |
|
8034 | 136 |
r:= PHYSFS_readBytes(f, buf, size); |
8031 | 137 |
|
138 |
if r <= 0 then |
|
139 |
pfsBlockRead:= 0 |
|
140 |
else |
|
141 |
pfsBlockRead:= r |
|
142 |
end; |
|
143 |
||
8025 | 144 |
procedure initModule; |
145 |
var i: LongInt; |
|
8310
a98c349bc06b
minor adjustments to libengine, moc is correctly created as definitions are set before calling it, params are better numbered and we don't subclass qthread but rather use moveToThread()
koda
parents:
8283
diff
changeset
|
146 |
cPhysfsId: shortstring; |
8025 | 147 |
begin |
8310
a98c349bc06b
minor adjustments to libengine, moc is correctly created as definitions are set before calling it, params are better numbered and we don't subclass qthread but rather use moveToThread()
koda
parents:
8283
diff
changeset
|
148 |
{$IFDEF HWLIBRARY} |
a98c349bc06b
minor adjustments to libengine, moc is correctly created as definitions are set before calling it, params are better numbered and we don't subclass qthread but rather use moveToThread()
koda
parents:
8283
diff
changeset
|
149 |
//TODO: http://icculus.org/pipermail/physfs/2011-August/001006.html |
a98c349bc06b
minor adjustments to libengine, moc is correctly created as definitions are set before calling it, params are better numbered and we don't subclass qthread but rather use moveToThread()
koda
parents:
8283
diff
changeset
|
150 |
cPhysfsId:= GetCurrentDir() + {$IFDEF DARWIN}'/Hedgewars.app/Contents/MacOS/' + {$ENDIF} ' hedgewars'; |
a98c349bc06b
minor adjustments to libengine, moc is correctly created as definitions are set before calling it, params are better numbered and we don't subclass qthread but rather use moveToThread()
koda
parents:
8283
diff
changeset
|
151 |
{$ELSE} |
a98c349bc06b
minor adjustments to libengine, moc is correctly created as definitions are set before calling it, params are better numbered and we don't subclass qthread but rather use moveToThread()
koda
parents:
8283
diff
changeset
|
152 |
cPhysfsId:= ParamStr(0); |
a98c349bc06b
minor adjustments to libengine, moc is correctly created as definitions are set before calling it, params are better numbered and we don't subclass qthread but rather use moveToThread()
koda
parents:
8283
diff
changeset
|
153 |
{$ENDIF} |
a98c349bc06b
minor adjustments to libengine, moc is correctly created as definitions are set before calling it, params are better numbered and we don't subclass qthread but rather use moveToThread()
koda
parents:
8283
diff
changeset
|
154 |
|
a98c349bc06b
minor adjustments to libengine, moc is correctly created as definitions are set before calling it, params are better numbered and we don't subclass qthread but rather use moveToThread()
koda
parents:
8283
diff
changeset
|
155 |
i:= PHYSFS_init(Str2PChar(cPhysfsId)); |
8025 | 156 |
AddFileLog('[PhysFS] init: ' + inttostr(i)); |
157 |
||
8714 | 158 |
i:= PHYSFS_mount(Str2PChar(PathPrefix), nil, false); |
8025 | 159 |
AddFileLog('[PhysFS] mount ' + PathPrefix + ': ' + inttostr(i)); |
8714 | 160 |
i:= PHYSFS_mount(Str2PChar(UserPathPrefix + '/Data'), nil, false); |
8046 | 161 |
AddFileLog('[PhysFS] mount ' + UserPathPrefix + '/Data: ' + inttostr(i)); |
8052 | 162 |
|
163 |
hedgewarsMountPackages; |
|
7959 | 164 |
end; |
165 |
||
166 |
procedure freeModule; |
|
167 |
begin |
|
168 |
PHYSFS_deinit; |
|
169 |
end; |
|
170 |
||
171 |
end. |