hedgewars/uPhysFSLayer.pas
author nemo
Thu, 29 Nov 2012 14:47:36 -0500
changeset 8134 38e163cc3bfd
parent 8107 ee21b816394f
child 8283 af97cdbb7713
permissions -rw-r--r--
unbreak linking pending some fix or other by koda. this is the same thing video recording still does.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7959
644b757d20e6 Start work on physfs support in engine
unc0rr
parents:
diff changeset
     1
unit uPhysFSLayer;
8063
06efc1ea6a40 linking phsyfs on osx
koda
parents: 8062
diff changeset
     2
7959
644b757d20e6 Start work on physfs support in engine
unc0rr
parents:
diff changeset
     3
interface
8077
2ea5cde93abc Fix build
unc0rr
parents: 8073
diff changeset
     4
uses SDLh, LuaPas;
7959
644b757d20e6 Start work on physfs support in engine
unc0rr
parents:
diff changeset
     5
8073
5a289ef40fdb physfs compilation on windows
koda
parents: 8067
diff changeset
     6
{$IFDEF ANDROID}
5a289ef40fdb physfs compilation on windows
koda
parents: 8067
diff changeset
     7
    {$linklib physfs}
5a289ef40fdb physfs compilation on windows
koda
parents: 8067
diff changeset
     8
{$ELSE}
5a289ef40fdb physfs compilation on windows
koda
parents: 8067
diff changeset
     9
    {$IFDEF DARWIN}
5a289ef40fdb physfs compilation on windows
koda
parents: 8067
diff changeset
    10
        {$LINKFRAMEWORK IOKit}
5a289ef40fdb physfs compilation on windows
koda
parents: 8067
diff changeset
    11
    {$ENDIF}
5a289ef40fdb physfs compilation on windows
koda
parents: 8067
diff changeset
    12
{$ENDIF}
5a289ef40fdb physfs compilation on windows
koda
parents: 8067
diff changeset
    13
5a289ef40fdb physfs compilation on windows
koda
parents: 8067
diff changeset
    14
const
5a289ef40fdb physfs compilation on windows
koda
parents: 8067
diff changeset
    15
{$IFDEF WIN32}
5a289ef40fdb physfs compilation on windows
koda
parents: 8067
diff changeset
    16
    PhysfsLibName = 'libphysfs';
5a289ef40fdb physfs compilation on windows
koda
parents: 8067
diff changeset
    17
{$ELSE}
8134
38e163cc3bfd unbreak linking pending some fix or other by koda. this is the same thing video recording still does.
nemo
parents: 8107
diff changeset
    18
    {$LINKLIB ../bin/libphysfs.a}
8073
5a289ef40fdb physfs compilation on windows
koda
parents: 8067
diff changeset
    19
    PhysfsLibName = 'physfs';
5a289ef40fdb physfs compilation on windows
koda
parents: 8067
diff changeset
    20
{$ENDIF}
5a289ef40fdb physfs compilation on windows
koda
parents: 8067
diff changeset
    21
7959
644b757d20e6 Start work on physfs support in engine
unc0rr
parents:
diff changeset
    22
procedure initModule;
644b757d20e6 Start work on physfs support in engine
unc0rr
parents:
diff changeset
    23
procedure freeModule;
644b757d20e6 Start work on physfs support in engine
unc0rr
parents:
diff changeset
    24
8028
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    25
type PFSFile = pointer;
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    26
8025
07862ab415c8 Get rid of Pathz and UserPathz
unc0rr
parents: 8022
diff changeset
    27
function rwopsOpenRead(fname: shortstring): PSDL_RWops;
07862ab415c8 Get rid of Pathz and UserPathz
unc0rr
parents: 8022
diff changeset
    28
function rwopsOpenWrite(fname: shortstring): PSDL_RWops;
8022
10b3b93c1f56 - Add physfsrwops library
unc0rr
parents: 7963
diff changeset
    29
8028
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    30
function pfsOpenRead(fname: shortstring): PFSFile;
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    31
function pfsClose(f: PFSFile): boolean;
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    32
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    33
procedure pfsReadLn(f: PFSFile; var s: shortstring);
8107
ee21b816394f Bring ansistrings back
unc0rr
parents: 8080
diff changeset
    34
procedure pfsReadLnA(f: PFSFile; var s: ansistring);
8031
fc40b343c45c Script loading via physfs which doesn't work:
unc0rr
parents: 8028
diff changeset
    35
function pfsBlockRead(f: PFSFile; buf: pointer; size: Int64): Int64;
fc40b343c45c Script loading via physfs which doesn't work:
unc0rr
parents: 8028
diff changeset
    36
function pfsEOF(f: PFSFile): boolean;
fc40b343c45c Script loading via physfs which doesn't work:
unc0rr
parents: 8028
diff changeset
    37
