3 years ago[libzomg] Metadata_win32.cpp::getUserName_ansi(): Only check for NULLs if cbUsername...
David Korth [Sun, 3 Apr 2016 05:35:53 +0000 (01:35 -0400)] 
[libzomg] Metadata_win32.cpp::getUserName_ansi(): Only check for NULLs if cbUsername > 0.

Found using cppcheck-1.72.

3 years ago[gens-sdl] Fixed a few errors found with cppcheck-1.72.
David Korth [Sun, 3 Apr 2016 05:31:29 +0000 (01:31 -0400)] 
[gens-sdl] Fixed a few errors found with cppcheck-1.72.

EmuLoopPrivate: Removed 'frameskip'. This variable was already
defined in EventLoopPrivate.

VBackend: Initialize m_forceFbDirty to true.

3 years ago[gens-sdl] EmuLoop::run(): Added support for ROM region auto-detection.
David Korth [Sun, 3 Apr 2016 02:29:52 +0000 (22:29 -0400)] 
[gens-sdl] EmuLoop::run(): Added support for ROM region auto-detection.

Currently always uses the 0x4812 detection order. (US, Europe, Japan, Asia)

Options.cpp: Added a region code "auto". This is now the default.

3 years ago[libgens] Moved auto-detect code from gens-qt4 to SysVersion.
David Korth [Sun, 3 Apr 2016 02:17:14 +0000 (22:17 -0400)] 
[libgens] Moved auto-detect code from gens-qt4 to SysVersion.

This will allow the auto-detect code to be reused by gens-sdl.

[gens-qt4] EmuManager.cpp:
- TODO: Remove GetLgRegionCode().

3 years ago[libgens] macros/common.h: ARRAY_SIZE(): Use (int) casts, not (size_t) casts.
David Korth [Sun, 3 Apr 2016 02:13:34 +0000 (22:13 -0400)] 
[libgens] macros/common.h: ARRAY_SIZE(): Use (int) casts, not (size_t) casts.

Fixes an issue where size_t isn't available in SysVersion.cpp, which will
be added in the next commit.

Also, it should be (int) anyway, since the first part was already (int).

3 years ago[gens-sdl] Options: Added a '--region' option.
David Korth [Sun, 3 Apr 2016 01:50:42 +0000 (21:50 -0400)] 
[gens-sdl] Options: Added a '--region' option.

Currently does not support auto-detection.

EmuLoop.cpp: Use the region specified on the command line.

This allows gens-sdl to run ROMs in PAL.

3 years ago[libgens] EmuContextFactory::createContext(): Added a region parameter.
David Korth [Sun, 3 Apr 2016 01:34:00 +0000 (21:34 -0400)] 
[libgens] EmuContextFactory::createContext(): Added a region parameter.

This allows setting the initial region.

[gens-qt4] EmuManager: Specify lg_region when creating EmuContext.

This fixes the initial region. Previously, it was always set to
SysVersion::REGION_US_NTSC, regardless of the user's setting.

This fixes a regression from commit f1f539b164d3421025be8d0a70f4932cb1bd06f6.
([gens-qt4] EmuManager::loadRom_int(): Support loading Pico ROMs.)

3 years ago[libgens] SoundMgr::ReInit(): Copy the last extrapolation value to 8 more lines.
David Korth [Sun, 3 Apr 2016 01:22:34 +0000 (21:22 -0400)] 
[libgens] SoundMgr::ReInit(): Copy the last extrapolation value to 8 more lines.

This may help at the end of the frame.

3 years ago[libgens] SoundMgr: 'line' might be 263 or 313 at the end of the frame.
David Korth [Sun, 3 Apr 2016 01:19:46 +0000 (21:19 -0400)] 
[libgens] SoundMgr: 'line' might be 263 or 313 at the end of the frame.

This fixes an assertion in gens-qt4 when using PAL regions.

TODO: Figure out why.

3 years ago[gens-sdl] Options: Marked "no-auto-fix-checksum" as the default setting.
David Korth [Sun, 3 Apr 2016 00:53:26 +0000 (20:53 -0400)] 
[gens-sdl] Options: Marked "no-auto-fix-checksum" as the default setting.

3 years agoDisable auto-fix checksum by default.
David Korth [Sun, 3 Apr 2016 00:44:48 +0000 (20:44 -0400)] 
Disable auto-fix checksum by default.

It causes more problems than it helps solve due to ROMs that use
non-standard checksum algorithms.

3 years ago[libgens] Vdp: Use symbolic constants for register bits.
David Korth [Thu, 31 Mar 2016 03:59:44 +0000 (23:59 -0400)] 
[libgens] Vdp: Use symbolic constants for register bits.

Other changes:

- Reg.#01 (Mode Set 2): Check if M1 was changed. Previously, 0x8C
  was checked, which included 128K, M2, and M5, but not M1.
- Reg.#11 (Mode Set 3): Updated the comment to indicate the correct bit.

3 years ago[libgens] VdpReg.hpp: Added VDP_REG_M5_SET1_M4 as a synonym for VDP_REG_M5_SET1_PSEL.
David Korth [Thu, 31 Mar 2016 03:44:13 +0000 (23:44 -0400)] 
[libgens] VdpReg.hpp: Added VDP_REG_M5_SET1_M4 as a synonym for VDP_REG_M5_SET1_PSEL.

