[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...


...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...


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 

- There's now a buildbot that makes sure this builds across two dozen 
different targets on every commit: 

- 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!


More information about the physfs mailing list