~korth/gens-gs-ii.git
3 years ago[unrar] Updated to unrar-5.3.11. feature/switch-to-libarchive github/feature/switch-to-libarchive
David Korth [Sun, 6 Mar 2016 03:21:20 +0000 (22:21 -0500)] 
[unrar] Updated to unrar-5.3.11.

It only has minor changes compared to 5.3.9, including a DLL
version change and some Windows changes.

Interestingly, the DLL version was changed from 5.31.1 to 5.31.0,
and the file version was changed from 5.31.1.1832 to 5.31.100.1864.
Not sure if the 5.31.1 was an error or what.

3 years ago[zlib] CMakeLists.txt: Minor formatting change for consistency.
David Korth [Fri, 15 Jan 2016 05:22:12 +0000 (00:22 -0500)] 
[zlib] CMakeLists.txt: Minor formatting change for consistency.

3 years ago[libcompat/W32U/tests] MiniZip_iowin32u_Test.cpp: Don't fail on ANSI tests if the...
David Korth [Sun, 10 Jan 2016 21:04:37 +0000 (16:04 -0500)] 
[libcompat/W32U/tests] MiniZip_iowin32u_Test.cpp: Don't fail on ANSI tests if the filename has a '?' in it.

These filenames cannot be accessed using the ANSI API, so failure
is expected.

Also check for '?' if the filename was opened successfully. It shouldn't
be there, and if it is, something went wrong.

3 years ago[libcompat/W32U] CMakeLists.txt: Copy the Zip files to the test directory.
David Korth [Sun, 10 Jan 2016 20:49:22 +0000 (15:49 -0500)] 
[libcompat/W32U] CMakeLists.txt: Copy the Zip files to the test directory.

3 years ago[libcompat/W32U] MiniZip_iowin32u_Test: New test for iowin32u.
David Korth [Sun, 10 Jan 2016 20:46:05 +0000 (15:46 -0500)] 
[libcompat/W32U] MiniZip_iowin32u_Test: New test for iowin32u.

This tests iowin32's ANSI and Unicode functions, followed by
the UTF-8 conversion functions in iowin32u.