3 years ago[libgens] VdpReg.hpp: Added #defines for VDP register bits.
David Korth [Thu, 31 Mar 2016 03:42:08 +0000 (23:42 -0400)] 
[libgens] VdpReg.hpp: Added #defines for VDP register bits.

I'll start to use symbolic constants instead of magic numbers in order
to avoid problems like the one with "Bubba 'N' Stix", where the wrong
value was used to check "DMA Enabled".

3 years ago[libgens] RomCartridgeMD: "Cadash" (JU) has a non-standard checksum.
David Korth [Thu, 31 Mar 2016 02:39:41 +0000 (22:39 -0400)] 
[libgens] RomCartridgeMD: "Cadash" (JU) has a non-standard checksum.

This bug was reported by Alfonso on the Sega Retro Gens/GS II
compatibility list: http://segaretro.org/Gens/GS_II_Compatibility_List

3 years ago[libgens] Vdp::writeCtrlMD(): The DMA Enabled bit is Set2 & 0x10, not Set2 & 0x04.
David Korth [Thu, 31 Mar 2016 01:51:38 +0000 (21:51 -0400)] 
[libgens] Vdp::writeCtrlMD(): The DMA Enabled bit is Set2 & 0x10, not Set2 & 0x04.

This fixes broken menus and a black screen in-game in "Bubba 'N' Stix".

This bug was reported by Alfonso on the Sega Retro Gens/GS II
compatibility list: http://segaretro.org/Gens/GS_II_Compatibility_List

This fixes a regression from commit a214b411413a4bd884fbfd9e0b2b8d4d24565afd.
(VdpReg.hpp: Initial codeword refactoring.)

3 years ago[libgens] Vdp::updateVdpLines(): 224/240 is M2, not M3.
David Korth [Tue, 29 Mar 2016 04:33:17 +0000 (00:33 -0400)] 
[libgens] Vdp::updateVdpLines(): 224/240 is M2, not M3.

This fixes "World Series Baseball" inadvertently activating 240-line
mode, since it was setting M3 (H/V counter stop), and likely fixes
games that actually used 240-line mode.

VdpReg.cpp, VdpPrivate::updateVdpMode():
- Check the newly-calculated VDP_Mode instead of Set2 when determining
  if the NTSC V30 roll values should be reset.
- Only do the above check if VDP_Mode has actually changed.

3 years ago[mdZ80] LDX I/D: Fix BC=0 test.
David Korth [Tue, 29 Mar 2016 04:02:56 +0000 (00:02 -0400)] 
[mdZ80] LDX I/D: Fix BC=0 test.

This caused "Alien Soldier" (J) to crash shortly after startup.

This fixes a regression from commit 55b0288bfc06e9987a626a602d24f5ae1ebb19a2,
which was committed in September 2011!
([libgens] mdZ80: Shrunk BC, DE, HL, IX, and IY to 16-bit.)

3 years ago[libgens] RomCartridgeMD: "Alien Soldier" (J) has a non-standard checksum.
David Korth [Tue, 29 Mar 2016 02:31:31 +0000 (22:31 -0400)] 
[libgens] RomCartridgeMD: "Alien Soldier" (J) has a non-standard checksum.

The game is now starting (if the region is set to JPN; the region code
breaks auto-detect), but it crashes after a few seconds on the main menu,
or even after selecting "Game Start".

This bug was reported by Alfonso on the Sega Retro Gens/GS II
compatibility list: http://segaretro.org/Gens/GS_II_Compatibility_List

3 years agoMerge branch 'feature/switch-to-libarchive'
David Korth [Tue, 29 Mar 2016 02:09:05 +0000 (22:09 -0400)] 
Merge branch 'feature/switch-to-libarchive'

I ended up simply updating the LZMA SDK and adding a built-in copy
of UnRAR.dll for Linux (libgensunrar.so). It turns out libarchive's
7z and RAR support is completely broken (as of 3.1.2, at least).

Added .lzma and .xz support as well.

.gz and .xz loading is now optimized by reading in a stored
"uncompressed" size instead of decompressing the data twice.

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 to
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[gens-sdl] SdlHandler::scancodeToGensKey(): Marked sdlToGens[] as const.
David Korth [Sun, 10 Jan 2016 05:13:19 +0000 (00:13 -0500)] 
[gens-sdl] SdlHandler::scancodeToGensKey(): Marked sdlToGens[] as const.

Interestingly, gcc-5.3.0 automatically did this when compiled with -Og.
Testing shows that it's automatically enabled at -O1, too. With -O0,
it's kept in the .data section instead of the .rodata section.

TODO: Does MSVC also optimize this?

3 years ago[libzomg] Metadata_win32.cpp::getUserName_unicode(): Only remove trailing NULLs if...
David Korth [Sun, 10 Jan 2016 05:05:00 +0000 (00:05 -0500)] 
[libzomg] Metadata_win32.cpp::getUserName_unicode(): Only remove trailing NULLs if cchUsername > 0.

Otherwise, we end up modifying username[-1], and that's no good.

Found using cppcheck-1.70.

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

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.

- 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

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.

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

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

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

- "[libgens] Removed the Decompressor subsystem."

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.

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.