fc40b343c45c Script loading via physfs which doesn't work:
unc0rr
parents: 8028
diff changeset
    38
function pfsExists(fname: shortstring): boolean;
8028
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    39
8077
2ea5cde93abc Fix build
unc0rr
parents: 8073
diff changeset
    40
function  physfsReader(L: Plua_State; f: PFSFile; sz: Psize_t) : PChar; cdecl; external PhysfsLibName;
2ea5cde93abc Fix build
unc0rr
parents: 8073
diff changeset
    41
procedure physfsReaderSetBuffer(buf: pointer); cdecl; external PhysfsLibName;
2ea5cde93abc Fix build
unc0rr
parents: 8073
diff changeset
    42
7959
644b757d20e6 Start work on physfs support in engine
unc0rr
parents:
diff changeset
    43
implementation
8022
10b3b93c1f56 - Add physfsrwops library
unc0rr
parents: 7963
diff changeset
    44
uses uUtils, uVariables;
7959
644b757d20e6 Start work on physfs support in engine
unc0rr
parents:
diff changeset
    45
8073
5a289ef40fdb physfs compilation on windows
koda
parents: 8067
diff changeset
    46
function PHYSFS_init(argv0: PChar) : LongInt; cdecl; external PhysfsLibName;
5a289ef40fdb physfs compilation on windows
koda
parents: 8067
diff changeset
    47
function PHYSFS_deinit() : LongInt; cdecl; external PhysfsLibName;
5a289ef40fdb physfs compilation on windows
koda
parents: 8067
diff changeset
    48
function PHYSFSRWOPS_openRead(fname: PChar): PSDL_RWops; cdecl ; external PhysfsLibName;
5a289ef40fdb physfs compilation on windows
koda
parents: 8067
diff changeset
    49
function PHYSFSRWOPS_openWrite(fname: PChar): PSDL_RWops; cdecl; external PhysfsLibName;
7959
644b757d20e6 Start work on physfs support in engine
unc0rr
parents:
diff changeset
    50
8073
5a289ef40fdb physfs compilation on windows
koda
parents: 8067
diff changeset
    51
function PHYSFS_mount(newDir, mountPoint: PChar; appendToPath: LongBool) : LongInt; cdecl; external PhysfsLibName;
5a289ef40fdb physfs compilation on windows
koda
parents: 8067
diff changeset
    52
function PHYSFS_openRead(fname: PChar): PFSFile; cdecl; external PhysfsLibName;
5a289ef40fdb physfs compilation on windows
koda
parents: 8067
diff changeset
    53
function PHYSFS_eof(f: PFSFile): LongBool; cdecl; external PhysfsLibName;
5a289ef40fdb physfs compilation on windows
koda
parents: 8067
diff changeset
    54
function PHYSFS_readBytes(f: PFSFile; buffer: pointer; len: Int64): Int64; cdecl; external PhysfsLibName;
5a289ef40fdb physfs compilation on windows
koda
parents: 8067
diff changeset
    55
function PHYSFS_close(f: PFSFile): LongBool; cdecl; external PhysfsLibName;
5a289ef40fdb physfs compilation on windows
koda
parents: 8067
diff changeset
    56
function PHYSFS_exists(fname: PChar): LongBool; cdecl; external PhysfsLibName;
7959
644b757d20e6 Start work on physfs support in engine
unc0rr
parents:
diff changeset
    57
8073
5a289ef40fdb physfs compilation on windows
koda
parents: 8067
diff changeset
    58
procedure hedgewarsMountPackages(); cdecl; external PhysfsLibName;
8052
845b5ae03841 Mount .hwt files found in Data folder
unc0rr
parents: 8046
diff changeset
    59
8025
07862ab415c8 Get rid of Pathz and UserPathz
unc0rr
parents: 8022
diff changeset
    60
function rwopsOpenRead(fname: shortstring): PSDL_RWops;
07862ab415c8 Get rid of Pathz and UserPathz
unc0rr
parents: 8022
diff changeset
    61
begin
07862ab415c8 Get rid of Pathz and UserPathz
unc0rr
parents: 8022
diff changeset
    62
    exit(PHYSFSRWOPS_openRead(Str2PChar(fname)));
07862ab415c8 Get rid of Pathz and UserPathz
unc0rr
parents: 8022
diff changeset
    63
end;
07862ab415c8 Get rid of Pathz and UserPathz
unc0rr
parents: 8022
diff changeset
    64
07862ab415c8 Get rid of Pathz and UserPathz
unc0rr
parents: 8022
diff changeset
    65
function rwopsOpenWrite(fname: shortstring): PSDL_RWops;
7959
644b757d20e6 Start work on physfs support in engine
unc0rr
parents:
diff changeset
    66
