[physfs] PhysicsFS 3.0.0 released!
Ryan C. Gordon
icculus at icculus.org
Wed Sep 27 16:52:58 EDT 2017
( This work was funded by my Patreon! If you like me working on things
like PhysicsFS and other useful pieces of code, consider throwing some
money in the pot: https://patreon.com/icculus )
PhysicsFS 3.0.0 is now available.
This is a brand new major release! As we are still source and binary
compatible, all users of any previous version--be it 1.0 or 2.0--are
encouraged to upgrade.
You can grab it here...
https://icculus.org/physfs/downloads/physfs-3.0.0.tar.bz2
...or from Mercurial with this command...
hg clone -u release-3.0.0 https://hg.icculus.org/icculus/physfs
...or just stare at the webview here...
https://hg.icculus.org/icculus/physfs/file/release-3.0.0
The stable-2.0 and stable-1.0 branches still exist, but are not expected
to see any serious future effort. Please move to PhysicsFS 3.0.
Notable changes in this release:
- PhysicsFS now is super-easy to build. You can usually just drop all
the C files into your project and compile it with everything else
without any magic configuration step. The CMake file is still there and
useful for packaging, etc, but it's 100% optional.
- ZIP files can now use the newer zip64 format.
- ZIP files may be password-protected. As the PkWare specs specify, each
file in the .zip may have a different password, so you call
PHYSFS_openRead(a, "file_that_i_want.txt$PASSWORD") to make it work.
Note that this is a wildly insecure way to protect your app's data, both
in how you'd have to manage passwords and that "traditional" PkWare
crypto is not really hardened anyhow. But if you have a basic
password-protected archive, PhysicsFS can get into it now!
- 7zip support has been rewritten and improved.
- ISO9660 archives are now supported.
- VDF (Gothic/Gothic2) archives are now supported.
- SLB (Independence War) archives are now supported.
- Everything behind the scenes now uses an abstract i/o interface
(PHYSFS_Io) instead of talking directly to files, and this interface is
available to applications. This allows you to mount anything as an
archive that you can wrap in a PHYSFS_Io, through the new
PHYSFS_mountIo() function. The obvious and most useful implementations
are already implemented for you behind the scenes on top of PHYSFS_Io:
PHYSFS_mountMemory() to mount an archive that's in a block of RAM, and
PHYSFS_mountHandle() to mount from a PHYSFS_File*...that is to say: you
now have an interface to do archives inside archives.
- The abstract interface that PhysicsFS uses to talk to archives
(PHYSFS_Archiver) is now public, so apps can implement their own
archivers and register them into the system. If you have a custom
archive format for your app, you can plug it into PhysicsFS at runtime
without modifying PhysicsFS itself.
- There's now a PHYSFS_getPrefDir() to figure out where it is safe to
write files on a given platform. This is usually a per-user,
per-application space, and should be used instead of
PHYSFS_getUserDir(). It might report something under
~/Library/Application Support on a Mac, somewhere under AppData for
Windows, or ~/.local/share on Linux, etc.
- There's now a PHYSFS_unmount() to match 2.0.0's PHYSFS_mount().
- There's now a PHYSFS_utf8FromUtf16(), so stop using
PHYSFS_utf8FromUcs2(). :)
- There's now PHYSFS_utf8stricmp() for case-insensitive UTF-8 string
comparison, in case you need to compare filenames.
- Enumerating files can now report errors, instead of quietly dropping
files when there were problems. Enumeration callbacks can now return
results too ("keep going", "stop enumerating, no error I just got what I
needed", "something went wrong, stop and return an error to the app").
- There is now a PHYSFS_stat() call that returns metadata on a specific
file as a whole instead of using PHYSFS_isDirectory(),
PHYSFS_getLastModTime(), etc separately).
- There's now a PHYSFS_readBytes() function that operates more like Unix
read()...the older PHYSFS_read() operates more like ANSI C's fread(),
but had undefined behavior if it reads half an object. There is also an
equivalent PHYSFS_writeBytes().
- Errors are now reported by numeric codes your app can process (there's
a function to turn them into human readable strings). Apps can set the
per-thread error code now, too, which is useful if you're writing an
PHYSFS_Archiver or PHYSFS_Io.
- The OS/2 port has Unicode support now.
- The Windows port now uses UTF-16 for Unicode instead of UCS-2, and
dropped the ANSI fallbacks (so among other hurdles, you'll need to bring
your own UNICOWS.DLL if you want Win95 support still).
- Lots of improvements, redesigns, bug fixes, corner cases, and
optimizations.
- There's now a buildbot that makes sure this builds across two dozen
different targets on every commit:
https://physfs-buildbot.icculus.org/waterfall
- New platforms: iOS, Android, Emscripten, WinRT (UWP, Windows Phone,
Windows Store), Win64, QNX, Solaris, Hurd, Debian/kFreeBSD, ArcaOS,
probably others.
- Dropped platforms: BeOS (Haiku is still supported), Windows CE
(Windows Phone is supported), Windows 95/98/ME (WinXP and later are
supported) MacOS Classic (macOS and iOS are supported). Even these might
work with minor patches if there's an urgent demand.
- Probably many other things. This work encompasses many years of effort
and quite a bit of internal redesign.
Thanks to those that sent in patches, and those that funded the push for
a 3.0.0 release on Patreon! Enjoy!
--ryan.
More information about the physfs
mailing list