The test currently fails on a few ANSI tests due to the expected
conversion error. ("Telephone" symbol doesn't exist in ANSI.)
All of the othre tests pass.

3 years ago[libgensfile] Rar::getFileInfo(): Removed two unused variables.
David Korth [Sun, 10 Jan 2016 04:59:49 +0000 (23:59 -0500)] 
[libgensfile] Rar::getFileInfo(): Removed two unused variables.

They were used when we used the Win32 WideCharToMultiByte() and
MultiByteToWideChar() functions directly, but now we use LibGensText.

3 years ago[libgensfile] Rar::openRar(): If RAROpenArchiveEx() isn't available, use
David Korth [Sun, 10 Jan 2016 04:59:40 +0000 (23:59 -0500)] 
[libgensfile] Rar::openRar(): If RAROpenArchiveEx() isn't available, use
RAROpenArchive().

RAROpenArchiveEx() was added in UnRAR.dll v2.

RAROpenArchive() doesn't support Unicode filenames, so on Windows,
we have to use the ANSI filename. On Linux, we can still use the
UTF-8 filename. (Well, at least I think it does. I haven't actually
tested a v2 library on the Linux build; only v7.)

3 years ago[libgensfile] Lzma: Implemented readFile().
David Korth [Sat, 9 Jan 2016 23:42:54 +0000 (18:42 -0500)] 
[libgensfile] Lzma: Implemented readFile().

LZMA-compresssed ROMs can now be loaded successfully. This includes
SMD-format ROMs, since I copied the start_pos code from Xz.

TODO: Use m_lzsize if it's valid.

3 years ago[libgensfile] Lzma: Fixed offsets in the header for lzsize.
David Korth [Sat, 9 Jan 2016 23:36:11 +0000 (18:36 -0500)] 
[libgensfile] Lzma: Fixed offsets in the header for lzsize.

It worked before due to the 32-bit wraparound, but since I fixed it,
it read an actual size that was invalid.

This is a regression from commit 772dbde2b9fef3b69aedf03bd474239a52c17cf3.
([libgensfile] Lzma::getFileInfo(): Fixed incorrect 64-bit shifts.)

3 years ago[libgensfile] Lzma::getFileInfo(): Fixed incorrect 64-bit shifts.
David Korth [Sat, 9 Jan 2016 23:31:36 +0000 (18:31 -0500)] 
[libgensfile] Lzma::getFileInfo(): Fixed incorrect 64-bit shifts.

gcc warned that these shifts were being processed as 32-bit:

Lzma.cpp:83:20: warning: left shift count >= width of type [-Wshift-count-overflow]
     (header[ 7] << 32) |
                    ^
Lzma.cpp:84:20: warning: left shift count >= width of type [-Wshift-count-overflow]
     (header[ 8] << 40) |
                    ^
Lzma.cpp:85:20: warning: left shift count >= width of type [-Wshift-count-overflow]
     (header[ 9] << 48) |
                    ^
Lzma.cpp:86:20: warning: left shift count >= width of type [-Wshift-count-overflow]
     (header[10] << 56);
                    ^

3 years ago[libgensfile] Xz.cpp: Minor formatting fixes.
David Korth [Sat, 9 Jan 2016 23:23:04 +0000 (18:23 -0500)] 
[libgensfile] Xz.cpp: Minor formatting fixes.

Removed comments that applied to Gzip but not Xz.

3 years ago[libgensfile] Lzma: Preliminary Lzma archive class.
David Korth [Sat, 9 Jan 2016 22:53:41 +0000 (17:53 -0500)] 
[libgensfile] Lzma: Preliminary Lzma archive class.

Currently, it only supports detecting the Lzma archive magic, and only
if the archive was created using xz-utils. The file format doesn't
have a really good magic number compared to .xz or .7z.

Note that .lzma wasn't widely used, so I don't expect the autodetection
screwiness to be an issue.

TODO: Add an option to disable autodetection of certain formats to
allow the user to work around a false positive if one occurs.

3 years ago[libgensfile] Sz, Xz: Call LzmaSdk::close(), not Archive::close().
David Korth [Sat, 9 Jan 2016 22:04:19 +0000 (17:04 -0500)] 
[libgensfile] Sz, Xz: Call LzmaSdk::close(), not Archive::close().

TODO: typedef super.

3 years ago[libgensfile] Xz.cpp: Removed unused CRC header includes.
David Korth [Sat, 9 Jan 2016 22:02:47 +0000 (17:02 -0500)] 
[libgensfile] Xz.cpp: Removed unused CRC header includes.

CRC table initialization is handled by the LzmaSdk class.

3 years ago[libgensfile] Xz::readFile(): Added a line note for the ExtraSize stuff.
David Korth [Sat, 9 Jan 2016 21:55:03 +0000 (16:55 -0500)] 
[libgensfile] Xz::readFile(): Added a line note for the ExtraSize stuff.

3 years ago[libgensfile] Xz::readFile(): Handle start_pos.
David Korth [Sat, 9 Jan 2016 21:53:44 +0000 (16:53 -0500)] 
[libgensfile] Xz::readFile(): Handle start_pos.

This fixes SMD support with Xz-compressed ROMs.

Note that Xz doesn't seem to have a "seek" function, so we have to simply
skip over the data we don't want.

3 years ago[libgensfile] Xz: Implemented readFile().
David Korth [Sat, 9 Jan 2016 21:47:50 +0000 (16:47 -0500)] 
[libgensfile] Xz: Implemented readFile().

There's a few TODOs that need to be taken care of, but it does
successfully load an Xz-compressed copy of "Vectorman 2".

3 years ago[libgensfile] LzmaSdk: New base class for LZMA SDK-based archive handlers.
David Korth [Sat, 9 Jan 2016 20:22:03 +0000 (15:22 -0500)] 
[libgensfile] LzmaSdk: New base class for LZMA SDK-based archive handlers.

This base class handles some initialization requird by all archive
handlers that use the LZMA SDK, including CRC tables and filename
encoding conversion.

NOTE: The Crc64 table is initialized regardless of whether or not
Xz is used. It's currently only used by Xz right now, but it could
be used by 7-Zip later as well. (Or, it *is* used by 7-Zip for LZMA2
streams, but I'm not sure.)

Better to just initialize all of the CRC tables regardless so we
don't encounter weird errors later.

3 years ago[libgensfile] Xz: Initial Xz archive handler.
David Korth [Sat, 9 Jan 2016 19:41:22 +0000 (14:41 -0500)] 
[libgensfile] Xz: Initial Xz archive handler.

This archive handler uses the LZMA SDK to decode Xz (LZMA2) streams.
.xz is used similarly to .gz on modern Linux systems.

TODO:
- Only read the first stream?
- Create a base class for both Sz and Xz, since they share a lot of
  boilerplate code required by the LZMA SDK.
- Implement readFile().

3 years ago[unrar] dll.def: Export RARProcessFileW().
David Korth [Sat, 9 Jan 2016 10:57:08 +0000 (05:57 -0500)] 
[unrar] dll.def: Export RARProcessFileW().

This is exported in the standard UnRAR.dll, but it's missing from dll.def.

3 years ago[unrar] CMakeLists.txt: Improved the Windows build.
David Korth [Sat, 9 Jan 2016 10:52:24 +0000 (05:52 -0500)] 
[unrar] CMakeLists.txt: Improved the Windows build.

I probably won't be building UnRAR.dll for Windows, since I can just
ship the precompiled versions (which have a digital signature).

- Enabled SMP on all versions.
- Enabled SSE on Windows x86. The SSE code is MSVC-specific,
  so I can't enable it elsewhere right now.
- Added dll.rc and dll.def. Without dll.def, UnRAR.dll doesn't
  have any exports, which makes it rather useless.

FIXME: secpassword.cpp uses LoadSysLibrary(), which doesn't exist in
UnRAR.dll and doesn't seem to exist on MSDN. I assume it's a version
of LoadLibrary() that only loads DLLs from system directories. This is
doable on Windows XP and later by clearing the DLL search path with
SetDllDirectory().

3 years ago[gens-qt4] translations/*.ts: Updated the translation files using lupdate.sh.
David Korth [Sat, 9 Jan 2016 10:09:32 +0000 (05:09 -0500)] 
[gens-qt4] translations/*.ts: Updated the translation files using lupdate.sh.

Same as commit bcbc5302c86bf2323af5e5d3d2fb0ad63963e931, but with
working UnRAR and 7-Zip.

3 years ago[gens-qt4] Removed the UnRAR external program and/or DLL option, again.
David Korth [Sat, 9 Jan 2016 10:08:01 +0000 (05:08 -0500)] 
[gens-qt4] Removed the UnRAR external program and/or DLL option, again.

There's no real need to show the UnRAR.dll status, since the library
will be provided with Gens/GS II.

TODO: Show an error message if the user attempts to open a RAR file
and UnRAR.dll can't be loaded.

3 years ago[libgens] Removed the Decompressor subsystem, again.
David Korth [Sat, 9 Jan 2016 10:01:06 +0000 (05:01 -0500)] 
[libgens] Removed the Decompressor subsystem, again.

Similar to commit c28895398ddd95fb4fda0d16736bcb6b17ca4cc8, except
I have working RAR and 7z decompressors using the Archive subsystem
now, so nothing of value is being lost.

3 years ago[libgensfile] CMakeLists.txt: Removed the commented-out Decompressor lines.
David Korth [Sat, 9 Jan 2016 10:00:12 +0000 (05:00 -0500)] 
[libgensfile] CMakeLists.txt: Removed the commented-out Decompressor lines.

These have all been reimplemented using the Archive base class.

3 years ago[libgensfile] Archive: New function checkMagic().
David Korth [Sat, 9 Jan 2016 09:55:18 +0000 (04:55 -0500)] 
[libgensfile] Archive: New function checkMagic().

This function checks the start of the file for the specified magic
value. If it's found, it returns 0; otherwise, a negative POSIX
error code is returned.

Refactored Zip, Sz, and Rar to use checkMagic() instead of duplicating
code everywhere.

3 years ago[libgensfile] Added magic checking for 7-Zip and Zip.
David Korth [Sat, 9 Jan 2016 09:44:46 +0000 (04:44 -0500)] 
[libgensfile] Added magic checking for 7-Zip and Zip.

This should improve loading performance and reduce false positives.

3 years ago[libgensfile] Rar::openRar(): Don't unconditionally override the EIO error code.
David Korth [Sat, 9 Jan 2016 09:39:56 +0000 (04:39 -0500)] 
[libgensfile] Rar::openRar(): Don't unconditionally override the EIO error code.

Set EINVAL if the header is wrong, and EIO if a read error occurred.

3 years ago[libgensfile] Rar::openRar(): Use rewind() instead of fseek(m_file, 0, SEEK_SET).
David Korth [Sat, 9 Jan 2016 09:38:12 +0000 (04:38 -0500)] 
[libgensfile] Rar::openRar(): Use rewind() instead of fseek(m_file, 0, SEEK_SET).

3 years ago[libgensfile] Rar::getFileInfo(): Fixed Unicode filename handling on Windows.
David Korth [Sat, 9 Jan 2016 09:33:39 +0000 (04:33 -0500)] 
[libgensfile] Rar::getFileInfo(): Fixed Unicode filename handling on Windows.

UnRAR.dll always ensures the Unicode field is filled out,
so we don't have to worry about checking the ANSI field.

Similarly, on Linux, UnRAR.dll ensures that the Unicode name
is converted to UTF-8 (or whatever the system locale is set to),
so we can just strdup() that field directly.

This fixes loading a ROM file with a Unicode name from a RAR archive.

3 years ago[libgensfile] Rar::readFile(): Implemented file reading.
David Korth [Sat, 9 Jan 2016 09:05:41 +0000 (04:05 -0500)] 
[libgensfile] Rar::readFile(): Implemented file reading.

I can now load a ROM with a non-ASCII filename from a RAR file
with a non-ASCII filename on Linux. The RAR was also created
on Linux.

On Windows, I can load a ROM with an ASCII filename from a RAR file
with a non-ASCII filename. If the ROM has a non-ASCII filename,
the load fails due to ANSI issues.

3 years agoc++11-compat.msvc.h: Added some wcs*() macros.
David Korth [Sat, 9 Jan 2016 09:04:42 +0000 (04:04 -0500)] 
c++11-compat.msvc.h: Added some wcs*() macros.

Same as str*(), but for wide character strings.

3 years ago[libgensfile] Rar: Handle Unicode on Windows correctly.
David Korth [Sat, 9 Jan 2016 08:42:29 +0000 (03:42 -0500)] 
[libgensfile] Rar: Handle Unicode on Windows correctly.

Windows requires conversion to UTF-16 and/or ANSI.

Linux can use UTF-8 as the "ANSI" version, but only if
the system locale is set correctly.

Also fixed a few issues that broke the MSVC build, including
returning -ENOSYS from getFile().

CMakeLists.txt: Link to libgenstext.

3 years ago[libgenstext] Encoding.cpp: Added wchar_t <-> UTF-8 functions.
David Korth [Sat, 9 Jan 2016 08:41:12 +0000 (03:41 -0500)] 
[libgenstext] Encoding.cpp: Added wchar_t <-> UTF-8 functions.

They're identical to the UTF-16 functions on Windows, but are
functionally different on Linux, since wchar_t is 32-bit there.

This may be needed for UnRAR.dll, since UnRAR.dll uses wchar_t.
I'm not sure if it uses UTF-8 for "ANSI" filenames internally
on Linux, though.

3 years agoCall setlocale(LC_ALL, "") on program startup.
David Korth [Sat, 9 Jan 2016 08:35:38 +0000 (03:35 -0500)] 
Call setlocale(LC_ALL, "") on program startup.

This updates gens-qt4, gens-sdl, and mcd_pcm.

This is needed in order for UnRAR.dll to handle UTF-8 properly on
Linux and Unix, since the wide character functions aren't initialized
if we don't set the locale.

An interesting side effect is this causes gens-sdl's OSD to show
timestamps with 4-digit years and 12-hour times on en_US, whereas
previously it was showing 2-digit years and 24-hour times.

I tested en_GB as well, and it shows DD/MM/YY format.

NOTE: Remember to use UTF-8 locales (e.g. en_US.UTF-8); otherwise,
UnRAR.dll won't be able to handle Unicode filenames properly.

NOTE 2: Test suites have NOT been updated to use setlocale().
This is intentional, and it helps to ensure that tests don't
randomly break due to a locale change.

3 years ago[libgensfile] Rar::Rar(): Close the RAR archive after checking it.
David Korth [Sat, 9 Jan 2016 08:06:12 +0000 (03:06 -0500)] 
[libgensfile] Rar::Rar(): Close the RAR archive after checking it.

No memory leaks for you.

3 years ago[libgenstext] SJIS_to_UTF8(): Source encoding is cp932, not CP_UTF8.
David Korth [Sat, 9 Jan 2016 07:33:38 +0000 (02:33 -0500)] 
[libgenstext] SJIS_to_UTF8(): Source encoding is cp932, not CP_UTF8.

Use the explicit mbs length when constructing the final UTF-8 string.
Windows' conversion functions don't guarantee that the resulting string
is NULL-terminated if we specify an explicit length for the source string,
so we have to specify an explicit length for the destination string.

3 years ago[libcompat/W32U] W32U_argv.c: #define inline on MSVC 2013 and earlier.
David Korth [Sat, 9 Jan 2016 07:09:51 +0000 (02:09 -0500)] 
[libcompat/W32U] W32U_argv.c: #define inline on MSVC 2013 and earlier.

This was added to c99-compat.msvcrt.h, but these headers are no longer
included in libcompat as of commit b27086f25844992491423a165de43a910b3fdb4f.

This is a regression from commit b27086f25844992491423a165de43a910b3fdb4f.
([libcompat] Don't include the C++ 2011 compatibility headers when compiling libcompat.)

3 years ago[libgensfile] Rar::Rar(): If the RAR couldn't be opened, close the file.
David Korth [Sat, 9 Jan 2016 06:36:51 +0000 (01:36 -0500)] 
[libgensfile] Rar::Rar(): If the RAR couldn't be opened, close the file.

Otherwise, ArchiveFactory assumes Rar is correct, and then the rest of
LibGens gets confused because the archive isn't working properly.

This is a regression from commit 203a045a480e96b849fe503eb5b921aa24e6b38c.
([libgensfile] Rar: New function openRom().)

3 years ago[libgenstext] Encoding: Optimized some functions.
David Korth [Sat, 9 Jan 2016 06:17:01 +0000 (01:17 -0500)] 
[libgenstext] Encoding: Optimized some functions.

The std::u16string functions are now declared as static inline wrappers
around the pointer/length functions. One of the old implementations was
a wrapper; the other was a full copy.

SJIS_to_Utf8(): Use explicit lengths where possible.

Also updated some function comments.

3 years ago[libgensfile] Sz.cpp: Fixed a Find/Replace error in a comment.
David Korth [Sat, 9 Jan 2016 06:00:23 +0000 (01:00 -0500)] 
[libgensfile] Sz.cpp: Fixed a Find/Replace error in a comment.

3 years ago[libgensfile] Rar: New function openRom().
David Korth [Sat, 9 Jan 2016 05:57:12 +0000 (00:57 -0500)] 
[libgensfile] Rar: New function openRom().

This function first checks the RAR magic (which works for RARv2
and later), and then attempts to open the file using UnRAR.dll.

FIXME: UnRAR.dll uses mbsrtowcs(), which is dependent on the system
locale. It also doesn't work properly for me; it fails at the first
non-ASCII character. I'll need to convert the strings to UTF-16
using libgenstext and then use the UTF-16 functions.

3 years ago[libgens] Rar.cpp: Initial port of DcRar_Win32 using libgensunrar.so.
David Korth [Sat, 9 Jan 2016 05:41:21 +0000 (00:41 -0500)] 
[libgens] Rar.cpp: Initial port of DcRar_Win32 using libgensunrar.so.

Link to libdl if it's present on the system, since this is usually
required for dlopen() and related.

FIXME: I'm not sure if the Linux version uses UTF-8 or ANSI or what.
Test it with Unicode archives created on both Linux and Windows.

TODO:
- Add LoadLibraryU() to libcompat_W32U.
- Implement readFile() and split RAR file opening into a separate function.
- Add header magic checks to other formats to improve performance.

3 years ago[unrar] dll.hpp: Use typedefs for Unix/Linux compatibility.
David Korth [Sat, 9 Jan 2016 05:38:09 +0000 (00:38 -0500)] 
[unrar] dll.hpp: Use typedefs for Unix/Linux compatibility.

The HANDLE define was causing problems with DLLEXPORT due to the
positioning of the '*'. Using a typedef fixes this.

This resulted in the following error when attempting to use dlsym():
RAROpenArchive load error: libgensunrar.so: undefined symbol: RAROpenArchive

3 years ago[libgensfile] UnRAR_dll.hpp: Fixed the include guard #endif comment.
David Korth [Sat, 9 Jan 2016 04:55:11 +0000 (23:55 -0500)] 
[libgensfile] UnRAR_dll.hpp: Fixed the include guard #endif comment.

3 years ago[libgensfile] UnRAR_dll: Updated the file headers.
David Korth [Sat, 9 Jan 2016 04:54:46 +0000 (23:54 -0500)] 
[libgensfile] UnRAR_dll: Updated the file headers.

libgens -> libgensfile

3 years ago[libgensfile] UnRAR_dll.cpp: Initial port of UnRAR_dll.cpp from Decompressor.
David Korth [Sat, 9 Jan 2016 04:49:09 +0000 (23:49 -0500)] 
[libgensfile] UnRAR_dll.cpp: Initial port of UnRAR_dll.cpp from Decompressor.

Major changes:
- Support for dlopen() on Unix/Linux systems.
- All UnRAR.h functions are now loaded.
- UnRAR_dll::load() returns a POSIX error code instead of a bool.
- The RAR DLL version is checked for compatibility.
- Some functions are allowed to be nullptr if the ABI version is
  low enough. Callers should check for nullptr before attempting
  to use those function pointers.
- m_loaded was removed. Instead, m_dll_abi is used for both the
  DLL ABI version and "not loaded" (ABI == 0).
- A few errors in the Unicode/ANSI text conversion were fixed,

TODO:
- Report actual errors for DLL version compatibility and other things
  instead of a generic -EIO.
- Win32: Add LoadLibraryU().

3 years ago[libgensfile] config.libgensfile.h.in: Forgot to add this file.
David Korth [Sat, 9 Jan 2016 04:48:03 +0000 (23:48 -0500)] 
[libgensfile] config.libgensfile.h.in: Forgot to add this file.

I have too many untracked files in the gens-gs-ii directory, so I don't
notice when an actual file that should be checked in, isn't.

3 years ago[unrar] dll.hpp: #define _UNIX on Unix, Linux, and Mac OS X.
David Korth [Sat, 9 Jan 2016 04:41:22 +0000 (23:41 -0500)] 
[unrar] dll.hpp: #define _UNIX on Unix, Linux, and Mac OS X.

This is usually defined by raros.hpp when building UnRAR.dll,
but it isn't accessible by users of UnRAR.dll.

We could just define _UNIX globally on the top level, but I haven't
seen this macro used anywhere else, so #define _UNIX here if it
isn't defined and the standard Unix, Linux, or Mac OS X macros
are present.

3 years ago[unrar] dll.cpp: Don't export ProcessFile().
David Korth [Sat, 9 Jan 2016 04:25:14 +0000 (23:25 -0500)] 
[unrar] dll.cpp: Don't export ProcessFile().

This isn't part of the UnRAR.dll interface.

Added a new macro, DLLEXPORT. This macro is used instead of
PASCAL because PASCAL is used on ProcessFile().

Added DLLEXPORT to all exported functions.

Marked ProcessFile() as static, since it's not used outside
of dll.cpp.

3 years ago[unrar] CMakeLists.txt: Remove "-fno-exceptions" from CXXFLAGS.
David Korth [Sat, 9 Jan 2016 04:21:18 +0000 (23:21 -0500)] 
[unrar] CMakeLists.txt: Remove "-fno-exceptions" from CXXFLAGS.

UnRAR.dll uses exceptions, so we can't disable them.

TODO: Use CheckCXXNoExceptionsCompilerFlag()?
(though that has "-EHsc" for MSVC, which is acceptable...)

3 years ago[cmake] gcc.cmake: Fix the variable names for -fno-rtti and -fno-exceptions.
David Korth [Sat, 9 Jan 2016 04:18:02 +0000 (23:18 -0500)] 
[cmake] gcc.cmake: Fix the variable names for -fno-rtti and -fno-exceptions.

This effectively resulted in the flags not being added, so RTTI and
exception handling remained enabled.

RTTI and exceptions are now actually disabled.

CheckCXXNoExceptionsCompilerFlag.cmake: Added a note about "-EHsc"
not disabling C++ exceptions on MSVC.

3 years ago[unrar] dll.cpp: Set the visibility of RAR*() functions to "default".
David Korth [Sat, 9 Jan 2016 04:12:14 +0000 (23:12 -0500)] 
[unrar] dll.cpp: Set the visibility of RAR*() functions to "default".

This makes the functions visible in the shared library on Linux.

3 years ago[unrar] CMakeLists.txt: Build libgensunrar on non-Windows systems.
David Korth [Sat, 9 Jan 2016 04:07:51 +0000 (23:07 -0500)] 
[unrar] CMakeLists.txt: Build libgensunrar on non-Windows systems.

Removed -Wall -Wextra from CFLAGS and CXXFLAGS. UnRAR generates
lots of warnings, most of which are probably harmless. I did notice
that the "chk" functions for e.g. wcsncpy() are showing warnings,
even though the lines in question appear to be correct.

Marked the library with VERSION 0.7, SOVERSION 0. UnRAR.dll is
generally backwards-compatible, though there was an unintentional
ABI breakage with v5 on 64-bit. I'm not going to support versions
earlier than v5 on 64-bit, and those DLLs are probably rare.

TODO: When building for Windows:
- Add dll.rc.
- Use dll.def for exports.

Speaking of exports: libgensunrar.so isn't showing any exported
symbols other than the standard initialization symbols. I probably
need to add something similar to __declspec(dllexport).

3 years ago[unrar] rs16.cpp: Convert a cp1252 en dash (0x96) to UTF-8 (U+2013).
David Korth [Sat, 9 Jan 2016 03:09:03 +0000 (22:09 -0500)] 
[unrar] rs16.cpp: Convert a cp1252 en dash (0x96) to UTF-8 (U+2013).

3 years ago[unrar] Initial commit of UnRAR 5.3.9.
David Korth [Sat, 9 Jan 2016 03:04:26 +0000 (22:04 -0500)] 
[unrar] Initial commit of UnRAR 5.3.9.

On Windows systems, UnRAR won't be built at all; however, we will
use dll.hpp for the interface. Instead, the Gens/GS II zip file
will contain an original signed copy of UnRAR.dll (or UnRAR64.dll).

On other systems, I will build a copy of UnRAR as a shared library,
libgensunrar.so. It will have the same interface as UnRAR.dll on
Windows (though using the C calling convention instead of PASCAL).
It will be dlopen()'d at runtime to avoid having to directly
link to it, which should help with licensing issues.

3 years ago[libgensfile] Split the new Archive subsystem into a separate library.
David Korth [Sat, 9 Jan 2016 02:57:33 +0000 (21:57 -0500)] 
[libgensfile] Split the new Archive subsystem into a separate library.

It only depends on libcompat, and the various W32U libraries on Windows.

The classes were moved from the LibGens::File namespace to the new
LibGensFile namespace.

Updated libgens and gens-qt4 to handle the new namespace and location.

3 years ago[gens-qt4] AboutDialog.cpp: Updated for the new LZMA SDK.
David Korth [Sat, 9 Jan 2016 02:55:14 +0000 (21:55 -0500)] 
[gens-qt4] AboutDialog.cpp: Updated for the new LZMA SDK.

lzma/7z/7zVersion.h -> lzma/7zVersion.h

The copyright date is now 1999-2015.

3 years ago[lzma] Removed the now-unused 7z/CMakeLists.txt and lzmabase/CMakeLists.txt files.
David Korth [Sat, 9 Jan 2016 02:53:37 +0000 (21:53 -0500)] 
[lzma] Removed the now-unused 7z/CMakeLists.txt and lzmabase/CMakeLists.txt files.

3 years ago[lzma] Combined the 7z and lzmabase directories.
David Korth [Sat, 9 Jan 2016 02:33:11 +0000 (21:33 -0500)] 
[lzma] Combined the 7z and lzmabase directories.

There's really no reason to have separate libraries for the two.
They're part of the same component in the original LZMA SDK, and
I'm unlikely to write anything that uses one but not the other.

CheckLZMA.cmake: Updated for the library reorganization.

libgens changes:
- Sz.cpp: Updated includes for LZMA.
- ArchiveFactory: Only attempt to use 7z if the LZMA SDK is available.
  Also check for zlib and MiniZip.
- CMakeLists.txt: Only build the various decompressors if their respective
  libraries are available.
- config.libgens.h.in: Added HAVE_MINIZIP.

3 years ago[libgens] Sz.cpp: Readded the 7zMain.c note from Dc7z.
David Korth [Sat, 9 Jan 2016 02:28:50 +0000 (21:28 -0500)] 
[libgens] Sz.cpp: Readded the 7zMain.c note from Dc7z.

3 years ago[lzma] Updated the LZMA SDK to 15.14.
David Korth [Sat, 9 Jan 2016 02:21:26 +0000 (21:21 -0500)] 
[lzma] Updated the LZMA SDK to 15.14.

There's a few minor API changes, so I had to update Sz.cpp
in order to compile with the updated LZMA SDK.

3 years ago[libgens] Sz: Ported Dc7z to the Archive subsystem.
David Korth [Fri, 8 Jan 2016 05:39:02 +0000 (00:39 -0500)] 
[libgens] Sz: Ported Dc7z to the Archive subsystem.

Renamed to Sz because C++ classes can't begin with a number.

I noticed a few instances in Dc7z where m_file was set to nullptr but
wasn't closed. That seems like a leak, since the LZMA SDK opens the
file by itself. I fixed those leaks in the Archive version.

3 years ago[libgens] Disabled the Decompressor subsystem.
David Korth [Fri, 8 Jan 2016 05:06:32 +0000 (00:06 -0500)] 
[libgens] Disabled the Decompressor subsystem.

The RAR and 7zip decompressors need to be ported to Archive.
For now, I'll just disable the Decompressor subsystem.

Note that this breaks gens-qt4, since it stores the RAR program/DLL
in the DcRar class, and #including any Decompressor headers results
in an error due to an #error I added to Decompressor.hpp.

Archive.hpp, Rom.hpp: Minor changes to adjust for this change.

3 years agoReverted three commits to bring back external UnRAR and Decompressors temporarily.
David Korth [Fri, 8 Jan 2016 04:56:25 +0000 (23:56 -0500)] 
Reverted three commits to bring back external UnRAR and Decompressors temporarily.

Commits reverted:

- "[gens-qt4] translations/*.ts: Updated the translation files using lupdate.sh."
  bcbc5302c86bf2323af5e5d3d2fb0ad63963e931

- "[gens-qt4] Removed the UnRAR external program and/or DLL option."
  35e74efe9a501df0ee832941a5485c25adc1fc7e

- "[libgens] Removed the Decompressor subsystem."
  c28895398ddd95fb4fda0d16736bcb6b17ca4cc8

While attempting to add support for libarchive, I encountered two
rather major issues that I didn't see previously:

- 7z files could be opened, but libarchive failed when attempting
  to read the central directory.

- RAR files couldn't be opened at all, and it turns out that
  libarchive only supports RARv3. RARv4 is the most common
  version right now, so that makes it rather useless.

This reverts commit c28895398ddd95fb4fda0d16736bcb6b17ca4cc8.

3 years ago[libgens] File/: readFile()'s ret_siz parameter is file_offset_t*, not size_t*. ...
David Korth [Fri, 8 Jan 2016 04:04:47 +0000 (23:04 -0500)] 
[libgens] File/: readFile()'s ret_siz parameter is file_offset_t*, not size_t*. (.cpp files)

Like commit b18ae389d8f8b73b9cd8fe82cf31fc82dee89a2d, but for .cpp files
instead of .hpp files.

3 years ago[libgens] Gzip: Close the file before setting the error code.
David Korth [Fri, 8 Jan 2016 03:34:47 +0000 (22:34 -0500)] 
[libgens] Gzip: Close the file before setting the error code.

For consistency with the other Archive handlers.

3 years ago[libgens] MemFake: Changed the internal variables from protected to private.
David Korth [Fri, 8 Jan 2016 03:31:04 +0000 (22:31 -0500)] 
[libgens] MemFake: Changed the internal variables from protected to private.

3 years ago[libgens] File/: readFile()'s ret_siz parameter is file_offset_t*, not size_t*.
David Korth [Fri, 8 Jan 2016 03:29:46 +0000 (22:29 -0500)] 
[libgens] File/: readFile()'s ret_siz parameter is file_offset_t*, not size_t*.

Comment fixes only.

3 years ago[gens-qt4] translations/*.ts: Updated the translation files using lupdate.sh.
David Korth [Fri, 8 Jan 2016 03:23:38 +0000 (22:23 -0500)] 
[gens-qt4] translations/*.ts: Updated the translation files using lupdate.sh.

Strings related to UnRAR and external programs in general have been
removed due to the libarchive changes.

The only new strings added are system abbreviations. I'm not sure if they
actually need to be localized, or if they do, I should probably add a
separate unlocalized version. These abbreviations are displayed in the
title bar to indicate the system that is currently being emulated.

3 years ago[gens-qt4] Removed the UnRAR external program and/or DLL option.
David Korth [Fri, 8 Jan 2016 03:17:24 +0000 (22:17 -0500)] 
[gens-qt4] Removed the UnRAR external program and/or DLL option.

The new Archive subsystem doesn't support RAR directy. Instead,
libarchive will decompress RAR archives, and it doesn't need
a copy of UnRAR.dll or /usr/bin/rar .

3 years ago[libgens] Removed the Decompressor subsystem.
David Korth [Fri, 8 Jan 2016 03:10:41 +0000 (22:10 -0500)] 
[libgens] Removed the Decompressor subsystem.

The Archive subsystem supports uncompressed, gzipped, and zipped
ROMs now. Once I add libarchive, it will also support RAR and 7z,
plus a bunch of other formats.

Archive.hpp, Rom.hpp: Minor changes to adjust for the removal of
the Decompressor subsystem.

3 years ago[libcompat/W32U] minizip_iowin32u.c: Use W32U_alloca.h functions to convert strings.
David Korth [Fri, 8 Jan 2016 02:57:24 +0000 (21:57 -0500)] 
[libcompat/W32U] minizip_iowin32u.c: Use W32U_alloca.h functions to convert strings.

Note that extra casting is required because the open64 prototype
uses const void*, whereas we need const char*. We can't simply
cast it in the macro parameter because that screws up the macro.

Marked the internal functions as static.

Removed the notes about UTF-8, since W32U_IsUnicode() handles
the system UTF-8 check for us.

3 years ago[libcompat/W32U] minizip_iowin32u.c: Use W32U_IsUnicode().
David Korth [Fri, 8 Jan 2016 02:38:07 +0000 (21:38 -0500)] 
[libcompat/W32U] minizip_iowin32u.c: Use W32U_IsUnicode().

GetModuleHandleW() returns a valid handle on Win9x if KernelEx
is installed.

Removed INVALID_HANDLE_VALUE and INVALID_SET_FILE_POINTER,
since these are defined in the Windows headers.

Don't bother retrieving the iowin32 ANSI function pointer if
we already have it. This eliminates the need to fill the
function pointer table twice every time. (It's now only
filled twice the first time minizip_iowin32u.c is used.)

3 years ago[libgens] ArchiveFactory: TODO: Distinguish between "file not supported" and "file...
David Korth [Fri, 8 Jan 2016 02:28:53 +0000 (21:28 -0500)] 
[libgens] ArchiveFactory: TODO: Distinguish between "file not supported" and "file supported but broken".

If MiniZip can't open the zip file for whatever reason, Gzip is tried
next, and since Gzip always succeeds (it reads uncompressed data as
well as compressed data), a broken zip file will appear as garbage.

It should show an error message instead.

3 years ago[libcompat] Split W32U into its own library, libcompat_W32U.
David Korth [Fri, 8 Jan 2016 02:22:11 +0000 (21:22 -0500)] 
[libcompat] Split W32U into its own library, libcompat_W32U.

The W32U code was only compiled on Windows builds, but this helps to
clean up the libcompat directory a bit.

Updated all other projects that use W32U to link in libcompat_W32U.

3 years ago[gens-qt4] CMakeLists.txt: Removed SET_MSVC_DEBUG_PATH().
David Korth [Fri, 8 Jan 2016 02:19:35 +0000 (21:19 -0500)] 
[gens-qt4] CMakeLists.txt: Removed SET_MSVC_DEBUG_PATH().

DO_SPLIT_DEBUG() does this for us.

3 years ago[libcompat] Moved iowin32u.c from MiniZip to libcompat/W32U/.
David Korth [Fri, 8 Jan 2016 01:57:31 +0000 (20:57 -0500)] 
[libcompat] Moved iowin32u.c from MiniZip to libcompat/W32U/.

This file is not part of MiniZip; it's a custom I/O handler
I wrote that converts UTF-8 filenames to ANSI or UTF-16.

TODO: Use W32U functions for parts of iowin32u.

Updated everything that used iowin32u to reflect this change.

Note that minizip_iowin32u.c is compiled into a separate library,
libcompat_W32U_minizip.a. This is to prevent cross-contamination
with libcompat, since we don't want to link in MiniZip if it isn't
needed by anything.

3 years ago[libgens] MemFake: Ported DcMemFake to the Archive subsystem.
David Korth [Fri, 8 Jan 2016 01:28:36 +0000 (20:28 -0500)] 
[libgens] MemFake: Ported DcMemFake to the Archive subsystem.

This is exclusively used by test suites, such as VdpFIFOTesting.

Note that ArchiveFactory does not support MemFake, since ArchiveFactory
requires a filename.

3 years ago[libgens] Zip.cpp: Removed an extra newline.
David Korth [Fri, 8 Jan 2016 01:25:07 +0000 (20:25 -0500)] 
[libgens] Zip.cpp: Removed an extra newline.

3 years ago[libgens] Zip: Ported DcZip to the Archive subsystem.
David Korth [Fri, 8 Jan 2016 01:20:08 +0000 (20:20 -0500)] 
[libgens] Zip: Ported DcZip to the Archive subsystem.

Other than changes to get it working with the Archive class,
this is basically the same as the original.

One notable change is that getFileInfo() now uses a 4096-byte
buffer for the ROM filename instead of a 256-byte buffer.
This should help with ROM files that have very long names
and/or lots of Unicode characters.

3 years ago[libgens] Gzip: Changed m_gzFile from protected to private.
David Korth [Fri, 8 Jan 2016 01:08:54 +0000 (20:08 -0500)] 
[libgens] Gzip: Changed m_gzFile from protected to private.

I don't plan on subclassing Gzip anytime soon, and the virtual functions
are all marked as final, so a subclass wouldn't be very useful.

3 years ago[libgens] RomCartridgeMD, TmssReg: Prevent an assertion with odd-sized ROMs.
David Korth [Fri, 8 Jan 2016 01:07:49 +0000 (20:07 -0500)] 
[libgens] RomCartridgeMD, TmssReg: Prevent an assertion with odd-sized ROMs.

If the ROM has an odd size, add 1 to the size before byteswapping.
The final byte will end up being byteswapped with 0 (RomCartridgeMD)
or 0xFF (TmssReg).

TODO: Use 0 or 0xFF consistently.

Also, if the ROM buffer is larger than the actual size of the ROM, clear
the rest of the buffer after loading. Standard malloc() (and its aligned
variants) isn't guaranteed to clear the memory after allocating, though
it sure seems like it's cleared every time I've tried it. (Could be a
zero-page optimization on my system.)

3 years ago[libgens] Gzip.cpp: Return with -EBADF if m_gzFile is nullptr.
David Korth [Fri, 8 Jan 2016 00:49:45 +0000 (19:49 -0500)] 
[libgens] Gzip.cpp: Return with -EBADF if m_gzFile is nullptr.

3 years ago[libgens] Gzip::readFile(): Don't check ret_siz.
David Korth [Fri, 8 Jan 2016 00:46:26 +0000 (19:46 -0500)] 
[libgens] Gzip::readFile(): Don't check ret_siz.

This is an output parameter, not an input or in/out parameter.

3 years ago[libgens] Gzip::getFileInfo(): Use byteswapping macros for gzsize.
David Korth [Thu, 7 Jan 2016 04:54:09 +0000 (23:54 -0500)] 
[libgens] Gzip::getFileInfo(): Use byteswapping macros for gzsize.

Also, I misread the gzip specification with regards to the bitfields.
The ending CRC32 and uncompressed filesize is *always* present.
I was looking at a header CRC bit, FLG.FHCRC, which is stored in
the header, not the footer.

3 years ago[libgens] Gzip.cpp: Ported DcGzip to the Archive subsystem.
David Korth [Thu, 7 Jan 2016 04:39:09 +0000 (23:39 -0500)] 
[libgens] Gzip.cpp: Ported DcGzip to the Archive subsystem.

As a minor performance improvement, getFileInfo() now reads the
uncompressed size stored at the end of the file.

TODO: The uncompressed size is only present if a certain flag is
set in the header. Check this flag. Also, use byteswapping macros.

3 years ago[libgens] Rom::loadRom(): s/Buffer size/Size of buf/g
David Korth [Thu, 7 Jan 2016 04:34:11 +0000 (23:34 -0500)] 
[libgens] Rom::loadRom(): s/Buffer size/Size of buf/g

3 years ago[libgens] Rom::loadRom(): Updated the function comments.
David Korth [Thu, 7 Jan 2016 04:32:32 +0000 (23:32 -0500)] 
[libgens] Rom::loadRom(): Updated the function comments.

Removed the note about SMD format, since it's no longer applicable.

3 years ago[libgens] RomCartridgeMD::loadRom(): Don't add 512 bytes for SMD anymore.
David Korth [Thu, 7 Jan 2016 04:30:49 +0000 (23:30 -0500)] 
[libgens] RomCartridgeMD::loadRom(): Don't add 512 bytes for SMD anymore.

Rom::loadRom() no longer needs the extra 512 bytes for the SMD header,
since Archive::readFile() supports seeking before reading.

3 years ago[libgens] Rom::loadRom(): Skip the SMD header when reading the ROM data.
David Korth [Thu, 7 Jan 2016 04:27:11 +0000 (23:27 -0500)] 
[libgens] Rom::loadRom(): Skip the SMD header when reading the ROM data.

Archive::readFile() supports skipping an arbitrary number of bytes
before reading data. Use that so we don't have to manually adjust
the buffers (and require the ROM buffer to be 512 bytes larger than
it needs to be).

3 years ago[libgens] Rom: Use Archive instead of Decompressor.
David Korth [Thu, 7 Jan 2016 04:17:56 +0000 (23:17 -0500)] 
[libgens] Rom: Use Archive instead of Decompressor.

TODO: Port DcMemFake to the Archive subsystem. For now, it's disabled.
Note that DcMemFake is only used by test suites.

Note that only uncompressed ROMs will work after this change. Also, if
you load a ROM image that's an odd number of bytes, an assertion will
occur due to the byteswapping code.

3 years ago[libgens] Archive::readFile(): Compare *ret_siz to read_len, not siz.
David Korth [Thu, 7 Jan 2016 04:14:28 +0000 (23:14 -0500)] 
[libgens] Archive::readFile(): Compare *ret_siz to read_len, not siz.

siz is the total size of the buffer. read_len is the amount of
data we actually want to read in.

This fixes an error that occurred if the ROM size is not a multiple
of 512 KB, since the ROM buffer is rounded up to the nearest 512 KB.

3 years ago[libgens] ArchiveFactory: New factory class for Archive objects.
David Korth [Thu, 7 Jan 2016 03:58:27 +0000 (22:58 -0500)] 
[libgens] ArchiveFactory: New factory class for Archive objects.

This currently just uses the Archive base class, but other subclasses
will be added later.

3 years ago[libgens] Archive::readFile(): Cast read_len to size_t for fread().
David Korth [Thu, 7 Jan 2016 03:57:52 +0000 (22:57 -0500)] 
[libgens] Archive::readFile(): Cast read_len to size_t for fread().

3 years ago[libgens] Archive.cpp: Removed an unused #include <string>.
David Korth [Thu, 7 Jan 2016 03:55:51 +0000 (22:55 -0500)] 
[libgens] Archive.cpp: Removed an unused #include <string>.

3 years ago[libgens] Archive::readFile(): Respect the start_pos and read_len parameters.
David Korth [Thu, 7 Jan 2016 03:51:51 +0000 (22:51 -0500)] 
[libgens] Archive::readFile(): Respect the start_pos and read_len parameters.

These parameters can be used to read a part of the file instead
of the entire file.

Updated the inline overload to allow short reads by setting read_len
to std::min(z_entry->filesize, siz).

TODO: Convert z_entry->filesize to file_offset_t? This is a new typedef
I added that's basically just int64_t. I need to ensure that all of the
libraries use 64-bit file offsets to reduce problems.

3 years ago[libgens] Archive.hpp: Added a Q_DISABLE_COPY() equivalent.
David Korth [Thu, 7 Jan 2016 03:47:09 +0000 (22:47 -0500)] 
[libgens] Archive.hpp: Added a Q_DISABLE_COPY() equivalent.

3 years ago[libgens] Archive: Initial Archive base class.
David Korth [Thu, 7 Jan 2016 03:44:17 +0000 (22:44 -0500)] 
[libgens] Archive: Initial Archive base class.

The Archive (File) subsystem is basically a rearchitecting of the
Decompressor system with deprecated stuff removed and performance
improvements. Among other things, I will be removing the built-in
RAR and 7z decompressors in favor of using libarchive, which supports
RAR (without UnRAR.dll or /usr/bin/rar), 7z, and lots of other formats,
including XZ, LHA, CAB, and other, more obscure formats

3 years ago[libcompat] CMakeLists.txt: Added a note about CHECK_SYMBOL_EXISTS().
David Korth [Thu, 7 Jan 2016 03:38:07 +0000 (22:38 -0500)] 
[libcompat] CMakeLists.txt: Added a note about CHECK_SYMBOL_EXISTS().

It works if localtime_s() is a macro (MSVC), but not for a __forceinline
function (MinGW-w64).