begin
8025
07862ab415c8 Get rid of Pathz and UserPathz
unc0rr
parents: 8022
diff changeset
    67
    exit(PHYSFSRWOPS_openWrite(Str2PChar(fname)));
07862ab415c8 Get rid of Pathz and UserPathz
unc0rr
parents: 8022
diff changeset
    68
end;
8022
10b3b93c1f56 - Add physfsrwops library
unc0rr
parents: 7963
diff changeset
    69
8028
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    70
function pfsOpenRead(fname: shortstring): PFSFile;
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    71
begin
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    72
    exit(PHYSFS_openRead(Str2PChar(fname)));
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    73
end;
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    74
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    75
function pfsEOF(f: PFSFile): boolean;
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    76
begin
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    77
    exit(PHYSFS_eof(f))
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    78
end;
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    79
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    80
function pfsClose(f: PFSFile): boolean;
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    81
begin
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    82
    exit(PHYSFS_close(f))
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    83
end;
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    84
8031
fc40b343c45c Script loading via physfs which doesn't work:
unc0rr
parents: 8028
diff changeset
    85
function pfsExists(fname: shortstring): boolean;
fc40b343c45c Script loading via physfs which doesn't work:
unc0rr
parents: 8028
diff changeset
    86
begin
fc40b343c45c Script loading via physfs which doesn't work:
unc0rr
parents: 8028
diff changeset
    87
    exit(PHYSFS_exists(Str2PChar(fname)))
fc40b343c45c Script loading via physfs which doesn't work:
unc0rr
parents: 8028
diff changeset
    88
end;
fc40b343c45c Script loading via physfs which doesn't work:
unc0rr
parents: 8028
diff changeset
    89
8028
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    90
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    91
procedure pfsReadLn(f: PFSFile; var s: shortstring);
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    92
var c: char;
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    93
begin
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    94
s[0]:= #0;
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    95
8034
fc032c0f7b23 Implement reader in C ffs
unc0rr
parents: 8031
diff changeset
    96
while (PHYSFS_readBytes(f, @c, 1) = 1) and (c <> #10) do
8028
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    97
    if (c <> #13) and (s[0] < #255) then
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    98
        begin
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
    99
        inc(s[0]);
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
   100
        s[byte(s[0])]:= c
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
   101
        end
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
   102
end;
dc30104660d3 Engine loads fine with basic config
unc0rr
parents: 8025
diff changeset
   103
8107
ee21b816394f Bring ansistrings back
unc0rr
parents: 8080
diff changeset
   104
procedure pfsReadLnA(f: PFSFile; var s: ansistring);
ee21b816394f Bring ansistrings back
unc0rr
parents: 8080
diff changeset
   105
var c: char;
ee21b816394f Bring ansistrings back
unc0rr
parents: 8080
diff changeset
   106
    b: shortstring;
ee21b816394f Bring ansistrings back
unc0rr
parents: 8080
diff changeset
   107
begin
ee21b816394f Bring ansistrings back
unc0rr
parents: 8080
diff changeset
   108
s:= '';
ee21b816394f Bring ansistrings back
unc0rr
parents: 8080
diff changeset
   109
b[0]:= #0;
ee21b816394f Bring ansistrings back
unc0rr
parents: 8080
diff changeset
   110
ee21b816394f Bring ansistrings back
unc0rr
parents: 8080
diff changeset
   111
while (PHYSFS_readBytes(f, @c, 1) = 1) and (c <> #10) do
ee21b816394f Bring ansistrings back
unc0rr
parents: 8080
diff changeset
   112
    if (c <> #13) then
ee21b816394f Bring ansistrings back
unc0rr
parents: 8080
diff changeset
   113
        begin
ee21b816394f Bring ansistrings back
unc0rr
parents: 8080
diff changeset
   114
        inc(b[0]);
ee21b816394f Bring ansistrings back
unc0rr
parents: 8080
diff changeset
   115
        b[byte(b[0])]:= c;
ee21b816394f Bring ansistrings back
unc0rr
parents: 8080
diff changeset
   116
        if b[0] = #255 then
ee21b816394f Bring ansistrings back
unc0rr
parents: 8080
diff changeset
   117
            begin
ee21b816394f Bring ansistrings back
unc0rr
parents: 8080
diff changeset
   118
            s:= s + b;
ee21b816394f Bring ansistrings back
unc0rr
parents: 8080
diff changeset
   119
            b[0]:= #0
ee21b816394f Bring ansistrings back
unc0rr
parents: 8080
diff changeset
   120
            end
ee21b816394f Bring ansistrings back
unc0rr
parents: 8080
diff changeset
   121
        end;
ee21b816394f Bring ansistrings back
unc0rr
parents: 8080
diff changeset
   122
        
ee21b816394f Bring ansistrings back
unc0rr
parents: 8080
diff changeset
   123
s:= s + b
ee21b816394f Bring ansistrings back
unc0rr
parents: 8080
diff changeset
   124
end;
ee21b816394f Bring ansistrings back
unc0rr
parents: 8080
diff changeset
   125
8031
fc40b343c45c Script loading via physfs which doesn't work:
unc0rr
parents: 8028
diff changeset
   126
function pfsBlockRead(f: PFSFile; buf: pointer; size: Int64): Int64;
fc40b343c45c Script loading via physfs which doesn't work:
unc0rr
parents: 8028
diff changeset
   127
var r: Int64;
fc40b343c45c Script loading via physfs which doesn't work:
unc0rr
parents: 8028
diff changeset
   128
begin
8034
fc032c0f7b23 Implement reader in C ffs
unc0rr
parents: 8031
diff changeset
   129
    r:= PHYSFS_readBytes(f, buf, size);
8031
fc40b343c45c Script loading via physfs which doesn't work:
unc0rr
parents: 8028
diff changeset
   130
fc40b343c45c Script loading via physfs which doesn't work:
unc0rr
parents: 8028
diff changeset
   131
    if r <= 0 then
fc40b343c45c Script loading via physfs which doesn't work:
unc0rr
parents: 8028
diff changeset
   132
        pfsBlockRead:= 0
fc40b343c45c Script loading via physfs which doesn't work:
unc0rr
parents: 8028
diff changeset
   133
    else
fc40b343c45c Script loading via physfs which doesn't work:
unc0rr
parents: 8028
diff changeset
   134
        pfsBlockRead:= r
fc40b343c45c Script loading via physfs which doesn't work:
unc0rr
parents: 8028
diff changeset
   135
end;
fc40b343c45c Script loading via physfs which doesn't work:
unc0rr
parents: 8028
diff changeset
   136
8025
07862ab415c8 Get rid of Pathz and UserPathz
unc0rr
parents: 8022
diff changeset
   137
procedure initModule;
07862ab415c8 Get rid of Pathz and UserPathz
unc0rr
parents: 8022
diff changeset
   138
var i: LongInt;
07862ab415c8 Get rid of Pathz and UserPathz
unc0rr
parents: 8022
diff changeset
   139
begin
07862ab415c8 Get rid of Pathz and UserPathz
unc0rr
parents: 8022
diff changeset
   140
    i:= PHYSFS_init(Str2PChar(ParamStr(0)));
07862ab415c8 Get rid of Pathz and UserPathz
unc0rr
parents: 8022
diff changeset
   141
    AddFileLog('[PhysFS] init: ' + inttostr(i));
07862ab415c8 Get rid of Pathz and UserPathz
unc0rr
parents: 8022
diff changeset
   142
07862ab415c8 Get rid of Pathz and UserPathz
unc0rr
parents: 8022
diff changeset
   143
    i:= PHYSFS_mount(Str2PChar(PathPrefix), nil, true);
07862ab415c8 Get rid of Pathz and UserPathz
unc0rr
parents: 8022
diff changeset
   144
    AddFileLog('[PhysFS] mount ' + PathPrefix + ': ' + inttostr(i));
8031
fc40b343c45c Script loading via physfs which doesn't work:
unc0rr
parents: 8028
diff changeset
   145
    i:= PHYSFS_mount(Str2PChar(UserPathPrefix + '/Data'), nil, true);
8046
4d3415927d2c Use (undocumented) Mix_LoadMUS_RW to load music
unc0rr
parents: 8034
diff changeset
   146
    AddFileLog('[PhysFS] mount ' + UserPathPrefix + '/Data: ' + inttostr(i));
8052
845b5ae03841 Mount .hwt files found in Data folder
unc0rr
parents: 8046
diff changeset
   147
845b5ae03841 Mount .hwt files found in Data folder
unc0rr
parents: 8046
diff changeset
   148
    hedgewarsMountPackages;
7959
644b757d20e6 Start work on physfs support in engine
unc0rr
parents:
diff changeset
   149
end;
644b757d20e6 Start work on physfs support in engine
unc0rr
parents:
diff changeset
   150
644b757d20e6 Start work on physfs support in engine
unc0rr
parents:
diff changeset
   151
procedure freeModule;
644b757d20e6 Start work on physfs support in engine
unc0rr
parents:
diff changeset
   152
begin
644b757d20e6 Start work on physfs support in engine
unc0rr
parents:
diff changeset
   153
    PHYSFS_deinit;
644b757d20e6 Start work on physfs support in engine
unc0rr
parents:
diff changeset
   154
end;
644b757d20e6 Start work on physfs support in engine
unc0rr
parents:
diff changeset
   155
644b757d20e6 Start work on physfs support in engine
unc0rr
parents:
diff changeset
   156
end.