From 3b5ee1f29f0169583eca216f8bcba48f634097f8 Mon Sep 17 00:00:00 2001 From: zeromus Date: Sun, 15 Nov 2009 05:13:50 +0000 Subject: [PATCH] win32: switch 7z to an externally housed static library, same as zlib. clean up some source file license headers --- desmume/src/addons/compactFlash.cpp | 3 - desmume/src/addons/expMemory.cpp | 6 +- desmume/src/addons/gbagame.cpp | 6 +- desmume/src/addons/guitarGrip.cpp | 6 +- desmume/src/addons/none.cpp | 6 +- desmume/src/addons/rumblepak.cpp | 6 +- desmume/src/utils/decrypt/crc.cpp | 2 +- desmume/src/utils/decrypt/crc.h | 2 +- desmume/src/utils/decrypt/decrypt.cpp | 2 +- desmume/src/utils/decrypt/header.cpp | 2 +- desmume/src/utils/decrypt/header.h | 2 +- desmume/src/windows/7z/7z-4.64_from_tastools | 0 .../windows/7z/{7zip.lib => 7z-vc8-Win32.lib} | Bin 3148504 -> 3149704 bytes .../7z/{7zip-x64.lib => 7z-vc8-x64.lib} | Bin 5362010 -> 5362610 bytes desmume/src/windows/7z/7zip.sln | 26 - desmume/src/windows/7z/7zip.vcproj | 6611 ----------------- desmume/src/windows/7z/C/7zCrc.c | 35 - desmume/src/windows/7z/C/7zCrc.h | 24 - desmume/src/windows/7z/C/Aes.c | 262 - desmume/src/windows/7z/C/Aes.h | 48 - desmume/src/windows/7z/C/Alloc.c | 127 - desmume/src/windows/7z/C/Alloc.h | 32 - desmume/src/windows/7z/C/Bra.c | 133 - desmume/src/windows/7z/C/Bra.h | 60 - desmume/src/windows/7z/C/Bra86.c | 85 - desmume/src/windows/7z/C/BraIA64.c | 67 - desmume/src/windows/7z/C/BwtSort.c | 516 -- desmume/src/windows/7z/C/BwtSort.h | 24 - desmume/src/windows/7z/C/CpuArch.h | 69 - desmume/src/windows/7z/C/HuffEnc.c | 148 - desmume/src/windows/7z/C/HuffEnc.h | 21 - desmume/src/windows/7z/C/LzFind.c | 751 -- desmume/src/windows/7z/C/LzFind.h | 107 - desmume/src/windows/7z/C/LzFindMt.c | 793 -- desmume/src/windows/7z/C/LzFindMt.h | 97 - desmume/src/windows/7z/C/LzHash.h | 54 - desmume/src/windows/7z/C/LzmaDec.c | 1007 --- desmume/src/windows/7z/C/LzmaDec.h | 223 - desmume/src/windows/7z/C/LzmaEnc.c | 2275 ------ desmume/src/windows/7z/C/LzmaEnc.h | 72 - desmume/src/windows/7z/C/RotateDefs.h | 22 - desmume/src/windows/7z/C/Sha256.c | 204 - desmume/src/windows/7z/C/Sha256.h | 22 - desmume/src/windows/7z/C/Sort.c | 95 - desmume/src/windows/7z/C/Sort.h | 14 - desmume/src/windows/7z/C/Threads.c | 109 - desmume/src/windows/7z/C/Threads.h | 68 - desmume/src/windows/7z/C/Types.h | 208 - .../CPP/7zip/Archive/7z/7zCompressionMode.cpp | 3 - .../CPP/7zip/Archive/7z/7zCompressionMode.h | 50 - .../7z/CPP/7zip/Archive/7z/7zDecode.cpp | 332 - .../windows/7z/CPP/7zip/Archive/7z/7zDecode.h | 68 - .../7z/CPP/7zip/Archive/7z/7zExtract.cpp | 273 - .../CPP/7zip/Archive/7z/7zFolderInStream.cpp | 130 - .../7z/CPP/7zip/Archive/7z/7zFolderInStream.h | 66 - .../CPP/7zip/Archive/7z/7zFolderOutStream.cpp | 164 - .../CPP/7zip/Archive/7z/7zFolderOutStream.h | 60 - .../7z/CPP/7zip/Archive/7z/7zHandler.cpp | 503 -- .../7z/CPP/7zip/Archive/7z/7zHandler.h | 121 - .../7z/CPP/7zip/Archive/7z/7zHeader.cpp | 27 - .../windows/7z/CPP/7zip/Archive/7z/7zHeader.h | 97 - .../windows/7z/CPP/7zip/Archive/7z/7zIn.cpp | 1260 ---- .../src/windows/7z/CPP/7zip/Archive/7z/7zIn.h | 245 - .../windows/7z/CPP/7zip/Archive/7z/7zItem.h | 258 - .../7z/CPP/7zip/Archive/7z/7zProperties.cpp | 163 - .../7z/CPP/7zip/Archive/7z/7zProperties.h | 22 - .../7z/CPP/7zip/Archive/7z/7zRegister.cpp | 18 - .../7z/CPP/7zip/Archive/7z/7zSpecStream.cpp | 24 - .../7z/CPP/7zip/Archive/7z/7zSpecStream.h | 35 - .../windows/7z/CPP/7zip/Archive/7z/StdAfx.h | 9 - .../7z/CPP/7zip/Archive/ArchiveExports.cpp | 130 - .../CPP/7zip/Archive/BZip2/BZip2Handler.cpp | 216 - .../7z/CPP/7zip/Archive/BZip2/BZip2Handler.h | 70 - .../7z/CPP/7zip/Archive/BZip2/BZip2Item.h | 20 - .../7z/CPP/7zip/Archive/BZip2/StdAfx.h | 8 - .../7z/CPP/7zip/Archive/BZip2/bz2Register.cpp | 18 - .../CPP/7zip/Archive/Common/CoderMixer2.cpp | 121 - .../7z/CPP/7zip/Archive/Common/CoderMixer2.h | 174 - .../CPP/7zip/Archive/Common/CoderMixer2MT.cpp | 230 - .../CPP/7zip/Archive/Common/CoderMixer2MT.h | 80 - .../7zip/Archive/Common/DummyOutStream.cpp | 22 - .../CPP/7zip/Archive/Common/DummyOutStream.h | 24 - .../CPP/7zip/Archive/Common/FindSignature.cpp | 62 - .../CPP/7zip/Archive/Common/FindSignature.h | 12 - .../7zip/Archive/Common/InStreamWithCRC.cpp | 40 - .../CPP/7zip/Archive/Common/InStreamWithCRC.h | 69 - .../CPP/7zip/Archive/Common/ItemNameUtils.cpp | 59 - .../CPP/7zip/Archive/Common/ItemNameUtils.h | 24 - .../CPP/7zip/Archive/Common/MultiStream.cpp | 201 - .../7z/CPP/7zip/Archive/Common/MultiStream.h | 76 - .../7zip/Archive/Common/OutStreamWithCRC.cpp | 24 - .../7zip/Archive/Common/OutStreamWithCRC.h | 38 - .../7zip/Archive/Common/ParseProperties.cpp | 177 - .../CPP/7zip/Archive/Common/ParseProperties.h | 18 - .../7z/CPP/7zip/Archive/Common/StdAfx.h | 9 - .../7z/CPP/7zip/Archive/DllExports2.cpp | 83 - .../7z/CPP/7zip/Archive/GZip/GZipHandler.cpp | 284 - .../7z/CPP/7zip/Archive/GZip/GZipHandler.h | 65 - .../7z/CPP/7zip/Archive/GZip/GZipHeader.cpp | 20 - .../7z/CPP/7zip/Archive/GZip/GZipHeader.h | 85 - .../7z/CPP/7zip/Archive/GZip/GZipIn.cpp | 119 - .../windows/7z/CPP/7zip/Archive/GZip/GZipIn.h | 30 - .../7z/CPP/7zip/Archive/GZip/GZipItem.h | 59 - .../7z/CPP/7zip/Archive/GZip/GZipRegister.cpp | 18 - .../7z/CPP/7zip/Archive/GZip/GZipUpdate.h | 39 - .../windows/7z/CPP/7zip/Archive/GZip/StdAfx.h | 8 - .../windows/7z/CPP/7zip/Archive/IArchive.h | 237 - .../7z/CPP/7zip/Archive/Lzh/LzhCRC.cpp | 43 - .../windows/7z/CPP/7zip/Archive/Lzh/LzhCRC.h | 27 - .../7z/CPP/7zip/Archive/Lzh/LzhHandler.cpp | 387 - .../7z/CPP/7zip/Archive/Lzh/LzhHandler.h | 30 - .../7z/CPP/7zip/Archive/Lzh/LzhHeader.h | 19 - .../windows/7z/CPP/7zip/Archive/Lzh/LzhIn.cpp | 172 - .../windows/7z/CPP/7zip/Archive/Lzh/LzhIn.h | 29 - .../windows/7z/CPP/7zip/Archive/Lzh/LzhItem.h | 172 - .../7zip/Archive/Lzh/LzhOutStreamWithCRC.cpp | 27 - .../7zip/Archive/Lzh/LzhOutStreamWithCRC.h | 38 - .../7z/CPP/7zip/Archive/Lzh/LzhRegister.cpp | 13 - .../windows/7z/CPP/7zip/Archive/Lzh/StdAfx.h | 8 - .../CPP/7zip/Archive/Lzma/LzmaArcRegister.cpp | 14 - .../7zip/Archive/Lzma/LzmaFiltersDecode.cpp | 86 - .../CPP/7zip/Archive/Lzma/LzmaFiltersDecode.h | 26 - .../7z/CPP/7zip/Archive/Lzma/LzmaHandler.cpp | 243 - .../7z/CPP/7zip/Archive/Lzma/LzmaHandler.h | 69 - .../7z/CPP/7zip/Archive/Lzma/LzmaIn.cpp | 56 - .../windows/7z/CPP/7zip/Archive/Lzma/LzmaIn.h | 16 - .../7z/CPP/7zip/Archive/Lzma/LzmaItem.h | 27 - .../windows/7z/CPP/7zip/Archive/Lzma/StdAfx.h | 8 - .../7z/CPP/7zip/Archive/Rar/RarHandler.cpp | 835 --- .../7z/CPP/7zip/Archive/Rar/RarHandler.h | 60 - .../7z/CPP/7zip/Archive/Rar/RarHeader.cpp | 19 - .../7z/CPP/7zip/Archive/Rar/RarHeader.h | 224 - .../windows/7z/CPP/7zip/Archive/Rar/RarIn.cpp | 513 -- .../windows/7z/CPP/7zip/Archive/Rar/RarIn.h | 126 - .../7z/CPP/7zip/Archive/Rar/RarItem.cpp | 55 - .../windows/7z/CPP/7zip/Archive/Rar/RarItem.h | 79 - .../7z/CPP/7zip/Archive/Rar/RarRegister.cpp | 13 - .../7zip/Archive/Rar/RarVolumeInStream.cpp | 84 - .../CPP/7zip/Archive/Rar/RarVolumeInStream.h | 49 - .../windows/7z/CPP/7zip/Archive/Rar/StdAfx.h | 8 - .../CPP/7zip/Archive/Split/SplitHandler.cpp | 357 - .../7z/CPP/7zip/Archive/Split/SplitHandler.h | 37 - .../CPP/7zip/Archive/Split/SplitRegister.cpp | 20 - .../7z/CPP/7zip/Archive/Split/StdAfx.h | 8 - .../src/windows/7z/CPP/7zip/Archive/StdAfx.h | 9 - .../windows/7z/CPP/7zip/Archive/Tar/StdAfx.h | 9 - .../7z/CPP/7zip/Archive/Tar/TarHandler.cpp | 229 - .../7z/CPP/7zip/Archive/Tar/TarHandler.h | 37 - .../7z/CPP/7zip/Archive/Tar/TarHeader.cpp | 25 - .../7z/CPP/7zip/Archive/Tar/TarHeader.h | 108 - .../windows/7z/CPP/7zip/Archive/Tar/TarIn.cpp | 176 - .../windows/7z/CPP/7zip/Archive/Tar/TarIn.h | 18 - .../windows/7z/CPP/7zip/Archive/Tar/TarItem.h | 71 - .../7z/CPP/7zip/Archive/Tar/TarRegister.cpp | 18 - .../windows/7z/CPP/7zip/Archive/Zip/StdAfx.h | 8 - .../CPP/7zip/Archive/Zip/ZipCompressionMode.h | 39 - .../7z/CPP/7zip/Archive/Zip/ZipHandler.cpp | 831 --- .../7z/CPP/7zip/Archive/Zip/ZipHandler.h | 100 - .../7z/CPP/7zip/Archive/Zip/ZipHeader.cpp | 35 - .../7z/CPP/7zip/Archive/Zip/ZipHeader.h | 265 - .../windows/7z/CPP/7zip/Archive/Zip/ZipIn.cpp | 868 --- .../windows/7z/CPP/7zip/Archive/Zip/ZipIn.h | 116 - .../7z/CPP/7zip/Archive/Zip/ZipItem.cpp | 147 - .../windows/7z/CPP/7zip/Archive/Zip/ZipItem.h | 268 - .../7z/CPP/7zip/Archive/Zip/ZipItemEx.h | 34 - .../7z/CPP/7zip/Archive/Zip/ZipRegister.cpp | 21 - .../7z/CPP/7zip/Common/CreateCoder.cpp | 292 - .../windows/7z/CPP/7zip/Common/CreateCoder.h | 98 - .../windows/7z/CPP/7zip/Common/DeclareArcs.h | 28 - .../7z/CPP/7zip/Common/DeclareCodecs.h | 31 - .../7z/CPP/7zip/Common/FilterCoder.cpp | 262 - .../windows/7z/CPP/7zip/Common/FilterCoder.h | 143 - .../windows/7z/CPP/7zip/Common/InBuffer.cpp | 83 - .../src/windows/7z/CPP/7zip/Common/InBuffer.h | 81 - .../7z/CPP/7zip/Common/InOutTempBuffer.cpp | 122 - .../7z/CPP/7zip/Common/InOutTempBuffer.h | 55 - .../7z/CPP/7zip/Common/LimitedStreams.cpp | 45 - .../7z/CPP/7zip/Common/LimitedStreams.h | 54 - .../7z/CPP/7zip/Common/LockedStream.cpp | 23 - .../windows/7z/CPP/7zip/Common/LockedStream.h | 38 - .../windows/7z/CPP/7zip/Common/MemBlocks.cpp | 183 - .../windows/7z/CPP/7zip/Common/MemBlocks.h | 77 - .../windows/7z/CPP/7zip/Common/MethodId.cpp | 27 - .../src/windows/7z/CPP/7zip/Common/MethodId.h | 10 - .../7z/CPP/7zip/Common/MethodProps.cpp | 99 - .../windows/7z/CPP/7zip/Common/MethodProps.h | 41 - .../7z/CPP/7zip/Common/OffsetStream.cpp | 35 - .../windows/7z/CPP/7zip/Common/OffsetStream.h | 25 - .../windows/7z/CPP/7zip/Common/OutBuffer.cpp | 119 - .../windows/7z/CPP/7zip/Common/OutBuffer.h | 64 - .../7z/CPP/7zip/Common/OutMemStream.cpp | 142 - .../windows/7z/CPP/7zip/Common/OutMemStream.h | 96 - .../windows/7z/CPP/7zip/Common/ProgressMt.cpp | 53 - .../windows/7z/CPP/7zip/Common/ProgressMt.h | 46 - .../7z/CPP/7zip/Common/ProgressUtils.cpp | 42 - .../7z/CPP/7zip/Common/ProgressUtils.h | 34 - .../windows/7z/CPP/7zip/Common/RegisterArc.h | 33 - .../7z/CPP/7zip/Common/RegisterCodec.h | 30 - .../src/windows/7z/CPP/7zip/Common/StdAfx.h | 9 - .../7z/CPP/7zip/Common/StreamBinder.cpp | 150 - .../windows/7z/CPP/7zip/Common/StreamBinder.h | 32 - .../7z/CPP/7zip/Common/StreamObjects.cpp | 68 - .../7z/CPP/7zip/Common/StreamObjects.h | 117 - .../7z/CPP/7zip/Common/StreamUtils.cpp | 56 - .../windows/7z/CPP/7zip/Common/StreamUtils.h | 13 - .../windows/7z/CPP/7zip/Common/VirtThread.cpp | 45 - .../windows/7z/CPP/7zip/Common/VirtThread.h | 23 - .../windows/7z/CPP/7zip/Compress/BZip2Const.h | 54 - .../windows/7z/CPP/7zip/Compress/BZip2Crc.cpp | 26 - .../windows/7z/CPP/7zip/Compress/BZip2Crc.h | 31 - .../7z/CPP/7zip/Compress/BZip2Decoder.cpp | 791 -- .../7z/CPP/7zip/Compress/BZip2Decoder.h | 159 - .../7z/CPP/7zip/Compress/BZip2Register.cpp | 20 - .../7z/CPP/7zip/Compress/Bcj2Coder.cpp | 393 - .../windows/7z/CPP/7zip/Compress/Bcj2Coder.h | 125 - .../7z/CPP/7zip/Compress/Bcj2Register.cpp | 19 - .../windows/7z/CPP/7zip/Compress/BcjCoder.cpp | 15 - .../windows/7z/CPP/7zip/Compress/BcjCoder.h | 22 - .../7z/CPP/7zip/Compress/BcjRegister.cpp | 19 - .../7z/CPP/7zip/Compress/BitlDecoder.cpp | 24 - .../7z/CPP/7zip/Compress/BitlDecoder.h | 125 - .../7z/CPP/7zip/Compress/BitmDecoder.h | 66 - .../7z/CPP/7zip/Compress/BranchCoder.cpp | 19 - .../7z/CPP/7zip/Compress/BranchCoder.h | 44 - .../7z/CPP/7zip/Compress/BranchMisc.cpp | 40 - .../windows/7z/CPP/7zip/Compress/BranchMisc.h | 14 - .../7z/CPP/7zip/Compress/BranchRegister.cpp | 30 - .../windows/7z/CPP/7zip/Compress/ByteSwap.cpp | 38 - .../windows/7z/CPP/7zip/Compress/ByteSwap.h | 30 - .../7z/CPP/7zip/Compress/ByteSwapRegister.cpp | 18 - .../windows/7z/CPP/7zip/Compress/Codec.def | 4 - .../7z/CPP/7zip/Compress/CodecExports.cpp | 157 - .../7z/CPP/7zip/Compress/CopyCoder.cpp | 62 - .../windows/7z/CPP/7zip/Compress/CopyCoder.h | 32 - .../7z/CPP/7zip/Compress/CopyRegister.cpp | 14 - .../CPP/7zip/Compress/Deflate64Register.cpp | 20 - .../7z/CPP/7zip/Compress/DeflateConst.h | 134 - .../7z/CPP/7zip/Compress/DeflateDecoder.cpp | 345 - .../7z/CPP/7zip/Compress/DeflateDecoder.h | 136 - .../CPP/7zip/Compress/DeflateNsisRegister.cpp | 14 - .../7z/CPP/7zip/Compress/DeflateRegister.cpp | 21 - .../7z/CPP/7zip/Compress/HuffmanDecoder.h | 89 - .../7z/CPP/7zip/Compress/ImplodeDecoder.cpp | 219 - .../7z/CPP/7zip/Compress/ImplodeDecoder.h | 57 - .../7zip/Compress/ImplodeHuffmanDecoder.cpp | 89 - .../CPP/7zip/Compress/ImplodeHuffmanDecoder.h | 34 - .../7z/CPP/7zip/Compress/LzOutWindow.cpp | 14 - .../7z/CPP/7zip/Compress/LzOutWindow.h | 66 - .../7z/CPP/7zip/Compress/LzhDecoder.cpp | 220 - .../windows/7z/CPP/7zip/Compress/LzhDecoder.h | 106 - .../7z/CPP/7zip/Compress/LzmaDecoder.cpp | 190 - .../7z/CPP/7zip/Compress/LzmaDecoder.h | 73 - .../7z/CPP/7zip/Compress/LzmaRegister.cpp | 20 - .../src/windows/7z/CPP/7zip/Compress/Mtf8.h | 196 - .../7z/CPP/7zip/Compress/PpmdContext.h | 489 -- .../windows/7z/CPP/7zip/Compress/PpmdDecode.h | 154 - .../7z/CPP/7zip/Compress/PpmdDecoder.cpp | 182 - .../7z/CPP/7zip/Compress/PpmdDecoder.h | 86 - .../7z/CPP/7zip/Compress/PpmdRegister.cpp | 20 - .../7z/CPP/7zip/Compress/PpmdSubAlloc.h | 295 - .../windows/7z/CPP/7zip/Compress/PpmdType.h | 20 - .../windows/7z/CPP/7zip/Compress/RangeCoder.h | 204 - .../7z/CPP/7zip/Compress/RangeCoderBit.h | 113 - .../7z/CPP/7zip/Compress/Rar1Decoder.cpp | 478 -- .../7z/CPP/7zip/Compress/Rar1Decoder.h | 88 - .../7z/CPP/7zip/Compress/Rar2Decoder.cpp | 389 - .../7z/CPP/7zip/Compress/Rar2Decoder.h | 174 - .../7z/CPP/7zip/Compress/Rar3Decoder.cpp | 834 --- .../7z/CPP/7zip/Compress/Rar3Decoder.h | 301 - .../windows/7z/CPP/7zip/Compress/Rar3Vm.cpp | 1094 --- .../src/windows/7z/CPP/7zip/Compress/Rar3Vm.h | 179 - .../CPP/7zip/Compress/RarCodecsRegister.cpp | 26 - .../7z/CPP/7zip/Compress/ShrinkDecoder.cpp | 148 - .../7z/CPP/7zip/Compress/ShrinkDecoder.h | 38 - .../src/windows/7z/CPP/7zip/Compress/StdAfx.h | 8 - .../7z/CPP/7zip/Compress/ZlibDecoder.cpp | 94 - .../7z/CPP/7zip/Compress/ZlibDecoder.h | 46 - .../src/windows/7z/CPP/7zip/Crypto/7zAes.cpp | 245 - .../src/windows/7z/CPP/7zip/Crypto/7zAes.h | 117 - .../7z/CPP/7zip/Crypto/7zAesRegister.cpp | 18 - .../windows/7z/CPP/7zip/Crypto/HmacSha1.cpp | 109 - .../src/windows/7z/CPP/7zip/Crypto/HmacSha1.h | 39 - .../src/windows/7z/CPP/7zip/Crypto/MyAes.cpp | 57 - .../src/windows/7z/CPP/7zip/Crypto/MyAes.h | 48 - .../7z/CPP/7zip/Crypto/Pbkdf2HmacSha1.cpp | 83 - .../7z/CPP/7zip/Crypto/Pbkdf2HmacSha1.h | 21 - .../windows/7z/CPP/7zip/Crypto/RandGen.cpp | 107 - .../src/windows/7z/CPP/7zip/Crypto/RandGen.h | 21 - .../7z/CPP/7zip/Crypto/Rar20Crypto.cpp | 136 - .../windows/7z/CPP/7zip/Crypto/Rar20Crypto.h | 50 - .../src/windows/7z/CPP/7zip/Crypto/RarAes.cpp | 139 - .../src/windows/7z/CPP/7zip/Crypto/RarAes.h | 62 - .../src/windows/7z/CPP/7zip/Crypto/Sha1.cpp | 213 - desmume/src/windows/7z/CPP/7zip/Crypto/Sha1.h | 68 - .../src/windows/7z/CPP/7zip/Crypto/StdAfx.h | 8 - .../src/windows/7z/CPP/7zip/Crypto/WzAes.cpp | 209 - .../src/windows/7z/CPP/7zip/Crypto/WzAes.h | 119 - .../windows/7z/CPP/7zip/Crypto/ZipCrypto.cpp | 131 - .../windows/7z/CPP/7zip/Crypto/ZipCrypto.h | 71 - .../windows/7z/CPP/7zip/Crypto/ZipStrong.cpp | 180 - .../windows/7z/CPP/7zip/Crypto/ZipStrong.h | 53 - desmume/src/windows/7z/CPP/7zip/ICoder.h | 186 - desmume/src/windows/7z/CPP/7zip/IDecl.h | 15 - desmume/src/windows/7z/CPP/7zip/IPassword.h | 24 - desmume/src/windows/7z/CPP/7zip/IProgress.h | 33 - desmume/src/windows/7z/CPP/7zip/IStream.h | 58 - desmume/src/windows/7z/CPP/7zip/PropID.h | 69 - desmume/src/windows/7z/CPP/Common/Buffer.h | 77 - desmume/src/windows/7z/CPP/Common/CRC.cpp | 10 - desmume/src/windows/7z/CPP/Common/ComTry.h | 17 - desmume/src/windows/7z/CPP/Common/Defs.h | 20 - .../src/windows/7z/CPP/Common/DynamicBuffer.h | 47 - .../7z/CPP/Common/InitializeStaticLib.h | 29 - .../src/windows/7z/CPP/Common/IntToString.cpp | 63 - .../src/windows/7z/CPP/Common/IntToString.h | 15 - desmume/src/windows/7z/CPP/Common/MyCom.h | 225 - .../src/windows/7z/CPP/Common/MyException.h | 14 - .../src/windows/7z/CPP/Common/MyInitGuid.h | 15 - desmume/src/windows/7z/CPP/Common/MyMap.cpp | 140 - desmume/src/windows/7z/CPP/Common/MyMap.h | 28 - .../src/windows/7z/CPP/Common/MyString.cpp | 198 - desmume/src/windows/7z/CPP/Common/MyString.h | 631 -- desmume/src/windows/7z/CPP/Common/MyUnknown.h | 24 - .../src/windows/7z/CPP/Common/MyVector.cpp | 90 - desmume/src/windows/7z/CPP/Common/MyVector.h | 256 - desmume/src/windows/7z/CPP/Common/MyWindows.h | 214 - desmume/src/windows/7z/CPP/Common/MyXml.cpp | 209 - desmume/src/windows/7z/CPP/Common/MyXml.h | 40 - .../src/windows/7z/CPP/Common/NewHandler.cpp | 116 - .../src/windows/7z/CPP/Common/NewHandler.h | 16 - .../windows/7z/CPP/Common/StringConvert.cpp | 102 - .../src/windows/7z/CPP/Common/StringConvert.h | 73 - .../src/windows/7z/CPP/Common/StringToInt.cpp | 90 - .../src/windows/7z/CPP/Common/StringToInt.h | 18 - desmume/src/windows/7z/CPP/Common/Types.h | 14 - .../src/windows/7z/CPP/Common/UTFConvert.cpp | 145 - .../src/windows/7z/CPP/Common/UTFConvert.h | 11 - .../src/windows/7z/CPP/Common/Wildcard.cpp | 458 -- desmume/src/windows/7z/CPP/Common/Wildcard.h | 80 - desmume/src/windows/7z/CPP/Windows/Defs.h | 23 - .../src/windows/7z/CPP/Windows/FileDir.cpp | 841 --- desmume/src/windows/7z/CPP/Windows/FileDir.h | 178 - .../src/windows/7z/CPP/Windows/FileFind.cpp | 402 - desmume/src/windows/7z/CPP/Windows/FileFind.h | 153 - desmume/src/windows/7z/CPP/Windows/FileIO.cpp | 317 - desmume/src/windows/7z/CPP/Windows/FileIO.h | 99 - desmume/src/windows/7z/CPP/Windows/FileName.h | 25 - desmume/src/windows/7z/CPP/Windows/Handle.h | 37 - .../windows/7z/CPP/Windows/PropVariant.cpp | 312 - .../src/windows/7z/CPP/Windows/PropVariant.h | 57 - desmume/src/windows/7z/CPP/Windows/StdAfx.h | 9 - .../windows/7z/CPP/Windows/Synchronization.h | 168 - desmume/src/windows/7z/CPP/Windows/Thread.h | 38 - desmume/src/windows/7z/CPP/Windows/Time.cpp | 86 - desmume/src/windows/7z/CPP/Windows/Time.h | 21 - desmume/src/windows/7z/DOC/License.txt | 57 - desmume/src/windows/7z/DOC/gpl.txt | 339 - desmume/src/windows/7z/DOC/readme.txt | 48 - desmume/src/windows/7z/DOC/unRarLicense.txt | 41 - desmume/src/windows/CWindow.cpp | 3 +- desmume/src/windows/CWindow.h | 3 +- desmume/src/windows/DeSmuME_2005.vcproj | 12 +- desmume/src/windows/IORegView.cpp | 3 +- desmume/src/windows/IORegView.h | 3 +- desmume/src/windows/cheatsWin.cpp | 6 +- desmume/src/windows/cheatsWin.h | 6 +- desmume/src/windows/console.cpp | 4 +- desmume/src/windows/console.h | 5 +- desmume/src/windows/disView.cpp | 3 +- desmume/src/windows/disView.h | 3 +- desmume/src/windows/gbaslot_config.cpp | 6 +- desmume/src/windows/gbaslot_config.h | 3 +- desmume/src/windows/ginfo.cpp | 3 +- desmume/src/windows/ginfo.h | 3 +- 374 files changed, 30 insertions(+), 51157 deletions(-) create mode 100644 desmume/src/windows/7z/7z-4.64_from_tastools rename desmume/src/windows/7z/{7zip.lib => 7z-vc8-Win32.lib} (74%) rename desmume/src/windows/7z/{7zip-x64.lib => 7z-vc8-x64.lib} (82%) delete mode 100644 desmume/src/windows/7z/7zip.sln delete mode 100644 desmume/src/windows/7z/7zip.vcproj delete mode 100644 desmume/src/windows/7z/C/7zCrc.c delete mode 100644 desmume/src/windows/7z/C/7zCrc.h delete mode 100644 desmume/src/windows/7z/C/Aes.c delete mode 100644 desmume/src/windows/7z/C/Aes.h delete mode 100644 desmume/src/windows/7z/C/Alloc.c delete mode 100644 desmume/src/windows/7z/C/Alloc.h delete mode 100644 desmume/src/windows/7z/C/Bra.c delete mode 100644 desmume/src/windows/7z/C/Bra.h delete mode 100644 desmume/src/windows/7z/C/Bra86.c delete mode 100644 desmume/src/windows/7z/C/BraIA64.c delete mode 100644 desmume/src/windows/7z/C/BwtSort.c delete mode 100644 desmume/src/windows/7z/C/BwtSort.h delete mode 100644 desmume/src/windows/7z/C/CpuArch.h delete mode 100644 desmume/src/windows/7z/C/HuffEnc.c delete mode 100644 desmume/src/windows/7z/C/HuffEnc.h delete mode 100644 desmume/src/windows/7z/C/LzFind.c delete mode 100644 desmume/src/windows/7z/C/LzFind.h delete mode 100644 desmume/src/windows/7z/C/LzFindMt.c delete mode 100644 desmume/src/windows/7z/C/LzFindMt.h delete mode 100644 desmume/src/windows/7z/C/LzHash.h delete mode 100644 desmume/src/windows/7z/C/LzmaDec.c delete mode 100644 desmume/src/windows/7z/C/LzmaDec.h delete mode 100644 desmume/src/windows/7z/C/LzmaEnc.c delete mode 100644 desmume/src/windows/7z/C/LzmaEnc.h delete mode 100644 desmume/src/windows/7z/C/RotateDefs.h delete mode 100644 desmume/src/windows/7z/C/Sha256.c delete mode 100644 desmume/src/windows/7z/C/Sha256.h delete mode 100644 desmume/src/windows/7z/C/Sort.c delete mode 100644 desmume/src/windows/7z/C/Sort.h delete mode 100644 desmume/src/windows/7z/C/Threads.c delete mode 100644 desmume/src/windows/7z/C/Threads.h delete mode 100644 desmume/src/windows/7z/C/Types.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/7z/7zCompressionMode.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/7z/7zCompressionMode.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/7z/7zDecode.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/7z/7zDecode.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/7z/7zExtract.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/7z/7zFolderInStream.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/7z/7zFolderInStream.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/7z/7zFolderOutStream.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/7z/7zFolderOutStream.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/7z/7zHandler.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/7z/7zHandler.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/7z/7zHeader.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/7z/7zHeader.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/7z/7zIn.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/7z/7zIn.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/7z/7zItem.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/7z/7zProperties.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/7z/7zProperties.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/7z/7zRegister.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/7z/7zSpecStream.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/7z/7zSpecStream.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/7z/StdAfx.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/ArchiveExports.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/BZip2/BZip2Handler.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/BZip2/BZip2Handler.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/BZip2/BZip2Item.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/BZip2/StdAfx.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/BZip2/bz2Register.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Common/CoderMixer2.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Common/CoderMixer2.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Common/CoderMixer2MT.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Common/CoderMixer2MT.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Common/DummyOutStream.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Common/DummyOutStream.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Common/FindSignature.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Common/FindSignature.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Common/InStreamWithCRC.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Common/InStreamWithCRC.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Common/ItemNameUtils.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Common/ItemNameUtils.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Common/MultiStream.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Common/MultiStream.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Common/OutStreamWithCRC.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Common/OutStreamWithCRC.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Common/ParseProperties.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Common/ParseProperties.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Common/StdAfx.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/DllExports2.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipHandler.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipHandler.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipHeader.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipHeader.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipIn.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipIn.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipItem.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipRegister.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipUpdate.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/GZip/StdAfx.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/IArchive.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhCRC.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhCRC.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhHandler.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhHandler.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhHeader.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhIn.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhIn.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhItem.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhOutStreamWithCRC.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhOutStreamWithCRC.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhRegister.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Lzh/StdAfx.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaArcRegister.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaFiltersDecode.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaFiltersDecode.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaHandler.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaHandler.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaIn.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaIn.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaItem.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Lzma/StdAfx.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarHandler.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarHandler.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarHeader.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarHeader.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarIn.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarIn.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarItem.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarItem.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarRegister.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarVolumeInStream.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarVolumeInStream.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Rar/StdAfx.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Split/SplitHandler.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Split/SplitHandler.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Split/SplitRegister.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Split/StdAfx.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/StdAfx.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Tar/StdAfx.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarHandler.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarHandler.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarHeader.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarHeader.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarIn.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarIn.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarItem.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarRegister.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Zip/StdAfx.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipCompressionMode.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipHandler.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipHandler.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipHeader.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipHeader.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipIn.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipIn.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipItem.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipItem.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipItemEx.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipRegister.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/CreateCoder.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/CreateCoder.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/DeclareArcs.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/DeclareCodecs.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/FilterCoder.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/FilterCoder.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/InBuffer.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/InBuffer.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/InOutTempBuffer.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/InOutTempBuffer.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/LimitedStreams.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/LimitedStreams.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/LockedStream.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/LockedStream.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/MemBlocks.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/MemBlocks.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/MethodId.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/MethodId.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/MethodProps.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/MethodProps.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/OffsetStream.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/OffsetStream.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/OutBuffer.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/OutBuffer.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/OutMemStream.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/OutMemStream.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/ProgressMt.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/ProgressMt.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/ProgressUtils.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/ProgressUtils.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/RegisterArc.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/RegisterCodec.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/StdAfx.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/StreamBinder.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/StreamBinder.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/StreamObjects.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/StreamObjects.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/StreamUtils.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/StreamUtils.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/VirtThread.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Common/VirtThread.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/BZip2Const.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/BZip2Crc.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/BZip2Crc.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/BZip2Decoder.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/BZip2Decoder.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/BZip2Register.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/Bcj2Coder.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/Bcj2Coder.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/Bcj2Register.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/BcjCoder.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/BcjCoder.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/BcjRegister.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/BitlDecoder.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/BitlDecoder.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/BitmDecoder.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/BranchCoder.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/BranchCoder.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/BranchMisc.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/BranchMisc.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/BranchRegister.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/ByteSwap.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/ByteSwap.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/ByteSwapRegister.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/Codec.def delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/CodecExports.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/CopyCoder.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/CopyCoder.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/CopyRegister.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/Deflate64Register.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/DeflateConst.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/DeflateDecoder.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/DeflateDecoder.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/DeflateNsisRegister.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/DeflateRegister.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/HuffmanDecoder.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/ImplodeDecoder.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/ImplodeDecoder.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/ImplodeHuffmanDecoder.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/ImplodeHuffmanDecoder.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/LzOutWindow.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/LzOutWindow.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/LzhDecoder.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/LzhDecoder.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/LzmaDecoder.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/LzmaDecoder.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/LzmaRegister.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/Mtf8.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/PpmdContext.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/PpmdDecode.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/PpmdDecoder.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/PpmdDecoder.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/PpmdRegister.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/PpmdSubAlloc.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/PpmdType.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/RangeCoder.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/RangeCoderBit.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/Rar1Decoder.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/Rar1Decoder.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/Rar2Decoder.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/Rar2Decoder.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/Rar3Decoder.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/Rar3Decoder.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/Rar3Vm.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/Rar3Vm.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/RarCodecsRegister.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/ShrinkDecoder.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/ShrinkDecoder.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/StdAfx.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/ZlibDecoder.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Compress/ZlibDecoder.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Crypto/7zAes.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Crypto/7zAes.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Crypto/7zAesRegister.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Crypto/HmacSha1.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Crypto/HmacSha1.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Crypto/MyAes.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Crypto/MyAes.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Crypto/Pbkdf2HmacSha1.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Crypto/Pbkdf2HmacSha1.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Crypto/RandGen.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Crypto/RandGen.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Crypto/Rar20Crypto.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Crypto/Rar20Crypto.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Crypto/RarAes.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Crypto/RarAes.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Crypto/Sha1.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Crypto/Sha1.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Crypto/StdAfx.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Crypto/WzAes.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Crypto/WzAes.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Crypto/ZipCrypto.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Crypto/ZipCrypto.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/Crypto/ZipStrong.cpp delete mode 100644 desmume/src/windows/7z/CPP/7zip/Crypto/ZipStrong.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/ICoder.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/IDecl.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/IPassword.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/IProgress.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/IStream.h delete mode 100644 desmume/src/windows/7z/CPP/7zip/PropID.h delete mode 100644 desmume/src/windows/7z/CPP/Common/Buffer.h delete mode 100644 desmume/src/windows/7z/CPP/Common/CRC.cpp delete mode 100644 desmume/src/windows/7z/CPP/Common/ComTry.h delete mode 100644 desmume/src/windows/7z/CPP/Common/Defs.h delete mode 100644 desmume/src/windows/7z/CPP/Common/DynamicBuffer.h delete mode 100644 desmume/src/windows/7z/CPP/Common/InitializeStaticLib.h delete mode 100644 desmume/src/windows/7z/CPP/Common/IntToString.cpp delete mode 100644 desmume/src/windows/7z/CPP/Common/IntToString.h delete mode 100644 desmume/src/windows/7z/CPP/Common/MyCom.h delete mode 100644 desmume/src/windows/7z/CPP/Common/MyException.h delete mode 100644 desmume/src/windows/7z/CPP/Common/MyInitGuid.h delete mode 100644 desmume/src/windows/7z/CPP/Common/MyMap.cpp delete mode 100644 desmume/src/windows/7z/CPP/Common/MyMap.h delete mode 100644 desmume/src/windows/7z/CPP/Common/MyString.cpp delete mode 100644 desmume/src/windows/7z/CPP/Common/MyString.h delete mode 100644 desmume/src/windows/7z/CPP/Common/MyUnknown.h delete mode 100644 desmume/src/windows/7z/CPP/Common/MyVector.cpp delete mode 100644 desmume/src/windows/7z/CPP/Common/MyVector.h delete mode 100644 desmume/src/windows/7z/CPP/Common/MyWindows.h delete mode 100644 desmume/src/windows/7z/CPP/Common/MyXml.cpp delete mode 100644 desmume/src/windows/7z/CPP/Common/MyXml.h delete mode 100644 desmume/src/windows/7z/CPP/Common/NewHandler.cpp delete mode 100644 desmume/src/windows/7z/CPP/Common/NewHandler.h delete mode 100644 desmume/src/windows/7z/CPP/Common/StringConvert.cpp delete mode 100644 desmume/src/windows/7z/CPP/Common/StringConvert.h delete mode 100644 desmume/src/windows/7z/CPP/Common/StringToInt.cpp delete mode 100644 desmume/src/windows/7z/CPP/Common/StringToInt.h delete mode 100644 desmume/src/windows/7z/CPP/Common/Types.h delete mode 100644 desmume/src/windows/7z/CPP/Common/UTFConvert.cpp delete mode 100644 desmume/src/windows/7z/CPP/Common/UTFConvert.h delete mode 100644 desmume/src/windows/7z/CPP/Common/Wildcard.cpp delete mode 100644 desmume/src/windows/7z/CPP/Common/Wildcard.h delete mode 100644 desmume/src/windows/7z/CPP/Windows/Defs.h delete mode 100644 desmume/src/windows/7z/CPP/Windows/FileDir.cpp delete mode 100644 desmume/src/windows/7z/CPP/Windows/FileDir.h delete mode 100644 desmume/src/windows/7z/CPP/Windows/FileFind.cpp delete mode 100644 desmume/src/windows/7z/CPP/Windows/FileFind.h delete mode 100644 desmume/src/windows/7z/CPP/Windows/FileIO.cpp delete mode 100644 desmume/src/windows/7z/CPP/Windows/FileIO.h delete mode 100644 desmume/src/windows/7z/CPP/Windows/FileName.h delete mode 100644 desmume/src/windows/7z/CPP/Windows/Handle.h delete mode 100644 desmume/src/windows/7z/CPP/Windows/PropVariant.cpp delete mode 100644 desmume/src/windows/7z/CPP/Windows/PropVariant.h delete mode 100644 desmume/src/windows/7z/CPP/Windows/StdAfx.h delete mode 100644 desmume/src/windows/7z/CPP/Windows/Synchronization.h delete mode 100644 desmume/src/windows/7z/CPP/Windows/Thread.h delete mode 100644 desmume/src/windows/7z/CPP/Windows/Time.cpp delete mode 100644 desmume/src/windows/7z/CPP/Windows/Time.h delete mode 100644 desmume/src/windows/7z/DOC/License.txt delete mode 100644 desmume/src/windows/7z/DOC/gpl.txt delete mode 100644 desmume/src/windows/7z/DOC/readme.txt delete mode 100644 desmume/src/windows/7z/DOC/unRarLicense.txt diff --git a/desmume/src/addons/compactFlash.cpp b/desmume/src/addons/compactFlash.cpp index 46223bf0c..362ad0daa 100644 --- a/desmume/src/addons/compactFlash.cpp +++ b/desmume/src/addons/compactFlash.cpp @@ -1,7 +1,4 @@ /* Copyright (C) 2006 yopyop - yopyop156@ifrance.com - yopyop156.ifrance.com - Copyright (C) 2006 Mic Copyright (C) 2009 CrazyMax Copyright (C) 2009 DeSmuME team diff --git a/desmume/src/addons/expMemory.cpp b/desmume/src/addons/expMemory.cpp index 9b5ee670d..5826d18aa 100644 --- a/desmume/src/addons/expMemory.cpp +++ b/desmume/src/addons/expMemory.cpp @@ -1,8 +1,4 @@ -/* Copyright (C) 2006 yopyop - yopyop156@ifrance.com - yopyop156.ifrance.com - - Copyright (C) 2009 CrazyMax +/* Copyright (C) 2009 CrazyMax Copyright (C) 2009 DeSmuME team This file is part of DeSmuME diff --git a/desmume/src/addons/gbagame.cpp b/desmume/src/addons/gbagame.cpp index 8d3b4d21a..457e1d566 100644 --- a/desmume/src/addons/gbagame.cpp +++ b/desmume/src/addons/gbagame.cpp @@ -1,8 +1,4 @@ -/* Copyright (C) 2006 yopyop - yopyop156@ifrance.com - yopyop156.ifrance.com - - Copyright (C) 2009 CrazyMax +/* Copyright (C) 2009 CrazyMax Copyright (C) 2009 DeSmuME team This file is part of DeSmuME diff --git a/desmume/src/addons/guitarGrip.cpp b/desmume/src/addons/guitarGrip.cpp index be629e46d..9000ef8c0 100644 --- a/desmume/src/addons/guitarGrip.cpp +++ b/desmume/src/addons/guitarGrip.cpp @@ -1,8 +1,4 @@ -/* Copyright (C) 2006 yopyop - yopyop156@ifrance.com - yopyop156.ifrance.com - - Copyright (C) 2009 CrazyMax +/* Copyright (C) 2009 CrazyMax Copyright (C) 2009 DeSmuME team This file is part of DeSmuME diff --git a/desmume/src/addons/none.cpp b/desmume/src/addons/none.cpp index 1393fbe7e..66015e1cd 100644 --- a/desmume/src/addons/none.cpp +++ b/desmume/src/addons/none.cpp @@ -1,8 +1,4 @@ -/* Copyright (C) 2006 yopyop - yopyop156@ifrance.com - yopyop156.ifrance.com - - Copyright (C) 2009 CrazyMax +/* Copyright (C) 2009 CrazyMax Copyright (C) 2009 DeSmuME team This file is part of DeSmuME diff --git a/desmume/src/addons/rumblepak.cpp b/desmume/src/addons/rumblepak.cpp index 6c31fb19c..f8291111c 100644 --- a/desmume/src/addons/rumblepak.cpp +++ b/desmume/src/addons/rumblepak.cpp @@ -1,8 +1,4 @@ -/* Copyright (C) 2006 yopyop - yopyop156@ifrance.com - yopyop156.ifrance.com - - Copyright (C) 2009 CrazyMax +/* Copyright (C) 2009 CrazyMax Copyright (C) 2009 DeSmuME team This file is part of DeSmuME diff --git a/desmume/src/utils/decrypt/crc.cpp b/desmume/src/utils/decrypt/crc.cpp index 30f62cf9e..52f3fd37b 100644 --- a/desmume/src/utils/decrypt/crc.cpp +++ b/desmume/src/utils/decrypt/crc.cpp @@ -1,5 +1,5 @@ //taken from ndstool -//http://devkitpro.cvs.sourceforge.net/viewvc/devkitpro/tools/nds/ndstool/source/crc.cpp?revision=1.2 +//http://devkitpro.svn.sourceforge.net/viewvc/devkitpro/trunk/tools/nds/ndstool/source/crc.cpp?revision=1587 /* crc.cpp - this file is part of DeSmuME * diff --git a/desmume/src/utils/decrypt/crc.h b/desmume/src/utils/decrypt/crc.h index 38da26d76..e7ca5779e 100644 --- a/desmume/src/utils/decrypt/crc.h +++ b/desmume/src/utils/decrypt/crc.h @@ -1,5 +1,5 @@ //taken from ndstool -//http://devkitpro.cvs.sourceforge.net/viewvc/devkitpro/tools/nds/ndstool/include/crc.h?revision=1.3 +//http://devkitpro.svn.sourceforge.net/viewvc/devkitpro/trunk/tools/nds/ndstool/include/crc.h?revision=2447 /* crc.h - this file is part of DeSmuME * diff --git a/desmume/src/utils/decrypt/decrypt.cpp b/desmume/src/utils/decrypt/decrypt.cpp index 9a0de58e1..00c83f035 100644 --- a/desmume/src/utils/decrypt/decrypt.cpp +++ b/desmume/src/utils/decrypt/decrypt.cpp @@ -1,5 +1,5 @@ //taken from ndstool -//http://devkitpro.cvs.sourceforge.net/viewvc/devkitpro/tools/nds/ndstool/source/encryption.cpp?revision=1.2 +//http://devkitpro.svn.sourceforge.net/viewvc/devkitpro/trunk/tools/nds/ndstool/source/encryption.cpp?revision=1565 /* decrypt.cpp - this file is part of DeSmuME * diff --git a/desmume/src/utils/decrypt/header.cpp b/desmume/src/utils/decrypt/header.cpp index 484e7e0e8..c64dd7730 100644 --- a/desmume/src/utils/decrypt/header.cpp +++ b/desmume/src/utils/decrypt/header.cpp @@ -1,5 +1,5 @@ //taken from ndstool -//http://devkitpro.cvs.sourceforge.net/viewvc/devkitpro/tools/nds/ndstool/source/header.cpp?revision=1.23 +//http://devkitpro.svn.sourceforge.net/viewvc/devkitpro/trunk/tools/nds/ndstool/source/header.cpp?revision=3063 /* header.cpp - this file is part of DeSmuME * diff --git a/desmume/src/utils/decrypt/header.h b/desmume/src/utils/decrypt/header.h index a8eb9c380..bca8ee524 100644 --- a/desmume/src/utils/decrypt/header.h +++ b/desmume/src/utils/decrypt/header.h @@ -1,5 +1,5 @@ //taken from ndstool -//http://devkitpro.cvs.sourceforge.net/viewvc/devkitpro/tools/nds/ndstool/include/header.h?revision=1.14 +//http://devkitpro.svn.sourceforge.net/viewvc/devkitpro/trunk/tools/nds/ndstool/include/header.h?revision=2447 /* header.h - this file is part of DeSmuME * diff --git a/desmume/src/windows/7z/7z-4.64_from_tastools b/desmume/src/windows/7z/7z-4.64_from_tastools new file mode 100644 index 000000000..e69de29bb diff --git a/desmume/src/windows/7z/7zip.lib b/desmume/src/windows/7z/7z-vc8-Win32.lib similarity index 74% rename from desmume/src/windows/7z/7zip.lib rename to desmume/src/windows/7z/7z-vc8-Win32.lib index abcc91a6df9a40df4e9d86886685757c63322800..ec3d32ee9a63d7f622e4e01cd117eb2559f51513 100644 GIT binary patch delta 193557 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 %t4;%|8JPrS`2+5oXrjC?wKfrqKZH+cMG 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 diff --git a/desmume/src/windows/7z/7zip-x64.lib b/desmume/src/windows/7z/7z-vc8-x64.lib similarity index 82% rename from desmume/src/windows/7z/7zip-x64.lib rename to desmume/src/windows/7z/7z-vc8-x64.lib index f971840f9f47d05011cc120bee0f4718415a604e..fc6bd769631a7840206b81dd305c53d93a82f589 100644 GIT binary patch delta 237194 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≥aY~m0I1a&QbUFtfwE7f4EF=z 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 Ct#lv& delta 235657 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�q?v2~oZO}x-`%Zfm{&2g!kW4#h5_f1$ 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 diff --git a/desmume/src/windows/7z/7zip.sln b/desmume/src/windows/7z/7zip.sln deleted file mode 100644 index 510da469c..000000000 --- a/desmume/src/windows/7z/7zip.sln +++ /dev/null @@ -1,26 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lib7zip", "7zip.vcproj", "{5646C572-A578-49F8-9DA9-3E00A8CBFE3F}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {5646C572-A578-49F8-9DA9-3E00A8CBFE3F}.Debug|Win32.ActiveCfg = Debug|Win32 - {5646C572-A578-49F8-9DA9-3E00A8CBFE3F}.Debug|Win32.Build.0 = Debug|Win32 - {5646C572-A578-49F8-9DA9-3E00A8CBFE3F}.Debug|x64.ActiveCfg = Debug|x64 - {5646C572-A578-49F8-9DA9-3E00A8CBFE3F}.Debug|x64.Build.0 = Debug|x64 - {5646C572-A578-49F8-9DA9-3E00A8CBFE3F}.Release|Win32.ActiveCfg = Release|Win32 - {5646C572-A578-49F8-9DA9-3E00A8CBFE3F}.Release|Win32.Build.0 = Release|Win32 - {5646C572-A578-49F8-9DA9-3E00A8CBFE3F}.Release|x64.ActiveCfg = Release|x64 - {5646C572-A578-49F8-9DA9-3E00A8CBFE3F}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/desmume/src/windows/7z/7zip.vcproj b/desmume/src/windows/7z/7zip.vcproj deleted file mode 100644 index c83181604..000000000 --- a/desmume/src/windows/7z/7zip.vcproj +++ /dev/null @@ -1,6611 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/desmume/src/windows/7z/C/7zCrc.c b/desmume/src/windows/7z/C/7zCrc.c deleted file mode 100644 index 92c47de0d..000000000 --- a/desmume/src/windows/7z/C/7zCrc.c +++ /dev/null @@ -1,35 +0,0 @@ -/* 7zCrc.c -- CRC32 calculation -2008-08-05 -Igor Pavlov -Public domain */ - -#include "7zCrc.h" - -#define kCrcPoly 0xEDB88320 -UInt32 g_CrcTable[256]; - -void MY_FAST_CALL CrcGenerateTable(void) -{ - UInt32 i; - for (i = 0; i < 256; i++) - { - UInt32 r = i; - int j; - for (j = 0; j < 8; j++) - r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1)); - g_CrcTable[i] = r; - } -} - -UInt32 MY_FAST_CALL CrcUpdate(UInt32 v, const void *data, size_t size) -{ - const Byte *p = (const Byte *)data; - for (; size > 0 ; size--, p++) - v = CRC_UPDATE_BYTE(v, *p); - return v; -} - -UInt32 MY_FAST_CALL CrcCalc(const void *data, size_t size) -{ - return CrcUpdate(CRC_INIT_VAL, data, size) ^ 0xFFFFFFFF; -} diff --git a/desmume/src/windows/7z/C/7zCrc.h b/desmume/src/windows/7z/C/7zCrc.h deleted file mode 100644 index ae230991e..000000000 --- a/desmume/src/windows/7z/C/7zCrc.h +++ /dev/null @@ -1,24 +0,0 @@ -/* 7zCrc.h -- CRC32 calculation -2008-03-13 -Igor Pavlov -Public domain */ - -#ifndef __7Z_CRC_H -#define __7Z_CRC_H - -#include - -#include "Types.h" - -extern UInt32 g_CrcTable[]; - -void MY_FAST_CALL CrcGenerateTable(void); - -#define CRC_INIT_VAL 0xFFFFFFFF -#define CRC_GET_DIGEST(crc) ((crc) ^ 0xFFFFFFFF) -#define CRC_UPDATE_BYTE(crc, b) (g_CrcTable[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) - -UInt32 MY_FAST_CALL CrcUpdate(UInt32 crc, const void *data, size_t size); -UInt32 MY_FAST_CALL CrcCalc(const void *data, size_t size); - -#endif diff --git a/desmume/src/windows/7z/C/Aes.c b/desmume/src/windows/7z/C/Aes.c deleted file mode 100644 index 8c185f20b..000000000 --- a/desmume/src/windows/7z/C/Aes.c +++ /dev/null @@ -1,262 +0,0 @@ -/* Aes.c -- AES encryption / decryption -2008-08-05 -Igor Pavlov -Public domain */ - -#include "Aes.h" -#include "CpuArch.h" - -static UInt32 T[256 * 4]; -static Byte Sbox[256] = { - 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, - 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, - 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, - 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, - 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, - 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, - 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, - 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, - 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, - 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, - 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, - 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, - 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, - 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, - 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, - 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16}; - -static UInt32 D[256 * 4]; -static Byte InvS[256]; - -static Byte Rcon[11] = { 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36 }; - -#define xtime(x) ((((x) << 1) ^ (((x) & 0x80) != 0 ? 0x1B : 0)) & 0xFF) - -#define Ui32(a0, a1, a2, a3) ((UInt32)(a0) | ((UInt32)(a1) << 8) | ((UInt32)(a2) << 16) | ((UInt32)(a3) << 24)) - -#define gb0(x) ( (x) & 0xFF) -#define gb1(x) (((x) >> ( 8)) & 0xFF) -#define gb2(x) (((x) >> (16)) & 0xFF) -#define gb3(x) (((x) >> (24)) & 0xFF) - -void AesGenTables(void) -{ - unsigned i; - for (i = 0; i < 256; i++) - InvS[Sbox[i]] = (Byte)i; - for (i = 0; i < 256; i++) - { - { - UInt32 a1 = Sbox[i]; - UInt32 a2 = xtime(a1); - UInt32 a3 = xtime(a1) ^ a1; - T[ i] = Ui32(a2, a1, a1, a3); - T[0x100 + i] = Ui32(a3, a2, a1, a1); - T[0x200 + i] = Ui32(a1, a3, a2, a1); - T[0x300 + i] = Ui32(a1, a1, a3, a2); - } - { - UInt32 a1 = InvS[i]; - UInt32 a2 = xtime(a1); - UInt32 a4 = xtime(a2); - UInt32 a8 = xtime(a4); - UInt32 a9 = a8 ^ a1; - UInt32 aB = a8 ^ a2 ^ a1; - UInt32 aD = a8 ^ a4 ^ a1; - UInt32 aE = a8 ^ a4 ^ a2; - D[ i] = Ui32(aE, a9, aD, aB); - D[0x100 + i] = Ui32(aB, aE, a9, aD); - D[0x200 + i] = Ui32(aD, aB, aE, a9); - D[0x300 + i] = Ui32(a9, aD, aB, aE); - } - } -} - -#define HT(i, x, s) (T + (x << 8))[gb ## x(s[(i + x) & 3])] -#define HT4(m, i, s, p) m[i] = \ - HT(i, 0, s) ^ \ - HT(i, 1, s) ^ \ - HT(i, 2, s) ^ \ - HT(i, 3, s) ^ w[p + i] -/* such order (2031) in HT16 is for VC6/K8 speed optimization) */ -#define HT16(m, s, p) \ - HT4(m, 2, s, p); \ - HT4(m, 0, s, p); \ - HT4(m, 3, s, p); \ - HT4(m, 1, s, p); \ - -#define FT(i, x) Sbox[gb ## x(m[(i + x) & 3])] -#define FT4(i) dest[i] = Ui32(FT(i, 0), FT(i, 1), FT(i, 2), FT(i, 3)) ^ w[i]; - -#define HD(i, x, s) (D + (x << 8))[gb ## x(s[(i - x) & 3])] -#define HD4(m, i, s, p) m[i] = \ - HD(i, 0, s) ^ \ - HD(i, 1, s) ^ \ - HD(i, 2, s) ^ \ - HD(i, 3, s) ^ w[p + i]; -/* such order (0231) in HD16 is for VC6/K8 speed optimization) */ -#define HD16(m, s, p) \ - HD4(m, 0, s, p); \ - HD4(m, 2, s, p); \ - HD4(m, 3, s, p); \ - HD4(m, 1, s, p); \ - -#define FD(i, x) InvS[gb ## x(m[(i - x) & 3])] -#define FD4(i) dest[i] = Ui32(FD(i, 0), FD(i, 1), FD(i, 2), FD(i, 3)) ^ w[i]; - -void Aes_SetKeyEncode(CAes *p, const Byte *key, unsigned keySize) -{ - unsigned i, wSize; - UInt32 *w; - keySize /= 4; - p->numRounds2 = keySize / 2 + 3; - - wSize = (p->numRounds2 * 2 + 1) * 4; - w = p->rkey; - - for (i = 0; i < keySize; i++, key += 4) - w[i] = Ui32(key[0], key[1], key[2], key[3]); - - for (; i < wSize; i++) - { - UInt32 t = w[i - 1]; - unsigned rem = i % keySize; - if (rem == 0) - t = Ui32(Sbox[gb1(t)] ^ Rcon[i / keySize], Sbox[gb2(t)], Sbox[gb3(t)], Sbox[gb0(t)]); - else if (keySize > 6 && rem == 4) - t = Ui32(Sbox[gb0(t)], Sbox[gb1(t)], Sbox[gb2(t)], Sbox[gb3(t)]); - w[i] = w[i - keySize] ^ t; - } -} - -void Aes_SetKeyDecode(CAes *p, const Byte *key, unsigned keySize) -{ - unsigned i, num; - UInt32 *w; - Aes_SetKeyEncode(p, key, keySize); - num = p->numRounds2 * 8 - 4; - w = p->rkey + 4; - for (i = 0; i < num; i++) - { - UInt32 r = w[i]; - w[i] = - D[ Sbox[gb0(r)]] ^ - D[0x100 + Sbox[gb1(r)]] ^ - D[0x200 + Sbox[gb2(r)]] ^ - D[0x300 + Sbox[gb3(r)]]; - } -} - -static void AesEncode32(UInt32 *dest, const UInt32 *src, const UInt32 *w, unsigned numRounds2) -{ - UInt32 s[4]; - UInt32 m[4]; - s[0] = src[0] ^ w[0]; - s[1] = src[1] ^ w[1]; - s[2] = src[2] ^ w[2]; - s[3] = src[3] ^ w[3]; - w += 4; - for (;;) - { - HT16(m, s, 0); - if (--numRounds2 == 0) - break; - HT16(s, m, 4); - w += 8; - } - w += 4; - FT4(0); FT4(1); FT4(2); FT4(3); -} - -static void AesDecode32(UInt32 *dest, const UInt32 *src, const UInt32 *w, unsigned numRounds2) -{ - UInt32 s[4]; - UInt32 m[4]; - w += numRounds2 * 8; - s[0] = src[0] ^ w[0]; - s[1] = src[1] ^ w[1]; - s[2] = src[2] ^ w[2]; - s[3] = src[3] ^ w[3]; - for (;;) - { - w -= 8; - HD16(m, s, 4); - if (--numRounds2 == 0) - break; - HD16(s, m, 0); - } - FD4(0); FD4(1); FD4(2); FD4(3); -} - -void Aes_Encode32(const CAes *p, UInt32 *dest, const UInt32 *src) -{ - AesEncode32(dest, src, p->rkey, p->numRounds2); -} - -void Aes_Decode32(const CAes *p, UInt32 *dest, const UInt32 *src) -{ - AesDecode32(dest, src, p->rkey, p->numRounds2); -} - -void AesCbc_Init(CAesCbc *p, const Byte *iv) -{ - unsigned i; - for (i = 0; i < 4; i++) - p->prev[i] = GetUi32(iv + i * 4); -} - -SizeT AesCbc_Encode(CAesCbc *p, Byte *data, SizeT size) -{ - SizeT i; - if (size == 0) - return 0; - if (size < AES_BLOCK_SIZE) - return AES_BLOCK_SIZE; - size -= AES_BLOCK_SIZE; - for (i = 0; i <= size; i += AES_BLOCK_SIZE, data += AES_BLOCK_SIZE) - { - p->prev[0] ^= GetUi32(data); - p->prev[1] ^= GetUi32(data + 4); - p->prev[2] ^= GetUi32(data + 8); - p->prev[3] ^= GetUi32(data + 12); - - AesEncode32(p->prev, p->prev, p->aes.rkey, p->aes.numRounds2); - - SetUi32(data, p->prev[0]); - SetUi32(data + 4, p->prev[1]); - SetUi32(data + 8, p->prev[2]); - SetUi32(data + 12, p->prev[3]); - } - return i; -} - -SizeT AesCbc_Decode(CAesCbc *p, Byte *data, SizeT size) -{ - SizeT i; - UInt32 in[4], out[4]; - if (size == 0) - return 0; - if (size < AES_BLOCK_SIZE) - return AES_BLOCK_SIZE; - size -= AES_BLOCK_SIZE; - for (i = 0; i <= size; i += AES_BLOCK_SIZE, data += AES_BLOCK_SIZE) - { - in[0] = GetUi32(data); - in[1] = GetUi32(data + 4); - in[2] = GetUi32(data + 8); - in[3] = GetUi32(data + 12); - - AesDecode32(out, in, p->aes.rkey, p->aes.numRounds2); - - SetUi32(data, p->prev[0] ^ out[0]); - SetUi32(data + 4, p->prev[1] ^ out[1]); - SetUi32(data + 8, p->prev[2] ^ out[2]); - SetUi32(data + 12, p->prev[3] ^ out[3]); - - p->prev[0] = in[0]; - p->prev[1] = in[1]; - p->prev[2] = in[2]; - p->prev[3] = in[3]; - } - return i; -} diff --git a/desmume/src/windows/7z/C/Aes.h b/desmume/src/windows/7z/C/Aes.h deleted file mode 100644 index 98ef0c6ea..000000000 --- a/desmume/src/windows/7z/C/Aes.h +++ /dev/null @@ -1,48 +0,0 @@ -/* Aes.h -- AES encryption / decryption -2008-08-05 -Igor Pavlov -Public domain */ - -#ifndef __AES_H -#define __AES_H - -#include "Types.h" - -#define AES_BLOCK_SIZE 16 - -typedef struct -{ - unsigned numRounds2; /* = numRounds / 2 */ - UInt32 rkey[(14 + 1) * 4]; -} CAes; - -/* Call AesGenTables one time before other AES functions */ -void AesGenTables(void); - -/* keySize = 16 or 24 or 32 (bytes) */ -void Aes_SetKeyEncode(CAes *p, const Byte *key, unsigned keySize); -void Aes_SetKeyDecode(CAes *p, const Byte *key, unsigned keySize); - -/* Aes_Encode32 and Aes_Decode32 functions work with little-endian words. - src and dest are pointers to 4 UInt32 words. - arc and dest can point to same block */ -void Aes_Encode32(const CAes *p, UInt32 *dest, const UInt32 *src); -void Aes_Decode32(const CAes *p, UInt32 *dest, const UInt32 *src); - -typedef struct -{ - UInt32 prev[4]; - CAes aes; -} CAesCbc; - -void AesCbc_Init(CAesCbc *p, const Byte *iv); /* iv size is AES_BLOCK_SIZE */ - -/* AesCbc_Encode and AesCbc_Decode: - if (res <= size): Filter have converted res bytes - if (res > size): Filter have not converted anything. And it needs at - least res = AES_BLOCK_SIZE bytes to convert one block */ - -SizeT AesCbc_Encode(CAesCbc *p, Byte *data, SizeT size); -SizeT AesCbc_Decode(CAesCbc *p, Byte *data, SizeT size); - -#endif diff --git a/desmume/src/windows/7z/C/Alloc.c b/desmume/src/windows/7z/C/Alloc.c deleted file mode 100644 index bb24a772b..000000000 --- a/desmume/src/windows/7z/C/Alloc.c +++ /dev/null @@ -1,127 +0,0 @@ -/* Alloc.c -- Memory allocation functions -2008-09-24 -Igor Pavlov -Public domain */ - -#ifdef _WIN32 -#include -#endif -#include - -#include "Alloc.h" - -/* #define _SZ_ALLOC_DEBUG */ - -/* use _SZ_ALLOC_DEBUG to debug alloc/free operations */ -#ifdef _SZ_ALLOC_DEBUG -#include -int g_allocCount = 0; -int g_allocCountMid = 0; -int g_allocCountBig = 0; -#endif - -void *MyAlloc(size_t size) -{ - if (size == 0) - return 0; - #ifdef _SZ_ALLOC_DEBUG - { - void *p = malloc(size); - fprintf(stderr, "\nAlloc %10d bytes, count = %10d, addr = %8X", size, g_allocCount++, (unsigned)p); - return p; - } - #else - return malloc(size); - #endif -} - -void MyFree(void *address) -{ - #ifdef _SZ_ALLOC_DEBUG - if (address != 0) - fprintf(stderr, "\nFree; count = %10d, addr = %8X", --g_allocCount, (unsigned)address); - #endif - free(address); -} - -#ifdef _WIN32 - -void *MidAlloc(size_t size) -{ - if (size == 0) - return 0; - #ifdef _SZ_ALLOC_DEBUG - fprintf(stderr, "\nAlloc_Mid %10d bytes; count = %10d", size, g_allocCountMid++); - #endif - return VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE); -} - -void MidFree(void *address) -{ - #ifdef _SZ_ALLOC_DEBUG - if (address != 0) - fprintf(stderr, "\nFree_Mid; count = %10d", --g_allocCountMid); - #endif - if (address == 0) - return; - VirtualFree(address, 0, MEM_RELEASE); -} - -#ifndef MEM_LARGE_PAGES -#undef _7ZIP_LARGE_PAGES -#endif - -#ifdef _7ZIP_LARGE_PAGES -SIZE_T g_LargePageSize = 0; -typedef SIZE_T (WINAPI *GetLargePageMinimumP)(); -#endif - -void SetLargePageSize() -{ - #ifdef _7ZIP_LARGE_PAGES - SIZE_T size = 0; - GetLargePageMinimumP largePageMinimum = (GetLargePageMinimumP) - GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetLargePageMinimum"); - if (largePageMinimum == 0) - return; - size = largePageMinimum(); - if (size == 0 || (size & (size - 1)) != 0) - return; - g_LargePageSize = size; - #endif -} - - -void *BigAlloc(size_t size) -{ - if (size == 0) - return 0; - #ifdef _SZ_ALLOC_DEBUG - fprintf(stderr, "\nAlloc_Big %10d bytes; count = %10d", size, g_allocCountBig++); - #endif - - #ifdef _7ZIP_LARGE_PAGES - if (g_LargePageSize != 0 && g_LargePageSize <= (1 << 30) && size >= (1 << 18)) - { - void *res = VirtualAlloc(0, (size + g_LargePageSize - 1) & (~(g_LargePageSize - 1)), - MEM_COMMIT | MEM_LARGE_PAGES, PAGE_READWRITE); - if (res != 0) - return res; - } - #endif - return VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE); -} - -void BigFree(void *address) -{ - #ifdef _SZ_ALLOC_DEBUG - if (address != 0) - fprintf(stderr, "\nFree_Big; count = %10d", --g_allocCountBig); - #endif - - if (address == 0) - return; - VirtualFree(address, 0, MEM_RELEASE); -} - -#endif diff --git a/desmume/src/windows/7z/C/Alloc.h b/desmume/src/windows/7z/C/Alloc.h deleted file mode 100644 index a396c6b9e..000000000 --- a/desmume/src/windows/7z/C/Alloc.h +++ /dev/null @@ -1,32 +0,0 @@ -/* Alloc.h -- Memory allocation functions -2008-03-13 -Igor Pavlov -Public domain */ - -#ifndef __COMMON_ALLOC_H -#define __COMMON_ALLOC_H - -#include - -void *MyAlloc(size_t size); -void MyFree(void *address); - -#ifdef _WIN32 - -void SetLargePageSize(); - -void *MidAlloc(size_t size); -void MidFree(void *address); -void *BigAlloc(size_t size); -void BigFree(void *address); - -#else - -#define MidAlloc(size) MyAlloc(size) -#define MidFree(address) MyFree(address) -#define BigAlloc(size) MyAlloc(size) -#define BigFree(address) MyFree(address) - -#endif - -#endif diff --git a/desmume/src/windows/7z/C/Bra.c b/desmume/src/windows/7z/C/Bra.c deleted file mode 100644 index 3b75f0ccb..000000000 --- a/desmume/src/windows/7z/C/Bra.c +++ /dev/null @@ -1,133 +0,0 @@ -/* Bra.c -- Converters for RISC code -2008-10-04 : Igor Pavlov : Public domain */ - -#include "Bra.h" - -SizeT ARM_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) -{ - SizeT i; - if (size < 4) - return 0; - size -= 4; - ip += 8; - for (i = 0; i <= size; i += 4) - { - if (data[i + 3] == 0xEB) - { - UInt32 dest; - UInt32 src = ((UInt32)data[i + 2] << 16) | ((UInt32)data[i + 1] << 8) | (data[i + 0]); - src <<= 2; - if (encoding) - dest = ip + (UInt32)i + src; - else - dest = src - (ip + (UInt32)i); - dest >>= 2; - data[i + 2] = (Byte)(dest >> 16); - data[i + 1] = (Byte)(dest >> 8); - data[i + 0] = (Byte)dest; - } - } - return i; -} - -SizeT ARMT_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) -{ - SizeT i; - if (size < 4) - return 0; - size -= 4; - ip += 4; - for (i = 0; i <= size; i += 2) - { - if ((data[i + 1] & 0xF8) == 0xF0 && - (data[i + 3] & 0xF8) == 0xF8) - { - UInt32 dest; - UInt32 src = - (((UInt32)data[i + 1] & 0x7) << 19) | - ((UInt32)data[i + 0] << 11) | - (((UInt32)data[i + 3] & 0x7) << 8) | - (data[i + 2]); - - src <<= 1; - if (encoding) - dest = ip + (UInt32)i + src; - else - dest = src - (ip + (UInt32)i); - dest >>= 1; - - data[i + 1] = (Byte)(0xF0 | ((dest >> 19) & 0x7)); - data[i + 0] = (Byte)(dest >> 11); - data[i + 3] = (Byte)(0xF8 | ((dest >> 8) & 0x7)); - data[i + 2] = (Byte)dest; - i += 2; - } - } - return i; -} - -SizeT PPC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) -{ - SizeT i; - if (size < 4) - return 0; - size -= 4; - for (i = 0; i <= size; i += 4) - { - if ((data[i] >> 2) == 0x12 && (data[i + 3] & 3) == 1) - { - UInt32 src = ((UInt32)(data[i + 0] & 3) << 24) | - ((UInt32)data[i + 1] << 16) | - ((UInt32)data[i + 2] << 8) | - ((UInt32)data[i + 3] & (~3)); - - UInt32 dest; - if (encoding) - dest = ip + (UInt32)i + src; - else - dest = src - (ip + (UInt32)i); - data[i + 0] = (Byte)(0x48 | ((dest >> 24) & 0x3)); - data[i + 1] = (Byte)(dest >> 16); - data[i + 2] = (Byte)(dest >> 8); - data[i + 3] &= 0x3; - data[i + 3] |= dest; - } - } - return i; -} - -SizeT SPARC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) -{ - UInt32 i; - if (size < 4) - return 0; - size -= 4; - for (i = 0; i <= size; i += 4) - { - if (data[i] == 0x40 && (data[i + 1] & 0xC0) == 0x00 || - data[i] == 0x7F && (data[i + 1] & 0xC0) == 0xC0) - { - UInt32 src = - ((UInt32)data[i + 0] << 24) | - ((UInt32)data[i + 1] << 16) | - ((UInt32)data[i + 2] << 8) | - ((UInt32)data[i + 3]); - UInt32 dest; - - src <<= 2; - if (encoding) - dest = ip + i + src; - else - dest = src - (ip + i); - dest >>= 2; - - dest = (((0 - ((dest >> 22) & 1)) << 22) & 0x3FFFFFFF) | (dest & 0x3FFFFF) | 0x40000000; - - data[i + 0] = (Byte)(dest >> 24); - data[i + 1] = (Byte)(dest >> 16); - data[i + 2] = (Byte)(dest >> 8); - data[i + 3] = (Byte)dest; - } - } - return i; -} diff --git a/desmume/src/windows/7z/C/Bra.h b/desmume/src/windows/7z/C/Bra.h deleted file mode 100644 index b9018eb99..000000000 --- a/desmume/src/windows/7z/C/Bra.h +++ /dev/null @@ -1,60 +0,0 @@ -/* Bra.h -- Branch converters for executables -2008-10-04 : Igor Pavlov : Public domain */ - -#ifndef __BRA_H -#define __BRA_H - -#include "Types.h" - -/* -These functions convert relative addresses to absolute addresses -in CALL instructions to increase the compression ratio. - - In: - data - data buffer - size - size of data - ip - current virtual Instruction Pinter (IP) value - state - state variable for x86 converter - encoding - 0 (for decoding), 1 (for encoding) - - Out: - state - state variable for x86 converter - - Returns: - The number of processed bytes. If you call these functions with multiple calls, - you must start next call with first byte after block of processed bytes. - - Type Endian Alignment LookAhead - - x86 little 1 4 - ARMT little 2 2 - ARM little 4 0 - PPC big 4 0 - SPARC big 4 0 - IA64 little 16 0 - - size must be >= Alignment + LookAhead, if it's not last block. - If (size < Alignment + LookAhead), converter returns 0. - - Example: - - UInt32 ip = 0; - for () - { - ; size must be >= Alignment + LookAhead, if it's not last block - SizeT processed = Convert(data, size, ip, 1); - data += processed; - size -= processed; - ip += processed; - } -*/ - -#define x86_Convert_Init(state) { state = 0; } -SizeT x86_Convert(Byte *data, SizeT size, UInt32 ip, UInt32 *state, int encoding); -SizeT ARM_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); -SizeT ARMT_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); -SizeT PPC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); -SizeT SPARC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); -SizeT IA64_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); - -#endif diff --git a/desmume/src/windows/7z/C/Bra86.c b/desmume/src/windows/7z/C/Bra86.c deleted file mode 100644 index c3eda016e..000000000 --- a/desmume/src/windows/7z/C/Bra86.c +++ /dev/null @@ -1,85 +0,0 @@ -/* Bra86.c -- Converter for x86 code (BCJ) -2008-10-04 : Igor Pavlov : Public domain */ - -#include "Bra.h" - -#define Test86MSByte(b) ((b) == 0 || (b) == 0xFF) - -const Byte kMaskToAllowedStatus[8] = {1, 1, 1, 0, 1, 0, 0, 0}; -const Byte kMaskToBitNumber[8] = {0, 1, 2, 2, 3, 3, 3, 3}; - -SizeT x86_Convert(Byte *data, SizeT size, UInt32 ip, UInt32 *state, int encoding) -{ - SizeT bufferPos = 0, prevPosT; - UInt32 prevMask = *state & 0x7; - if (size < 5) - return 0; - ip += 5; - prevPosT = (SizeT)0 - 1; - - for (;;) - { - Byte *p = data + bufferPos; - Byte *limit = data + size - 4; - for (; p < limit; p++) - if ((*p & 0xFE) == 0xE8) - break; - bufferPos = (SizeT)(p - data); - if (p >= limit) - break; - prevPosT = bufferPos - prevPosT; - if (prevPosT > 3) - prevMask = 0; - else - { - prevMask = (prevMask << ((int)prevPosT - 1)) & 0x7; - if (prevMask != 0) - { - Byte b = p[4 - kMaskToBitNumber[prevMask]]; - if (!kMaskToAllowedStatus[prevMask] || Test86MSByte(b)) - { - prevPosT = bufferPos; - prevMask = ((prevMask << 1) & 0x7) | 1; - bufferPos++; - continue; - } - } - } - prevPosT = bufferPos; - - if (Test86MSByte(p[4])) - { - UInt32 src = ((UInt32)p[4] << 24) | ((UInt32)p[3] << 16) | ((UInt32)p[2] << 8) | ((UInt32)p[1]); - UInt32 dest; - for (;;) - { - Byte b; - int index; - if (encoding) - dest = (ip + (UInt32)bufferPos) + src; - else - dest = src - (ip + (UInt32)bufferPos); - if (prevMask == 0) - break; - index = kMaskToBitNumber[prevMask] * 8; - b = (Byte)((dest >> (24 - index)) & 0xFF); - if (!Test86MSByte(b)) - break; - src = dest ^ ((1 << (32 - index)) - 1); - } - p[4] = (Byte)((~(((dest >> 24) & 1) - 1)) & 0xFF); - p[3] = (Byte)((dest >> 16) & 0xFF); - p[2] = (Byte)((dest >> 8) & 0xFF); - p[1] = (Byte)(dest & 0xFF); - bufferPos += 5; - } - else - { - prevMask = ((prevMask << 1) & 0x7) | 1; - bufferPos++; - } - } - prevPosT = bufferPos - prevPosT; - *state = ((prevPosT > 3) ? 0 : ((prevMask << ((int)prevPosT - 1)) & 0x7)); - return bufferPos; -} diff --git a/desmume/src/windows/7z/C/BraIA64.c b/desmume/src/windows/7z/C/BraIA64.c deleted file mode 100644 index f359f16a3..000000000 --- a/desmume/src/windows/7z/C/BraIA64.c +++ /dev/null @@ -1,67 +0,0 @@ -/* BraIA64.c -- Converter for IA-64 code -2008-10-04 : Igor Pavlov : Public domain */ - -#include "Bra.h" - -static const Byte kBranchTable[32] = -{ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 4, 4, 6, 6, 0, 0, 7, 7, - 4, 4, 0, 0, 4, 4, 0, 0 -}; - -SizeT IA64_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) -{ - SizeT i; - if (size < 16) - return 0; - size -= 16; - for (i = 0; i <= size; i += 16) - { - UInt32 instrTemplate = data[i] & 0x1F; - UInt32 mask = kBranchTable[instrTemplate]; - UInt32 bitPos = 5; - int slot; - for (slot = 0; slot < 3; slot++, bitPos += 41) - { - UInt32 bytePos, bitRes; - UInt64 instruction, instNorm; - int j; - if (((mask >> slot) & 1) == 0) - continue; - bytePos = (bitPos >> 3); - bitRes = bitPos & 0x7; - instruction = 0; - for (j = 0; j < 6; j++) - instruction += (UInt64)data[i + j + bytePos] << (8 * j); - - instNorm = instruction >> bitRes; - if (((instNorm >> 37) & 0xF) == 0x5 && ((instNorm >> 9) & 0x7) == 0) - { - UInt32 src = (UInt32)((instNorm >> 13) & 0xFFFFF); - UInt32 dest; - src |= ((UInt32)(instNorm >> 36) & 1) << 20; - - src <<= 4; - - if (encoding) - dest = ip + (UInt32)i + src; - else - dest = src - (ip + (UInt32)i); - - dest >>= 4; - - instNorm &= ~((UInt64)(0x8FFFFF) << 13); - instNorm |= ((UInt64)(dest & 0xFFFFF) << 13); - instNorm |= ((UInt64)(dest & 0x100000) << (36 - 20)); - - instruction &= (1 << bitRes) - 1; - instruction |= (instNorm << bitRes); - for (j = 0; j < 6; j++) - data[i + j + bytePos] = (Byte)(instruction >> (8 * j)); - } - } - } - return i; -} diff --git a/desmume/src/windows/7z/C/BwtSort.c b/desmume/src/windows/7z/C/BwtSort.c deleted file mode 100644 index d6b545e83..000000000 --- a/desmume/src/windows/7z/C/BwtSort.c +++ /dev/null @@ -1,516 +0,0 @@ -/* BwtSort.c -- BWT block sorting -2008-08-17 -Igor Pavlov -Public domain */ - -#include "BwtSort.h" -#include "Sort.h" - -/* #define BLOCK_SORT_USE_HEAP_SORT */ - -#define NO_INLINE MY_FAST_CALL - -/* Don't change it !!! */ -#define kNumHashBytes 2 -#define kNumHashValues (1 << (kNumHashBytes * 8)) - -/* kNumRefBitsMax must be < (kNumHashBytes * 8) = 16 */ -#define kNumRefBitsMax 12 - -#define BS_TEMP_SIZE kNumHashValues - -#ifdef BLOCK_SORT_EXTERNAL_FLAGS - -/* 32 Flags in UInt32 word */ -#define kNumFlagsBits 5 -#define kNumFlagsInWord (1 << kNumFlagsBits) -#define kFlagsMask (kNumFlagsInWord - 1) -#define kAllFlags 0xFFFFFFFF - -#else - -#define kNumBitsMax 20 -#define kIndexMask ((1 << kNumBitsMax) - 1) -#define kNumExtraBits (32 - kNumBitsMax) -#define kNumExtra0Bits (kNumExtraBits - 2) -#define kNumExtra0Mask ((1 << kNumExtra0Bits) - 1) - -#define SetFinishedGroupSize(p, size) \ - { *(p) |= ((((size) - 1) & kNumExtra0Mask) << kNumBitsMax); \ - if ((size) > (1 << kNumExtra0Bits)) { \ - *(p) |= 0x40000000; *((p) + 1) |= ((((size) - 1)>> kNumExtra0Bits) << kNumBitsMax); } } \ - -static void SetGroupSize(UInt32 *p, UInt32 size) -{ - if (--size == 0) - return; - *p |= 0x80000000 | ((size & kNumExtra0Mask) << kNumBitsMax); - if (size >= (1 << kNumExtra0Bits)) - { - *p |= 0x40000000; - p[1] |= ((size >> kNumExtra0Bits) << kNumBitsMax); - } -} - -#endif - -/* -SortGroup - is recursive Range-Sort function with HeapSort optimization for small blocks - "range" is not real range. It's only for optimization. -returns: 1 - if there are groups, 0 - no more groups -*/ - -UInt32 NO_INLINE SortGroup(UInt32 BlockSize, UInt32 NumSortedBytes, UInt32 groupOffset, UInt32 groupSize, int NumRefBits, UInt32 *Indices - #ifndef BLOCK_SORT_USE_HEAP_SORT - , UInt32 left, UInt32 range - #endif - ) -{ - UInt32 *ind2 = Indices + groupOffset; - UInt32 *Groups; - if (groupSize <= 1) - { - /* - #ifndef BLOCK_SORT_EXTERNAL_FLAGS - SetFinishedGroupSize(ind2, 1); - #endif - */ - return 0; - } - Groups = Indices + BlockSize + BS_TEMP_SIZE; - if (groupSize <= ((UInt32)1 << NumRefBits) - #ifndef BLOCK_SORT_USE_HEAP_SORT - && groupSize <= range - #endif - ) - { - UInt32 *temp = Indices + BlockSize; - UInt32 j; - UInt32 mask, thereAreGroups, group, cg; - { - UInt32 gPrev; - UInt32 gRes = 0; - { - UInt32 sp = ind2[0] + NumSortedBytes; - if (sp >= BlockSize) sp -= BlockSize; - gPrev = Groups[sp]; - temp[0] = (gPrev << NumRefBits); - } - - for (j = 1; j < groupSize; j++) - { - UInt32 sp = ind2[j] + NumSortedBytes; - UInt32 g; - if (sp >= BlockSize) sp -= BlockSize; - g = Groups[sp]; - temp[j] = (g << NumRefBits) | j; - gRes |= (gPrev ^ g); - } - if (gRes == 0) - { - #ifndef BLOCK_SORT_EXTERNAL_FLAGS - SetGroupSize(ind2, groupSize); - #endif - return 1; - } - } - - HeapSort(temp, groupSize); - mask = ((1 << NumRefBits) - 1); - thereAreGroups = 0; - - group = groupOffset; - cg = (temp[0] >> NumRefBits); - temp[0] = ind2[temp[0] & mask]; - - { - #ifdef BLOCK_SORT_EXTERNAL_FLAGS - UInt32 *Flags = Groups + BlockSize; - #else - UInt32 prevGroupStart = 0; - #endif - - for (j = 1; j < groupSize; j++) - { - UInt32 val = temp[j]; - UInt32 cgCur = (val >> NumRefBits); - - if (cgCur != cg) - { - cg = cgCur; - group = groupOffset + j; - - #ifdef BLOCK_SORT_EXTERNAL_FLAGS - { - UInt32 t = group - 1; - Flags[t >> kNumFlagsBits] &= ~(1 << (t & kFlagsMask)); - } - #else - SetGroupSize(temp + prevGroupStart, j - prevGroupStart); - prevGroupStart = j; - #endif - } - else - thereAreGroups = 1; - { - UInt32 ind = ind2[val & mask]; - temp[j] = ind; - Groups[ind] = group; - } - } - - #ifndef BLOCK_SORT_EXTERNAL_FLAGS - SetGroupSize(temp + prevGroupStart, j - prevGroupStart); - #endif - } - - for (j = 0; j < groupSize; j++) - ind2[j] = temp[j]; - return thereAreGroups; - } - - /* Check that all strings are in one group (cannot sort) */ - { - UInt32 group, j; - UInt32 sp = ind2[0] + NumSortedBytes; if (sp >= BlockSize) sp -= BlockSize; - group = Groups[sp]; - for (j = 1; j < groupSize; j++) - { - sp = ind2[j] + NumSortedBytes; if (sp >= BlockSize) sp -= BlockSize; - if (Groups[sp] != group) - break; - } - if (j == groupSize) - { - #ifndef BLOCK_SORT_EXTERNAL_FLAGS - SetGroupSize(ind2, groupSize); - #endif - return 1; - } - } - - #ifndef BLOCK_SORT_USE_HEAP_SORT - { - /* ---------- Range Sort ---------- */ - UInt32 i; - UInt32 mid; - for (;;) - { - UInt32 j; - if (range <= 1) - { - #ifndef BLOCK_SORT_EXTERNAL_FLAGS - SetGroupSize(ind2, groupSize); - #endif - return 1; - } - mid = left + ((range + 1) >> 1); - j = groupSize; - i = 0; - do - { - UInt32 sp = ind2[i] + NumSortedBytes; if (sp >= BlockSize) sp -= BlockSize; - if (Groups[sp] >= mid) - { - for (j--; j > i; j--) - { - sp = ind2[j] + NumSortedBytes; if (sp >= BlockSize) sp -= BlockSize; - if (Groups[sp] < mid) - { - UInt32 temp = ind2[i]; ind2[i] = ind2[j]; ind2[j] = temp; - break; - } - } - if (i >= j) - break; - } - } - while (++i < j); - if (i == 0) - { - range = range - (mid - left); - left = mid; - } - else if (i == groupSize) - range = (mid - left); - else - break; - } - - #ifdef BLOCK_SORT_EXTERNAL_FLAGS - { - UInt32 t = (groupOffset + i - 1); - UInt32 *Flags = Groups + BlockSize; - Flags[t >> kNumFlagsBits] &= ~(1 << (t & kFlagsMask)); - } - #endif - - { - UInt32 j; - for (j = i; j < groupSize; j++) - Groups[ind2[j]] = groupOffset + i; - } - - { - UInt32 res = SortGroup(BlockSize, NumSortedBytes, groupOffset, i, NumRefBits, Indices, left, mid - left); - return res | SortGroup(BlockSize, NumSortedBytes, groupOffset + i, groupSize - i, NumRefBits, Indices, mid, range - (mid - left)); - } - - } - - #else - - /* ---------- Heap Sort ---------- */ - - { - UInt32 j; - for (j = 0; j < groupSize; j++) - { - UInt32 sp = ind2[j] + NumSortedBytes; if (sp >= BlockSize) sp -= BlockSize; - ind2[j] = sp; - } - - HeapSortRef(ind2, Groups, groupSize); - - /* Write Flags */ - { - UInt32 sp = ind2[0]; - UInt32 group = Groups[sp]; - - #ifdef BLOCK_SORT_EXTERNAL_FLAGS - UInt32 *Flags = Groups + BlockSize; - #else - UInt32 prevGroupStart = 0; - #endif - - for (j = 1; j < groupSize; j++) - { - sp = ind2[j]; - if (Groups[sp] != group) - { - group = Groups[sp]; - #ifdef BLOCK_SORT_EXTERNAL_FLAGS - { - UInt32 t = groupOffset + j - 1; - Flags[t >> kNumFlagsBits] &= ~(1 << (t & kFlagsMask)); - } - #else - SetGroupSize(ind2 + prevGroupStart, j - prevGroupStart); - prevGroupStart = j; - #endif - } - } - - #ifndef BLOCK_SORT_EXTERNAL_FLAGS - SetGroupSize(ind2 + prevGroupStart, j - prevGroupStart); - #endif - } - { - /* Write new Groups values and Check that there are groups */ - UInt32 thereAreGroups = 0; - for (j = 0; j < groupSize; j++) - { - UInt32 group = groupOffset + j; - #ifndef BLOCK_SORT_EXTERNAL_FLAGS - UInt32 subGroupSize = ((ind2[j] & ~0xC0000000) >> kNumBitsMax); - if ((ind2[j] & 0x40000000) != 0) - subGroupSize += ((ind2[j + 1] >> kNumBitsMax) << kNumExtra0Bits); - subGroupSize++; - for (;;) - { - UInt32 original = ind2[j]; - UInt32 sp = original & kIndexMask; - if (sp < NumSortedBytes) sp += BlockSize; sp -= NumSortedBytes; - ind2[j] = sp | (original & ~kIndexMask); - Groups[sp] = group; - if (--subGroupSize == 0) - break; - j++; - thereAreGroups = 1; - } - #else - UInt32 *Flags = Groups + BlockSize; - for (;;) - { - UInt32 sp = ind2[j]; if (sp < NumSortedBytes) sp += BlockSize; sp -= NumSortedBytes; - ind2[j] = sp; - Groups[sp] = group; - if ((Flags[(groupOffset + j) >> kNumFlagsBits] & (1 << ((groupOffset + j) & kFlagsMask))) == 0) - break; - j++; - thereAreGroups = 1; - } - #endif - } - return thereAreGroups; - } - } - #endif -} - -/* conditions: blockSize > 0 */ -UInt32 BlockSort(UInt32 *Indices, const Byte *data, UInt32 blockSize) -{ - UInt32 *counters = Indices + blockSize; - UInt32 i; - UInt32 *Groups; - #ifdef BLOCK_SORT_EXTERNAL_FLAGS - UInt32 *Flags; - #endif - - /* Radix-Sort for 2 bytes */ - for (i = 0; i < kNumHashValues; i++) - counters[i] = 0; - for (i = 0; i < blockSize - 1; i++) - counters[((UInt32)data[i] << 8) | data[i + 1]]++; - counters[((UInt32)data[i] << 8) | data[0]]++; - - Groups = counters + BS_TEMP_SIZE; - #ifdef BLOCK_SORT_EXTERNAL_FLAGS - Flags = Groups + blockSize; - { - UInt32 numWords = (blockSize + kFlagsMask) >> kNumFlagsBits; - for (i = 0; i < numWords; i++) - Flags[i] = kAllFlags; - } - #endif - - { - UInt32 sum = 0; - for (i = 0; i < kNumHashValues; i++) - { - UInt32 groupSize = counters[i]; - if (groupSize > 0) - { - #ifdef BLOCK_SORT_EXTERNAL_FLAGS - UInt32 t = sum + groupSize - 1; - Flags[t >> kNumFlagsBits] &= ~(1 << (t & kFlagsMask)); - #endif - sum += groupSize; - } - counters[i] = sum - groupSize; - } - - for (i = 0; i < blockSize - 1; i++) - Groups[i] = counters[((UInt32)data[i] << 8) | data[i + 1]]; - Groups[i] = counters[((UInt32)data[i] << 8) | data[0]]; - - for (i = 0; i < blockSize - 1; i++) - Indices[counters[((UInt32)data[i] << 8) | data[i + 1]]++] = i; - Indices[counters[((UInt32)data[i] << 8) | data[0]]++] = i; - - #ifndef BLOCK_SORT_EXTERNAL_FLAGS - { - UInt32 prev = 0; - for (i = 0; i < kNumHashValues; i++) - { - UInt32 prevGroupSize = counters[i] - prev; - if (prevGroupSize == 0) - continue; - SetGroupSize(Indices + prev, prevGroupSize); - prev = counters[i]; - } - } - #endif - } - - { - int NumRefBits; - UInt32 NumSortedBytes; - for (NumRefBits = 0; ((blockSize - 1) >> NumRefBits) != 0; NumRefBits++); - NumRefBits = 32 - NumRefBits; - if (NumRefBits > kNumRefBitsMax) - NumRefBits = kNumRefBitsMax; - - for (NumSortedBytes = kNumHashBytes; ; NumSortedBytes <<= 1) - { - #ifndef BLOCK_SORT_EXTERNAL_FLAGS - UInt32 finishedGroupSize = 0; - #endif - UInt32 newLimit = 0; - for (i = 0; i < blockSize;) - { - UInt32 groupSize; - #ifdef BLOCK_SORT_EXTERNAL_FLAGS - - if ((Flags[i >> kNumFlagsBits] & (1 << (i & kFlagsMask))) == 0) - { - i++; - continue; - } - for (groupSize = 1; - (Flags[(i + groupSize) >> kNumFlagsBits] & (1 << ((i + groupSize) & kFlagsMask))) != 0; - groupSize++); - - groupSize++; - - #else - - groupSize = ((Indices[i] & ~0xC0000000) >> kNumBitsMax); - { - Bool finishedGroup = ((Indices[i] & 0x80000000) == 0); - if ((Indices[i] & 0x40000000) != 0) - { - groupSize += ((Indices[i + 1] >> kNumBitsMax) << kNumExtra0Bits); - Indices[i + 1] &= kIndexMask; - } - Indices[i] &= kIndexMask; - groupSize++; - if (finishedGroup || groupSize == 1) - { - Indices[i - finishedGroupSize] &= kIndexMask; - if (finishedGroupSize > 1) - Indices[i - finishedGroupSize + 1] &= kIndexMask; - { - UInt32 newGroupSize = groupSize + finishedGroupSize; - SetFinishedGroupSize(Indices + i - finishedGroupSize, newGroupSize); - finishedGroupSize = newGroupSize; - } - i += groupSize; - continue; - } - finishedGroupSize = 0; - } - - #endif - - if (NumSortedBytes >= blockSize) - { - UInt32 j; - for (j = 0; j < groupSize; j++) - { - UInt32 t = (i + j); - /* Flags[t >> kNumFlagsBits] &= ~(1 << (t & kFlagsMask)); */ - Groups[Indices[t]] = t; - } - } - else - if (SortGroup(blockSize, NumSortedBytes, i, groupSize, NumRefBits, Indices - #ifndef BLOCK_SORT_USE_HEAP_SORT - , 0, blockSize - #endif - ) != 0) - newLimit = i + groupSize; - i += groupSize; - } - if (newLimit == 0) - break; - } - } - #ifndef BLOCK_SORT_EXTERNAL_FLAGS - for (i = 0; i < blockSize;) - { - UInt32 groupSize = ((Indices[i] & ~0xC0000000) >> kNumBitsMax); - if ((Indices[i] & 0x40000000) != 0) - { - groupSize += ((Indices[i + 1] >> kNumBitsMax) << kNumExtra0Bits); - Indices[i + 1] &= kIndexMask; - } - Indices[i] &= kIndexMask; - groupSize++; - i += groupSize; - } - #endif - return Groups[0]; -} - diff --git a/desmume/src/windows/7z/C/BwtSort.h b/desmume/src/windows/7z/C/BwtSort.h deleted file mode 100644 index 84c50339c..000000000 --- a/desmume/src/windows/7z/C/BwtSort.h +++ /dev/null @@ -1,24 +0,0 @@ -/* BwtSort.h -- BWT block sorting -2008-03-26 -Igor Pavlov -Public domain */ - -#ifndef __BWTSORT_H -#define __BWTSORT_H - -#include "Types.h" - -/* use BLOCK_SORT_EXTERNAL_FLAGS if blockSize can be > 1M */ -/* #define BLOCK_SORT_EXTERNAL_FLAGS */ - -#ifdef BLOCK_SORT_EXTERNAL_FLAGS -#define BLOCK_SORT_EXTERNAL_SIZE(blockSize) ((((blockSize) + 31) >> 5)) -#else -#define BLOCK_SORT_EXTERNAL_SIZE(blockSize) 0 -#endif - -#define BLOCK_SORT_BUF_SIZE(blockSize) ((blockSize) * 2 + BLOCK_SORT_EXTERNAL_SIZE(blockSize) + (1 << 16)) - -UInt32 BlockSort(UInt32 *indices, const Byte *data, UInt32 blockSize); - -#endif diff --git a/desmume/src/windows/7z/C/CpuArch.h b/desmume/src/windows/7z/C/CpuArch.h deleted file mode 100644 index 006361f2f..000000000 --- a/desmume/src/windows/7z/C/CpuArch.h +++ /dev/null @@ -1,69 +0,0 @@ -/* CpuArch.h -2008-08-05 -Igor Pavlov -Public domain */ - -#ifndef __CPUARCH_H -#define __CPUARCH_H - -/* -LITTLE_ENDIAN_UNALIGN means: - 1) CPU is LITTLE_ENDIAN - 2) it's allowed to make unaligned memory accesses -if LITTLE_ENDIAN_UNALIGN is not defined, it means that we don't know -about these properties of platform. -*/ - -#if defined(_M_IX86) || defined(_M_X64) || defined(_M_AMD64) || defined(__i386__) || defined(__x86_64__) -#define LITTLE_ENDIAN_UNALIGN -#endif - -#ifdef LITTLE_ENDIAN_UNALIGN - -#define GetUi16(p) (*(const UInt16 *)(p)) -#define GetUi32(p) (*(const UInt32 *)(p)) -#define GetUi64(p) (*(const UInt64 *)(p)) -#define SetUi32(p, d) *(UInt32 *)(p) = (d); - -#else - -#define GetUi16(p) (((const Byte *)(p))[0] | ((UInt16)((const Byte *)(p))[1] << 8)) - -#define GetUi32(p) ( \ - ((const Byte *)(p))[0] | \ - ((UInt32)((const Byte *)(p))[1] << 8) | \ - ((UInt32)((const Byte *)(p))[2] << 16) | \ - ((UInt32)((const Byte *)(p))[3] << 24)) - -#define GetUi64(p) (GetUi32(p) | ((UInt64)GetUi32(((const Byte *)(p)) + 4) << 32)) - -#define SetUi32(p, d) { UInt32 _x_ = (d); \ - ((Byte *)(p))[0] = (Byte)_x_; \ - ((Byte *)(p))[1] = (Byte)(_x_ >> 8); \ - ((Byte *)(p))[2] = (Byte)(_x_ >> 16); \ - ((Byte *)(p))[3] = (Byte)(_x_ >> 24); } - -#endif - -#if defined(LITTLE_ENDIAN_UNALIGN) && defined(_WIN64) && (_MSC_VER >= 1300) - -#pragma intrinsic(_byteswap_ulong) -#pragma intrinsic(_byteswap_uint64) -#define GetBe32(p) _byteswap_ulong(*(const UInt32 *)(const Byte *)(p)) -#define GetBe64(p) _byteswap_uint64(*(const UInt64 *)(const Byte *)(p)) - -#else - -#define GetBe32(p) ( \ - ((UInt32)((const Byte *)(p))[0] << 24) | \ - ((UInt32)((const Byte *)(p))[1] << 16) | \ - ((UInt32)((const Byte *)(p))[2] << 8) | \ - ((const Byte *)(p))[3] ) - -#define GetBe64(p) (((UInt64)GetBe32(p) << 32) | GetBe32(((const Byte *)(p)) + 4)) - -#endif - -#define GetBe16(p) (((UInt16)((const Byte *)(p))[0] << 8) | ((const Byte *)(p))[1]) - -#endif diff --git a/desmume/src/windows/7z/C/HuffEnc.c b/desmume/src/windows/7z/C/HuffEnc.c deleted file mode 100644 index 2d31ad596..000000000 --- a/desmume/src/windows/7z/C/HuffEnc.c +++ /dev/null @@ -1,148 +0,0 @@ -/* HuffEnc.c -- functions for Huffman encoding -2008-08-05 -Igor Pavlov -Public domain */ - -#include "HuffEnc.h" -#include "Sort.h" - -#define kMaxLen 16 -#define NUM_BITS 10 -#define MASK ((1 << NUM_BITS) - 1) - -#define NUM_COUNTERS 64 - -#define HUFFMAN_SPEED_OPT - -void Huffman_Generate(const UInt32 *freqs, UInt32 *p, Byte *lens, UInt32 numSymbols, UInt32 maxLen) -{ - UInt32 num = 0; - /* if (maxLen > 10) maxLen = 10; */ - { - UInt32 i; - - #ifdef HUFFMAN_SPEED_OPT - - UInt32 counters[NUM_COUNTERS]; - for (i = 0; i < NUM_COUNTERS; i++) - counters[i] = 0; - for (i = 0; i < numSymbols; i++) - { - UInt32 freq = freqs[i]; - counters[(freq < NUM_COUNTERS - 1) ? freq : NUM_COUNTERS - 1]++; - } - - for (i = 1; i < NUM_COUNTERS; i++) - { - UInt32 temp = counters[i]; - counters[i] = num; - num += temp; - } - - for (i = 0; i < numSymbols; i++) - { - UInt32 freq = freqs[i]; - if (freq == 0) - lens[i] = 0; - else - p[counters[((freq < NUM_COUNTERS - 1) ? freq : NUM_COUNTERS - 1)]++] = i | (freq << NUM_BITS); - } - counters[0] = 0; - HeapSort(p + counters[NUM_COUNTERS - 2], counters[NUM_COUNTERS - 1] - counters[NUM_COUNTERS - 2]); - - #else - - for (i = 0; i < numSymbols; i++) - { - UInt32 freq = freqs[i]; - if (freq == 0) - lens[i] = 0; - else - p[num++] = i | (freq << NUM_BITS); - } - HeapSort(p, num); - - #endif - } - - if (num < 2) - { - int minCode = 0; - int maxCode = 1; - if (num == 1) - { - maxCode = (int)(p[0] & MASK); - if (maxCode == 0) - maxCode++; - } - p[minCode] = 0; - p[maxCode] = 1; - lens[minCode] = lens[maxCode] = 1; - return; - } - - { - UInt32 b, e, i; - - i = b = e = 0; - do - { - UInt32 n, m, freq; - n = (i != num && (b == e || (p[i] >> NUM_BITS) <= (p[b] >> NUM_BITS))) ? i++ : b++; - freq = (p[n] & ~MASK); - p[n] = (p[n] & MASK) | (e << NUM_BITS); - m = (i != num && (b == e || (p[i] >> NUM_BITS) <= (p[b] >> NUM_BITS))) ? i++ : b++; - freq += (p[m] & ~MASK); - p[m] = (p[m] & MASK) | (e << NUM_BITS); - p[e] = (p[e] & MASK) | freq; - e++; - } - while (num - e > 1); - - { - UInt32 lenCounters[kMaxLen + 1]; - for (i = 0; i <= kMaxLen; i++) - lenCounters[i] = 0; - - p[--e] &= MASK; - lenCounters[1] = 2; - while (e > 0) - { - UInt32 len = (p[p[--e] >> NUM_BITS] >> NUM_BITS) + 1; - p[e] = (p[e] & MASK) | (len << NUM_BITS); - if (len >= maxLen) - for (len = maxLen - 1; lenCounters[len] == 0; len--); - lenCounters[len]--; - lenCounters[len + 1] += 2; - } - - { - UInt32 len; - i = 0; - for (len = maxLen; len != 0; len--) - { - UInt32 num; - for (num = lenCounters[len]; num != 0; num--) - lens[p[i++] & MASK] = (Byte)len; - } - } - - { - UInt32 nextCodes[kMaxLen + 1]; - { - UInt32 code = 0; - UInt32 len; - for (len = 1; len <= kMaxLen; len++) - nextCodes[len] = code = (code + lenCounters[len - 1]) << 1; - } - /* if (code + lenCounters[kMaxLen] - 1 != (1 << kMaxLen) - 1) throw 1; */ - - { - UInt32 i; - for (i = 0; i < numSymbols; i++) - p[i] = nextCodes[lens[i]]++; - } - } - } - } -} diff --git a/desmume/src/windows/7z/C/HuffEnc.h b/desmume/src/windows/7z/C/HuffEnc.h deleted file mode 100644 index c0617b33e..000000000 --- a/desmume/src/windows/7z/C/HuffEnc.h +++ /dev/null @@ -1,21 +0,0 @@ -/* HuffEnc.h -- functions for Huffman encoding -2008-03-26 -Igor Pavlov -Public domain */ - -#ifndef __HUFFENC_H -#define __HUFFENC_H - -#include "Types.h" - -/* -Conditions: - num <= 1024 = 2 ^ NUM_BITS - Sum(freqs) < 4M = 2 ^ (32 - NUM_BITS) - maxLen <= 16 = kMaxLen - Num_Items(p) >= HUFFMAN_TEMP_SIZE(num) -*/ - -void Huffman_Generate(const UInt32 *freqs, UInt32 *p, Byte *lens, UInt32 num, UInt32 maxLen); - -#endif diff --git a/desmume/src/windows/7z/C/LzFind.c b/desmume/src/windows/7z/C/LzFind.c deleted file mode 100644 index e0ebe6235..000000000 --- a/desmume/src/windows/7z/C/LzFind.c +++ /dev/null @@ -1,751 +0,0 @@ -/* LzFind.c -- Match finder for LZ algorithms -2008-10-04 : Igor Pavlov : Public domain */ - -#include - -#include "LzFind.h" -#include "LzHash.h" - -#define kEmptyHashValue 0 -#define kMaxValForNormalize ((UInt32)0xFFFFFFFF) -#define kNormalizeStepMin (1 << 10) /* it must be power of 2 */ -#define kNormalizeMask (~(kNormalizeStepMin - 1)) -#define kMaxHistorySize ((UInt32)3 << 30) - -#define kStartMaxLen 3 - -static void LzInWindow_Free(CMatchFinder *p, ISzAlloc *alloc) -{ - if (!p->directInput) - { - alloc->Free(alloc, p->bufferBase); - p->bufferBase = 0; - } -} - -/* keepSizeBefore + keepSizeAfter + keepSizeReserv must be < 4G) */ - -static int LzInWindow_Create(CMatchFinder *p, UInt32 keepSizeReserv, ISzAlloc *alloc) -{ - UInt32 blockSize = p->keepSizeBefore + p->keepSizeAfter + keepSizeReserv; - if (p->directInput) - { - p->blockSize = blockSize; - return 1; - } - if (p->bufferBase == 0 || p->blockSize != blockSize) - { - LzInWindow_Free(p, alloc); - p->blockSize = blockSize; - p->bufferBase = (Byte *)alloc->Alloc(alloc, (size_t)blockSize); - } - return (p->bufferBase != 0); -} - -Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; } -Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 index) { return p->buffer[index]; } - -UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; } - -void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue) -{ - p->posLimit -= subValue; - p->pos -= subValue; - p->streamPos -= subValue; -} - -static void MatchFinder_ReadBlock(CMatchFinder *p) -{ - if (p->streamEndWasReached || p->result != SZ_OK) - return; - for (;;) - { - Byte *dest = p->buffer + (p->streamPos - p->pos); - size_t size = (p->bufferBase + p->blockSize - dest); - if (size == 0) - return; - p->result = p->stream->Read(p->stream, dest, &size); - if (p->result != SZ_OK) - return; - if (size == 0) - { - p->streamEndWasReached = 1; - return; - } - p->streamPos += (UInt32)size; - if (p->streamPos - p->pos > p->keepSizeAfter) - return; - } -} - -void MatchFinder_MoveBlock(CMatchFinder *p) -{ - memmove(p->bufferBase, - p->buffer - p->keepSizeBefore, - (size_t)(p->streamPos - p->pos + p->keepSizeBefore)); - p->buffer = p->bufferBase + p->keepSizeBefore; -} - -int MatchFinder_NeedMove(CMatchFinder *p) -{ - /* if (p->streamEndWasReached) return 0; */ - return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter); -} - -void MatchFinder_ReadIfRequired(CMatchFinder *p) -{ - if (p->streamEndWasReached) - return; - if (p->keepSizeAfter >= p->streamPos - p->pos) - MatchFinder_ReadBlock(p); -} - -static void MatchFinder_CheckAndMoveAndRead(CMatchFinder *p) -{ - if (MatchFinder_NeedMove(p)) - MatchFinder_MoveBlock(p); - MatchFinder_ReadBlock(p); -} - -static void MatchFinder_SetDefaultSettings(CMatchFinder *p) -{ - p->cutValue = 32; - p->btMode = 1; - p->numHashBytes = 4; - /* p->skipModeBits = 0; */ - p->directInput = 0; - p->bigHash = 0; -} - -#define kCrcPoly 0xEDB88320 - -void MatchFinder_Construct(CMatchFinder *p) -{ - UInt32 i; - p->bufferBase = 0; - p->directInput = 0; - p->hash = 0; - MatchFinder_SetDefaultSettings(p); - - for (i = 0; i < 256; i++) - { - UInt32 r = i; - int j; - for (j = 0; j < 8; j++) - r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1)); - p->crc[i] = r; - } -} - -static void MatchFinder_FreeThisClassMemory(CMatchFinder *p, ISzAlloc *alloc) -{ - alloc->Free(alloc, p->hash); - p->hash = 0; -} - -void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc) -{ - MatchFinder_FreeThisClassMemory(p, alloc); - LzInWindow_Free(p, alloc); -} - -static CLzRef* AllocRefs(UInt32 num, ISzAlloc *alloc) -{ - size_t sizeInBytes = (size_t)num * sizeof(CLzRef); - if (sizeInBytes / sizeof(CLzRef) != num) - return 0; - return (CLzRef *)alloc->Alloc(alloc, sizeInBytes); -} - -int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, - UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, - ISzAlloc *alloc) -{ - UInt32 sizeReserv; - if (historySize > kMaxHistorySize) - { - MatchFinder_Free(p, alloc); - return 0; - } - sizeReserv = historySize >> 1; - if (historySize > ((UInt32)2 << 30)) - sizeReserv = historySize >> 2; - sizeReserv += (keepAddBufferBefore + matchMaxLen + keepAddBufferAfter) / 2 + (1 << 19); - - p->keepSizeBefore = historySize + keepAddBufferBefore + 1; - p->keepSizeAfter = matchMaxLen + keepAddBufferAfter; - /* we need one additional byte, since we use MoveBlock after pos++ and before dictionary using */ - if (LzInWindow_Create(p, sizeReserv, alloc)) - { - UInt32 newCyclicBufferSize = (historySize /* >> p->skipModeBits */) + 1; - UInt32 hs; - p->matchMaxLen = matchMaxLen; - { - p->fixedHashSize = 0; - if (p->numHashBytes == 2) - hs = (1 << 16) - 1; - else - { - hs = historySize - 1; - hs |= (hs >> 1); - hs |= (hs >> 2); - hs |= (hs >> 4); - hs |= (hs >> 8); - hs >>= 1; - /* hs >>= p->skipModeBits; */ - hs |= 0xFFFF; /* don't change it! It's required for Deflate */ - if (hs > (1 << 24)) - { - if (p->numHashBytes == 3) - hs = (1 << 24) - 1; - else - hs >>= 1; - } - } - p->hashMask = hs; - hs++; - if (p->numHashBytes > 2) p->fixedHashSize += kHash2Size; - if (p->numHashBytes > 3) p->fixedHashSize += kHash3Size; - if (p->numHashBytes > 4) p->fixedHashSize += kHash4Size; - hs += p->fixedHashSize; - } - - { - UInt32 prevSize = p->hashSizeSum + p->numSons; - UInt32 newSize; - p->historySize = historySize; - p->hashSizeSum = hs; - p->cyclicBufferSize = newCyclicBufferSize; - p->numSons = (p->btMode ? newCyclicBufferSize * 2 : newCyclicBufferSize); - newSize = p->hashSizeSum + p->numSons; - if (p->hash != 0 && prevSize == newSize) - return 1; - MatchFinder_FreeThisClassMemory(p, alloc); - p->hash = AllocRefs(newSize, alloc); - if (p->hash != 0) - { - p->son = p->hash + p->hashSizeSum; - return 1; - } - } - } - MatchFinder_Free(p, alloc); - return 0; -} - -static void MatchFinder_SetLimits(CMatchFinder *p) -{ - UInt32 limit = kMaxValForNormalize - p->pos; - UInt32 limit2 = p->cyclicBufferSize - p->cyclicBufferPos; - if (limit2 < limit) - limit = limit2; - limit2 = p->streamPos - p->pos; - if (limit2 <= p->keepSizeAfter) - { - if (limit2 > 0) - limit2 = 1; - } - else - limit2 -= p->keepSizeAfter; - if (limit2 < limit) - limit = limit2; - { - UInt32 lenLimit = p->streamPos - p->pos; - if (lenLimit > p->matchMaxLen) - lenLimit = p->matchMaxLen; - p->lenLimit = lenLimit; - } - p->posLimit = p->pos + limit; -} - -void MatchFinder_Init(CMatchFinder *p) -{ - UInt32 i; - for (i = 0; i < p->hashSizeSum; i++) - p->hash[i] = kEmptyHashValue; - p->cyclicBufferPos = 0; - p->buffer = p->bufferBase; - p->pos = p->streamPos = p->cyclicBufferSize; - p->result = SZ_OK; - p->streamEndWasReached = 0; - MatchFinder_ReadBlock(p); - MatchFinder_SetLimits(p); -} - -static UInt32 MatchFinder_GetSubValue(CMatchFinder *p) -{ - return (p->pos - p->historySize - 1) & kNormalizeMask; -} - -void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems) -{ - UInt32 i; - for (i = 0; i < numItems; i++) - { - UInt32 value = items[i]; - if (value <= subValue) - value = kEmptyHashValue; - else - value -= subValue; - items[i] = value; - } -} - -static void MatchFinder_Normalize(CMatchFinder *p) -{ - UInt32 subValue = MatchFinder_GetSubValue(p); - MatchFinder_Normalize3(subValue, p->hash, p->hashSizeSum + p->numSons); - MatchFinder_ReduceOffsets(p, subValue); -} - -static void MatchFinder_CheckLimits(CMatchFinder *p) -{ - if (p->pos == kMaxValForNormalize) - MatchFinder_Normalize(p); - if (!p->streamEndWasReached && p->keepSizeAfter == p->streamPos - p->pos) - MatchFinder_CheckAndMoveAndRead(p); - if (p->cyclicBufferPos == p->cyclicBufferSize) - p->cyclicBufferPos = 0; - MatchFinder_SetLimits(p); -} - -static UInt32 * Hc_GetMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, - UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue, - UInt32 *distances, UInt32 maxLen) -{ - son[_cyclicBufferPos] = curMatch; - for (;;) - { - UInt32 delta = pos - curMatch; - if (cutValue-- == 0 || delta >= _cyclicBufferSize) - return distances; - { - const Byte *pb = cur - delta; - curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)]; - if (pb[maxLen] == cur[maxLen] && *pb == *cur) - { - UInt32 len = 0; - while (++len != lenLimit) - if (pb[len] != cur[len]) - break; - if (maxLen < len) - { - *distances++ = maxLen = len; - *distances++ = delta - 1; - if (len == lenLimit) - return distances; - } - } - } - } -} - -UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, - UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue, - UInt32 *distances, UInt32 maxLen) -{ - CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1; - CLzRef *ptr1 = son + (_cyclicBufferPos << 1); - UInt32 len0 = 0, len1 = 0; - for (;;) - { - UInt32 delta = pos - curMatch; - if (cutValue-- == 0 || delta >= _cyclicBufferSize) - { - *ptr0 = *ptr1 = kEmptyHashValue; - return distances; - } - { - CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); - const Byte *pb = cur - delta; - UInt32 len = (len0 < len1 ? len0 : len1); - if (pb[len] == cur[len]) - { - if (++len != lenLimit && pb[len] == cur[len]) - while (++len != lenLimit) - if (pb[len] != cur[len]) - break; - if (maxLen < len) - { - *distances++ = maxLen = len; - *distances++ = delta - 1; - if (len == lenLimit) - { - *ptr1 = pair[0]; - *ptr0 = pair[1]; - return distances; - } - } - } - if (pb[len] < cur[len]) - { - *ptr1 = curMatch; - ptr1 = pair + 1; - curMatch = *ptr1; - len1 = len; - } - else - { - *ptr0 = curMatch; - ptr0 = pair; - curMatch = *ptr0; - len0 = len; - } - } - } -} - -static void SkipMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, - UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue) -{ - CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1; - CLzRef *ptr1 = son + (_cyclicBufferPos << 1); - UInt32 len0 = 0, len1 = 0; - for (;;) - { - UInt32 delta = pos - curMatch; - if (cutValue-- == 0 || delta >= _cyclicBufferSize) - { - *ptr0 = *ptr1 = kEmptyHashValue; - return; - } - { - CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); - const Byte *pb = cur - delta; - UInt32 len = (len0 < len1 ? len0 : len1); - if (pb[len] == cur[len]) - { - while (++len != lenLimit) - if (pb[len] != cur[len]) - break; - { - if (len == lenLimit) - { - *ptr1 = pair[0]; - *ptr0 = pair[1]; - return; - } - } - } - if (pb[len] < cur[len]) - { - *ptr1 = curMatch; - ptr1 = pair + 1; - curMatch = *ptr1; - len1 = len; - } - else - { - *ptr0 = curMatch; - ptr0 = pair; - curMatch = *ptr0; - len0 = len; - } - } - } -} - -#define MOVE_POS \ - ++p->cyclicBufferPos; \ - p->buffer++; \ - if (++p->pos == p->posLimit) MatchFinder_CheckLimits(p); - -#define MOVE_POS_RET MOVE_POS return offset; - -static void MatchFinder_MovePos(CMatchFinder *p) { MOVE_POS; } - -#define GET_MATCHES_HEADER2(minLen, ret_op) \ - UInt32 lenLimit; UInt32 hashValue; const Byte *cur; UInt32 curMatch; \ - lenLimit = p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \ - cur = p->buffer; - -#define GET_MATCHES_HEADER(minLen) GET_MATCHES_HEADER2(minLen, return 0) -#define SKIP_HEADER(minLen) GET_MATCHES_HEADER2(minLen, continue) - -#define MF_PARAMS(p) p->pos, p->buffer, p->son, p->cyclicBufferPos, p->cyclicBufferSize, p->cutValue - -#define GET_MATCHES_FOOTER(offset, maxLen) \ - offset = (UInt32)(GetMatchesSpec1(lenLimit, curMatch, MF_PARAMS(p), \ - distances + offset, maxLen) - distances); MOVE_POS_RET; - -#define SKIP_FOOTER \ - SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); MOVE_POS; - -static UInt32 Bt2_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) -{ - UInt32 offset; - GET_MATCHES_HEADER(2) - HASH2_CALC; - curMatch = p->hash[hashValue]; - p->hash[hashValue] = p->pos; - offset = 0; - GET_MATCHES_FOOTER(offset, 1) -} - -UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) -{ - UInt32 offset; - GET_MATCHES_HEADER(3) - HASH_ZIP_CALC; - curMatch = p->hash[hashValue]; - p->hash[hashValue] = p->pos; - offset = 0; - GET_MATCHES_FOOTER(offset, 2) -} - -static UInt32 Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) -{ - UInt32 hash2Value, delta2, maxLen, offset; - GET_MATCHES_HEADER(3) - - HASH3_CALC; - - delta2 = p->pos - p->hash[hash2Value]; - curMatch = p->hash[kFix3HashSize + hashValue]; - - p->hash[hash2Value] = - p->hash[kFix3HashSize + hashValue] = p->pos; - - - maxLen = 2; - offset = 0; - if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur) - { - for (; maxLen != lenLimit; maxLen++) - if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen]) - break; - distances[0] = maxLen; - distances[1] = delta2 - 1; - offset = 2; - if (maxLen == lenLimit) - { - SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); - MOVE_POS_RET; - } - } - GET_MATCHES_FOOTER(offset, maxLen) -} - -static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) -{ - UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset; - GET_MATCHES_HEADER(4) - - HASH4_CALC; - - delta2 = p->pos - p->hash[ hash2Value]; - delta3 = p->pos - p->hash[kFix3HashSize + hash3Value]; - curMatch = p->hash[kFix4HashSize + hashValue]; - - p->hash[ hash2Value] = - p->hash[kFix3HashSize + hash3Value] = - p->hash[kFix4HashSize + hashValue] = p->pos; - - maxLen = 1; - offset = 0; - if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur) - { - distances[0] = maxLen = 2; - distances[1] = delta2 - 1; - offset = 2; - } - if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur) - { - maxLen = 3; - distances[offset + 1] = delta3 - 1; - offset += 2; - delta2 = delta3; - } - if (offset != 0) - { - for (; maxLen != lenLimit; maxLen++) - if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen]) - break; - distances[offset - 2] = maxLen; - if (maxLen == lenLimit) - { - SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); - MOVE_POS_RET; - } - } - if (maxLen < 3) - maxLen = 3; - GET_MATCHES_FOOTER(offset, maxLen) -} - -static UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) -{ - UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset; - GET_MATCHES_HEADER(4) - - HASH4_CALC; - - delta2 = p->pos - p->hash[ hash2Value]; - delta3 = p->pos - p->hash[kFix3HashSize + hash3Value]; - curMatch = p->hash[kFix4HashSize + hashValue]; - - p->hash[ hash2Value] = - p->hash[kFix3HashSize + hash3Value] = - p->hash[kFix4HashSize + hashValue] = p->pos; - - maxLen = 1; - offset = 0; - if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur) - { - distances[0] = maxLen = 2; - distances[1] = delta2 - 1; - offset = 2; - } - if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur) - { - maxLen = 3; - distances[offset + 1] = delta3 - 1; - offset += 2; - delta2 = delta3; - } - if (offset != 0) - { - for (; maxLen != lenLimit; maxLen++) - if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen]) - break; - distances[offset - 2] = maxLen; - if (maxLen == lenLimit) - { - p->son[p->cyclicBufferPos] = curMatch; - MOVE_POS_RET; - } - } - if (maxLen < 3) - maxLen = 3; - offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p), - distances + offset, maxLen) - (distances)); - MOVE_POS_RET -} - -UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) -{ - UInt32 offset; - GET_MATCHES_HEADER(3) - HASH_ZIP_CALC; - curMatch = p->hash[hashValue]; - p->hash[hashValue] = p->pos; - offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p), - distances, 2) - (distances)); - MOVE_POS_RET -} - -static void Bt2_MatchFinder_Skip(CMatchFinder *p, UInt32 num) -{ - do - { - SKIP_HEADER(2) - HASH2_CALC; - curMatch = p->hash[hashValue]; - p->hash[hashValue] = p->pos; - SKIP_FOOTER - } - while (--num != 0); -} - -void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num) -{ - do - { - SKIP_HEADER(3) - HASH_ZIP_CALC; - curMatch = p->hash[hashValue]; - p->hash[hashValue] = p->pos; - SKIP_FOOTER - } - while (--num != 0); -} - -static void Bt3_MatchFinder_Skip(CMatchFinder *p, UInt32 num) -{ - do - { - UInt32 hash2Value; - SKIP_HEADER(3) - HASH3_CALC; - curMatch = p->hash[kFix3HashSize + hashValue]; - p->hash[hash2Value] = - p->hash[kFix3HashSize + hashValue] = p->pos; - SKIP_FOOTER - } - while (--num != 0); -} - -static void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num) -{ - do - { - UInt32 hash2Value, hash3Value; - SKIP_HEADER(4) - HASH4_CALC; - curMatch = p->hash[kFix4HashSize + hashValue]; - p->hash[ hash2Value] = - p->hash[kFix3HashSize + hash3Value] = p->pos; - p->hash[kFix4HashSize + hashValue] = p->pos; - SKIP_FOOTER - } - while (--num != 0); -} - -static void Hc4_MatchFinder_Skip(CMatchFinder *p, UInt32 num) -{ - do - { - UInt32 hash2Value, hash3Value; - SKIP_HEADER(4) - HASH4_CALC; - curMatch = p->hash[kFix4HashSize + hashValue]; - p->hash[ hash2Value] = - p->hash[kFix3HashSize + hash3Value] = - p->hash[kFix4HashSize + hashValue] = p->pos; - p->son[p->cyclicBufferPos] = curMatch; - MOVE_POS - } - while (--num != 0); -} - -void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num) -{ - do - { - SKIP_HEADER(3) - HASH_ZIP_CALC; - curMatch = p->hash[hashValue]; - p->hash[hashValue] = p->pos; - p->son[p->cyclicBufferPos] = curMatch; - MOVE_POS - } - while (--num != 0); -} - -void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable) -{ - vTable->Init = (Mf_Init_Func)MatchFinder_Init; - vTable->GetIndexByte = (Mf_GetIndexByte_Func)MatchFinder_GetIndexByte; - vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinder_GetNumAvailableBytes; - vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinder_GetPointerToCurrentPos; - if (!p->btMode) - { - vTable->GetMatches = (Mf_GetMatches_Func)Hc4_MatchFinder_GetMatches; - vTable->Skip = (Mf_Skip_Func)Hc4_MatchFinder_Skip; - } - else if (p->numHashBytes == 2) - { - vTable->GetMatches = (Mf_GetMatches_Func)Bt2_MatchFinder_GetMatches; - vTable->Skip = (Mf_Skip_Func)Bt2_MatchFinder_Skip; - } - else if (p->numHashBytes == 3) - { - vTable->GetMatches = (Mf_GetMatches_Func)Bt3_MatchFinder_GetMatches; - vTable->Skip = (Mf_Skip_Func)Bt3_MatchFinder_Skip; - } - else - { - vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches; - vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip; - } -} diff --git a/desmume/src/windows/7z/C/LzFind.h b/desmume/src/windows/7z/C/LzFind.h deleted file mode 100644 index 423d67e0c..000000000 --- a/desmume/src/windows/7z/C/LzFind.h +++ /dev/null @@ -1,107 +0,0 @@ -/* LzFind.h -- Match finder for LZ algorithms -2008-10-04 : Igor Pavlov : Public domain */ - -#ifndef __LZFIND_H -#define __LZFIND_H - -#include "Types.h" - -typedef UInt32 CLzRef; - -typedef struct _CMatchFinder -{ - Byte *buffer; - UInt32 pos; - UInt32 posLimit; - UInt32 streamPos; - UInt32 lenLimit; - - UInt32 cyclicBufferPos; - UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */ - - UInt32 matchMaxLen; - CLzRef *hash; - CLzRef *son; - UInt32 hashMask; - UInt32 cutValue; - - Byte *bufferBase; - ISeqInStream *stream; - int streamEndWasReached; - - UInt32 blockSize; - UInt32 keepSizeBefore; - UInt32 keepSizeAfter; - - UInt32 numHashBytes; - int directInput; - int btMode; - /* int skipModeBits; */ - int bigHash; - UInt32 historySize; - UInt32 fixedHashSize; - UInt32 hashSizeSum; - UInt32 numSons; - SRes result; - UInt32 crc[256]; -} CMatchFinder; - -#define Inline_MatchFinder_GetPointerToCurrentPos(p) ((p)->buffer) -#define Inline_MatchFinder_GetIndexByte(p, index) ((p)->buffer[(Int32)(index)]) - -#define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos) - -int MatchFinder_NeedMove(CMatchFinder *p); -Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p); -void MatchFinder_MoveBlock(CMatchFinder *p); -void MatchFinder_ReadIfRequired(CMatchFinder *p); - -void MatchFinder_Construct(CMatchFinder *p); - -/* Conditions: - historySize <= 3 GB - keepAddBufferBefore + matchMaxLen + keepAddBufferAfter < 511MB -*/ -int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, - UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, - ISzAlloc *alloc); -void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc); -void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems); -void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue); - -UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *buffer, CLzRef *son, - UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue, - UInt32 *distances, UInt32 maxLen); - -/* -Conditions: - Mf_GetNumAvailableBytes_Func must be called before each Mf_GetMatchLen_Func. - Mf_GetPointerToCurrentPos_Func's result must be used only before any other function -*/ - -typedef void (*Mf_Init_Func)(void *object); -typedef Byte (*Mf_GetIndexByte_Func)(void *object, Int32 index); -typedef UInt32 (*Mf_GetNumAvailableBytes_Func)(void *object); -typedef const Byte * (*Mf_GetPointerToCurrentPos_Func)(void *object); -typedef UInt32 (*Mf_GetMatches_Func)(void *object, UInt32 *distances); -typedef void (*Mf_Skip_Func)(void *object, UInt32); - -typedef struct _IMatchFinder -{ - Mf_Init_Func Init; - Mf_GetIndexByte_Func GetIndexByte; - Mf_GetNumAvailableBytes_Func GetNumAvailableBytes; - Mf_GetPointerToCurrentPos_Func GetPointerToCurrentPos; - Mf_GetMatches_Func GetMatches; - Mf_Skip_Func Skip; -} IMatchFinder; - -void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable); - -void MatchFinder_Init(CMatchFinder *p); -UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances); -UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances); -void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num); -void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num); - -#endif diff --git a/desmume/src/windows/7z/C/LzFindMt.c b/desmume/src/windows/7z/C/LzFindMt.c deleted file mode 100644 index 0ef134735..000000000 --- a/desmume/src/windows/7z/C/LzFindMt.c +++ /dev/null @@ -1,793 +0,0 @@ -/* LzFindMt.c -- multithreaded Match finder for LZ algorithms -2008-10-04 : Igor Pavlov : Public domain */ - -#include "LzHash.h" - -#include "LzFindMt.h" - -void MtSync_Construct(CMtSync *p) -{ - p->wasCreated = False; - p->csWasInitialized = False; - p->csWasEntered = False; - Thread_Construct(&p->thread); - Event_Construct(&p->canStart); - Event_Construct(&p->wasStarted); - Event_Construct(&p->wasStopped); - Semaphore_Construct(&p->freeSemaphore); - Semaphore_Construct(&p->filledSemaphore); -} - -void MtSync_GetNextBlock(CMtSync *p) -{ - if (p->needStart) - { - p->numProcessedBlocks = 1; - p->needStart = False; - p->stopWriting = False; - p->exit = False; - Event_Reset(&p->wasStarted); - Event_Reset(&p->wasStopped); - - Event_Set(&p->canStart); - Event_Wait(&p->wasStarted); - } - else - { - CriticalSection_Leave(&p->cs); - p->csWasEntered = False; - p->numProcessedBlocks++; - Semaphore_Release1(&p->freeSemaphore); - } - Semaphore_Wait(&p->filledSemaphore); - CriticalSection_Enter(&p->cs); - p->csWasEntered = True; -} - -/* MtSync_StopWriting must be called if Writing was started */ - -void MtSync_StopWriting(CMtSync *p) -{ - UInt32 myNumBlocks = p->numProcessedBlocks; - if (!Thread_WasCreated(&p->thread) || p->needStart) - return; - p->stopWriting = True; - if (p->csWasEntered) - { - CriticalSection_Leave(&p->cs); - p->csWasEntered = False; - } - Semaphore_Release1(&p->freeSemaphore); - - Event_Wait(&p->wasStopped); - - while (myNumBlocks++ != p->numProcessedBlocks) - { - Semaphore_Wait(&p->filledSemaphore); - Semaphore_Release1(&p->freeSemaphore); - } - p->needStart = True; -} - -void MtSync_Destruct(CMtSync *p) -{ - if (Thread_WasCreated(&p->thread)) - { - MtSync_StopWriting(p); - p->exit = True; - if (p->needStart) - Event_Set(&p->canStart); - Thread_Wait(&p->thread); - Thread_Close(&p->thread); - } - if (p->csWasInitialized) - { - CriticalSection_Delete(&p->cs); - p->csWasInitialized = False; - } - - Event_Close(&p->canStart); - Event_Close(&p->wasStarted); - Event_Close(&p->wasStopped); - Semaphore_Close(&p->freeSemaphore); - Semaphore_Close(&p->filledSemaphore); - - p->wasCreated = False; -} - -#define RINOK_THREAD(x) { if ((x) != 0) return SZ_ERROR_THREAD; } - -static SRes MtSync_Create2(CMtSync *p, unsigned (MY_STD_CALL *startAddress)(void *), void *obj, UInt32 numBlocks) -{ - if (p->wasCreated) - return SZ_OK; - - RINOK_THREAD(CriticalSection_Init(&p->cs)); - p->csWasInitialized = True; - - RINOK_THREAD(AutoResetEvent_CreateNotSignaled(&p->canStart)); - RINOK_THREAD(AutoResetEvent_CreateNotSignaled(&p->wasStarted)); - RINOK_THREAD(AutoResetEvent_CreateNotSignaled(&p->wasStopped)); - - RINOK_THREAD(Semaphore_Create(&p->freeSemaphore, numBlocks, numBlocks)); - RINOK_THREAD(Semaphore_Create(&p->filledSemaphore, 0, numBlocks)); - - p->needStart = True; - - RINOK_THREAD(Thread_Create(&p->thread, startAddress, obj)); - p->wasCreated = True; - return SZ_OK; -} - -static SRes MtSync_Create(CMtSync *p, unsigned (MY_STD_CALL *startAddress)(void *), void *obj, UInt32 numBlocks) -{ - SRes res = MtSync_Create2(p, startAddress, obj, numBlocks); - if (res != SZ_OK) - MtSync_Destruct(p); - return res; -} - -void MtSync_Init(CMtSync *p) { p->needStart = True; } - -#define kMtMaxValForNormalize 0xFFFFFFFF - -#define DEF_GetHeads2(name, v, action) \ -static void GetHeads ## name(const Byte *p, UInt32 pos, \ -UInt32 *hash, UInt32 hashMask, UInt32 *heads, UInt32 numHeads, const UInt32 *crc) \ -{ action; for (; numHeads != 0; numHeads--) { \ -const UInt32 value = (v); p++; *heads++ = pos - hash[value]; hash[value] = pos++; } } - -#define DEF_GetHeads(name, v) DEF_GetHeads2(name, v, ;) - -DEF_GetHeads2(2, (p[0] | ((UInt32)p[1] << 8)), hashMask = hashMask; crc = crc; ) -DEF_GetHeads(3, (crc[p[0]] ^ p[1] ^ ((UInt32)p[2] << 8)) & hashMask) -DEF_GetHeads(4, (crc[p[0]] ^ p[1] ^ ((UInt32)p[2] << 8) ^ (crc[p[3]] << 5)) & hashMask) -DEF_GetHeads(4b, (crc[p[0]] ^ p[1] ^ ((UInt32)p[2] << 8) ^ ((UInt32)p[3] << 16)) & hashMask) -DEF_GetHeads(5, (crc[p[0]] ^ p[1] ^ ((UInt32)p[2] << 8) ^ (crc[p[3]] << 5) ^ (crc[p[4]] << 3)) & hashMask) - -void HashThreadFunc(CMatchFinderMt *mt) -{ - CMtSync *p = &mt->hashSync; - for (;;) - { - UInt32 numProcessedBlocks = 0; - Event_Wait(&p->canStart); - Event_Set(&p->wasStarted); - for (;;) - { - if (p->exit) - return; - if (p->stopWriting) - { - p->numProcessedBlocks = numProcessedBlocks; - Event_Set(&p->wasStopped); - break; - } - - { - CMatchFinder *mf = mt->MatchFinder; - if (MatchFinder_NeedMove(mf)) - { - CriticalSection_Enter(&mt->btSync.cs); - CriticalSection_Enter(&mt->hashSync.cs); - { - const Byte *beforePtr = MatchFinder_GetPointerToCurrentPos(mf); - const Byte *afterPtr; - MatchFinder_MoveBlock(mf); - afterPtr = MatchFinder_GetPointerToCurrentPos(mf); - mt->pointerToCurPos -= beforePtr - afterPtr; - mt->buffer -= beforePtr - afterPtr; - } - CriticalSection_Leave(&mt->btSync.cs); - CriticalSection_Leave(&mt->hashSync.cs); - continue; - } - - Semaphore_Wait(&p->freeSemaphore); - - MatchFinder_ReadIfRequired(mf); - if (mf->pos > (kMtMaxValForNormalize - kMtHashBlockSize)) - { - UInt32 subValue = (mf->pos - mf->historySize - 1); - MatchFinder_ReduceOffsets(mf, subValue); - MatchFinder_Normalize3(subValue, mf->hash + mf->fixedHashSize, mf->hashMask + 1); - } - { - UInt32 *heads = mt->hashBuf + ((numProcessedBlocks++) & kMtHashNumBlocksMask) * kMtHashBlockSize; - UInt32 num = mf->streamPos - mf->pos; - heads[0] = 2; - heads[1] = num; - if (num >= mf->numHashBytes) - { - num = num - mf->numHashBytes + 1; - if (num > kMtHashBlockSize - 2) - num = kMtHashBlockSize - 2; - mt->GetHeadsFunc(mf->buffer, mf->pos, mf->hash + mf->fixedHashSize, mf->hashMask, heads + 2, num, mf->crc); - heads[0] += num; - } - mf->pos += num; - mf->buffer += num; - } - } - - Semaphore_Release1(&p->filledSemaphore); - } - } -} - -void MatchFinderMt_GetNextBlock_Hash(CMatchFinderMt *p) -{ - MtSync_GetNextBlock(&p->hashSync); - p->hashBufPosLimit = p->hashBufPos = ((p->hashSync.numProcessedBlocks - 1) & kMtHashNumBlocksMask) * kMtHashBlockSize; - p->hashBufPosLimit += p->hashBuf[p->hashBufPos++]; - p->hashNumAvail = p->hashBuf[p->hashBufPos++]; -} - -#define kEmptyHashValue 0 - -/* #define MFMT_GM_INLINE */ - -#ifdef MFMT_GM_INLINE - -#define NO_INLINE MY_FAST_CALL - -Int32 NO_INLINE GetMatchesSpecN(UInt32 lenLimit, UInt32 pos, const Byte *cur, CLzRef *son, - UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue, - UInt32 *_distances, UInt32 _maxLen, const UInt32 *hash, Int32 limit, UInt32 size, UInt32 *posRes) -{ - do - { - UInt32 *distances = _distances + 1; - UInt32 curMatch = pos - *hash++; - - CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1; - CLzRef *ptr1 = son + (_cyclicBufferPos << 1); - UInt32 len0 = 0, len1 = 0; - UInt32 cutValue = _cutValue; - UInt32 maxLen = _maxLen; - for (;;) - { - UInt32 delta = pos - curMatch; - if (cutValue-- == 0 || delta >= _cyclicBufferSize) - { - *ptr0 = *ptr1 = kEmptyHashValue; - break; - } - { - CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); - const Byte *pb = cur - delta; - UInt32 len = (len0 < len1 ? len0 : len1); - if (pb[len] == cur[len]) - { - if (++len != lenLimit && pb[len] == cur[len]) - while (++len != lenLimit) - if (pb[len] != cur[len]) - break; - if (maxLen < len) - { - *distances++ = maxLen = len; - *distances++ = delta - 1; - if (len == lenLimit) - { - *ptr1 = pair[0]; - *ptr0 = pair[1]; - break; - } - } - } - if (pb[len] < cur[len]) - { - *ptr1 = curMatch; - ptr1 = pair + 1; - curMatch = *ptr1; - len1 = len; - } - else - { - *ptr0 = curMatch; - ptr0 = pair; - curMatch = *ptr0; - len0 = len; - } - } - } - pos++; - _cyclicBufferPos++; - cur++; - { - UInt32 num = (UInt32)(distances - _distances); - *_distances = num - 1; - _distances += num; - limit -= num; - } - } - while (limit > 0 && --size != 0); - *posRes = pos; - return limit; -} - -#endif - -void BtGetMatches(CMatchFinderMt *p, UInt32 *distances) -{ - UInt32 numProcessed = 0; - UInt32 curPos = 2; - UInt32 limit = kMtBtBlockSize - (p->matchMaxLen * 2); - distances[1] = p->hashNumAvail; - while (curPos < limit) - { - if (p->hashBufPos == p->hashBufPosLimit) - { - MatchFinderMt_GetNextBlock_Hash(p); - distances[1] = numProcessed + p->hashNumAvail; - if (p->hashNumAvail >= p->numHashBytes) - continue; - for (; p->hashNumAvail != 0; p->hashNumAvail--) - distances[curPos++] = 0; - break; - } - { - UInt32 size = p->hashBufPosLimit - p->hashBufPos; - UInt32 lenLimit = p->matchMaxLen; - UInt32 pos = p->pos; - UInt32 cyclicBufferPos = p->cyclicBufferPos; - if (lenLimit >= p->hashNumAvail) - lenLimit = p->hashNumAvail; - { - UInt32 size2 = p->hashNumAvail - lenLimit + 1; - if (size2 < size) - size = size2; - size2 = p->cyclicBufferSize - cyclicBufferPos; - if (size2 < size) - size = size2; - } - #ifndef MFMT_GM_INLINE - while (curPos < limit && size-- != 0) - { - UInt32 *startDistances = distances + curPos; - UInt32 num = (UInt32)(GetMatchesSpec1(lenLimit, pos - p->hashBuf[p->hashBufPos++], - pos, p->buffer, p->son, cyclicBufferPos, p->cyclicBufferSize, p->cutValue, - startDistances + 1, p->numHashBytes - 1) - startDistances); - *startDistances = num - 1; - curPos += num; - cyclicBufferPos++; - pos++; - p->buffer++; - } - #else - { - UInt32 posRes; - curPos = limit - GetMatchesSpecN(lenLimit, pos, p->buffer, p->son, cyclicBufferPos, p->cyclicBufferSize, p->cutValue, - distances + curPos, p->numHashBytes - 1, p->hashBuf + p->hashBufPos, (Int32)(limit - curPos) , size, &posRes); - p->hashBufPos += posRes - pos; - cyclicBufferPos += posRes - pos; - p->buffer += posRes - pos; - pos = posRes; - } - #endif - - numProcessed += pos - p->pos; - p->hashNumAvail -= pos - p->pos; - p->pos = pos; - if (cyclicBufferPos == p->cyclicBufferSize) - cyclicBufferPos = 0; - p->cyclicBufferPos = cyclicBufferPos; - } - } - distances[0] = curPos; -} - -void BtFillBlock(CMatchFinderMt *p, UInt32 globalBlockIndex) -{ - CMtSync *sync = &p->hashSync; - if (!sync->needStart) - { - CriticalSection_Enter(&sync->cs); - sync->csWasEntered = True; - } - - BtGetMatches(p, p->btBuf + (globalBlockIndex & kMtBtNumBlocksMask) * kMtBtBlockSize); - - if (p->pos > kMtMaxValForNormalize - kMtBtBlockSize) - { - UInt32 subValue = p->pos - p->cyclicBufferSize; - MatchFinder_Normalize3(subValue, p->son, p->cyclicBufferSize * 2); - p->pos -= subValue; - } - - if (!sync->needStart) - { - CriticalSection_Leave(&sync->cs); - sync->csWasEntered = False; - } -} - -void BtThreadFunc(CMatchFinderMt *mt) -{ - CMtSync *p = &mt->btSync; - for (;;) - { - UInt32 blockIndex = 0; - Event_Wait(&p->canStart); - Event_Set(&p->wasStarted); - for (;;) - { - if (p->exit) - return; - if (p->stopWriting) - { - p->numProcessedBlocks = blockIndex; - MtSync_StopWriting(&mt->hashSync); - Event_Set(&p->wasStopped); - break; - } - Semaphore_Wait(&p->freeSemaphore); - BtFillBlock(mt, blockIndex++); - Semaphore_Release1(&p->filledSemaphore); - } - } -} - -void MatchFinderMt_Construct(CMatchFinderMt *p) -{ - p->hashBuf = 0; - MtSync_Construct(&p->hashSync); - MtSync_Construct(&p->btSync); -} - -void MatchFinderMt_FreeMem(CMatchFinderMt *p, ISzAlloc *alloc) -{ - alloc->Free(alloc, p->hashBuf); - p->hashBuf = 0; -} - -void MatchFinderMt_Destruct(CMatchFinderMt *p, ISzAlloc *alloc) -{ - MtSync_Destruct(&p->hashSync); - MtSync_Destruct(&p->btSync); - MatchFinderMt_FreeMem(p, alloc); -} - -#define kHashBufferSize (kMtHashBlockSize * kMtHashNumBlocks) -#define kBtBufferSize (kMtBtBlockSize * kMtBtNumBlocks) - -static unsigned MY_STD_CALL HashThreadFunc2(void *p) { HashThreadFunc((CMatchFinderMt *)p); return 0; } -static unsigned MY_STD_CALL BtThreadFunc2(void *p) -{ - Byte allocaDummy[0x180]; - int i = 0; - for (i = 0; i < 16; i++) - allocaDummy[i] = (Byte)i; - BtThreadFunc((CMatchFinderMt *)p); - return 0; -} - -SRes MatchFinderMt_Create(CMatchFinderMt *p, UInt32 historySize, UInt32 keepAddBufferBefore, - UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ISzAlloc *alloc) -{ - CMatchFinder *mf = p->MatchFinder; - p->historySize = historySize; - if (kMtBtBlockSize <= matchMaxLen * 4) - return SZ_ERROR_PARAM; - if (p->hashBuf == 0) - { - p->hashBuf = (UInt32 *)alloc->Alloc(alloc, (kHashBufferSize + kBtBufferSize) * sizeof(UInt32)); - if (p->hashBuf == 0) - return SZ_ERROR_MEM; - p->btBuf = p->hashBuf + kHashBufferSize; - } - keepAddBufferBefore += (kHashBufferSize + kBtBufferSize); - keepAddBufferAfter += kMtHashBlockSize; - if (!MatchFinder_Create(mf, historySize, keepAddBufferBefore, matchMaxLen, keepAddBufferAfter, alloc)) - return SZ_ERROR_MEM; - - RINOK(MtSync_Create(&p->hashSync, HashThreadFunc2, p, kMtHashNumBlocks)); - RINOK(MtSync_Create(&p->btSync, BtThreadFunc2, p, kMtBtNumBlocks)); - return SZ_OK; -} - -/* Call it after ReleaseStream / SetStream */ -void MatchFinderMt_Init(CMatchFinderMt *p) -{ - CMatchFinder *mf = p->MatchFinder; - p->btBufPos = p->btBufPosLimit = 0; - p->hashBufPos = p->hashBufPosLimit = 0; - MatchFinder_Init(mf); - p->pointerToCurPos = MatchFinder_GetPointerToCurrentPos(mf); - p->btNumAvailBytes = 0; - p->lzPos = p->historySize + 1; - - p->hash = mf->hash; - p->fixedHashSize = mf->fixedHashSize; - p->crc = mf->crc; - - p->son = mf->son; - p->matchMaxLen = mf->matchMaxLen; - p->numHashBytes = mf->numHashBytes; - p->pos = mf->pos; - p->buffer = mf->buffer; - p->cyclicBufferPos = mf->cyclicBufferPos; - p->cyclicBufferSize = mf->cyclicBufferSize; - p->cutValue = mf->cutValue; -} - -/* ReleaseStream is required to finish multithreading */ -void MatchFinderMt_ReleaseStream(CMatchFinderMt *p) -{ - MtSync_StopWriting(&p->btSync); - /* p->MatchFinder->ReleaseStream(); */ -} - -void MatchFinderMt_Normalize(CMatchFinderMt *p) -{ - MatchFinder_Normalize3(p->lzPos - p->historySize - 1, p->hash, p->fixedHashSize); - p->lzPos = p->historySize + 1; -} - -void MatchFinderMt_GetNextBlock_Bt(CMatchFinderMt *p) -{ - UInt32 blockIndex; - MtSync_GetNextBlock(&p->btSync); - blockIndex = ((p->btSync.numProcessedBlocks - 1) & kMtBtNumBlocksMask); - p->btBufPosLimit = p->btBufPos = blockIndex * kMtBtBlockSize; - p->btBufPosLimit += p->btBuf[p->btBufPos++]; - p->btNumAvailBytes = p->btBuf[p->btBufPos++]; - if (p->lzPos >= kMtMaxValForNormalize - kMtBtBlockSize) - MatchFinderMt_Normalize(p); -} - -const Byte * MatchFinderMt_GetPointerToCurrentPos(CMatchFinderMt *p) -{ - return p->pointerToCurPos; -} - -#define GET_NEXT_BLOCK_IF_REQUIRED if (p->btBufPos == p->btBufPosLimit) MatchFinderMt_GetNextBlock_Bt(p); - -UInt32 MatchFinderMt_GetNumAvailableBytes(CMatchFinderMt *p) -{ - GET_NEXT_BLOCK_IF_REQUIRED; - return p->btNumAvailBytes; -} - -Byte MatchFinderMt_GetIndexByte(CMatchFinderMt *p, Int32 index) -{ - return p->pointerToCurPos[index]; -} - -UInt32 * MixMatches2(CMatchFinderMt *p, UInt32 matchMinPos, UInt32 *distances) -{ - UInt32 hash2Value, curMatch2; - UInt32 *hash = p->hash; - const Byte *cur = p->pointerToCurPos; - UInt32 lzPos = p->lzPos; - MT_HASH2_CALC - - curMatch2 = hash[hash2Value]; - hash[hash2Value] = lzPos; - - if (curMatch2 >= matchMinPos) - if (cur[(ptrdiff_t)curMatch2 - lzPos] == cur[0]) - { - *distances++ = 2; - *distances++ = lzPos - curMatch2 - 1; - } - return distances; -} - -UInt32 * MixMatches3(CMatchFinderMt *p, UInt32 matchMinPos, UInt32 *distances) -{ - UInt32 hash2Value, hash3Value, curMatch2, curMatch3; - UInt32 *hash = p->hash; - const Byte *cur = p->pointerToCurPos; - UInt32 lzPos = p->lzPos; - MT_HASH3_CALC - - curMatch2 = hash[ hash2Value]; - curMatch3 = hash[kFix3HashSize + hash3Value]; - - hash[ hash2Value] = - hash[kFix3HashSize + hash3Value] = - lzPos; - - if (curMatch2 >= matchMinPos && cur[(ptrdiff_t)curMatch2 - lzPos] == cur[0]) - { - distances[1] = lzPos - curMatch2 - 1; - if (cur[(ptrdiff_t)curMatch2 - lzPos + 2] == cur[2]) - { - distances[0] = 3; - return distances + 2; - } - distances[0] = 2; - distances += 2; - } - if (curMatch3 >= matchMinPos && cur[(ptrdiff_t)curMatch3 - lzPos] == cur[0]) - { - *distances++ = 3; - *distances++ = lzPos - curMatch3 - 1; - } - return distances; -} - -/* -UInt32 *MixMatches4(CMatchFinderMt *p, UInt32 matchMinPos, UInt32 *distances) -{ - UInt32 hash2Value, hash3Value, hash4Value, curMatch2, curMatch3, curMatch4; - UInt32 *hash = p->hash; - const Byte *cur = p->pointerToCurPos; - UInt32 lzPos = p->lzPos; - MT_HASH4_CALC - - curMatch2 = hash[ hash2Value]; - curMatch3 = hash[kFix3HashSize + hash3Value]; - curMatch4 = hash[kFix4HashSize + hash4Value]; - - hash[ hash2Value] = - hash[kFix3HashSize + hash3Value] = - hash[kFix4HashSize + hash4Value] = - lzPos; - - if (curMatch2 >= matchMinPos && cur[(ptrdiff_t)curMatch2 - lzPos] == cur[0]) - { - distances[1] = lzPos - curMatch2 - 1; - if (cur[(ptrdiff_t)curMatch2 - lzPos + 2] == cur[2]) - { - distances[0] = (cur[(ptrdiff_t)curMatch2 - lzPos + 3] == cur[3]) ? 4 : 3; - return distances + 2; - } - distances[0] = 2; - distances += 2; - } - if (curMatch3 >= matchMinPos && cur[(ptrdiff_t)curMatch3 - lzPos] == cur[0]) - { - distances[1] = lzPos - curMatch3 - 1; - if (cur[(ptrdiff_t)curMatch3 - lzPos + 3] == cur[3]) - { - distances[0] = 4; - return distances + 2; - } - distances[0] = 3; - distances += 2; - } - - if (curMatch4 >= matchMinPos) - if ( - cur[(ptrdiff_t)curMatch4 - lzPos] == cur[0] && - cur[(ptrdiff_t)curMatch4 - lzPos + 3] == cur[3] - ) - { - *distances++ = 4; - *distances++ = lzPos - curMatch4 - 1; - } - return distances; -} -*/ - -#define INCREASE_LZ_POS p->lzPos++; p->pointerToCurPos++; - -UInt32 MatchFinderMt2_GetMatches(CMatchFinderMt *p, UInt32 *distances) -{ - const UInt32 *btBuf = p->btBuf + p->btBufPos; - UInt32 len = *btBuf++; - p->btBufPos += 1 + len; - p->btNumAvailBytes--; - { - UInt32 i; - for (i = 0; i < len; i += 2) - { - *distances++ = *btBuf++; - *distances++ = *btBuf++; - } - } - INCREASE_LZ_POS - return len; -} - -UInt32 MatchFinderMt_GetMatches(CMatchFinderMt *p, UInt32 *distances) -{ - const UInt32 *btBuf = p->btBuf + p->btBufPos; - UInt32 len = *btBuf++; - p->btBufPos += 1 + len; - - if (len == 0) - { - if (p->btNumAvailBytes-- >= 4) - len = (UInt32)(p->MixMatchesFunc(p, p->lzPos - p->historySize, distances) - (distances)); - } - else - { - /* Condition: there are matches in btBuf with length < p->numHashBytes */ - UInt32 *distances2; - p->btNumAvailBytes--; - distances2 = p->MixMatchesFunc(p, p->lzPos - btBuf[1], distances); - do - { - *distances2++ = *btBuf++; - *distances2++ = *btBuf++; - } - while ((len -= 2) != 0); - len = (UInt32)(distances2 - (distances)); - } - INCREASE_LZ_POS - return len; -} - -#define SKIP_HEADER2 do { GET_NEXT_BLOCK_IF_REQUIRED -#define SKIP_HEADER(n) SKIP_HEADER2 if (p->btNumAvailBytes-- >= (n)) { const Byte *cur = p->pointerToCurPos; UInt32 *hash = p->hash; -#define SKIP_FOOTER } INCREASE_LZ_POS p->btBufPos += p->btBuf[p->btBufPos] + 1; } while (--num != 0); - -void MatchFinderMt0_Skip(CMatchFinderMt *p, UInt32 num) -{ - SKIP_HEADER2 { p->btNumAvailBytes--; - SKIP_FOOTER -} - -void MatchFinderMt2_Skip(CMatchFinderMt *p, UInt32 num) -{ - SKIP_HEADER(2) - UInt32 hash2Value; - MT_HASH2_CALC - hash[hash2Value] = p->lzPos; - SKIP_FOOTER -} - -void MatchFinderMt3_Skip(CMatchFinderMt *p, UInt32 num) -{ - SKIP_HEADER(3) - UInt32 hash2Value, hash3Value; - MT_HASH3_CALC - hash[kFix3HashSize + hash3Value] = - hash[ hash2Value] = - p->lzPos; - SKIP_FOOTER -} - -/* -void MatchFinderMt4_Skip(CMatchFinderMt *p, UInt32 num) -{ - SKIP_HEADER(4) - UInt32 hash2Value, hash3Value, hash4Value; - MT_HASH4_CALC - hash[kFix4HashSize + hash4Value] = - hash[kFix3HashSize + hash3Value] = - hash[ hash2Value] = - p->lzPos; - SKIP_FOOTER -} -*/ - -void MatchFinderMt_CreateVTable(CMatchFinderMt *p, IMatchFinder *vTable) -{ - vTable->Init = (Mf_Init_Func)MatchFinderMt_Init; - vTable->GetIndexByte = (Mf_GetIndexByte_Func)MatchFinderMt_GetIndexByte; - vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinderMt_GetNumAvailableBytes; - vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinderMt_GetPointerToCurrentPos; - vTable->GetMatches = (Mf_GetMatches_Func)MatchFinderMt_GetMatches; - switch(p->MatchFinder->numHashBytes) - { - case 2: - p->GetHeadsFunc = GetHeads2; - p->MixMatchesFunc = (Mf_Mix_Matches)0; - vTable->Skip = (Mf_Skip_Func)MatchFinderMt0_Skip; - vTable->GetMatches = (Mf_GetMatches_Func)MatchFinderMt2_GetMatches; - break; - case 3: - p->GetHeadsFunc = GetHeads3; - p->MixMatchesFunc = (Mf_Mix_Matches)MixMatches2; - vTable->Skip = (Mf_Skip_Func)MatchFinderMt2_Skip; - break; - default: - /* case 4: */ - p->GetHeadsFunc = p->MatchFinder->bigHash ? GetHeads4b : GetHeads4; - /* p->GetHeadsFunc = GetHeads4; */ - p->MixMatchesFunc = (Mf_Mix_Matches)MixMatches3; - vTable->Skip = (Mf_Skip_Func)MatchFinderMt3_Skip; - break; - /* - default: - p->GetHeadsFunc = GetHeads5; - p->MixMatchesFunc = (Mf_Mix_Matches)MixMatches4; - vTable->Skip = (Mf_Skip_Func)MatchFinderMt4_Skip; - break; - */ - } -} diff --git a/desmume/src/windows/7z/C/LzFindMt.h b/desmume/src/windows/7z/C/LzFindMt.h deleted file mode 100644 index b7ead2d47..000000000 --- a/desmume/src/windows/7z/C/LzFindMt.h +++ /dev/null @@ -1,97 +0,0 @@ -/* LzFindMt.h -- multithreaded Match finder for LZ algorithms -2008-10-04 : Igor Pavlov : Public domain */ - -#ifndef __LZFINDMT_H -#define __LZFINDMT_H - -#include "Threads.h" -#include "LzFind.h" - -#define kMtHashBlockSize (1 << 13) -#define kMtHashNumBlocks (1 << 3) -#define kMtHashNumBlocksMask (kMtHashNumBlocks - 1) - -#define kMtBtBlockSize (1 << 14) -#define kMtBtNumBlocks (1 << 6) -#define kMtBtNumBlocksMask (kMtBtNumBlocks - 1) - -typedef struct _CMtSync -{ - Bool wasCreated; - Bool needStart; - Bool exit; - Bool stopWriting; - - CThread thread; - CAutoResetEvent canStart; - CAutoResetEvent wasStarted; - CAutoResetEvent wasStopped; - CSemaphore freeSemaphore; - CSemaphore filledSemaphore; - Bool csWasInitialized; - Bool csWasEntered; - CCriticalSection cs; - UInt32 numProcessedBlocks; -} CMtSync; - -typedef UInt32 * (*Mf_Mix_Matches)(void *p, UInt32 matchMinPos, UInt32 *distances); - -/* kMtCacheLineDummy must be >= size_of_CPU_cache_line */ -#define kMtCacheLineDummy 128 - -typedef void (*Mf_GetHeads)(const Byte *buffer, UInt32 pos, - UInt32 *hash, UInt32 hashMask, UInt32 *heads, UInt32 numHeads, const UInt32 *crc); - -typedef struct _CMatchFinderMt -{ - /* LZ */ - const Byte *pointerToCurPos; - UInt32 *btBuf; - UInt32 btBufPos; - UInt32 btBufPosLimit; - UInt32 lzPos; - UInt32 btNumAvailBytes; - - UInt32 *hash; - UInt32 fixedHashSize; - UInt32 historySize; - const UInt32 *crc; - - Mf_Mix_Matches MixMatchesFunc; - - /* LZ + BT */ - CMtSync btSync; - Byte btDummy[kMtCacheLineDummy]; - - /* BT */ - UInt32 *hashBuf; - UInt32 hashBufPos; - UInt32 hashBufPosLimit; - UInt32 hashNumAvail; - - CLzRef *son; - UInt32 matchMaxLen; - UInt32 numHashBytes; - UInt32 pos; - Byte *buffer; - UInt32 cyclicBufferPos; - UInt32 cyclicBufferSize; /* it must be historySize + 1 */ - UInt32 cutValue; - - /* BT + Hash */ - CMtSync hashSync; - /* Byte hashDummy[kMtCacheLineDummy]; */ - - /* Hash */ - Mf_GetHeads GetHeadsFunc; - CMatchFinder *MatchFinder; -} CMatchFinderMt; - -void MatchFinderMt_Construct(CMatchFinderMt *p); -void MatchFinderMt_Destruct(CMatchFinderMt *p, ISzAlloc *alloc); -SRes MatchFinderMt_Create(CMatchFinderMt *p, UInt32 historySize, UInt32 keepAddBufferBefore, - UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ISzAlloc *alloc); -void MatchFinderMt_CreateVTable(CMatchFinderMt *p, IMatchFinder *vTable); -void MatchFinderMt_ReleaseStream(CMatchFinderMt *p); - -#endif diff --git a/desmume/src/windows/7z/C/LzHash.h b/desmume/src/windows/7z/C/LzHash.h deleted file mode 100644 index c92341750..000000000 --- a/desmume/src/windows/7z/C/LzHash.h +++ /dev/null @@ -1,54 +0,0 @@ -/* LzHash.h -- HASH functions for LZ algorithms -2008-10-04 : Igor Pavlov : Public domain */ - -#ifndef __LZHASH_H -#define __LZHASH_H - -#define kHash2Size (1 << 10) -#define kHash3Size (1 << 16) -#define kHash4Size (1 << 20) - -#define kFix3HashSize (kHash2Size) -#define kFix4HashSize (kHash2Size + kHash3Size) -#define kFix5HashSize (kHash2Size + kHash3Size + kHash4Size) - -#define HASH2_CALC hashValue = cur[0] | ((UInt32)cur[1] << 8); - -#define HASH3_CALC { \ - UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ - hash2Value = temp & (kHash2Size - 1); \ - hashValue = (temp ^ ((UInt32)cur[2] << 8)) & p->hashMask; } - -#define HASH4_CALC { \ - UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ - hash2Value = temp & (kHash2Size - 1); \ - hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \ - hashValue = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & p->hashMask; } - -#define HASH5_CALC { \ - UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ - hash2Value = temp & (kHash2Size - 1); \ - hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \ - hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)); \ - hashValue = (hash4Value ^ (p->crc[cur[4]] << 3)) & p->hashMask; \ - hash4Value &= (kHash4Size - 1); } - -/* #define HASH_ZIP_CALC hashValue = ((cur[0] | ((UInt32)cur[1] << 8)) ^ p->crc[cur[2]]) & 0xFFFF; */ -#define HASH_ZIP_CALC hashValue = ((cur[2] | ((UInt32)cur[0] << 8)) ^ p->crc[cur[1]]) & 0xFFFF; - - -#define MT_HASH2_CALC \ - hash2Value = (p->crc[cur[0]] ^ cur[1]) & (kHash2Size - 1); - -#define MT_HASH3_CALC { \ - UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ - hash2Value = temp & (kHash2Size - 1); \ - hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); } - -#define MT_HASH4_CALC { \ - UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ - hash2Value = temp & (kHash2Size - 1); \ - hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \ - hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & (kHash4Size - 1); } - -#endif diff --git a/desmume/src/windows/7z/C/LzmaDec.c b/desmume/src/windows/7z/C/LzmaDec.c deleted file mode 100644 index e40e4286e..000000000 --- a/desmume/src/windows/7z/C/LzmaDec.c +++ /dev/null @@ -1,1007 +0,0 @@ -/* LzmaDec.c -- LZMA Decoder -2008-11-06 : Igor Pavlov : Public domain */ - -#include "LzmaDec.h" - -#include - -#define kNumTopBits 24 -#define kTopValue ((UInt32)1 << kNumTopBits) - -#define kNumBitModelTotalBits 11 -#define kBitModelTotal (1 << kNumBitModelTotalBits) -#define kNumMoveBits 5 - -#define RC_INIT_SIZE 5 - -#define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); } - -#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound) -#define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits)); -#define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits)); -#define GET_BIT2(p, i, A0, A1) IF_BIT_0(p) \ - { UPDATE_0(p); i = (i + i); A0; } else \ - { UPDATE_1(p); i = (i + i) + 1; A1; } -#define GET_BIT(p, i) GET_BIT2(p, i, ; , ;) - -#define TREE_GET_BIT(probs, i) { GET_BIT((probs + i), i); } -#define TREE_DECODE(probs, limit, i) \ - { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; } - -/* #define _LZMA_SIZE_OPT */ - -#ifdef _LZMA_SIZE_OPT -#define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i) -#else -#define TREE_6_DECODE(probs, i) \ - { i = 1; \ - TREE_GET_BIT(probs, i); \ - TREE_GET_BIT(probs, i); \ - TREE_GET_BIT(probs, i); \ - TREE_GET_BIT(probs, i); \ - TREE_GET_BIT(probs, i); \ - TREE_GET_BIT(probs, i); \ - i -= 0x40; } -#endif - -#define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_ERROR; range <<= 8; code = (code << 8) | (*buf++); } - -#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound) -#define UPDATE_0_CHECK range = bound; -#define UPDATE_1_CHECK range -= bound; code -= bound; -#define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p) \ - { UPDATE_0_CHECK; i = (i + i); A0; } else \ - { UPDATE_1_CHECK; i = (i + i) + 1; A1; } -#define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ; , ;) -#define TREE_DECODE_CHECK(probs, limit, i) \ - { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; } - - -#define kNumPosBitsMax 4 -#define kNumPosStatesMax (1 << kNumPosBitsMax) - -#define kLenNumLowBits 3 -#define kLenNumLowSymbols (1 << kLenNumLowBits) -#define kLenNumMidBits 3 -#define kLenNumMidSymbols (1 << kLenNumMidBits) -#define kLenNumHighBits 8 -#define kLenNumHighSymbols (1 << kLenNumHighBits) - -#define LenChoice 0 -#define LenChoice2 (LenChoice + 1) -#define LenLow (LenChoice2 + 1) -#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits)) -#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits)) -#define kNumLenProbs (LenHigh + kLenNumHighSymbols) - - -#define kNumStates 12 -#define kNumLitStates 7 - -#define kStartPosModelIndex 4 -#define kEndPosModelIndex 14 -#define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) - -#define kNumPosSlotBits 6 -#define kNumLenToPosStates 4 - -#define kNumAlignBits 4 -#define kAlignTableSize (1 << kNumAlignBits) - -#define kMatchMinLen 2 -#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols) - -#define IsMatch 0 -#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax)) -#define IsRepG0 (IsRep + kNumStates) -#define IsRepG1 (IsRepG0 + kNumStates) -#define IsRepG2 (IsRepG1 + kNumStates) -#define IsRep0Long (IsRepG2 + kNumStates) -#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax)) -#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits)) -#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex) -#define LenCoder (Align + kAlignTableSize) -#define RepLenCoder (LenCoder + kNumLenProbs) -#define Literal (RepLenCoder + kNumLenProbs) - -#define LZMA_BASE_SIZE 1846 -#define LZMA_LIT_SIZE 768 - -#define LzmaProps_GetNumProbs(p) ((UInt32)LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((p)->lc + (p)->lp))) - -#if Literal != LZMA_BASE_SIZE -StopCompilingDueBUG -#endif - -static const Byte kLiteralNextStates[kNumStates * 2] = -{ - 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5, - 7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10 -}; - -#define LZMA_DIC_MIN (1 << 12) - -/* First LZMA-symbol is always decoded. -And it decodes new LZMA-symbols while (buf < bufLimit), but "buf" is without last normalization -Out: - Result: - SZ_OK - OK - SZ_ERROR_DATA - Error - p->remainLen: - < kMatchSpecLenStart : normal remain - = kMatchSpecLenStart : finished - = kMatchSpecLenStart + 1 : Flush marker - = kMatchSpecLenStart + 2 : State Init Marker -*/ - -static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte *bufLimit) -{ - CLzmaProb *probs = p->probs; - - unsigned state = p->state; - UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3]; - unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1; - unsigned lpMask = ((unsigned)1 << (p->prop.lp)) - 1; - unsigned lc = p->prop.lc; - - Byte *dic = p->dic; - SizeT dicBufSize = p->dicBufSize; - SizeT dicPos = p->dicPos; - - UInt32 processedPos = p->processedPos; - UInt32 checkDicSize = p->checkDicSize; - unsigned len = 0; - - const Byte *buf = p->buf; - UInt32 range = p->range; - UInt32 code = p->code; - - do - { - CLzmaProb *prob; - UInt32 bound; - unsigned ttt; - unsigned posState = processedPos & pbMask; - - prob = probs + IsMatch + (state << kNumPosBitsMax) + posState; - IF_BIT_0(prob) - { - unsigned symbol; - UPDATE_0(prob); - prob = probs + Literal; - if (checkDicSize != 0 || processedPos != 0) - prob += (LZMA_LIT_SIZE * (((processedPos & lpMask) << lc) + - (dic[(dicPos == 0 ? dicBufSize : dicPos) - 1] >> (8 - lc)))); - - if (state < kNumLitStates) - { - symbol = 1; - do { GET_BIT(prob + symbol, symbol) } while (symbol < 0x100); - } - else - { - unsigned matchByte = p->dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)]; - unsigned offs = 0x100; - symbol = 1; - do - { - unsigned bit; - CLzmaProb *probLit; - matchByte <<= 1; - bit = (matchByte & offs); - probLit = prob + offs + bit + symbol; - GET_BIT2(probLit, symbol, offs &= ~bit, offs &= bit) - } - while (symbol < 0x100); - } - dic[dicPos++] = (Byte)(symbol & 0xFF); - processedPos++; - - state = kLiteralNextStates[state]; - /* if (state < 4) state = 0; else if (state < 10) state -= 3; else state -= 6; */ - continue; - } - else - { - UPDATE_1(prob); - prob = probs + IsRep + state; - IF_BIT_0(prob) - { - UPDATE_0(prob); - state += kNumStates; - prob = probs + LenCoder; - } - else - { - UPDATE_1(prob); - if (checkDicSize == 0 && processedPos == 0) - return SZ_ERROR_DATA; - prob = probs + IsRepG0 + state; - IF_BIT_0(prob) - { - UPDATE_0(prob); - prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState; - IF_BIT_0(prob) - { - UPDATE_0(prob); - dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)]; - dicPos++; - processedPos++; - state = state < kNumLitStates ? 9 : 11; - continue; - } - UPDATE_1(prob); - } - else - { - UInt32 distance; - UPDATE_1(prob); - prob = probs + IsRepG1 + state; - IF_BIT_0(prob) - { - UPDATE_0(prob); - distance = rep1; - } - else - { - UPDATE_1(prob); - prob = probs + IsRepG2 + state; - IF_BIT_0(prob) - { - UPDATE_0(prob); - distance = rep2; - } - else - { - UPDATE_1(prob); - distance = rep3; - rep3 = rep2; - } - rep2 = rep1; - } - rep1 = rep0; - rep0 = distance; - } - state = state < kNumLitStates ? 8 : 11; - prob = probs + RepLenCoder; - } - { - unsigned limit, offset; - CLzmaProb *probLen = prob + LenChoice; - IF_BIT_0(probLen) - { - UPDATE_0(probLen); - probLen = prob + LenLow + (posState << kLenNumLowBits); - offset = 0; - limit = (1 << kLenNumLowBits); - } - else - { - UPDATE_1(probLen); - probLen = prob + LenChoice2; - IF_BIT_0(probLen) - { - UPDATE_0(probLen); - probLen = prob + LenMid + (posState << kLenNumMidBits); - offset = kLenNumLowSymbols; - limit = (1 << kLenNumMidBits); - } - else - { - UPDATE_1(probLen); - probLen = prob + LenHigh; - offset = kLenNumLowSymbols + kLenNumMidSymbols; - limit = (1 << kLenNumHighBits); - } - } - TREE_DECODE(probLen, limit, len); - len += offset; - } - - if (state >= kNumStates) - { - UInt32 distance; - prob = probs + PosSlot + - ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits); - TREE_6_DECODE(prob, distance); - if (distance >= kStartPosModelIndex) - { - unsigned posSlot = (unsigned)distance; - int numDirectBits = (int)(((distance >> 1) - 1)); - distance = (2 | (distance & 1)); - if (posSlot < kEndPosModelIndex) - { - distance <<= numDirectBits; - prob = probs + SpecPos + distance - posSlot - 1; - { - UInt32 mask = 1; - unsigned i = 1; - do - { - GET_BIT2(prob + i, i, ; , distance |= mask); - mask <<= 1; - } - while (--numDirectBits != 0); - } - } - else - { - numDirectBits -= kNumAlignBits; - do - { - NORMALIZE - range >>= 1; - - { - UInt32 t; - code -= range; - t = (0 - ((UInt32)code >> 31)); /* (UInt32)((Int32)code >> 31) */ - distance = (distance << 1) + (t + 1); - code += range & t; - } - /* - distance <<= 1; - if (code >= range) - { - code -= range; - distance |= 1; - } - */ - } - while (--numDirectBits != 0); - prob = probs + Align; - distance <<= kNumAlignBits; - { - unsigned i = 1; - GET_BIT2(prob + i, i, ; , distance |= 1); - GET_BIT2(prob + i, i, ; , distance |= 2); - GET_BIT2(prob + i, i, ; , distance |= 4); - GET_BIT2(prob + i, i, ; , distance |= 8); - } - if (distance == (UInt32)0xFFFFFFFF) - { - len += kMatchSpecLenStart; - state -= kNumStates; - break; - } - } - } - rep3 = rep2; - rep2 = rep1; - rep1 = rep0; - rep0 = distance + 1; - if (checkDicSize == 0) - { - if (distance >= processedPos) - return SZ_ERROR_DATA; - } - else if (distance >= checkDicSize) - return SZ_ERROR_DATA; - state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3; - /* state = kLiteralNextStates[state]; */ - } - - len += kMatchMinLen; - - if (limit == dicPos) - return SZ_ERROR_DATA; - { - SizeT rem = limit - dicPos; - unsigned curLen = ((rem < len) ? (unsigned)rem : len); - SizeT pos = (dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0); - - processedPos += curLen; - - len -= curLen; - if (pos + curLen <= dicBufSize) - { - Byte *dest = dic + dicPos; - ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos; - const Byte *lim = dest + curLen; - dicPos += curLen; - do - *(dest) = (Byte)*(dest + src); - while (++dest != lim); - } - else - { - do - { - dic[dicPos++] = dic[pos]; - if (++pos == dicBufSize) - pos = 0; - } - while (--curLen != 0); - } - } - } - } - while (dicPos < limit && buf < bufLimit); - NORMALIZE; - p->buf = buf; - p->range = range; - p->code = code; - p->remainLen = len; - p->dicPos = dicPos; - p->processedPos = processedPos; - p->reps[0] = rep0; - p->reps[1] = rep1; - p->reps[2] = rep2; - p->reps[3] = rep3; - p->state = state; - - return SZ_OK; -} - -static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit) -{ - if (p->remainLen != 0 && p->remainLen < kMatchSpecLenStart) - { - Byte *dic = p->dic; - SizeT dicPos = p->dicPos; - SizeT dicBufSize = p->dicBufSize; - unsigned len = p->remainLen; - UInt32 rep0 = p->reps[0]; - if (limit - dicPos < len) - len = (unsigned)(limit - dicPos); - - if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= len) - p->checkDicSize = p->prop.dicSize; - - p->processedPos += len; - p->remainLen -= len; - while (len-- != 0) - { - dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)]; - dicPos++; - } - p->dicPos = dicPos; - } -} - -static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit) -{ - do - { - SizeT limit2 = limit; - if (p->checkDicSize == 0) - { - UInt32 rem = p->prop.dicSize - p->processedPos; - if (limit - p->dicPos > rem) - limit2 = p->dicPos + rem; - } - RINOK(LzmaDec_DecodeReal(p, limit2, bufLimit)); - if (p->processedPos >= p->prop.dicSize) - p->checkDicSize = p->prop.dicSize; - LzmaDec_WriteRem(p, limit); - } - while (p->dicPos < limit && p->buf < bufLimit && p->remainLen < kMatchSpecLenStart); - - if (p->remainLen > kMatchSpecLenStart) - { - p->remainLen = kMatchSpecLenStart; - } - return 0; -} - -typedef enum -{ - DUMMY_ERROR, /* unexpected end of input stream */ - DUMMY_LIT, - DUMMY_MATCH, - DUMMY_REP -} ELzmaDummy; - -static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inSize) -{ - UInt32 range = p->range; - UInt32 code = p->code; - const Byte *bufLimit = buf + inSize; - CLzmaProb *probs = p->probs; - unsigned state = p->state; - ELzmaDummy res; - - { - CLzmaProb *prob; - UInt32 bound; - unsigned ttt; - unsigned posState = (p->processedPos) & ((1 << p->prop.pb) - 1); - - prob = probs + IsMatch + (state << kNumPosBitsMax) + posState; - IF_BIT_0_CHECK(prob) - { - UPDATE_0_CHECK - - /* if (bufLimit - buf >= 7) return DUMMY_LIT; */ - - prob = probs + Literal; - if (p->checkDicSize != 0 || p->processedPos != 0) - prob += (LZMA_LIT_SIZE * - ((((p->processedPos) & ((1 << (p->prop.lp)) - 1)) << p->prop.lc) + - (p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc)))); - - if (state < kNumLitStates) - { - unsigned symbol = 1; - do { GET_BIT_CHECK(prob + symbol, symbol) } while (symbol < 0x100); - } - else - { - unsigned matchByte = p->dic[p->dicPos - p->reps[0] + - ((p->dicPos < p->reps[0]) ? p->dicBufSize : 0)]; - unsigned offs = 0x100; - unsigned symbol = 1; - do - { - unsigned bit; - CLzmaProb *probLit; - matchByte <<= 1; - bit = (matchByte & offs); - probLit = prob + offs + bit + symbol; - GET_BIT2_CHECK(probLit, symbol, offs &= ~bit, offs &= bit) - } - while (symbol < 0x100); - } - res = DUMMY_LIT; - } - else - { - unsigned len; - UPDATE_1_CHECK; - - prob = probs + IsRep + state; - IF_BIT_0_CHECK(prob) - { - UPDATE_0_CHECK; - state = 0; - prob = probs + LenCoder; - res = DUMMY_MATCH; - } - else - { - UPDATE_1_CHECK; - res = DUMMY_REP; - prob = probs + IsRepG0 + state; - IF_BIT_0_CHECK(prob) - { - UPDATE_0_CHECK; - prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState; - IF_BIT_0_CHECK(prob) - { - UPDATE_0_CHECK; - NORMALIZE_CHECK; - return DUMMY_REP; - } - else - { - UPDATE_1_CHECK; - } - } - else - { - UPDATE_1_CHECK; - prob = probs + IsRepG1 + state; - IF_BIT_0_CHECK(prob) - { - UPDATE_0_CHECK; - } - else - { - UPDATE_1_CHECK; - prob = probs + IsRepG2 + state; - IF_BIT_0_CHECK(prob) - { - UPDATE_0_CHECK; - } - else - { - UPDATE_1_CHECK; - } - } - } - state = kNumStates; - prob = probs + RepLenCoder; - } - { - unsigned limit, offset; - CLzmaProb *probLen = prob + LenChoice; - IF_BIT_0_CHECK(probLen) - { - UPDATE_0_CHECK; - probLen = prob + LenLow + (posState << kLenNumLowBits); - offset = 0; - limit = 1 << kLenNumLowBits; - } - else - { - UPDATE_1_CHECK; - probLen = prob + LenChoice2; - IF_BIT_0_CHECK(probLen) - { - UPDATE_0_CHECK; - probLen = prob + LenMid + (posState << kLenNumMidBits); - offset = kLenNumLowSymbols; - limit = 1 << kLenNumMidBits; - } - else - { - UPDATE_1_CHECK; - probLen = prob + LenHigh; - offset = kLenNumLowSymbols + kLenNumMidSymbols; - limit = 1 << kLenNumHighBits; - } - } - TREE_DECODE_CHECK(probLen, limit, len); - len += offset; - } - - if (state < 4) - { - unsigned posSlot; - prob = probs + PosSlot + - ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << - kNumPosSlotBits); - TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot); - if (posSlot >= kStartPosModelIndex) - { - int numDirectBits = ((posSlot >> 1) - 1); - - /* if (bufLimit - buf >= 8) return DUMMY_MATCH; */ - - if (posSlot < kEndPosModelIndex) - { - prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits) - posSlot - 1; - } - else - { - numDirectBits -= kNumAlignBits; - do - { - NORMALIZE_CHECK - range >>= 1; - code -= range & (((code - range) >> 31) - 1); - /* if (code >= range) code -= range; */ - } - while (--numDirectBits != 0); - prob = probs + Align; - numDirectBits = kNumAlignBits; - } - { - unsigned i = 1; - do - { - GET_BIT_CHECK(prob + i, i); - } - while (--numDirectBits != 0); - } - } - } - } - } - NORMALIZE_CHECK; - return res; -} - - -static void LzmaDec_InitRc(CLzmaDec *p, const Byte *data) -{ - p->code = ((UInt32)data[1] << 24) | ((UInt32)data[2] << 16) | ((UInt32)data[3] << 8) | ((UInt32)data[4]); - p->range = 0xFFFFFFFF; - p->needFlush = 0; -} - -void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState) -{ - p->needFlush = 1; - p->remainLen = 0; - p->tempBufSize = 0; - - if (initDic) - { - p->processedPos = 0; - p->checkDicSize = 0; - p->needInitState = 1; - } - if (initState) - p->needInitState = 1; -} - -void LzmaDec_Init(CLzmaDec *p) -{ - p->dicPos = 0; - LzmaDec_InitDicAndState(p, True, True); -} - -static void LzmaDec_InitStateReal(CLzmaDec *p) -{ - UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (p->prop.lc + p->prop.lp)); - UInt32 i; - CLzmaProb *probs = p->probs; - for (i = 0; i < numProbs; i++) - probs[i] = kBitModelTotal >> 1; - p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1; - p->state = 0; - p->needInitState = 0; -} - -SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen, - ELzmaFinishMode finishMode, ELzmaStatus *status) -{ - SizeT inSize = *srcLen; - (*srcLen) = 0; - LzmaDec_WriteRem(p, dicLimit); - - *status = LZMA_STATUS_NOT_SPECIFIED; - - while (p->remainLen != kMatchSpecLenStart) - { - int checkEndMarkNow; - - if (p->needFlush != 0) - { - for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--) - p->tempBuf[p->tempBufSize++] = *src++; - if (p->tempBufSize < RC_INIT_SIZE) - { - *status = LZMA_STATUS_NEEDS_MORE_INPUT; - return SZ_OK; - } - if (p->tempBuf[0] != 0) - return SZ_ERROR_DATA; - - LzmaDec_InitRc(p, p->tempBuf); - p->tempBufSize = 0; - } - - checkEndMarkNow = 0; - if (p->dicPos >= dicLimit) - { - if (p->remainLen == 0 && p->code == 0) - { - *status = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK; - return SZ_OK; - } - if (finishMode == LZMA_FINISH_ANY) - { - *status = LZMA_STATUS_NOT_FINISHED; - return SZ_OK; - } - if (p->remainLen != 0) - { - *status = LZMA_STATUS_NOT_FINISHED; - return SZ_ERROR_DATA; - } - checkEndMarkNow = 1; - } - - if (p->needInitState) - LzmaDec_InitStateReal(p); - - if (p->tempBufSize == 0) - { - SizeT processed; - const Byte *bufLimit; - if (inSize < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow) - { - int dummyRes = LzmaDec_TryDummy(p, src, inSize); - if (dummyRes == DUMMY_ERROR) - { - memcpy(p->tempBuf, src, inSize); - p->tempBufSize = (unsigned)inSize; - (*srcLen) += inSize; - *status = LZMA_STATUS_NEEDS_MORE_INPUT; - return SZ_OK; - } - if (checkEndMarkNow && dummyRes != DUMMY_MATCH) - { - *status = LZMA_STATUS_NOT_FINISHED; - return SZ_ERROR_DATA; - } - bufLimit = src; - } - else - bufLimit = src + inSize - LZMA_REQUIRED_INPUT_MAX; - p->buf = src; - if (LzmaDec_DecodeReal2(p, dicLimit, bufLimit) != 0) - return SZ_ERROR_DATA; - processed = (SizeT)(p->buf - src); - (*srcLen) += processed; - src += processed; - inSize -= processed; - } - else - { - unsigned rem = p->tempBufSize, lookAhead = 0; - while (rem < LZMA_REQUIRED_INPUT_MAX && lookAhead < inSize) - p->tempBuf[rem++] = src[lookAhead++]; - p->tempBufSize = rem; - if (rem < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow) - { - int dummyRes = LzmaDec_TryDummy(p, p->tempBuf, rem); - if (dummyRes == DUMMY_ERROR) - { - (*srcLen) += lookAhead; - *status = LZMA_STATUS_NEEDS_MORE_INPUT; - return SZ_OK; - } - if (checkEndMarkNow && dummyRes != DUMMY_MATCH) - { - *status = LZMA_STATUS_NOT_FINISHED; - return SZ_ERROR_DATA; - } - } - p->buf = p->tempBuf; - if (LzmaDec_DecodeReal2(p, dicLimit, p->buf) != 0) - return SZ_ERROR_DATA; - lookAhead -= (rem - (unsigned)(p->buf - p->tempBuf)); - (*srcLen) += lookAhead; - src += lookAhead; - inSize -= lookAhead; - p->tempBufSize = 0; - } - } - if (p->code == 0) - *status = LZMA_STATUS_FINISHED_WITH_MARK; - return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA; -} - -SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) -{ - SizeT outSize = *destLen; - SizeT inSize = *srcLen; - *srcLen = *destLen = 0; - for (;;) - { - SizeT inSizeCur = inSize, outSizeCur, dicPos; - ELzmaFinishMode curFinishMode; - SRes res; - if (p->dicPos == p->dicBufSize) - p->dicPos = 0; - dicPos = p->dicPos; - if (outSize > p->dicBufSize - dicPos) - { - outSizeCur = p->dicBufSize; - curFinishMode = LZMA_FINISH_ANY; - } - else - { - outSizeCur = dicPos + outSize; - curFinishMode = finishMode; - } - - res = LzmaDec_DecodeToDic(p, outSizeCur, src, &inSizeCur, curFinishMode, status); - src += inSizeCur; - inSize -= inSizeCur; - *srcLen += inSizeCur; - outSizeCur = p->dicPos - dicPos; - memcpy(dest, p->dic + dicPos, outSizeCur); - dest += outSizeCur; - outSize -= outSizeCur; - *destLen += outSizeCur; - if (res != 0) - return res; - if (outSizeCur == 0 || outSize == 0) - return SZ_OK; - } -} - -void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc) -{ - alloc->Free(alloc, p->probs); - p->probs = 0; -} - -static void LzmaDec_FreeDict(CLzmaDec *p, ISzAlloc *alloc) -{ - alloc->Free(alloc, p->dic); - p->dic = 0; -} - -void LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc) -{ - LzmaDec_FreeProbs(p, alloc); - LzmaDec_FreeDict(p, alloc); -} - -SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size) -{ - UInt32 dicSize; - Byte d; - - if (size < LZMA_PROPS_SIZE) - return SZ_ERROR_UNSUPPORTED; - else - dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)data[4] << 24); - - if (dicSize < LZMA_DIC_MIN) - dicSize = LZMA_DIC_MIN; - p->dicSize = dicSize; - - d = data[0]; - if (d >= (9 * 5 * 5)) - return SZ_ERROR_UNSUPPORTED; - - p->lc = d % 9; - d /= 9; - p->pb = d / 5; - p->lp = d % 5; - - return SZ_OK; -} - -static SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAlloc *alloc) -{ - UInt32 numProbs = LzmaProps_GetNumProbs(propNew); - if (p->probs == 0 || numProbs != p->numProbs) - { - LzmaDec_FreeProbs(p, alloc); - p->probs = (CLzmaProb *)alloc->Alloc(alloc, numProbs * sizeof(CLzmaProb)); - p->numProbs = numProbs; - if (p->probs == 0) - return SZ_ERROR_MEM; - } - return SZ_OK; -} - -SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc) -{ - CLzmaProps propNew; - RINOK(LzmaProps_Decode(&propNew, props, propsSize)); - RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)); - p->prop = propNew; - return SZ_OK; -} - -SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc) -{ - CLzmaProps propNew; - SizeT dicBufSize; - RINOK(LzmaProps_Decode(&propNew, props, propsSize)); - RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)); - dicBufSize = propNew.dicSize; - if (p->dic == 0 || dicBufSize != p->dicBufSize) - { - LzmaDec_FreeDict(p, alloc); - p->dic = (Byte *)alloc->Alloc(alloc, dicBufSize); - if (p->dic == 0) - { - LzmaDec_FreeProbs(p, alloc); - return SZ_ERROR_MEM; - } - } - p->dicBufSize = dicBufSize; - p->prop = propNew; - return SZ_OK; -} - -SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, - const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, - ELzmaStatus *status, ISzAlloc *alloc) -{ - CLzmaDec p; - SRes res; - SizeT inSize = *srcLen; - SizeT outSize = *destLen; - *srcLen = *destLen = 0; - if (inSize < RC_INIT_SIZE) - return SZ_ERROR_INPUT_EOF; - - LzmaDec_Construct(&p); - res = LzmaDec_AllocateProbs(&p, propData, propSize, alloc); - if (res != 0) - return res; - p.dic = dest; - p.dicBufSize = outSize; - - LzmaDec_Init(&p); - - *srcLen = inSize; - res = LzmaDec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status); - - if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT) - res = SZ_ERROR_INPUT_EOF; - - (*destLen) = p.dicPos; - LzmaDec_FreeProbs(&p, alloc); - return res; -} diff --git a/desmume/src/windows/7z/C/LzmaDec.h b/desmume/src/windows/7z/C/LzmaDec.h deleted file mode 100644 index ad7d7057a..000000000 --- a/desmume/src/windows/7z/C/LzmaDec.h +++ /dev/null @@ -1,223 +0,0 @@ -/* LzmaDec.h -- LZMA Decoder -2008-10-04 : Igor Pavlov : Public domain */ - -#ifndef __LZMADEC_H -#define __LZMADEC_H - -#include "Types.h" - -/* #define _LZMA_PROB32 */ -/* _LZMA_PROB32 can increase the speed on some CPUs, - but memory usage for CLzmaDec::probs will be doubled in that case */ - -#ifdef _LZMA_PROB32 -#define CLzmaProb UInt32 -#else -#define CLzmaProb UInt16 -#endif - - -/* ---------- LZMA Properties ---------- */ - -#define LZMA_PROPS_SIZE 5 - -typedef struct _CLzmaProps -{ - unsigned lc, lp, pb; - UInt32 dicSize; -} CLzmaProps; - -/* LzmaProps_Decode - decodes properties -Returns: - SZ_OK - SZ_ERROR_UNSUPPORTED - Unsupported properties -*/ - -SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size); - - -/* ---------- LZMA Decoder state ---------- */ - -/* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case. - Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */ - -#define LZMA_REQUIRED_INPUT_MAX 20 - -typedef struct -{ - CLzmaProps prop; - CLzmaProb *probs; - Byte *dic; - const Byte *buf; - UInt32 range, code; - SizeT dicPos; - SizeT dicBufSize; - UInt32 processedPos; - UInt32 checkDicSize; - unsigned state; - UInt32 reps[4]; - unsigned remainLen; - int needFlush; - int needInitState; - UInt32 numProbs; - unsigned tempBufSize; - Byte tempBuf[LZMA_REQUIRED_INPUT_MAX]; -} CLzmaDec; - -#define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; } - -void LzmaDec_Init(CLzmaDec *p); - -/* There are two types of LZMA streams: - 0) Stream with end mark. That end mark adds about 6 bytes to compressed size. - 1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */ - -typedef enum -{ - LZMA_FINISH_ANY, /* finish at any point */ - LZMA_FINISH_END /* block must be finished at the end */ -} ELzmaFinishMode; - -/* ELzmaFinishMode has meaning only if the decoding reaches output limit !!! - - You must use LZMA_FINISH_END, when you know that current output buffer - covers last bytes of block. In other cases you must use LZMA_FINISH_ANY. - - If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK, - and output value of destLen will be less than output buffer size limit. - You can check status result also. - - You can use multiple checks to test data integrity after full decompression: - 1) Check Result and "status" variable. - 2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize. - 3) Check that output(srcLen) = compressedSize, if you know real compressedSize. - You must use correct finish mode in that case. */ - -typedef enum -{ - LZMA_STATUS_NOT_SPECIFIED, /* use main error code instead */ - LZMA_STATUS_FINISHED_WITH_MARK, /* stream was finished with end mark. */ - LZMA_STATUS_NOT_FINISHED, /* stream was not finished */ - LZMA_STATUS_NEEDS_MORE_INPUT, /* you must provide more input bytes */ - LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK /* there is probability that stream was finished without end mark */ -} ELzmaStatus; - -/* ELzmaStatus is used only as output value for function call */ - - -/* ---------- Interfaces ---------- */ - -/* There are 3 levels of interfaces: - 1) Dictionary Interface - 2) Buffer Interface - 3) One Call Interface - You can select any of these interfaces, but don't mix functions from different - groups for same object. */ - - -/* There are two variants to allocate state for Dictionary Interface: - 1) LzmaDec_Allocate / LzmaDec_Free - 2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs - You can use variant 2, if you set dictionary buffer manually. - For Buffer Interface you must always use variant 1. - -LzmaDec_Allocate* can return: - SZ_OK - SZ_ERROR_MEM - Memory allocation error - SZ_ERROR_UNSUPPORTED - Unsupported properties -*/ - -SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc); -void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc); - -SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc); -void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc); - -/* ---------- Dictionary Interface ---------- */ - -/* You can use it, if you want to eliminate the overhead for data copying from - dictionary to some other external buffer. - You must work with CLzmaDec variables directly in this interface. - - STEPS: - LzmaDec_Constr() - LzmaDec_Allocate() - for (each new stream) - { - LzmaDec_Init() - while (it needs more decompression) - { - LzmaDec_DecodeToDic() - use data from CLzmaDec::dic and update CLzmaDec::dicPos - } - } - LzmaDec_Free() -*/ - -/* LzmaDec_DecodeToDic - - The decoding to internal dictionary buffer (CLzmaDec::dic). - You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!! - -finishMode: - It has meaning only if the decoding reaches output limit (dicLimit). - LZMA_FINISH_ANY - Decode just dicLimit bytes. - LZMA_FINISH_END - Stream must be finished after dicLimit. - -Returns: - SZ_OK - status: - LZMA_STATUS_FINISHED_WITH_MARK - LZMA_STATUS_NOT_FINISHED - LZMA_STATUS_NEEDS_MORE_INPUT - LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK - SZ_ERROR_DATA - Data error -*/ - -SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, - const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); - - -/* ---------- Buffer Interface ---------- */ - -/* It's zlib-like interface. - See LzmaDec_DecodeToDic description for information about STEPS and return results, - but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need - to work with CLzmaDec variables manually. - -finishMode: - It has meaning only if the decoding reaches output limit (*destLen). - LZMA_FINISH_ANY - Decode just destLen bytes. - LZMA_FINISH_END - Stream must be finished after (*destLen). -*/ - -SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, - const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); - - -/* ---------- One Call Interface ---------- */ - -/* LzmaDecode - -finishMode: - It has meaning only if the decoding reaches output limit (*destLen). - LZMA_FINISH_ANY - Decode just destLen bytes. - LZMA_FINISH_END - Stream must be finished after (*destLen). - -Returns: - SZ_OK - status: - LZMA_STATUS_FINISHED_WITH_MARK - LZMA_STATUS_NOT_FINISHED - LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK - SZ_ERROR_DATA - Data error - SZ_ERROR_MEM - Memory allocation error - SZ_ERROR_UNSUPPORTED - Unsupported properties - SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src). -*/ - -SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, - const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, - ELzmaStatus *status, ISzAlloc *alloc); - -#endif diff --git a/desmume/src/windows/7z/C/LzmaEnc.c b/desmume/src/windows/7z/C/LzmaEnc.c deleted file mode 100644 index a5a82da91..000000000 --- a/desmume/src/windows/7z/C/LzmaEnc.c +++ /dev/null @@ -1,2275 +0,0 @@ -/* LzmaEnc.c -- LZMA Encoder -2008-10-04 : Igor Pavlov : Public domain */ - -#include - -/* #define SHOW_STAT */ -/* #define SHOW_STAT2 */ - -#if defined(SHOW_STAT) || defined(SHOW_STAT2) -#include -#endif - -#include "LzmaEnc.h" - -#include "LzFind.h" -#ifdef COMPRESS_MF_MT -#include "LzFindMt.h" -#endif - -#ifdef SHOW_STAT -static int ttt = 0; -#endif - -#define kBlockSizeMax ((1 << LZMA_NUM_BLOCK_SIZE_BITS) - 1) - -#define kBlockSize (9 << 10) -#define kUnpackBlockSize (1 << 18) -#define kMatchArraySize (1 << 21) -#define kMatchRecordMaxSize ((LZMA_MATCH_LEN_MAX * 2 + 3) * LZMA_MATCH_LEN_MAX) - -#define kNumMaxDirectBits (31) - -#define kNumTopBits 24 -#define kTopValue ((UInt32)1 << kNumTopBits) - -#define kNumBitModelTotalBits 11 -#define kBitModelTotal (1 << kNumBitModelTotalBits) -#define kNumMoveBits 5 -#define kProbInitValue (kBitModelTotal >> 1) - -#define kNumMoveReducingBits 4 -#define kNumBitPriceShiftBits 4 -#define kBitPrice (1 << kNumBitPriceShiftBits) - -void LzmaEncProps_Init(CLzmaEncProps *p) -{ - p->level = 5; - p->dictSize = p->mc = 0; - p->lc = p->lp = p->pb = p->algo = p->fb = p->btMode = p->numHashBytes = p->numThreads = -1; - p->writeEndMark = 0; -} - -void LzmaEncProps_Normalize(CLzmaEncProps *p) -{ - int level = p->level; - if (level < 0) level = 5; - p->level = level; - if (p->dictSize == 0) p->dictSize = (level <= 5 ? (1 << (level * 2 + 14)) : (level == 6 ? (1 << 25) : (1 << 26))); - if (p->lc < 0) p->lc = 3; - if (p->lp < 0) p->lp = 0; - if (p->pb < 0) p->pb = 2; - if (p->algo < 0) p->algo = (level < 5 ? 0 : 1); - if (p->fb < 0) p->fb = (level < 7 ? 32 : 64); - if (p->btMode < 0) p->btMode = (p->algo == 0 ? 0 : 1); - if (p->numHashBytes < 0) p->numHashBytes = 4; - if (p->mc == 0) p->mc = (16 + (p->fb >> 1)) >> (p->btMode ? 0 : 1); - if (p->numThreads < 0) p->numThreads = ((p->btMode && p->algo) ? 2 : 1); -} - -UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2) -{ - CLzmaEncProps props = *props2; - LzmaEncProps_Normalize(&props); - return props.dictSize; -} - -/* #define LZMA_LOG_BSR */ -/* Define it for Intel's CPU */ - - -#ifdef LZMA_LOG_BSR - -#define kDicLogSizeMaxCompress 30 - -#define BSR2_RET(pos, res) { unsigned long i; _BitScanReverse(&i, (pos)); res = (i + i) + ((pos >> (i - 1)) & 1); } - -UInt32 GetPosSlot1(UInt32 pos) -{ - UInt32 res; - BSR2_RET(pos, res); - return res; -} -#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); } -#define GetPosSlot(pos, res) { if (pos < 2) res = pos; else BSR2_RET(pos, res); } - -#else - -#define kNumLogBits (9 + (int)sizeof(size_t) / 2) -#define kDicLogSizeMaxCompress ((kNumLogBits - 1) * 2 + 7) - -void LzmaEnc_FastPosInit(Byte *g_FastPos) -{ - int c = 2, slotFast; - g_FastPos[0] = 0; - g_FastPos[1] = 1; - - for (slotFast = 2; slotFast < kNumLogBits * 2; slotFast++) - { - UInt32 k = (1 << ((slotFast >> 1) - 1)); - UInt32 j; - for (j = 0; j < k; j++, c++) - g_FastPos[c] = (Byte)slotFast; - } -} - -#define BSR2_RET(pos, res) { UInt32 i = 6 + ((kNumLogBits - 1) & \ - (0 - (((((UInt32)1 << (kNumLogBits + 6)) - 1) - pos) >> 31))); \ - res = p->g_FastPos[pos >> i] + (i * 2); } -/* -#define BSR2_RET(pos, res) { res = (pos < (1 << (kNumLogBits + 6))) ? \ - p->g_FastPos[pos >> 6] + 12 : \ - p->g_FastPos[pos >> (6 + kNumLogBits - 1)] + (6 + (kNumLogBits - 1)) * 2; } -*/ - -#define GetPosSlot1(pos) p->g_FastPos[pos] -#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); } -#define GetPosSlot(pos, res) { if (pos < kNumFullDistances) res = p->g_FastPos[pos]; else BSR2_RET(pos, res); } - -#endif - - -#define LZMA_NUM_REPS 4 - -typedef unsigned CState; - -typedef struct _COptimal -{ - UInt32 price; - - CState state; - int prev1IsChar; - int prev2; - - UInt32 posPrev2; - UInt32 backPrev2; - - UInt32 posPrev; - UInt32 backPrev; - UInt32 backs[LZMA_NUM_REPS]; -} COptimal; - -#define kNumOpts (1 << 12) - -#define kNumLenToPosStates 4 -#define kNumPosSlotBits 6 -#define kDicLogSizeMin 0 -#define kDicLogSizeMax 32 -#define kDistTableSizeMax (kDicLogSizeMax * 2) - - -#define kNumAlignBits 4 -#define kAlignTableSize (1 << kNumAlignBits) -#define kAlignMask (kAlignTableSize - 1) - -#define kStartPosModelIndex 4 -#define kEndPosModelIndex 14 -#define kNumPosModels (kEndPosModelIndex - kStartPosModelIndex) - -#define kNumFullDistances (1 << (kEndPosModelIndex / 2)) - -#ifdef _LZMA_PROB32 -#define CLzmaProb UInt32 -#else -#define CLzmaProb UInt16 -#endif - -#define LZMA_PB_MAX 4 -#define LZMA_LC_MAX 8 -#define LZMA_LP_MAX 4 - -#define LZMA_NUM_PB_STATES_MAX (1 << LZMA_PB_MAX) - - -#define kLenNumLowBits 3 -#define kLenNumLowSymbols (1 << kLenNumLowBits) -#define kLenNumMidBits 3 -#define kLenNumMidSymbols (1 << kLenNumMidBits) -#define kLenNumHighBits 8 -#define kLenNumHighSymbols (1 << kLenNumHighBits) - -#define kLenNumSymbolsTotal (kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols) - -#define LZMA_MATCH_LEN_MIN 2 -#define LZMA_MATCH_LEN_MAX (LZMA_MATCH_LEN_MIN + kLenNumSymbolsTotal - 1) - -#define kNumStates 12 - -typedef struct -{ - CLzmaProb choice; - CLzmaProb choice2; - CLzmaProb low[LZMA_NUM_PB_STATES_MAX << kLenNumLowBits]; - CLzmaProb mid[LZMA_NUM_PB_STATES_MAX << kLenNumMidBits]; - CLzmaProb high[kLenNumHighSymbols]; -} CLenEnc; - -typedef struct -{ - CLenEnc p; - UInt32 prices[LZMA_NUM_PB_STATES_MAX][kLenNumSymbolsTotal]; - UInt32 tableSize; - UInt32 counters[LZMA_NUM_PB_STATES_MAX]; -} CLenPriceEnc; - -typedef struct _CRangeEnc -{ - UInt32 range; - Byte cache; - UInt64 low; - UInt64 cacheSize; - Byte *buf; - Byte *bufLim; - Byte *bufBase; - ISeqOutStream *outStream; - UInt64 processed; - SRes res; -} CRangeEnc; - -typedef struct _CSeqInStreamBuf -{ - ISeqInStream funcTable; - const Byte *data; - SizeT rem; -} CSeqInStreamBuf; - -static SRes MyRead(void *pp, void *data, size_t *size) -{ - size_t curSize = *size; - CSeqInStreamBuf *p = (CSeqInStreamBuf *)pp; - if (p->rem < curSize) - curSize = p->rem; - memcpy(data, p->data, curSize); - p->rem -= curSize; - p->data += curSize; - *size = curSize; - return SZ_OK; -} - -typedef struct -{ - CLzmaProb *litProbs; - - CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX]; - CLzmaProb isRep[kNumStates]; - CLzmaProb isRepG0[kNumStates]; - CLzmaProb isRepG1[kNumStates]; - CLzmaProb isRepG2[kNumStates]; - CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX]; - - CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits]; - CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex]; - CLzmaProb posAlignEncoder[1 << kNumAlignBits]; - - CLenPriceEnc lenEnc; - CLenPriceEnc repLenEnc; - - UInt32 reps[LZMA_NUM_REPS]; - UInt32 state; -} CSaveState; - -typedef struct _CLzmaEnc -{ - IMatchFinder matchFinder; - void *matchFinderObj; - - #ifdef COMPRESS_MF_MT - Bool mtMode; - CMatchFinderMt matchFinderMt; - #endif - - CMatchFinder matchFinderBase; - - #ifdef COMPRESS_MF_MT - Byte pad[128]; - #endif - - UInt32 optimumEndIndex; - UInt32 optimumCurrentIndex; - - UInt32 longestMatchLength; - UInt32 numPairs; - UInt32 numAvail; - COptimal opt[kNumOpts]; - - #ifndef LZMA_LOG_BSR - Byte g_FastPos[1 << kNumLogBits]; - #endif - - UInt32 ProbPrices[kBitModelTotal >> kNumMoveReducingBits]; - UInt32 matches[LZMA_MATCH_LEN_MAX * 2 + 2 + 1]; - UInt32 numFastBytes; - UInt32 additionalOffset; - UInt32 reps[LZMA_NUM_REPS]; - UInt32 state; - - UInt32 posSlotPrices[kNumLenToPosStates][kDistTableSizeMax]; - UInt32 distancesPrices[kNumLenToPosStates][kNumFullDistances]; - UInt32 alignPrices[kAlignTableSize]; - UInt32 alignPriceCount; - - UInt32 distTableSize; - - unsigned lc, lp, pb; - unsigned lpMask, pbMask; - - CLzmaProb *litProbs; - - CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX]; - CLzmaProb isRep[kNumStates]; - CLzmaProb isRepG0[kNumStates]; - CLzmaProb isRepG1[kNumStates]; - CLzmaProb isRepG2[kNumStates]; - CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX]; - - CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits]; - CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex]; - CLzmaProb posAlignEncoder[1 << kNumAlignBits]; - - CLenPriceEnc lenEnc; - CLenPriceEnc repLenEnc; - - unsigned lclp; - - Bool fastMode; - - CRangeEnc rc; - - Bool writeEndMark; - UInt64 nowPos64; - UInt32 matchPriceCount; - Bool finished; - Bool multiThread; - - SRes result; - UInt32 dictSize; - UInt32 matchFinderCycles; - - ISeqInStream *inStream; - CSeqInStreamBuf seqBufInStream; - - CSaveState saveState; -} CLzmaEnc; - -void LzmaEnc_SaveState(CLzmaEncHandle pp) -{ - CLzmaEnc *p = (CLzmaEnc *)pp; - CSaveState *dest = &p->saveState; - int i; - dest->lenEnc = p->lenEnc; - dest->repLenEnc = p->repLenEnc; - dest->state = p->state; - - for (i = 0; i < kNumStates; i++) - { - memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i])); - memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i])); - } - for (i = 0; i < kNumLenToPosStates; i++) - memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i])); - memcpy(dest->isRep, p->isRep, sizeof(p->isRep)); - memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0)); - memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1)); - memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2)); - memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders)); - memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder)); - memcpy(dest->reps, p->reps, sizeof(p->reps)); - memcpy(dest->litProbs, p->litProbs, (0x300 << p->lclp) * sizeof(CLzmaProb)); -} - -void LzmaEnc_RestoreState(CLzmaEncHandle pp) -{ - CLzmaEnc *dest = (CLzmaEnc *)pp; - const CSaveState *p = &dest->saveState; - int i; - dest->lenEnc = p->lenEnc; - dest->repLenEnc = p->repLenEnc; - dest->state = p->state; - - for (i = 0; i < kNumStates; i++) - { - memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i])); - memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i])); - } - for (i = 0; i < kNumLenToPosStates; i++) - memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i])); - memcpy(dest->isRep, p->isRep, sizeof(p->isRep)); - memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0)); - memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1)); - memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2)); - memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders)); - memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder)); - memcpy(dest->reps, p->reps, sizeof(p->reps)); - memcpy(dest->litProbs, p->litProbs, (0x300 << dest->lclp) * sizeof(CLzmaProb)); -} - -SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2) -{ - CLzmaEnc *p = (CLzmaEnc *)pp; - CLzmaEncProps props = *props2; - LzmaEncProps_Normalize(&props); - - if (props.lc > LZMA_LC_MAX || props.lp > LZMA_LP_MAX || props.pb > LZMA_PB_MAX || - props.dictSize > (1 << kDicLogSizeMaxCompress) || props.dictSize > (1 << 30)) - return SZ_ERROR_PARAM; - p->dictSize = props.dictSize; - p->matchFinderCycles = props.mc; - { - unsigned fb = props.fb; - if (fb < 5) - fb = 5; - if (fb > LZMA_MATCH_LEN_MAX) - fb = LZMA_MATCH_LEN_MAX; - p->numFastBytes = fb; - } - p->lc = props.lc; - p->lp = props.lp; - p->pb = props.pb; - p->fastMode = (props.algo == 0); - p->matchFinderBase.btMode = props.btMode; - { - UInt32 numHashBytes = 4; - if (props.btMode) - { - if (props.numHashBytes < 2) - numHashBytes = 2; - else if (props.numHashBytes < 4) - numHashBytes = props.numHashBytes; - } - p->matchFinderBase.numHashBytes = numHashBytes; - } - - p->matchFinderBase.cutValue = props.mc; - - p->writeEndMark = props.writeEndMark; - - #ifdef COMPRESS_MF_MT - /* - if (newMultiThread != _multiThread) - { - ReleaseMatchFinder(); - _multiThread = newMultiThread; - } - */ - p->multiThread = (props.numThreads > 1); - #endif - - return SZ_OK; -} - -static const int kLiteralNextStates[kNumStates] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5}; -static const int kMatchNextStates[kNumStates] = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10}; -static const int kRepNextStates[kNumStates] = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11}; -static const int kShortRepNextStates[kNumStates]= {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11}; - -#define IsCharState(s) ((s) < 7) - -#define GetLenToPosState(len) (((len) < kNumLenToPosStates + 1) ? (len) - 2 : kNumLenToPosStates - 1) - -#define kInfinityPrice (1 << 30) - -static void RangeEnc_Construct(CRangeEnc *p) -{ - p->outStream = 0; - p->bufBase = 0; -} - -#define RangeEnc_GetProcessed(p) ((p)->processed + ((p)->buf - (p)->bufBase) + (p)->cacheSize) - -#define RC_BUF_SIZE (1 << 16) -static int RangeEnc_Alloc(CRangeEnc *p, ISzAlloc *alloc) -{ - if (p->bufBase == 0) - { - p->bufBase = (Byte *)alloc->Alloc(alloc, RC_BUF_SIZE); - if (p->bufBase == 0) - return 0; - p->bufLim = p->bufBase + RC_BUF_SIZE; - } - return 1; -} - -static void RangeEnc_Free(CRangeEnc *p, ISzAlloc *alloc) -{ - alloc->Free(alloc, p->bufBase); - p->bufBase = 0; -} - -static void RangeEnc_Init(CRangeEnc *p) -{ - /* Stream.Init(); */ - p->low = 0; - p->range = 0xFFFFFFFF; - p->cacheSize = 1; - p->cache = 0; - - p->buf = p->bufBase; - - p->processed = 0; - p->res = SZ_OK; -} - -static void RangeEnc_FlushStream(CRangeEnc *p) -{ - size_t num; - if (p->res != SZ_OK) - return; - num = p->buf - p->bufBase; - if (num != p->outStream->Write(p->outStream, p->bufBase, num)) - p->res = SZ_ERROR_WRITE; - p->processed += num; - p->buf = p->bufBase; -} - -static void MY_FAST_CALL RangeEnc_ShiftLow(CRangeEnc *p) -{ - if ((UInt32)p->low < (UInt32)0xFF000000 || (int)(p->low >> 32) != 0) - { - Byte temp = p->cache; - do - { - Byte *buf = p->buf; - *buf++ = (Byte)(temp + (Byte)(p->low >> 32)); - p->buf = buf; - if (buf == p->bufLim) - RangeEnc_FlushStream(p); - temp = 0xFF; - } - while (--p->cacheSize != 0); - p->cache = (Byte)((UInt32)p->low >> 24); - } - p->cacheSize++; - p->low = (UInt32)p->low << 8; -} - -static void RangeEnc_FlushData(CRangeEnc *p) -{ - int i; - for (i = 0; i < 5; i++) - RangeEnc_ShiftLow(p); -} - -static void RangeEnc_EncodeDirectBits(CRangeEnc *p, UInt32 value, int numBits) -{ - do - { - p->range >>= 1; - p->low += p->range & (0 - ((value >> --numBits) & 1)); - if (p->range < kTopValue) - { - p->range <<= 8; - RangeEnc_ShiftLow(p); - } - } - while (numBits != 0); -} - -static void RangeEnc_EncodeBit(CRangeEnc *p, CLzmaProb *prob, UInt32 symbol) -{ - UInt32 ttt = *prob; - UInt32 newBound = (p->range >> kNumBitModelTotalBits) * ttt; - if (symbol == 0) - { - p->range = newBound; - ttt += (kBitModelTotal - ttt) >> kNumMoveBits; - } - else - { - p->low += newBound; - p->range -= newBound; - ttt -= ttt >> kNumMoveBits; - } - *prob = (CLzmaProb)ttt; - if (p->range < kTopValue) - { - p->range <<= 8; - RangeEnc_ShiftLow(p); - } -} - -static void LitEnc_Encode(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol) -{ - symbol |= 0x100; - do - { - RangeEnc_EncodeBit(p, probs + (symbol >> 8), (symbol >> 7) & 1); - symbol <<= 1; - } - while (symbol < 0x10000); -} - -static void LitEnc_EncodeMatched(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol, UInt32 matchByte) -{ - UInt32 offs = 0x100; - symbol |= 0x100; - do - { - matchByte <<= 1; - RangeEnc_EncodeBit(p, probs + (offs + (matchByte & offs) + (symbol >> 8)), (symbol >> 7) & 1); - symbol <<= 1; - offs &= ~(matchByte ^ symbol); - } - while (symbol < 0x10000); -} - -void LzmaEnc_InitPriceTables(UInt32 *ProbPrices) -{ - UInt32 i; - for (i = (1 << kNumMoveReducingBits) / 2; i < kBitModelTotal; i += (1 << kNumMoveReducingBits)) - { - const int kCyclesBits = kNumBitPriceShiftBits; - UInt32 w = i; - UInt32 bitCount = 0; - int j; - for (j = 0; j < kCyclesBits; j++) - { - w = w * w; - bitCount <<= 1; - while (w >= ((UInt32)1 << 16)) - { - w >>= 1; - bitCount++; - } - } - ProbPrices[i >> kNumMoveReducingBits] = ((kNumBitModelTotalBits << kCyclesBits) - 15 - bitCount); - } -} - - -#define GET_PRICE(prob, symbol) \ - p->ProbPrices[((prob) ^ (((-(int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; - -#define GET_PRICEa(prob, symbol) \ - ProbPrices[((prob) ^ ((-((int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; - -#define GET_PRICE_0(prob) p->ProbPrices[(prob) >> kNumMoveReducingBits] -#define GET_PRICE_1(prob) p->ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] - -#define GET_PRICE_0a(prob) ProbPrices[(prob) >> kNumMoveReducingBits] -#define GET_PRICE_1a(prob) ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] - -static UInt32 LitEnc_GetPrice(const CLzmaProb *probs, UInt32 symbol, UInt32 *ProbPrices) -{ - UInt32 price = 0; - symbol |= 0x100; - do - { - price += GET_PRICEa(probs[symbol >> 8], (symbol >> 7) & 1); - symbol <<= 1; - } - while (symbol < 0x10000); - return price; -} - -static UInt32 LitEnc_GetPriceMatched(const CLzmaProb *probs, UInt32 symbol, UInt32 matchByte, UInt32 *ProbPrices) -{ - UInt32 price = 0; - UInt32 offs = 0x100; - symbol |= 0x100; - do - { - matchByte <<= 1; - price += GET_PRICEa(probs[offs + (matchByte & offs) + (symbol >> 8)], (symbol >> 7) & 1); - symbol <<= 1; - offs &= ~(matchByte ^ symbol); - } - while (symbol < 0x10000); - return price; -} - - -static void RcTree_Encode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol) -{ - UInt32 m = 1; - int i; - for (i = numBitLevels; i != 0;) - { - UInt32 bit; - i--; - bit = (symbol >> i) & 1; - RangeEnc_EncodeBit(rc, probs + m, bit); - m = (m << 1) | bit; - } -} - -static void RcTree_ReverseEncode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol) -{ - UInt32 m = 1; - int i; - for (i = 0; i < numBitLevels; i++) - { - UInt32 bit = symbol & 1; - RangeEnc_EncodeBit(rc, probs + m, bit); - m = (m << 1) | bit; - symbol >>= 1; - } -} - -static UInt32 RcTree_GetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, UInt32 *ProbPrices) -{ - UInt32 price = 0; - symbol |= (1 << numBitLevels); - while (symbol != 1) - { - price += GET_PRICEa(probs[symbol >> 1], symbol & 1); - symbol >>= 1; - } - return price; -} - -static UInt32 RcTree_ReverseGetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, UInt32 *ProbPrices) -{ - UInt32 price = 0; - UInt32 m = 1; - int i; - for (i = numBitLevels; i != 0; i--) - { - UInt32 bit = symbol & 1; - symbol >>= 1; - price += GET_PRICEa(probs[m], bit); - m = (m << 1) | bit; - } - return price; -} - - -static void LenEnc_Init(CLenEnc *p) -{ - unsigned i; - p->choice = p->choice2 = kProbInitValue; - for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumLowBits); i++) - p->low[i] = kProbInitValue; - for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumMidBits); i++) - p->mid[i] = kProbInitValue; - for (i = 0; i < kLenNumHighSymbols; i++) - p->high[i] = kProbInitValue; -} - -static void LenEnc_Encode(CLenEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState) -{ - if (symbol < kLenNumLowSymbols) - { - RangeEnc_EncodeBit(rc, &p->choice, 0); - RcTree_Encode(rc, p->low + (posState << kLenNumLowBits), kLenNumLowBits, symbol); - } - else - { - RangeEnc_EncodeBit(rc, &p->choice, 1); - if (symbol < kLenNumLowSymbols + kLenNumMidSymbols) - { - RangeEnc_EncodeBit(rc, &p->choice2, 0); - RcTree_Encode(rc, p->mid + (posState << kLenNumMidBits), kLenNumMidBits, symbol - kLenNumLowSymbols); - } - else - { - RangeEnc_EncodeBit(rc, &p->choice2, 1); - RcTree_Encode(rc, p->high, kLenNumHighBits, symbol - kLenNumLowSymbols - kLenNumMidSymbols); - } - } -} - -static void LenEnc_SetPrices(CLenEnc *p, UInt32 posState, UInt32 numSymbols, UInt32 *prices, UInt32 *ProbPrices) -{ - UInt32 a0 = GET_PRICE_0a(p->choice); - UInt32 a1 = GET_PRICE_1a(p->choice); - UInt32 b0 = a1 + GET_PRICE_0a(p->choice2); - UInt32 b1 = a1 + GET_PRICE_1a(p->choice2); - UInt32 i = 0; - for (i = 0; i < kLenNumLowSymbols; i++) - { - if (i >= numSymbols) - return; - prices[i] = a0 + RcTree_GetPrice(p->low + (posState << kLenNumLowBits), kLenNumLowBits, i, ProbPrices); - } - for (; i < kLenNumLowSymbols + kLenNumMidSymbols; i++) - { - if (i >= numSymbols) - return; - prices[i] = b0 + RcTree_GetPrice(p->mid + (posState << kLenNumMidBits), kLenNumMidBits, i - kLenNumLowSymbols, ProbPrices); - } - for (; i < numSymbols; i++) - prices[i] = b1 + RcTree_GetPrice(p->high, kLenNumHighBits, i - kLenNumLowSymbols - kLenNumMidSymbols, ProbPrices); -} - -static void MY_FAST_CALL LenPriceEnc_UpdateTable(CLenPriceEnc *p, UInt32 posState, UInt32 *ProbPrices) -{ - LenEnc_SetPrices(&p->p, posState, p->tableSize, p->prices[posState], ProbPrices); - p->counters[posState] = p->tableSize; -} - -static void LenPriceEnc_UpdateTables(CLenPriceEnc *p, UInt32 numPosStates, UInt32 *ProbPrices) -{ - UInt32 posState; - for (posState = 0; posState < numPosStates; posState++) - LenPriceEnc_UpdateTable(p, posState, ProbPrices); -} - -static void LenEnc_Encode2(CLenPriceEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState, Bool updatePrice, UInt32 *ProbPrices) -{ - LenEnc_Encode(&p->p, rc, symbol, posState); - if (updatePrice) - if (--p->counters[posState] == 0) - LenPriceEnc_UpdateTable(p, posState, ProbPrices); -} - - - - -static void MovePos(CLzmaEnc *p, UInt32 num) -{ - #ifdef SHOW_STAT - ttt += num; - printf("\n MovePos %d", num); - #endif - if (num != 0) - { - p->additionalOffset += num; - p->matchFinder.Skip(p->matchFinderObj, num); - } -} - -static UInt32 ReadMatchDistances(CLzmaEnc *p, UInt32 *numDistancePairsRes) -{ - UInt32 lenRes = 0, numPairs; - p->numAvail = p->matchFinder.GetNumAvailableBytes(p->matchFinderObj); - numPairs = p->matchFinder.GetMatches(p->matchFinderObj, p->matches); - #ifdef SHOW_STAT - printf("\n i = %d numPairs = %d ", ttt, numPairs / 2); - ttt++; - { - UInt32 i; - for (i = 0; i < numPairs; i += 2) - printf("%2d %6d | ", p->matches[i], p->matches[i + 1]); - } - #endif - if (numPairs > 0) - { - lenRes = p->matches[numPairs - 2]; - if (lenRes == p->numFastBytes) - { - const Byte *pby = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; - UInt32 distance = p->matches[numPairs - 1] + 1; - UInt32 numAvail = p->numAvail; - if (numAvail > LZMA_MATCH_LEN_MAX) - numAvail = LZMA_MATCH_LEN_MAX; - { - const Byte *pby2 = pby - distance; - for (; lenRes < numAvail && pby[lenRes] == pby2[lenRes]; lenRes++); - } - } - } - p->additionalOffset++; - *numDistancePairsRes = numPairs; - return lenRes; -} - - -#define MakeAsChar(p) (p)->backPrev = (UInt32)(-1); (p)->prev1IsChar = False; -#define MakeAsShortRep(p) (p)->backPrev = 0; (p)->prev1IsChar = False; -#define IsShortRep(p) ((p)->backPrev == 0) - -static UInt32 GetRepLen1Price(CLzmaEnc *p, UInt32 state, UInt32 posState) -{ - return - GET_PRICE_0(p->isRepG0[state]) + - GET_PRICE_0(p->isRep0Long[state][posState]); -} - -static UInt32 GetPureRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 state, UInt32 posState) -{ - UInt32 price; - if (repIndex == 0) - { - price = GET_PRICE_0(p->isRepG0[state]); - price += GET_PRICE_1(p->isRep0Long[state][posState]); - } - else - { - price = GET_PRICE_1(p->isRepG0[state]); - if (repIndex == 1) - price += GET_PRICE_0(p->isRepG1[state]); - else - { - price += GET_PRICE_1(p->isRepG1[state]); - price += GET_PRICE(p->isRepG2[state], repIndex - 2); - } - } - return price; -} - -static UInt32 GetRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 len, UInt32 state, UInt32 posState) -{ - return p->repLenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN] + - GetPureRepPrice(p, repIndex, state, posState); -} - -static UInt32 Backward(CLzmaEnc *p, UInt32 *backRes, UInt32 cur) -{ - UInt32 posMem = p->opt[cur].posPrev; - UInt32 backMem = p->opt[cur].backPrev; - p->optimumEndIndex = cur; - do - { - if (p->opt[cur].prev1IsChar) - { - MakeAsChar(&p->opt[posMem]) - p->opt[posMem].posPrev = posMem - 1; - if (p->opt[cur].prev2) - { - p->opt[posMem - 1].prev1IsChar = False; - p->opt[posMem - 1].posPrev = p->opt[cur].posPrev2; - p->opt[posMem - 1].backPrev = p->opt[cur].backPrev2; - } - } - { - UInt32 posPrev = posMem; - UInt32 backCur = backMem; - - backMem = p->opt[posPrev].backPrev; - posMem = p->opt[posPrev].posPrev; - - p->opt[posPrev].backPrev = backCur; - p->opt[posPrev].posPrev = cur; - cur = posPrev; - } - } - while (cur != 0); - *backRes = p->opt[0].backPrev; - p->optimumCurrentIndex = p->opt[0].posPrev; - return p->optimumCurrentIndex; -} - -#define LIT_PROBS(pos, prevByte) (p->litProbs + ((((pos) & p->lpMask) << p->lc) + ((prevByte) >> (8 - p->lc))) * 0x300) - -static UInt32 GetOptimum(CLzmaEnc *p, UInt32 position, UInt32 *backRes) -{ - UInt32 numAvail, mainLen, numPairs, repMaxIndex, i, posState, lenEnd, len, cur; - UInt32 matchPrice, repMatchPrice, normalMatchPrice; - UInt32 reps[LZMA_NUM_REPS], repLens[LZMA_NUM_REPS]; - UInt32 *matches; - const Byte *data; - Byte curByte, matchByte; - if (p->optimumEndIndex != p->optimumCurrentIndex) - { - const COptimal *opt = &p->opt[p->optimumCurrentIndex]; - UInt32 lenRes = opt->posPrev - p->optimumCurrentIndex; - *backRes = opt->backPrev; - p->optimumCurrentIndex = opt->posPrev; - return lenRes; - } - p->optimumCurrentIndex = p->optimumEndIndex = 0; - - if (p->additionalOffset == 0) - mainLen = ReadMatchDistances(p, &numPairs); - else - { - mainLen = p->longestMatchLength; - numPairs = p->numPairs; - } - - numAvail = p->numAvail; - if (numAvail < 2) - { - *backRes = (UInt32)(-1); - return 1; - } - if (numAvail > LZMA_MATCH_LEN_MAX) - numAvail = LZMA_MATCH_LEN_MAX; - - data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; - repMaxIndex = 0; - for (i = 0; i < LZMA_NUM_REPS; i++) - { - UInt32 lenTest; - const Byte *data2; - reps[i] = p->reps[i]; - data2 = data - (reps[i] + 1); - if (data[0] != data2[0] || data[1] != data2[1]) - { - repLens[i] = 0; - continue; - } - for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++); - repLens[i] = lenTest; - if (lenTest > repLens[repMaxIndex]) - repMaxIndex = i; - } - if (repLens[repMaxIndex] >= p->numFastBytes) - { - UInt32 lenRes; - *backRes = repMaxIndex; - lenRes = repLens[repMaxIndex]; - MovePos(p, lenRes - 1); - return lenRes; - } - - matches = p->matches; - if (mainLen >= p->numFastBytes) - { - *backRes = matches[numPairs - 1] + LZMA_NUM_REPS; - MovePos(p, mainLen - 1); - return mainLen; - } - curByte = *data; - matchByte = *(data - (reps[0] + 1)); - - if (mainLen < 2 && curByte != matchByte && repLens[repMaxIndex] < 2) - { - *backRes = (UInt32)-1; - return 1; - } - - p->opt[0].state = (CState)p->state; - - posState = (position & p->pbMask); - - { - const CLzmaProb *probs = LIT_PROBS(position, *(data - 1)); - p->opt[1].price = GET_PRICE_0(p->isMatch[p->state][posState]) + - (!IsCharState(p->state) ? - LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) : - LitEnc_GetPrice(probs, curByte, p->ProbPrices)); - } - - MakeAsChar(&p->opt[1]); - - matchPrice = GET_PRICE_1(p->isMatch[p->state][posState]); - repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[p->state]); - - if (matchByte == curByte) - { - UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, p->state, posState); - if (shortRepPrice < p->opt[1].price) - { - p->opt[1].price = shortRepPrice; - MakeAsShortRep(&p->opt[1]); - } - } - lenEnd = ((mainLen >= repLens[repMaxIndex]) ? mainLen : repLens[repMaxIndex]); - - if (lenEnd < 2) - { - *backRes = p->opt[1].backPrev; - return 1; - } - - p->opt[1].posPrev = 0; - for (i = 0; i < LZMA_NUM_REPS; i++) - p->opt[0].backs[i] = reps[i]; - - len = lenEnd; - do - p->opt[len--].price = kInfinityPrice; - while (len >= 2); - - for (i = 0; i < LZMA_NUM_REPS; i++) - { - UInt32 repLen = repLens[i]; - UInt32 price; - if (repLen < 2) - continue; - price = repMatchPrice + GetPureRepPrice(p, i, p->state, posState); - do - { - UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][repLen - 2]; - COptimal *opt = &p->opt[repLen]; - if (curAndLenPrice < opt->price) - { - opt->price = curAndLenPrice; - opt->posPrev = 0; - opt->backPrev = i; - opt->prev1IsChar = False; - } - } - while (--repLen >= 2); - } - - normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[p->state]); - - len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2); - if (len <= mainLen) - { - UInt32 offs = 0; - while (len > matches[offs]) - offs += 2; - for (; ; len++) - { - COptimal *opt; - UInt32 distance = matches[offs + 1]; - - UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN]; - UInt32 lenToPosState = GetLenToPosState(len); - if (distance < kNumFullDistances) - curAndLenPrice += p->distancesPrices[lenToPosState][distance]; - else - { - UInt32 slot; - GetPosSlot2(distance, slot); - curAndLenPrice += p->alignPrices[distance & kAlignMask] + p->posSlotPrices[lenToPosState][slot]; - } - opt = &p->opt[len]; - if (curAndLenPrice < opt->price) - { - opt->price = curAndLenPrice; - opt->posPrev = 0; - opt->backPrev = distance + LZMA_NUM_REPS; - opt->prev1IsChar = False; - } - if (len == matches[offs]) - { - offs += 2; - if (offs == numPairs) - break; - } - } - } - - cur = 0; - - #ifdef SHOW_STAT2 - if (position >= 0) - { - unsigned i; - printf("\n pos = %4X", position); - for (i = cur; i <= lenEnd; i++) - printf("\nprice[%4X] = %d", position - cur + i, p->opt[i].price); - } - #endif - - for (;;) - { - UInt32 numAvailFull, newLen, numPairs, posPrev, state, posState, startLen; - UInt32 curPrice, curAnd1Price, matchPrice, repMatchPrice; - Bool nextIsChar; - Byte curByte, matchByte; - const Byte *data; - COptimal *curOpt; - COptimal *nextOpt; - - cur++; - if (cur == lenEnd) - return Backward(p, backRes, cur); - - newLen = ReadMatchDistances(p, &numPairs); - if (newLen >= p->numFastBytes) - { - p->numPairs = numPairs; - p->longestMatchLength = newLen; - return Backward(p, backRes, cur); - } - position++; - curOpt = &p->opt[cur]; - posPrev = curOpt->posPrev; - if (curOpt->prev1IsChar) - { - posPrev--; - if (curOpt->prev2) - { - state = p->opt[curOpt->posPrev2].state; - if (curOpt->backPrev2 < LZMA_NUM_REPS) - state = kRepNextStates[state]; - else - state = kMatchNextStates[state]; - } - else - state = p->opt[posPrev].state; - state = kLiteralNextStates[state]; - } - else - state = p->opt[posPrev].state; - if (posPrev == cur - 1) - { - if (IsShortRep(curOpt)) - state = kShortRepNextStates[state]; - else - state = kLiteralNextStates[state]; - } - else - { - UInt32 pos; - const COptimal *prevOpt; - if (curOpt->prev1IsChar && curOpt->prev2) - { - posPrev = curOpt->posPrev2; - pos = curOpt->backPrev2; - state = kRepNextStates[state]; - } - else - { - pos = curOpt->backPrev; - if (pos < LZMA_NUM_REPS) - state = kRepNextStates[state]; - else - state = kMatchNextStates[state]; - } - prevOpt = &p->opt[posPrev]; - if (pos < LZMA_NUM_REPS) - { - UInt32 i; - reps[0] = prevOpt->backs[pos]; - for (i = 1; i <= pos; i++) - reps[i] = prevOpt->backs[i - 1]; - for (; i < LZMA_NUM_REPS; i++) - reps[i] = prevOpt->backs[i]; - } - else - { - UInt32 i; - reps[0] = (pos - LZMA_NUM_REPS); - for (i = 1; i < LZMA_NUM_REPS; i++) - reps[i] = prevOpt->backs[i - 1]; - } - } - curOpt->state = (CState)state; - - curOpt->backs[0] = reps[0]; - curOpt->backs[1] = reps[1]; - curOpt->backs[2] = reps[2]; - curOpt->backs[3] = reps[3]; - - curPrice = curOpt->price; - nextIsChar = False; - data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; - curByte = *data; - matchByte = *(data - (reps[0] + 1)); - - posState = (position & p->pbMask); - - curAnd1Price = curPrice + GET_PRICE_0(p->isMatch[state][posState]); - { - const CLzmaProb *probs = LIT_PROBS(position, *(data - 1)); - curAnd1Price += - (!IsCharState(state) ? - LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) : - LitEnc_GetPrice(probs, curByte, p->ProbPrices)); - } - - nextOpt = &p->opt[cur + 1]; - - if (curAnd1Price < nextOpt->price) - { - nextOpt->price = curAnd1Price; - nextOpt->posPrev = cur; - MakeAsChar(nextOpt); - nextIsChar = True; - } - - matchPrice = curPrice + GET_PRICE_1(p->isMatch[state][posState]); - repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[state]); - - if (matchByte == curByte && !(nextOpt->posPrev < cur && nextOpt->backPrev == 0)) - { - UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, state, posState); - if (shortRepPrice <= nextOpt->price) - { - nextOpt->price = shortRepPrice; - nextOpt->posPrev = cur; - MakeAsShortRep(nextOpt); - nextIsChar = True; - } - } - numAvailFull = p->numAvail; - { - UInt32 temp = kNumOpts - 1 - cur; - if (temp < numAvailFull) - numAvailFull = temp; - } - - if (numAvailFull < 2) - continue; - numAvail = (numAvailFull <= p->numFastBytes ? numAvailFull : p->numFastBytes); - - if (!nextIsChar && matchByte != curByte) /* speed optimization */ - { - /* try Literal + rep0 */ - UInt32 temp; - UInt32 lenTest2; - const Byte *data2 = data - (reps[0] + 1); - UInt32 limit = p->numFastBytes + 1; - if (limit > numAvailFull) - limit = numAvailFull; - - for (temp = 1; temp < limit && data[temp] == data2[temp]; temp++); - lenTest2 = temp - 1; - if (lenTest2 >= 2) - { - UInt32 state2 = kLiteralNextStates[state]; - UInt32 posStateNext = (position + 1) & p->pbMask; - UInt32 nextRepMatchPrice = curAnd1Price + - GET_PRICE_1(p->isMatch[state2][posStateNext]) + - GET_PRICE_1(p->isRep[state2]); - /* for (; lenTest2 >= 2; lenTest2--) */ - { - UInt32 curAndLenPrice; - COptimal *opt; - UInt32 offset = cur + 1 + lenTest2; - while (lenEnd < offset) - p->opt[++lenEnd].price = kInfinityPrice; - curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); - opt = &p->opt[offset]; - if (curAndLenPrice < opt->price) - { - opt->price = curAndLenPrice; - opt->posPrev = cur + 1; - opt->backPrev = 0; - opt->prev1IsChar = True; - opt->prev2 = False; - } - } - } - } - - startLen = 2; /* speed optimization */ - { - UInt32 repIndex; - for (repIndex = 0; repIndex < LZMA_NUM_REPS; repIndex++) - { - UInt32 lenTest; - UInt32 lenTestTemp; - UInt32 price; - const Byte *data2 = data - (reps[repIndex] + 1); - if (data[0] != data2[0] || data[1] != data2[1]) - continue; - for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++); - while (lenEnd < cur + lenTest) - p->opt[++lenEnd].price = kInfinityPrice; - lenTestTemp = lenTest; - price = repMatchPrice + GetPureRepPrice(p, repIndex, state, posState); - do - { - UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][lenTest - 2]; - COptimal *opt = &p->opt[cur + lenTest]; - if (curAndLenPrice < opt->price) - { - opt->price = curAndLenPrice; - opt->posPrev = cur; - opt->backPrev = repIndex; - opt->prev1IsChar = False; - } - } - while (--lenTest >= 2); - lenTest = lenTestTemp; - - if (repIndex == 0) - startLen = lenTest + 1; - - /* if (_maxMode) */ - { - UInt32 lenTest2 = lenTest + 1; - UInt32 limit = lenTest2 + p->numFastBytes; - UInt32 nextRepMatchPrice; - if (limit > numAvailFull) - limit = numAvailFull; - for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++); - lenTest2 -= lenTest + 1; - if (lenTest2 >= 2) - { - UInt32 state2 = kRepNextStates[state]; - UInt32 posStateNext = (position + lenTest) & p->pbMask; - UInt32 curAndLenCharPrice = - price + p->repLenEnc.prices[posState][lenTest - 2] + - GET_PRICE_0(p->isMatch[state2][posStateNext]) + - LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]), - data[lenTest], data2[lenTest], p->ProbPrices); - state2 = kLiteralNextStates[state2]; - posStateNext = (position + lenTest + 1) & p->pbMask; - nextRepMatchPrice = curAndLenCharPrice + - GET_PRICE_1(p->isMatch[state2][posStateNext]) + - GET_PRICE_1(p->isRep[state2]); - - /* for (; lenTest2 >= 2; lenTest2--) */ - { - UInt32 curAndLenPrice; - COptimal *opt; - UInt32 offset = cur + lenTest + 1 + lenTest2; - while (lenEnd < offset) - p->opt[++lenEnd].price = kInfinityPrice; - curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); - opt = &p->opt[offset]; - if (curAndLenPrice < opt->price) - { - opt->price = curAndLenPrice; - opt->posPrev = cur + lenTest + 1; - opt->backPrev = 0; - opt->prev1IsChar = True; - opt->prev2 = True; - opt->posPrev2 = cur; - opt->backPrev2 = repIndex; - } - } - } - } - } - } - /* for (UInt32 lenTest = 2; lenTest <= newLen; lenTest++) */ - if (newLen > numAvail) - { - newLen = numAvail; - for (numPairs = 0; newLen > matches[numPairs]; numPairs += 2); - matches[numPairs] = newLen; - numPairs += 2; - } - if (newLen >= startLen) - { - UInt32 normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[state]); - UInt32 offs, curBack, posSlot; - UInt32 lenTest; - while (lenEnd < cur + newLen) - p->opt[++lenEnd].price = kInfinityPrice; - - offs = 0; - while (startLen > matches[offs]) - offs += 2; - curBack = matches[offs + 1]; - GetPosSlot2(curBack, posSlot); - for (lenTest = /*2*/ startLen; ; lenTest++) - { - UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][lenTest - LZMA_MATCH_LEN_MIN]; - UInt32 lenToPosState = GetLenToPosState(lenTest); - COptimal *opt; - if (curBack < kNumFullDistances) - curAndLenPrice += p->distancesPrices[lenToPosState][curBack]; - else - curAndLenPrice += p->posSlotPrices[lenToPosState][posSlot] + p->alignPrices[curBack & kAlignMask]; - - opt = &p->opt[cur + lenTest]; - if (curAndLenPrice < opt->price) - { - opt->price = curAndLenPrice; - opt->posPrev = cur; - opt->backPrev = curBack + LZMA_NUM_REPS; - opt->prev1IsChar = False; - } - - if (/*_maxMode && */lenTest == matches[offs]) - { - /* Try Match + Literal + Rep0 */ - const Byte *data2 = data - (curBack + 1); - UInt32 lenTest2 = lenTest + 1; - UInt32 limit = lenTest2 + p->numFastBytes; - UInt32 nextRepMatchPrice; - if (limit > numAvailFull) - limit = numAvailFull; - for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++); - lenTest2 -= lenTest + 1; - if (lenTest2 >= 2) - { - UInt32 state2 = kMatchNextStates[state]; - UInt32 posStateNext = (position + lenTest) & p->pbMask; - UInt32 curAndLenCharPrice = curAndLenPrice + - GET_PRICE_0(p->isMatch[state2][posStateNext]) + - LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]), - data[lenTest], data2[lenTest], p->ProbPrices); - state2 = kLiteralNextStates[state2]; - posStateNext = (posStateNext + 1) & p->pbMask; - nextRepMatchPrice = curAndLenCharPrice + - GET_PRICE_1(p->isMatch[state2][posStateNext]) + - GET_PRICE_1(p->isRep[state2]); - - /* for (; lenTest2 >= 2; lenTest2--) */ - { - UInt32 offset = cur + lenTest + 1 + lenTest2; - UInt32 curAndLenPrice; - COptimal *opt; - while (lenEnd < offset) - p->opt[++lenEnd].price = kInfinityPrice; - curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); - opt = &p->opt[offset]; - if (curAndLenPrice < opt->price) - { - opt->price = curAndLenPrice; - opt->posPrev = cur + lenTest + 1; - opt->backPrev = 0; - opt->prev1IsChar = True; - opt->prev2 = True; - opt->posPrev2 = cur; - opt->backPrev2 = curBack + LZMA_NUM_REPS; - } - } - } - offs += 2; - if (offs == numPairs) - break; - curBack = matches[offs + 1]; - if (curBack >= kNumFullDistances) - GetPosSlot2(curBack, posSlot); - } - } - } - } -} - -#define ChangePair(smallDist, bigDist) (((bigDist) >> 7) > (smallDist)) - -static UInt32 GetOptimumFast(CLzmaEnc *p, UInt32 *backRes) -{ - UInt32 numAvail, mainLen, mainDist, numPairs, repIndex, repLen, i; - const Byte *data; - const UInt32 *matches; - - if (p->additionalOffset == 0) - mainLen = ReadMatchDistances(p, &numPairs); - else - { - mainLen = p->longestMatchLength; - numPairs = p->numPairs; - } - - numAvail = p->numAvail; - *backRes = (UInt32)-1; - if (numAvail < 2) - return 1; - if (numAvail > LZMA_MATCH_LEN_MAX) - numAvail = LZMA_MATCH_LEN_MAX; - data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; - - repLen = repIndex = 0; - for (i = 0; i < LZMA_NUM_REPS; i++) - { - UInt32 len; - const Byte *data2 = data - (p->reps[i] + 1); - if (data[0] != data2[0] || data[1] != data2[1]) - continue; - for (len = 2; len < numAvail && data[len] == data2[len]; len++); - if (len >= p->numFastBytes) - { - *backRes = i; - MovePos(p, len - 1); - return len; - } - if (len > repLen) - { - repIndex = i; - repLen = len; - } - } - - matches = p->matches; - if (mainLen >= p->numFastBytes) - { - *backRes = matches[numPairs - 1] + LZMA_NUM_REPS; - MovePos(p, mainLen - 1); - return mainLen; - } - - mainDist = 0; /* for GCC */ - if (mainLen >= 2) - { - mainDist = matches[numPairs - 1]; - while (numPairs > 2 && mainLen == matches[numPairs - 4] + 1) - { - if (!ChangePair(matches[numPairs - 3], mainDist)) - break; - numPairs -= 2; - mainLen = matches[numPairs - 2]; - mainDist = matches[numPairs - 1]; - } - if (mainLen == 2 && mainDist >= 0x80) - mainLen = 1; - } - - if (repLen >= 2 && ( - (repLen + 1 >= mainLen) || - (repLen + 2 >= mainLen && mainDist >= (1 << 9)) || - (repLen + 3 >= mainLen && mainDist >= (1 << 15)))) - { - *backRes = repIndex; - MovePos(p, repLen - 1); - return repLen; - } - - if (mainLen < 2 || numAvail <= 2) - return 1; - - p->longestMatchLength = ReadMatchDistances(p, &p->numPairs); - if (p->longestMatchLength >= 2) - { - UInt32 newDistance = matches[p->numPairs - 1]; - if ((p->longestMatchLength >= mainLen && newDistance < mainDist) || - (p->longestMatchLength == mainLen + 1 && !ChangePair(mainDist, newDistance)) || - (p->longestMatchLength > mainLen + 1) || - (p->longestMatchLength + 1 >= mainLen && mainLen >= 3 && ChangePair(newDistance, mainDist))) - return 1; - } - - data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; - for (i = 0; i < LZMA_NUM_REPS; i++) - { - UInt32 len, limit; - const Byte *data2 = data - (p->reps[i] + 1); - if (data[0] != data2[0] || data[1] != data2[1]) - continue; - limit = mainLen - 1; - for (len = 2; len < limit && data[len] == data2[len]; len++); - if (len >= limit) - return 1; - } - *backRes = mainDist + LZMA_NUM_REPS; - MovePos(p, mainLen - 2); - return mainLen; -} - -static void WriteEndMarker(CLzmaEnc *p, UInt32 posState) -{ - UInt32 len; - RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1); - RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0); - p->state = kMatchNextStates[p->state]; - len = LZMA_MATCH_LEN_MIN; - LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); - RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, (1 << kNumPosSlotBits) - 1); - RangeEnc_EncodeDirectBits(&p->rc, (((UInt32)1 << 30) - 1) >> kNumAlignBits, 30 - kNumAlignBits); - RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, kAlignMask); -} - -static SRes CheckErrors(CLzmaEnc *p) -{ - if (p->result != SZ_OK) - return p->result; - if (p->rc.res != SZ_OK) - p->result = SZ_ERROR_WRITE; - if (p->matchFinderBase.result != SZ_OK) - p->result = SZ_ERROR_READ; - if (p->result != SZ_OK) - p->finished = True; - return p->result; -} - -static SRes Flush(CLzmaEnc *p, UInt32 nowPos) -{ - /* ReleaseMFStream(); */ - p->finished = True; - if (p->writeEndMark) - WriteEndMarker(p, nowPos & p->pbMask); - RangeEnc_FlushData(&p->rc); - RangeEnc_FlushStream(&p->rc); - return CheckErrors(p); -} - -static void FillAlignPrices(CLzmaEnc *p) -{ - UInt32 i; - for (i = 0; i < kAlignTableSize; i++) - p->alignPrices[i] = RcTree_ReverseGetPrice(p->posAlignEncoder, kNumAlignBits, i, p->ProbPrices); - p->alignPriceCount = 0; -} - -static void FillDistancesPrices(CLzmaEnc *p) -{ - UInt32 tempPrices[kNumFullDistances]; - UInt32 i, lenToPosState; - for (i = kStartPosModelIndex; i < kNumFullDistances; i++) - { - UInt32 posSlot = GetPosSlot1(i); - UInt32 footerBits = ((posSlot >> 1) - 1); - UInt32 base = ((2 | (posSlot & 1)) << footerBits); - tempPrices[i] = RcTree_ReverseGetPrice(p->posEncoders + base - posSlot - 1, footerBits, i - base, p->ProbPrices); - } - - for (lenToPosState = 0; lenToPosState < kNumLenToPosStates; lenToPosState++) - { - UInt32 posSlot; - const CLzmaProb *encoder = p->posSlotEncoder[lenToPosState]; - UInt32 *posSlotPrices = p->posSlotPrices[lenToPosState]; - for (posSlot = 0; posSlot < p->distTableSize; posSlot++) - posSlotPrices[posSlot] = RcTree_GetPrice(encoder, kNumPosSlotBits, posSlot, p->ProbPrices); - for (posSlot = kEndPosModelIndex; posSlot < p->distTableSize; posSlot++) - posSlotPrices[posSlot] += ((((posSlot >> 1) - 1) - kNumAlignBits) << kNumBitPriceShiftBits); - - { - UInt32 *distancesPrices = p->distancesPrices[lenToPosState]; - UInt32 i; - for (i = 0; i < kStartPosModelIndex; i++) - distancesPrices[i] = posSlotPrices[i]; - for (; i < kNumFullDistances; i++) - distancesPrices[i] = posSlotPrices[GetPosSlot1(i)] + tempPrices[i]; - } - } - p->matchPriceCount = 0; -} - -void LzmaEnc_Construct(CLzmaEnc *p) -{ - RangeEnc_Construct(&p->rc); - MatchFinder_Construct(&p->matchFinderBase); - #ifdef COMPRESS_MF_MT - MatchFinderMt_Construct(&p->matchFinderMt); - p->matchFinderMt.MatchFinder = &p->matchFinderBase; - #endif - - { - CLzmaEncProps props; - LzmaEncProps_Init(&props); - LzmaEnc_SetProps(p, &props); - } - - #ifndef LZMA_LOG_BSR - LzmaEnc_FastPosInit(p->g_FastPos); - #endif - - LzmaEnc_InitPriceTables(p->ProbPrices); - p->litProbs = 0; - p->saveState.litProbs = 0; -} - -CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc) -{ - void *p; - p = alloc->Alloc(alloc, sizeof(CLzmaEnc)); - if (p != 0) - LzmaEnc_Construct((CLzmaEnc *)p); - return p; -} - -void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc) -{ - alloc->Free(alloc, p->litProbs); - alloc->Free(alloc, p->saveState.litProbs); - p->litProbs = 0; - p->saveState.litProbs = 0; -} - -void LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig) -{ - #ifdef COMPRESS_MF_MT - MatchFinderMt_Destruct(&p->matchFinderMt, allocBig); - #endif - MatchFinder_Free(&p->matchFinderBase, allocBig); - LzmaEnc_FreeLits(p, alloc); - RangeEnc_Free(&p->rc, alloc); -} - -void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig) -{ - LzmaEnc_Destruct((CLzmaEnc *)p, alloc, allocBig); - alloc->Free(alloc, p); -} - -static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, Bool useLimits, UInt32 maxPackSize, UInt32 maxUnpackSize) -{ - UInt32 nowPos32, startPos32; - if (p->inStream != 0) - { - p->matchFinderBase.stream = p->inStream; - p->matchFinder.Init(p->matchFinderObj); - p->inStream = 0; - } - - if (p->finished) - return p->result; - RINOK(CheckErrors(p)); - - nowPos32 = (UInt32)p->nowPos64; - startPos32 = nowPos32; - - if (p->nowPos64 == 0) - { - UInt32 numPairs; - Byte curByte; - if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0) - return Flush(p, nowPos32); - ReadMatchDistances(p, &numPairs); - RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][0], 0); - p->state = kLiteralNextStates[p->state]; - curByte = p->matchFinder.GetIndexByte(p->matchFinderObj, 0 - p->additionalOffset); - LitEnc_Encode(&p->rc, p->litProbs, curByte); - p->additionalOffset--; - nowPos32++; - } - - if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) != 0) - for (;;) - { - UInt32 pos, len, posState; - - if (p->fastMode) - len = GetOptimumFast(p, &pos); - else - len = GetOptimum(p, nowPos32, &pos); - - #ifdef SHOW_STAT2 - printf("\n pos = %4X, len = %d pos = %d", nowPos32, len, pos); - #endif - - posState = nowPos32 & p->pbMask; - if (len == 1 && pos == (UInt32)-1) - { - Byte curByte; - CLzmaProb *probs; - const Byte *data; - - RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 0); - data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset; - curByte = *data; - probs = LIT_PROBS(nowPos32, *(data - 1)); - if (IsCharState(p->state)) - LitEnc_Encode(&p->rc, probs, curByte); - else - LitEnc_EncodeMatched(&p->rc, probs, curByte, *(data - p->reps[0] - 1)); - p->state = kLiteralNextStates[p->state]; - } - else - { - RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1); - if (pos < LZMA_NUM_REPS) - { - RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 1); - if (pos == 0) - { - RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 0); - RangeEnc_EncodeBit(&p->rc, &p->isRep0Long[p->state][posState], ((len == 1) ? 0 : 1)); - } - else - { - UInt32 distance = p->reps[pos]; - RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 1); - if (pos == 1) - RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 0); - else - { - RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 1); - RangeEnc_EncodeBit(&p->rc, &p->isRepG2[p->state], pos - 2); - if (pos == 3) - p->reps[3] = p->reps[2]; - p->reps[2] = p->reps[1]; - } - p->reps[1] = p->reps[0]; - p->reps[0] = distance; - } - if (len == 1) - p->state = kShortRepNextStates[p->state]; - else - { - LenEnc_Encode2(&p->repLenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); - p->state = kRepNextStates[p->state]; - } - } - else - { - UInt32 posSlot; - RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0); - p->state = kMatchNextStates[p->state]; - LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); - pos -= LZMA_NUM_REPS; - GetPosSlot(pos, posSlot); - RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, posSlot); - - if (posSlot >= kStartPosModelIndex) - { - UInt32 footerBits = ((posSlot >> 1) - 1); - UInt32 base = ((2 | (posSlot & 1)) << footerBits); - UInt32 posReduced = pos - base; - - if (posSlot < kEndPosModelIndex) - RcTree_ReverseEncode(&p->rc, p->posEncoders + base - posSlot - 1, footerBits, posReduced); - else - { - RangeEnc_EncodeDirectBits(&p->rc, posReduced >> kNumAlignBits, footerBits - kNumAlignBits); - RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, posReduced & kAlignMask); - p->alignPriceCount++; - } - } - p->reps[3] = p->reps[2]; - p->reps[2] = p->reps[1]; - p->reps[1] = p->reps[0]; - p->reps[0] = pos; - p->matchPriceCount++; - } - } - p->additionalOffset -= len; - nowPos32 += len; - if (p->additionalOffset == 0) - { - UInt32 processed; - if (!p->fastMode) - { - if (p->matchPriceCount >= (1 << 7)) - FillDistancesPrices(p); - if (p->alignPriceCount >= kAlignTableSize) - FillAlignPrices(p); - } - if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0) - break; - processed = nowPos32 - startPos32; - if (useLimits) - { - if (processed + kNumOpts + 300 >= maxUnpackSize || - RangeEnc_GetProcessed(&p->rc) + kNumOpts * 2 >= maxPackSize) - break; - } - else if (processed >= (1 << 15)) - { - p->nowPos64 += nowPos32 - startPos32; - return CheckErrors(p); - } - } - } - p->nowPos64 += nowPos32 - startPos32; - return Flush(p, nowPos32); -} - -#define kBigHashDicLimit ((UInt32)1 << 24) - -static SRes LzmaEnc_Alloc(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) -{ - UInt32 beforeSize = kNumOpts; - Bool btMode; - if (!RangeEnc_Alloc(&p->rc, alloc)) - return SZ_ERROR_MEM; - btMode = (p->matchFinderBase.btMode != 0); - #ifdef COMPRESS_MF_MT - p->mtMode = (p->multiThread && !p->fastMode && btMode); - #endif - - { - unsigned lclp = p->lc + p->lp; - if (p->litProbs == 0 || p->saveState.litProbs == 0 || p->lclp != lclp) - { - LzmaEnc_FreeLits(p, alloc); - p->litProbs = (CLzmaProb *)alloc->Alloc(alloc, (0x300 << lclp) * sizeof(CLzmaProb)); - p->saveState.litProbs = (CLzmaProb *)alloc->Alloc(alloc, (0x300 << lclp) * sizeof(CLzmaProb)); - if (p->litProbs == 0 || p->saveState.litProbs == 0) - { - LzmaEnc_FreeLits(p, alloc); - return SZ_ERROR_MEM; - } - p->lclp = lclp; - } - } - - p->matchFinderBase.bigHash = (p->dictSize > kBigHashDicLimit); - - if (beforeSize + p->dictSize < keepWindowSize) - beforeSize = keepWindowSize - p->dictSize; - - #ifdef COMPRESS_MF_MT - if (p->mtMode) - { - RINOK(MatchFinderMt_Create(&p->matchFinderMt, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig)); - p->matchFinderObj = &p->matchFinderMt; - MatchFinderMt_CreateVTable(&p->matchFinderMt, &p->matchFinder); - } - else - #endif - { - if (!MatchFinder_Create(&p->matchFinderBase, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig)) - return SZ_ERROR_MEM; - p->matchFinderObj = &p->matchFinderBase; - MatchFinder_CreateVTable(&p->matchFinderBase, &p->matchFinder); - } - return SZ_OK; -} - -void LzmaEnc_Init(CLzmaEnc *p) -{ - UInt32 i; - p->state = 0; - for (i = 0 ; i < LZMA_NUM_REPS; i++) - p->reps[i] = 0; - - RangeEnc_Init(&p->rc); - - - for (i = 0; i < kNumStates; i++) - { - UInt32 j; - for (j = 0; j < LZMA_NUM_PB_STATES_MAX; j++) - { - p->isMatch[i][j] = kProbInitValue; - p->isRep0Long[i][j] = kProbInitValue; - } - p->isRep[i] = kProbInitValue; - p->isRepG0[i] = kProbInitValue; - p->isRepG1[i] = kProbInitValue; - p->isRepG2[i] = kProbInitValue; - } - - { - UInt32 num = 0x300 << (p->lp + p->lc); - for (i = 0; i < num; i++) - p->litProbs[i] = kProbInitValue; - } - - { - for (i = 0; i < kNumLenToPosStates; i++) - { - CLzmaProb *probs = p->posSlotEncoder[i]; - UInt32 j; - for (j = 0; j < (1 << kNumPosSlotBits); j++) - probs[j] = kProbInitValue; - } - } - { - for (i = 0; i < kNumFullDistances - kEndPosModelIndex; i++) - p->posEncoders[i] = kProbInitValue; - } - - LenEnc_Init(&p->lenEnc.p); - LenEnc_Init(&p->repLenEnc.p); - - for (i = 0; i < (1 << kNumAlignBits); i++) - p->posAlignEncoder[i] = kProbInitValue; - - p->optimumEndIndex = 0; - p->optimumCurrentIndex = 0; - p->additionalOffset = 0; - - p->pbMask = (1 << p->pb) - 1; - p->lpMask = (1 << p->lp) - 1; -} - -void LzmaEnc_InitPrices(CLzmaEnc *p) -{ - if (!p->fastMode) - { - FillDistancesPrices(p); - FillAlignPrices(p); - } - - p->lenEnc.tableSize = - p->repLenEnc.tableSize = - p->numFastBytes + 1 - LZMA_MATCH_LEN_MIN; - LenPriceEnc_UpdateTables(&p->lenEnc, 1 << p->pb, p->ProbPrices); - LenPriceEnc_UpdateTables(&p->repLenEnc, 1 << p->pb, p->ProbPrices); -} - -static SRes LzmaEnc_AllocAndInit(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) -{ - UInt32 i; - for (i = 0; i < (UInt32)kDicLogSizeMaxCompress; i++) - if (p->dictSize <= ((UInt32)1 << i)) - break; - p->distTableSize = i * 2; - - p->finished = False; - p->result = SZ_OK; - RINOK(LzmaEnc_Alloc(p, keepWindowSize, alloc, allocBig)); - LzmaEnc_Init(p); - LzmaEnc_InitPrices(p); - p->nowPos64 = 0; - return SZ_OK; -} - -static SRes LzmaEnc_Prepare(CLzmaEncHandle pp, ISeqInStream *inStream, ISeqOutStream *outStream, - ISzAlloc *alloc, ISzAlloc *allocBig) -{ - CLzmaEnc *p = (CLzmaEnc *)pp; - p->inStream = inStream; - p->rc.outStream = outStream; - return LzmaEnc_AllocAndInit(p, 0, alloc, allocBig); -} - -SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp, - ISeqInStream *inStream, UInt32 keepWindowSize, - ISzAlloc *alloc, ISzAlloc *allocBig) -{ - CLzmaEnc *p = (CLzmaEnc *)pp; - p->inStream = inStream; - return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig); -} - -static void LzmaEnc_SetInputBuf(CLzmaEnc *p, const Byte *src, SizeT srcLen) -{ - p->seqBufInStream.funcTable.Read = MyRead; - p->seqBufInStream.data = src; - p->seqBufInStream.rem = srcLen; -} - -SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen, - UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) -{ - CLzmaEnc *p = (CLzmaEnc *)pp; - LzmaEnc_SetInputBuf(p, src, srcLen); - p->inStream = &p->seqBufInStream.funcTable; - return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig); -} - -void LzmaEnc_Finish(CLzmaEncHandle pp) -{ - #ifdef COMPRESS_MF_MT - CLzmaEnc *p = (CLzmaEnc *)pp; - if (p->mtMode) - MatchFinderMt_ReleaseStream(&p->matchFinderMt); - #else - pp = pp; - #endif -} - -typedef struct _CSeqOutStreamBuf -{ - ISeqOutStream funcTable; - Byte *data; - SizeT rem; - Bool overflow; -} CSeqOutStreamBuf; - -static size_t MyWrite(void *pp, const void *data, size_t size) -{ - CSeqOutStreamBuf *p = (CSeqOutStreamBuf *)pp; - if (p->rem < size) - { - size = p->rem; - p->overflow = True; - } - memcpy(p->data, data, size); - p->rem -= size; - p->data += size; - return size; -} - - -UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp) -{ - const CLzmaEnc *p = (CLzmaEnc *)pp; - return p->matchFinder.GetNumAvailableBytes(p->matchFinderObj); -} - -const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp) -{ - const CLzmaEnc *p = (CLzmaEnc *)pp; - return p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset; -} - -SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit, - Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize) -{ - CLzmaEnc *p = (CLzmaEnc *)pp; - UInt64 nowPos64; - SRes res; - CSeqOutStreamBuf outStream; - - outStream.funcTable.Write = MyWrite; - outStream.data = dest; - outStream.rem = *destLen; - outStream.overflow = False; - - p->writeEndMark = False; - p->finished = False; - p->result = SZ_OK; - - if (reInit) - LzmaEnc_Init(p); - LzmaEnc_InitPrices(p); - nowPos64 = p->nowPos64; - RangeEnc_Init(&p->rc); - p->rc.outStream = &outStream.funcTable; - - res = LzmaEnc_CodeOneBlock(p, True, desiredPackSize, *unpackSize); - - *unpackSize = (UInt32)(p->nowPos64 - nowPos64); - *destLen -= outStream.rem; - if (outStream.overflow) - return SZ_ERROR_OUTPUT_EOF; - - return res; -} - -SRes LzmaEnc_Encode(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress, - ISzAlloc *alloc, ISzAlloc *allocBig) -{ - CLzmaEnc *p = (CLzmaEnc *)pp; - SRes res = SZ_OK; - - #ifdef COMPRESS_MF_MT - Byte allocaDummy[0x300]; - int i = 0; - for (i = 0; i < 16; i++) - allocaDummy[i] = (Byte)i; - #endif - - RINOK(LzmaEnc_Prepare(pp, inStream, outStream, alloc, allocBig)); - - for (;;) - { - res = LzmaEnc_CodeOneBlock(p, False, 0, 0); - if (res != SZ_OK || p->finished != 0) - break; - if (progress != 0) - { - res = progress->Progress(progress, p->nowPos64, RangeEnc_GetProcessed(&p->rc)); - if (res != SZ_OK) - { - res = SZ_ERROR_PROGRESS; - break; - } - } - } - LzmaEnc_Finish(pp); - return res; -} - -SRes LzmaEnc_WriteProperties(CLzmaEncHandle pp, Byte *props, SizeT *size) -{ - CLzmaEnc *p = (CLzmaEnc *)pp; - int i; - UInt32 dictSize = p->dictSize; - if (*size < LZMA_PROPS_SIZE) - return SZ_ERROR_PARAM; - *size = LZMA_PROPS_SIZE; - props[0] = (Byte)((p->pb * 5 + p->lp) * 9 + p->lc); - - for (i = 11; i <= 30; i++) - { - if (dictSize <= ((UInt32)2 << i)) - { - dictSize = (2 << i); - break; - } - if (dictSize <= ((UInt32)3 << i)) - { - dictSize = (3 << i); - break; - } - } - - for (i = 0; i < 4; i++) - props[1 + i] = (Byte)(dictSize >> (8 * i)); - return SZ_OK; -} - -SRes LzmaEnc_MemEncode(CLzmaEncHandle pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, - int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig) -{ - SRes res; - CLzmaEnc *p = (CLzmaEnc *)pp; - - CSeqOutStreamBuf outStream; - - LzmaEnc_SetInputBuf(p, src, srcLen); - - outStream.funcTable.Write = MyWrite; - outStream.data = dest; - outStream.rem = *destLen; - outStream.overflow = False; - - p->writeEndMark = writeEndMark; - res = LzmaEnc_Encode(pp, &outStream.funcTable, &p->seqBufInStream.funcTable, - progress, alloc, allocBig); - - *destLen -= outStream.rem; - if (outStream.overflow) - return SZ_ERROR_OUTPUT_EOF; - return res; -} - -SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, - const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark, - ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig) -{ - CLzmaEnc *p = (CLzmaEnc *)LzmaEnc_Create(alloc); - SRes res; - if (p == 0) - return SZ_ERROR_MEM; - - res = LzmaEnc_SetProps(p, props); - if (res == SZ_OK) - { - res = LzmaEnc_WriteProperties(p, propsEncoded, propsSize); - if (res == SZ_OK) - res = LzmaEnc_MemEncode(p, dest, destLen, src, srcLen, - writeEndMark, progress, alloc, allocBig); - } - - LzmaEnc_Destroy(p, alloc, allocBig); - return res; -} diff --git a/desmume/src/windows/7z/C/LzmaEnc.h b/desmume/src/windows/7z/C/LzmaEnc.h deleted file mode 100644 index e3d84fa35..000000000 --- a/desmume/src/windows/7z/C/LzmaEnc.h +++ /dev/null @@ -1,72 +0,0 @@ -/* LzmaEnc.h -- LZMA Encoder -2008-10-04 : Igor Pavlov : Public domain */ - -#ifndef __LZMAENC_H -#define __LZMAENC_H - -#include "Types.h" - -#define LZMA_PROPS_SIZE 5 - -typedef struct _CLzmaEncProps -{ - int level; /* 0 <= level <= 9 */ - UInt32 dictSize; /* (1 << 12) <= dictSize <= (1 << 27) for 32-bit version - (1 << 12) <= dictSize <= (1 << 30) for 64-bit version - default = (1 << 24) */ - int lc; /* 0 <= lc <= 8, default = 3 */ - int lp; /* 0 <= lp <= 4, default = 0 */ - int pb; /* 0 <= pb <= 4, default = 2 */ - int algo; /* 0 - fast, 1 - normal, default = 1 */ - int fb; /* 5 <= fb <= 273, default = 32 */ - int btMode; /* 0 - hashChain Mode, 1 - binTree mode - normal, default = 1 */ - int numHashBytes; /* 2, 3 or 4, default = 4 */ - UInt32 mc; /* 1 <= mc <= (1 << 30), default = 32 */ - unsigned writeEndMark; /* 0 - do not write EOPM, 1 - write EOPM, default = 0 */ - int numThreads; /* 1 or 2, default = 2 */ -} CLzmaEncProps; - -void LzmaEncProps_Init(CLzmaEncProps *p); -void LzmaEncProps_Normalize(CLzmaEncProps *p); -UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2); - - -/* ---------- CLzmaEncHandle Interface ---------- */ - -/* LzmaEnc_* functions can return the following exit codes: -Returns: - SZ_OK - OK - SZ_ERROR_MEM - Memory allocation error - SZ_ERROR_PARAM - Incorrect paramater in props - SZ_ERROR_WRITE - Write callback error. - SZ_ERROR_PROGRESS - some break from progress callback - SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) -*/ - -typedef void * CLzmaEncHandle; - -CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc); -void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig); -SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props); -SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *properties, SizeT *size); -SRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream, - ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); -SRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, - int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); - -/* ---------- One Call Interface ---------- */ - -/* LzmaEncode -Return code: - SZ_OK - OK - SZ_ERROR_MEM - Memory allocation error - SZ_ERROR_PARAM - Incorrect paramater - SZ_ERROR_OUTPUT_EOF - output buffer overflow - SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) -*/ - -SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, - const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark, - ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); - -#endif diff --git a/desmume/src/windows/7z/C/RotateDefs.h b/desmume/src/windows/7z/C/RotateDefs.h deleted file mode 100644 index 189350d7b..000000000 --- a/desmume/src/windows/7z/C/RotateDefs.h +++ /dev/null @@ -1,22 +0,0 @@ -/* RotateDefs.h -- Rotate functions -2008-08-05 -Igor Pavlov -Public domain */ - -#ifndef __ROTATEDEFS_H -#define __ROTATEDEFS_H - -#ifdef _MSC_VER - -#include -#define rotlFixed(x, n) _rotl((x), (n)) -#define rotrFixed(x, n) _rotr((x), (n)) - -#else - -#define rotlFixed(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) -#define rotrFixed(x, n) (((x) >> (n)) | ((x) << (32 - (n)))) - -#endif - -#endif diff --git a/desmume/src/windows/7z/C/Sha256.c b/desmume/src/windows/7z/C/Sha256.c deleted file mode 100644 index 657c2ab92..000000000 --- a/desmume/src/windows/7z/C/Sha256.c +++ /dev/null @@ -1,204 +0,0 @@ -/* Crypto/Sha256.c -- SHA-256 Hash function -2008-11-06 : Igor Pavlov : Public domain -This code is based on public domain code from Wei Dai's Crypto++ library. */ - -#include "Sha256.h" -#include "RotateDefs.h" - -/* define it for speed optimization */ -/* #define _SHA256_UNROLL */ -/* #define _SHA256_UNROLL2 */ - -void Sha256_Init(CSha256 *p) -{ - p->state[0] = 0x6a09e667; - p->state[1] = 0xbb67ae85; - p->state[2] = 0x3c6ef372; - p->state[3] = 0xa54ff53a; - p->state[4] = 0x510e527f; - p->state[5] = 0x9b05688c; - p->state[6] = 0x1f83d9ab; - p->state[7] = 0x5be0cd19; - p->count = 0; -} - -#define S0(x) (rotrFixed(x, 2) ^ rotrFixed(x,13) ^ rotrFixed(x, 22)) -#define S1(x) (rotrFixed(x, 6) ^ rotrFixed(x,11) ^ rotrFixed(x, 25)) -#define s0(x) (rotrFixed(x, 7) ^ rotrFixed(x,18) ^ (x >> 3)) -#define s1(x) (rotrFixed(x,17) ^ rotrFixed(x,19) ^ (x >> 10)) - -#define blk0(i) (W[i] = data[i]) -#define blk2(i) (W[i&15] += s1(W[(i-2)&15]) + W[(i-7)&15] + s0(W[(i-15)&15])) - -#define Ch(x,y,z) (z^(x&(y^z))) -#define Maj(x,y,z) ((x&y)|(z&(x|y))) - -#define a(i) T[(0-(i))&7] -#define b(i) T[(1-(i))&7] -#define c(i) T[(2-(i))&7] -#define d(i) T[(3-(i))&7] -#define e(i) T[(4-(i))&7] -#define f(i) T[(5-(i))&7] -#define g(i) T[(6-(i))&7] -#define h(i) T[(7-(i))&7] - - -#ifdef _SHA256_UNROLL2 - -#define R(a,b,c,d,e,f,g,h, i) h += S1(e) + Ch(e,f,g) + K[i+j] + (j?blk2(i):blk0(i));\ - d += h; h += S0(a) + Maj(a, b, c) - -#define RX_8(i) \ - R(a,b,c,d,e,f,g,h, i); \ - R(h,a,b,c,d,e,f,g, i+1); \ - R(g,h,a,b,c,d,e,f, i+2); \ - R(f,g,h,a,b,c,d,e, i+3); \ - R(e,f,g,h,a,b,c,d, i+4); \ - R(d,e,f,g,h,a,b,c, i+5); \ - R(c,d,e,f,g,h,a,b, i+6); \ - R(b,c,d,e,f,g,h,a, i+7) - -#else - -#define R(i) h(i) += S1(e(i)) + Ch(e(i),f(i),g(i)) + K[i+j] + (j?blk2(i):blk0(i));\ - d(i) += h(i); h(i) += S0(a(i)) + Maj(a(i), b(i), c(i)) - -#ifdef _SHA256_UNROLL - -#define RX_8(i) R(i+0); R(i+1); R(i+2); R(i+3); R(i+4); R(i+5); R(i+6); R(i+7); - -#endif - -#endif - -const UInt32 K[64] = { - 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, - 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, - 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, - 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, - 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, - 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, - 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, - 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, - 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, - 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, - 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, - 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, - 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, - 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, - 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, - 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 -}; - -static void Sha256_Transform(UInt32 *state, const UInt32 *data) -{ - UInt32 W[16]; - unsigned j; - #ifdef _SHA256_UNROLL2 - UInt32 a,b,c,d,e,f,g,h; - a = state[0]; - b = state[1]; - c = state[2]; - d = state[3]; - e = state[4]; - f = state[5]; - g = state[6]; - h = state[7]; - #else - UInt32 T[8]; - for (j = 0; j < 8; j++) - T[j] = state[j]; - #endif - - for (j = 0; j < 64; j += 16) - { - #if defined(_SHA256_UNROLL) || defined(_SHA256_UNROLL2) - RX_8(0); RX_8(8); - #else - unsigned i; - for (i = 0; i < 16; i++) { R(i); } - #endif - } - - #ifdef _SHA256_UNROLL2 - state[0] += a; - state[1] += b; - state[2] += c; - state[3] += d; - state[4] += e; - state[5] += f; - state[6] += g; - state[7] += h; - #else - for (j = 0; j < 8; j++) - state[j] += T[j]; - #endif - - /* Wipe variables */ - /* memset(W, 0, sizeof(W)); */ - /* memset(T, 0, sizeof(T)); */ -} - -#undef S0 -#undef S1 -#undef s0 -#undef s1 - -static void Sha256_WriteByteBlock(CSha256 *p) -{ - UInt32 data32[16]; - unsigned i; - for (i = 0; i < 16; i++) - data32[i] = - ((UInt32)(p->buffer[i * 4 ]) << 24) + - ((UInt32)(p->buffer[i * 4 + 1]) << 16) + - ((UInt32)(p->buffer[i * 4 + 2]) << 8) + - ((UInt32)(p->buffer[i * 4 + 3])); - Sha256_Transform(p->state, data32); -} - -void Sha256_Update(CSha256 *p, const Byte *data, size_t size) -{ - UInt32 curBufferPos = (UInt32)p->count & 0x3F; - while (size > 0) - { - p->buffer[curBufferPos++] = *data++; - p->count++; - size--; - if (curBufferPos == 64) - { - curBufferPos = 0; - Sha256_WriteByteBlock(p); - } - } -} - -void Sha256_Final(CSha256 *p, Byte *digest) -{ - UInt64 lenInBits = (p->count << 3); - UInt32 curBufferPos = (UInt32)p->count & 0x3F; - unsigned i; - p->buffer[curBufferPos++] = 0x80; - while (curBufferPos != (64 - 8)) - { - curBufferPos &= 0x3F; - if (curBufferPos == 0) - Sha256_WriteByteBlock(p); - p->buffer[curBufferPos++] = 0; - } - for (i = 0; i < 8; i++) - { - p->buffer[curBufferPos++] = (Byte)(lenInBits >> 56); - lenInBits <<= 8; - } - Sha256_WriteByteBlock(p); - - for (i = 0; i < 8; i++) - { - *digest++ = (Byte)((p->state[i] >> 24) & 0xFF); - *digest++ = (Byte)((p->state[i] >> 16) & 0xFF); - *digest++ = (Byte)((p->state[i] >> 8) & 0xFF); - *digest++ = (Byte)((p->state[i]) & 0xFF); - } - Sha256_Init(p); -} diff --git a/desmume/src/windows/7z/C/Sha256.h b/desmume/src/windows/7z/C/Sha256.h deleted file mode 100644 index 8703b4a63..000000000 --- a/desmume/src/windows/7z/C/Sha256.h +++ /dev/null @@ -1,22 +0,0 @@ -/* Crypto/Sha256.h -- SHA-256 Hash function -2008-10-04 : Igor Pavlov : Public domain */ - -#ifndef __CRYPTO_SHA256_H -#define __CRYPTO_SHA256_H - -#include "Types.h" - -#define SHA256_DIGEST_SIZE 32 - -typedef struct -{ - UInt32 state[8]; - UInt64 count; - Byte buffer[64]; -} CSha256; - -void Sha256_Init(CSha256 *p); -void Sha256_Update(CSha256 *p, const Byte *data, size_t size); -void Sha256_Final(CSha256 *p, Byte *digest); - -#endif diff --git a/desmume/src/windows/7z/C/Sort.c b/desmume/src/windows/7z/C/Sort.c deleted file mode 100644 index bb20dc348..000000000 --- a/desmume/src/windows/7z/C/Sort.c +++ /dev/null @@ -1,95 +0,0 @@ -/* Sort.c -- Sort functions -2008-08-17 -Igor Pavlov -Public domain */ - -#include "Sort.h" - -#define HeapSortDown(p, k, size, temp) \ - { for (;;) { \ - UInt32 s = (k << 1); \ - if (s > size) break; \ - if (s < size && p[s + 1] > p[s]) s++; \ - if (temp >= p[s]) break; \ - p[k] = p[s]; k = s; \ - } p[k] = temp; } - -void HeapSort(UInt32 *p, UInt32 size) -{ - if (size <= 1) - return; - p--; - { - UInt32 i = size / 2; - do - { - UInt32 temp = p[i]; - UInt32 k = i; - HeapSortDown(p, k, size, temp) - } - while (--i != 0); - } - /* - do - { - UInt32 k = 1; - UInt32 temp = p[size]; - p[size--] = p[1]; - HeapSortDown(p, k, size, temp) - } - while (size > 1); - */ - while (size > 3) - { - UInt32 temp = p[size]; - UInt32 k = (p[3] > p[2]) ? 3 : 2; - p[size--] = p[1]; - p[1] = p[k]; - HeapSortDown(p, k, size, temp) - } - { - UInt32 temp = p[size]; - p[size] = p[1]; - if (size > 2 && p[2] < temp) - { - p[1] = p[2]; - p[2] = temp; - } - else - p[1] = temp; - } -} - -/* -#define HeapSortRefDown(p, vals, n, size, temp) \ - { UInt32 k = n; UInt32 val = vals[temp]; for (;;) { \ - UInt32 s = (k << 1); \ - if (s > size) break; \ - if (s < size && vals[p[s + 1]] > vals[p[s]]) s++; \ - if (val >= vals[p[s]]) break; \ - p[k] = p[s]; k = s; \ - } p[k] = temp; } - -void HeapSortRef(UInt32 *p, UInt32 *vals, UInt32 size) -{ - if (size <= 1) - return; - p--; - { - UInt32 i = size / 2; - do - { - UInt32 temp = p[i]; - HeapSortRefDown(p, vals, i, size, temp); - } - while (--i != 0); - } - do - { - UInt32 temp = p[size]; - p[size--] = p[1]; - HeapSortRefDown(p, vals, 1, size, temp); - } - while (size > 1); -} -*/ \ No newline at end of file diff --git a/desmume/src/windows/7z/C/Sort.h b/desmume/src/windows/7z/C/Sort.h deleted file mode 100644 index cff6c4c32..000000000 --- a/desmume/src/windows/7z/C/Sort.h +++ /dev/null @@ -1,14 +0,0 @@ -/* Sort.h -- Sort functions -2008-03-19 -Igor Pavlov -Public domain */ - -#ifndef __7Z_SORT_H -#define __7Z_SORT_H - -#include "Types.h" - -void HeapSort(UInt32 *p, UInt32 size); -/* void HeapSortRef(UInt32 *p, UInt32 *vals, UInt32 size); */ - -#endif diff --git a/desmume/src/windows/7z/C/Threads.c b/desmume/src/windows/7z/C/Threads.c deleted file mode 100644 index c7d8b0a8a..000000000 --- a/desmume/src/windows/7z/C/Threads.c +++ /dev/null @@ -1,109 +0,0 @@ -/* Threads.c -- multithreading library -2008-08-05 -Igor Pavlov -Public domain */ - -#include "Threads.h" -#include - -static WRes GetError() -{ - DWORD res = GetLastError(); - return (res) ? (WRes)(res) : 1; -} - -WRes HandleToWRes(HANDLE h) { return (h != 0) ? 0 : GetError(); } -WRes BOOLToWRes(BOOL v) { return v ? 0 : GetError(); } - -static WRes MyCloseHandle(HANDLE *h) -{ - if (*h != NULL) - if (!CloseHandle(*h)) - return GetError(); - *h = NULL; - return 0; -} - -WRes Thread_Create(CThread *thread, THREAD_FUNC_RET_TYPE (THREAD_FUNC_CALL_TYPE *startAddress)(void *), LPVOID parameter) -{ - unsigned threadId; /* Windows Me/98/95: threadId parameter may not be NULL in _beginthreadex/CreateThread functions */ - thread->handle = - /* CreateThread(0, 0, startAddress, parameter, 0, &threadId); */ - (HANDLE)_beginthreadex(NULL, 0, startAddress, parameter, 0, &threadId); - /* maybe we must use errno here, but probably GetLastError() is also OK. */ - return HandleToWRes(thread->handle); -} - -WRes WaitObject(HANDLE h) -{ - return (WRes)WaitForSingleObject(h, INFINITE); -} - -WRes Thread_Wait(CThread *thread) -{ - if (thread->handle == NULL) - return 1; - return WaitObject(thread->handle); -} - -WRes Thread_Close(CThread *thread) -{ - return MyCloseHandle(&thread->handle); -} - -WRes Event_Create(CEvent *p, BOOL manualReset, int initialSignaled) -{ - p->handle = CreateEvent(NULL, manualReset, (initialSignaled ? TRUE : FALSE), NULL); - return HandleToWRes(p->handle); -} - -WRes ManualResetEvent_Create(CManualResetEvent *p, int initialSignaled) - { return Event_Create(p, TRUE, initialSignaled); } -WRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *p) - { return ManualResetEvent_Create(p, 0); } - -WRes AutoResetEvent_Create(CAutoResetEvent *p, int initialSignaled) - { return Event_Create(p, FALSE, initialSignaled); } -WRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *p) - { return AutoResetEvent_Create(p, 0); } - -WRes Event_Set(CEvent *p) { return BOOLToWRes(SetEvent(p->handle)); } -WRes Event_Reset(CEvent *p) { return BOOLToWRes(ResetEvent(p->handle)); } -WRes Event_Wait(CEvent *p) { return WaitObject(p->handle); } -WRes Event_Close(CEvent *p) { return MyCloseHandle(&p->handle); } - - -WRes Semaphore_Create(CSemaphore *p, UInt32 initiallyCount, UInt32 maxCount) -{ - p->handle = CreateSemaphore(NULL, (LONG)initiallyCount, (LONG)maxCount, NULL); - return HandleToWRes(p->handle); -} - -WRes Semaphore_Release(CSemaphore *p, LONG releaseCount, LONG *previousCount) -{ - return BOOLToWRes(ReleaseSemaphore(p->handle, releaseCount, previousCount)); -} -WRes Semaphore_ReleaseN(CSemaphore *p, UInt32 releaseCount) -{ - return Semaphore_Release(p, (LONG)releaseCount, NULL); -} -WRes Semaphore_Release1(CSemaphore *p) -{ - return Semaphore_ReleaseN(p, 1); -} - -WRes Semaphore_Wait(CSemaphore *p) { return WaitObject(p->handle); } -WRes Semaphore_Close(CSemaphore *p) { return MyCloseHandle(&p->handle); } - -WRes CriticalSection_Init(CCriticalSection *p) -{ - /* InitializeCriticalSection can raise only STATUS_NO_MEMORY exception */ - __try - { - InitializeCriticalSection(p); - /* InitializeCriticalSectionAndSpinCount(p, 0); */ - } - __except (EXCEPTION_EXECUTE_HANDLER) { return 1; } - return 0; -} - diff --git a/desmume/src/windows/7z/C/Threads.h b/desmume/src/windows/7z/C/Threads.h deleted file mode 100644 index 3d9072946..000000000 --- a/desmume/src/windows/7z/C/Threads.h +++ /dev/null @@ -1,68 +0,0 @@ -/* Threads.h -- multithreading library -2008-11-22 : Igor Pavlov : Public domain */ - -#ifndef __7Z_THRESDS_H -#define __7Z_THRESDS_H - -#include "Types.h" - -typedef struct _CThread -{ - HANDLE handle; -} CThread; - -#define Thread_Construct(thread) (thread)->handle = NULL -#define Thread_WasCreated(thread) ((thread)->handle != NULL) - -typedef unsigned THREAD_FUNC_RET_TYPE; -#define THREAD_FUNC_CALL_TYPE MY_STD_CALL -#define THREAD_FUNC_DECL THREAD_FUNC_RET_TYPE THREAD_FUNC_CALL_TYPE - -WRes Thread_Create(CThread *thread, THREAD_FUNC_RET_TYPE (THREAD_FUNC_CALL_TYPE *startAddress)(void *), LPVOID parameter); -WRes Thread_Wait(CThread *thread); -WRes Thread_Close(CThread *thread); - -typedef struct _CEvent -{ - HANDLE handle; -} CEvent; - -typedef CEvent CAutoResetEvent; -typedef CEvent CManualResetEvent; - -#define Event_Construct(event) (event)->handle = NULL -#define Event_IsCreated(event) ((event)->handle != NULL) - -WRes ManualResetEvent_Create(CManualResetEvent *event, int initialSignaled); -WRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *event); -WRes AutoResetEvent_Create(CAutoResetEvent *event, int initialSignaled); -WRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *event); -WRes Event_Set(CEvent *event); -WRes Event_Reset(CEvent *event); -WRes Event_Wait(CEvent *event); -WRes Event_Close(CEvent *event); - - -typedef struct _CSemaphore -{ - HANDLE handle; -} CSemaphore; - -#define Semaphore_Construct(p) (p)->handle = NULL - -WRes Semaphore_Create(CSemaphore *p, UInt32 initiallyCount, UInt32 maxCount); -WRes Semaphore_ReleaseN(CSemaphore *p, UInt32 num); -WRes Semaphore_Release1(CSemaphore *p); -WRes Semaphore_Wait(CSemaphore *p); -WRes Semaphore_Close(CSemaphore *p); - - -typedef CRITICAL_SECTION CCriticalSection; - -WRes CriticalSection_Init(CCriticalSection *p); -#define CriticalSection_Delete(p) DeleteCriticalSection(p) -#define CriticalSection_Enter(p) EnterCriticalSection(p) -#define CriticalSection_Leave(p) LeaveCriticalSection(p) - -#endif - diff --git a/desmume/src/windows/7z/C/Types.h b/desmume/src/windows/7z/C/Types.h deleted file mode 100644 index 2638196aa..000000000 --- a/desmume/src/windows/7z/C/Types.h +++ /dev/null @@ -1,208 +0,0 @@ -/* Types.h -- Basic types -2008-11-23 : Igor Pavlov : Public domain */ - -#ifndef __7Z_TYPES_H -#define __7Z_TYPES_H - -#include - -#ifdef _WIN32 -#include -#endif - -#define SZ_OK 0 - -#define SZ_ERROR_DATA 1 -#define SZ_ERROR_MEM 2 -#define SZ_ERROR_CRC 3 -#define SZ_ERROR_UNSUPPORTED 4 -#define SZ_ERROR_PARAM 5 -#define SZ_ERROR_INPUT_EOF 6 -#define SZ_ERROR_OUTPUT_EOF 7 -#define SZ_ERROR_READ 8 -#define SZ_ERROR_WRITE 9 -#define SZ_ERROR_PROGRESS 10 -#define SZ_ERROR_FAIL 11 -#define SZ_ERROR_THREAD 12 - -#define SZ_ERROR_ARCHIVE 16 -#define SZ_ERROR_NO_ARCHIVE 17 - -typedef int SRes; - -#ifdef _WIN32 -typedef DWORD WRes; -#else -typedef int WRes; -#endif - -#ifndef RINOK -#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; } -#endif - -typedef unsigned char Byte; -typedef short Int16; -typedef unsigned short UInt16; - -#ifdef _LZMA_UINT32_IS_ULONG -typedef long Int32; -typedef unsigned long UInt32; -#else -typedef int Int32; -typedef unsigned int UInt32; -#endif - -#ifdef _SZ_NO_INT_64 - -/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers. - NOTES: Some code will work incorrectly in that case! */ - -typedef long Int64; -typedef unsigned long UInt64; - -#else - -#if defined(_MSC_VER) || defined(__BORLANDC__) -typedef __int64 Int64; -typedef unsigned __int64 UInt64; -#else -typedef long long int Int64; -typedef unsigned long long int UInt64; -#endif - -#endif - -#ifdef _LZMA_NO_SYSTEM_SIZE_T -typedef UInt32 SizeT; -#else -typedef size_t SizeT; -#endif - -typedef int Bool; -#define True 1 -#define False 0 - - -#ifdef _MSC_VER - -#if _MSC_VER >= 1300 -#define MY_NO_INLINE __declspec(noinline) -#else -#define MY_NO_INLINE -#endif - -#define MY_CDECL __cdecl -#define MY_STD_CALL __stdcall -#define MY_FAST_CALL MY_NO_INLINE __fastcall - -#else - -#define MY_CDECL -#define MY_STD_CALL -#define MY_FAST_CALL - -#endif - - -/* The following interfaces use first parameter as pointer to structure */ - -typedef struct -{ - SRes (*Read)(void *p, void *buf, size_t *size); - /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. - (output(*size) < input(*size)) is allowed */ -} ISeqInStream; - -/* it can return SZ_ERROR_INPUT_EOF */ -SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size); -SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType); -SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf); - -typedef struct -{ - size_t (*Write)(void *p, const void *buf, size_t size); - /* Returns: result - the number of actually written bytes. - (result < size) means error */ -} ISeqOutStream; - -typedef enum -{ - SZ_SEEK_SET = 0, - SZ_SEEK_CUR = 1, - SZ_SEEK_END = 2 -} ESzSeek; - -typedef struct -{ - SRes (*Read)(void *p, void *buf, size_t *size); /* same as ISeqInStream::Read */ - SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); -} ISeekInStream; - -typedef struct -{ - SRes (*Look)(void *p, void **buf, size_t *size); - /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. - (output(*size) > input(*size)) is not allowed - (output(*size) < input(*size)) is allowed */ - SRes (*Skip)(void *p, size_t offset); - /* offset must be <= output(*size) of Look */ - - SRes (*Read)(void *p, void *buf, size_t *size); - /* reads directly (without buffer). It's same as ISeqInStream::Read */ - SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); -} ILookInStream; - -SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size); -SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset); - -/* reads via ILookInStream::Read */ -SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType); -SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size); - -#define LookToRead_BUF_SIZE (1 << 14) - -typedef struct -{ - ILookInStream s; - ISeekInStream *realStream; - size_t pos; - size_t size; - Byte buf[LookToRead_BUF_SIZE]; -} CLookToRead; - -void LookToRead_CreateVTable(CLookToRead *p, int lookahead); -void LookToRead_Init(CLookToRead *p); - -typedef struct -{ - ISeqInStream s; - ILookInStream *realStream; -} CSecToLook; - -void SecToLook_CreateVTable(CSecToLook *p); - -typedef struct -{ - ISeqInStream s; - ILookInStream *realStream; -} CSecToRead; - -void SecToRead_CreateVTable(CSecToRead *p); - -typedef struct -{ - SRes (*Progress)(void *p, UInt64 inSize, UInt64 outSize); - /* Returns: result. (result != SZ_OK) means break. - Value (UInt64)(Int64)-1 for size means unknown value. */ -} ICompressProgress; - -typedef struct -{ - void *(*Alloc)(void *p, size_t size); - void (*Free)(void *p, void *address); /* address can be 0 */ -} ISzAlloc; - -#define IAlloc_Alloc(p, size) (p)->Alloc((p), size) -#define IAlloc_Free(p, a) (p)->Free((p), a) - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zCompressionMode.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zCompressionMode.cpp deleted file mode 100644 index 232c63820..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zCompressionMode.cpp +++ /dev/null @@ -1,3 +0,0 @@ -// CompressionMethod.cpp - -#include "StdAfx.h" diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zCompressionMode.h b/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zCompressionMode.h deleted file mode 100644 index 5e986355b..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zCompressionMode.h +++ /dev/null @@ -1,50 +0,0 @@ -// 7zCompressionMode.h - -#ifndef __7Z_COMPRESSION_MODE_H -#define __7Z_COMPRESSION_MODE_H - -#include "../../../Common/MyString.h" - -#include "../../../Windows/PropVariant.h" - -#include "../../Common/MethodProps.h" - -namespace NArchive { -namespace N7z { - -struct CMethodFull: public CMethod -{ - UInt32 NumInStreams; - UInt32 NumOutStreams; - bool IsSimpleCoder() const { return (NumInStreams == 1) && (NumOutStreams == 1); } -}; - -struct CBind -{ - UInt32 InCoder; - UInt32 InStream; - UInt32 OutCoder; - UInt32 OutStream; -}; - -struct CCompressionMethodMode -{ - CObjectVector Methods; - CRecordVector Binds; - #ifdef COMPRESS_MT - UInt32 NumThreads; - #endif - bool PasswordIsDefined; - UString Password; - - bool IsEmpty() const { return (Methods.IsEmpty() && !PasswordIsDefined); } - CCompressionMethodMode(): PasswordIsDefined(false) - #ifdef COMPRESS_MT - , NumThreads(1) - #endif - {} -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zDecode.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zDecode.cpp deleted file mode 100644 index 02744c96a..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zDecode.cpp +++ /dev/null @@ -1,332 +0,0 @@ -// 7zDecode.cpp - -#include "StdAfx.h" - -#include "../../Common/LimitedStreams.h" -#include "../../Common/LockedStream.h" -#include "../../Common/ProgressUtils.h" -#include "../../Common/StreamObjects.h" - -#include "7zDecode.h" - -namespace NArchive { -namespace N7z { - -static void ConvertFolderItemInfoToBindInfo(const CFolder &folder, - CBindInfoEx &bindInfo) -{ - bindInfo.Clear(); - int i; - for (i = 0; i < folder.BindPairs.Size(); i++) - { - NCoderMixer::CBindPair bindPair; - bindPair.InIndex = (UInt32)folder.BindPairs[i].InIndex; - bindPair.OutIndex = (UInt32)folder.BindPairs[i].OutIndex; - bindInfo.BindPairs.Add(bindPair); - } - UInt32 outStreamIndex = 0; - for (i = 0; i < folder.Coders.Size(); i++) - { - NCoderMixer::CCoderStreamsInfo coderStreamsInfo; - const CCoderInfo &coderInfo = folder.Coders[i]; - coderStreamsInfo.NumInStreams = (UInt32)coderInfo.NumInStreams; - coderStreamsInfo.NumOutStreams = (UInt32)coderInfo.NumOutStreams; - bindInfo.Coders.Add(coderStreamsInfo); - bindInfo.CoderMethodIDs.Add(coderInfo.MethodID); - for (UInt32 j = 0; j < coderStreamsInfo.NumOutStreams; j++, outStreamIndex++) - if (folder.FindBindPairForOutStream(outStreamIndex) < 0) - bindInfo.OutStreams.Add(outStreamIndex); - } - for (i = 0; i < folder.PackStreams.Size(); i++) - bindInfo.InStreams.Add((UInt32)folder.PackStreams[i]); -} - -static bool AreCodersEqual(const NCoderMixer::CCoderStreamsInfo &a1, - const NCoderMixer::CCoderStreamsInfo &a2) -{ - return (a1.NumInStreams == a2.NumInStreams) && - (a1.NumOutStreams == a2.NumOutStreams); -} - -static bool AreBindPairsEqual(const NCoderMixer::CBindPair &a1, const NCoderMixer::CBindPair &a2) -{ - return (a1.InIndex == a2.InIndex) && - (a1.OutIndex == a2.OutIndex); -} - -static bool AreBindInfoExEqual(const CBindInfoEx &a1, const CBindInfoEx &a2) -{ - if (a1.Coders.Size() != a2.Coders.Size()) - return false; - int i; - for (i = 0; i < a1.Coders.Size(); i++) - if (!AreCodersEqual(a1.Coders[i], a2.Coders[i])) - return false; - if (a1.BindPairs.Size() != a2.BindPairs.Size()) - return false; - for (i = 0; i < a1.BindPairs.Size(); i++) - if (!AreBindPairsEqual(a1.BindPairs[i], a2.BindPairs[i])) - return false; - for (i = 0; i < a1.CoderMethodIDs.Size(); i++) - if (a1.CoderMethodIDs[i] != a2.CoderMethodIDs[i]) - return false; - if (a1.InStreams.Size() != a2.InStreams.Size()) - return false; - if (a1.OutStreams.Size() != a2.OutStreams.Size()) - return false; - return true; -} - -CDecoder::CDecoder(bool multiThread) -{ - #ifndef _ST_MODE - multiThread = true; - #endif - _multiThread = multiThread; - _bindInfoExPrevIsDefined = false; -} - -HRESULT CDecoder::Decode( - DECL_EXTERNAL_CODECS_LOC_VARS - IInStream *inStream, - UInt64 startPos, - const UInt64 *packSizes, - const CFolder &folderInfo, - ISequentialOutStream *outStream, - ICompressProgressInfo *compressProgress - #ifndef _NO_CRYPTO - , ICryptoGetTextPassword *getTextPassword, bool &passwordIsDefined - #endif - #ifdef COMPRESS_MT - , bool mtMode, UInt32 numThreads - #endif - ) -{ - if (!folderInfo.CheckStructure()) - return E_NOTIMPL; - #ifndef _NO_CRYPTO - passwordIsDefined = false; - #endif - CObjectVector< CMyComPtr > inStreams; - - CLockedInStream lockedInStream; - lockedInStream.Init(inStream); - - for (int j = 0; j < folderInfo.PackStreams.Size(); j++) - { - CLockedSequentialInStreamImp *lockedStreamImpSpec = new - CLockedSequentialInStreamImp; - CMyComPtr lockedStreamImp = lockedStreamImpSpec; - lockedStreamImpSpec->Init(&lockedInStream, startPos); - startPos += packSizes[j]; - - CLimitedSequentialInStream *streamSpec = new - CLimitedSequentialInStream; - CMyComPtr inStream = streamSpec; - streamSpec->SetStream(lockedStreamImp); - streamSpec->Init(packSizes[j]); - inStreams.Add(inStream); - } - - int numCoders = folderInfo.Coders.Size(); - - CBindInfoEx bindInfo; - ConvertFolderItemInfoToBindInfo(folderInfo, bindInfo); - bool createNewCoders; - if (!_bindInfoExPrevIsDefined) - createNewCoders = true; - else - createNewCoders = !AreBindInfoExEqual(bindInfo, _bindInfoExPrev); - if (createNewCoders) - { - int i; - _decoders.Clear(); - // _decoders2.Clear(); - - _mixerCoder.Release(); - - if (_multiThread) - { - _mixerCoderMTSpec = new NCoderMixer::CCoderMixer2MT; - _mixerCoder = _mixerCoderMTSpec; - _mixerCoderCommon = _mixerCoderMTSpec; - } - else - { - #ifdef _ST_MODE - _mixerCoderSTSpec = new NCoderMixer::CCoderMixer2ST; - _mixerCoder = _mixerCoderSTSpec; - _mixerCoderCommon = _mixerCoderSTSpec; - #endif - } - RINOK(_mixerCoderCommon->SetBindInfo(bindInfo)); - - for (i = 0; i < numCoders; i++) - { - const CCoderInfo &coderInfo = folderInfo.Coders[i]; - - - CMyComPtr decoder; - CMyComPtr decoder2; - RINOK(CreateCoder( - EXTERNAL_CODECS_LOC_VARS - coderInfo.MethodID, decoder, decoder2, false)); - CMyComPtr decoderUnknown; - if (coderInfo.IsSimpleCoder()) - { - if (decoder == 0) - return E_NOTIMPL; - - decoderUnknown = (IUnknown *)decoder; - - if (_multiThread) - _mixerCoderMTSpec->AddCoder(decoder); - #ifdef _ST_MODE - else - _mixerCoderSTSpec->AddCoder(decoder, false); - #endif - } - else - { - if (decoder2 == 0) - return E_NOTIMPL; - decoderUnknown = (IUnknown *)decoder2; - if (_multiThread) - _mixerCoderMTSpec->AddCoder2(decoder2); - #ifdef _ST_MODE - else - _mixerCoderSTSpec->AddCoder2(decoder2, false); - #endif - } - _decoders.Add(decoderUnknown); - #ifdef EXTERNAL_CODECS - CMyComPtr setCompressCodecsInfo; - decoderUnknown.QueryInterface(IID_ISetCompressCodecsInfo, (void **)&setCompressCodecsInfo); - if (setCompressCodecsInfo) - { - RINOK(setCompressCodecsInfo->SetCompressCodecsInfo(codecsInfo)); - } - #endif - } - _bindInfoExPrev = bindInfo; - _bindInfoExPrevIsDefined = true; - } - int i; - _mixerCoderCommon->ReInit(); - - UInt32 packStreamIndex = 0, unpackStreamIndex = 0; - UInt32 coderIndex = 0; - // UInt32 coder2Index = 0; - - for (i = 0; i < numCoders; i++) - { - const CCoderInfo &coderInfo = folderInfo.Coders[i]; - CMyComPtr &decoder = _decoders[coderIndex]; - - { - CMyComPtr setDecoderProperties; - decoder.QueryInterface(IID_ICompressSetDecoderProperties2, &setDecoderProperties); - if (setDecoderProperties) - { - const CByteBuffer &props = coderInfo.Props; - size_t size = props.GetCapacity(); - if (size > 0xFFFFFFFF) - return E_NOTIMPL; - if (size > 0) - { - RINOK(setDecoderProperties->SetDecoderProperties2((const Byte *)props, (UInt32)size)); - } - } - } - - #ifdef COMPRESS_MT - if (mtMode) - { - CMyComPtr setCoderMt; - decoder.QueryInterface(IID_ICompressSetCoderMt, &setCoderMt); - if (setCoderMt) - { - RINOK(setCoderMt->SetNumberOfThreads(numThreads)); - } - } - #endif - - #ifndef _NO_CRYPTO - { - CMyComPtr cryptoSetPassword; - decoder.QueryInterface(IID_ICryptoSetPassword, &cryptoSetPassword); - if (cryptoSetPassword) - { - if (getTextPassword == 0) - return E_FAIL; - CMyComBSTR passwordBSTR; - RINOK(getTextPassword->CryptoGetTextPassword(&passwordBSTR)); - CByteBuffer buffer; - passwordIsDefined = true; - const UString password(passwordBSTR); - const UInt32 sizeInBytes = password.Length() * 2; - buffer.SetCapacity(sizeInBytes); - for (int i = 0; i < password.Length(); i++) - { - wchar_t c = password[i]; - ((Byte *)buffer)[i * 2] = (Byte)c; - ((Byte *)buffer)[i * 2 + 1] = (Byte)(c >> 8); - } - RINOK(cryptoSetPassword->CryptoSetPassword((const Byte *)buffer, sizeInBytes)); - } - } - #endif - - coderIndex++; - - UInt32 numInStreams = (UInt32)coderInfo.NumInStreams; - UInt32 numOutStreams = (UInt32)coderInfo.NumOutStreams; - CRecordVector packSizesPointers; - CRecordVector unpackSizesPointers; - packSizesPointers.Reserve(numInStreams); - unpackSizesPointers.Reserve(numOutStreams); - UInt32 j; - for (j = 0; j < numOutStreams; j++, unpackStreamIndex++) - unpackSizesPointers.Add(&folderInfo.UnpackSizes[unpackStreamIndex]); - - for (j = 0; j < numInStreams; j++, packStreamIndex++) - { - int bindPairIndex = folderInfo.FindBindPairForInStream(packStreamIndex); - if (bindPairIndex >= 0) - packSizesPointers.Add( - &folderInfo.UnpackSizes[(UInt32)folderInfo.BindPairs[bindPairIndex].OutIndex]); - else - { - int index = folderInfo.FindPackStreamArrayIndex(packStreamIndex); - if (index < 0) - return E_FAIL; - packSizesPointers.Add(&packSizes[index]); - } - } - - _mixerCoderCommon->SetCoderInfo(i, - &packSizesPointers.Front(), - &unpackSizesPointers.Front()); - } - UInt32 mainCoder, temp; - bindInfo.FindOutStream(bindInfo.OutStreams[0], mainCoder, temp); - - if (_multiThread) - _mixerCoderMTSpec->SetProgressCoderIndex(mainCoder); - /* - else - _mixerCoderSTSpec->SetProgressCoderIndex(mainCoder);; - */ - - if (numCoders == 0) - return 0; - CRecordVector inStreamPointers; - inStreamPointers.Reserve(inStreams.Size()); - for (i = 0; i < inStreams.Size(); i++) - inStreamPointers.Add(inStreams[i]); - ISequentialOutStream *outStreamPointer = outStream; - return _mixerCoder->Code(&inStreamPointers.Front(), NULL, - inStreams.Size(), &outStreamPointer, NULL, 1, compressProgress); -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zDecode.h b/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zDecode.h deleted file mode 100644 index aa3904a7c..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zDecode.h +++ /dev/null @@ -1,68 +0,0 @@ -// 7zDecode.h - -#ifndef __7Z_DECODE_H -#define __7Z_DECODE_H - -#include "../../IStream.h" -#include "../../IPassword.h" - -#include "../Common/CoderMixer2.h" -#include "../Common/CoderMixer2MT.h" -#ifdef _ST_MODE -#include "../Common/CoderMixer2ST.h" -#endif - -#include "../../Common/CreateCoder.h" - -#include "7zItem.h" - -namespace NArchive { -namespace N7z { - -struct CBindInfoEx: public NCoderMixer::CBindInfo -{ - CRecordVector CoderMethodIDs; - void Clear() - { - CBindInfo::Clear(); - CoderMethodIDs.Clear(); - } -}; - -class CDecoder -{ - bool _bindInfoExPrevIsDefined; - CBindInfoEx _bindInfoExPrev; - - bool _multiThread; - #ifdef _ST_MODE - NCoderMixer::CCoderMixer2ST *_mixerCoderSTSpec; - #endif - NCoderMixer::CCoderMixer2MT *_mixerCoderMTSpec; - NCoderMixer::CCoderMixer2 *_mixerCoderCommon; - - CMyComPtr _mixerCoder; - CObjectVector > _decoders; - // CObjectVector > _decoders2; -public: - CDecoder(bool multiThread); - HRESULT Decode( - DECL_EXTERNAL_CODECS_LOC_VARS - IInStream *inStream, - UInt64 startPos, - const UInt64 *packSizes, - const CFolder &folder, - ISequentialOutStream *outStream, - ICompressProgressInfo *compressProgress - #ifndef _NO_CRYPTO - , ICryptoGetTextPassword *getTextPasswordSpec, bool &passwordIsDefined - #endif - #ifdef COMPRESS_MT - , bool mtMode, UInt32 numThreads - #endif - ); -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zExtract.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zExtract.cpp deleted file mode 100644 index dbc1aa522..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zExtract.cpp +++ /dev/null @@ -1,273 +0,0 @@ -// 7zExtract.cpp - -#include "StdAfx.h" - -#include "7zHandler.h" -#include "7zFolderOutStream.h" -#include "7zDecode.h" -// #include "7z1Decode.h" - -#include "../../../Common/ComTry.h" -#include "../../Common/StreamObjects.h" -#include "../../Common/ProgressUtils.h" -#include "../../Common/LimitedStreams.h" - -namespace NArchive { -namespace N7z { - -struct CExtractFolderInfo -{ - #ifdef _7Z_VOL - int VolumeIndex; - #endif - CNum FileIndex; - CNum FolderIndex; - CBoolVector ExtractStatuses; - UInt64 UnpackSize; - CExtractFolderInfo( - #ifdef _7Z_VOL - int volumeIndex, - #endif - CNum fileIndex, CNum folderIndex): - #ifdef _7Z_VOL - VolumeIndex(volumeIndex), - #endif - FileIndex(fileIndex), - FolderIndex(folderIndex), - UnpackSize(0) - { - if (fileIndex != kNumNoIndex) - { - ExtractStatuses.Reserve(1); - ExtractStatuses.Add(true); - } - }; -}; - -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 testModeSpec, IArchiveExtractCallback *extractCallbackSpec) -{ - COM_TRY_BEGIN - bool testMode = (testModeSpec != 0); - CMyComPtr extractCallback = extractCallbackSpec; - UInt64 importantTotalUnpacked = 0; - - bool allFilesMode = (numItems == UInt32(-1)); - if (allFilesMode) - numItems = - #ifdef _7Z_VOL - _refs.Size(); - #else - _db.Files.Size(); - #endif - - if(numItems == 0) - return S_OK; - - /* - if(_volumes.Size() != 1) - return E_FAIL; - const CVolume &volume = _volumes.Front(); - const CArchiveDatabaseEx &_db = volume.Database; - IInStream *_inStream = volume.Stream; - */ - - CObjectVector extractFolderInfoVector; - for(UInt32 ii = 0; ii < numItems; ii++) - { - // UInt32 fileIndex = allFilesMode ? indexIndex : indices[indexIndex]; - UInt32 ref2Index = allFilesMode ? ii : indices[ii]; - // const CRef2 &ref2 = _refs[ref2Index]; - - // for(UInt32 ri = 0; ri < ref2.Refs.Size(); ri++) - { - #ifdef _7Z_VOL - // const CRef &ref = ref2.Refs[ri]; - const CRef &ref = _refs[ref2Index]; - - int volumeIndex = ref.VolumeIndex; - const CVolume &volume = _volumes[volumeIndex]; - const CArchiveDatabaseEx &db = volume.Database; - UInt32 fileIndex = ref.ItemIndex; - #else - const CArchiveDatabaseEx &db = _db; - UInt32 fileIndex = ref2Index; - #endif - - CNum folderIndex = db.FileIndexToFolderIndexMap[fileIndex]; - if (folderIndex == kNumNoIndex) - { - extractFolderInfoVector.Add(CExtractFolderInfo( - #ifdef _7Z_VOL - volumeIndex, - #endif - fileIndex, kNumNoIndex)); - continue; - } - if (extractFolderInfoVector.IsEmpty() || - folderIndex != extractFolderInfoVector.Back().FolderIndex - #ifdef _7Z_VOL - || volumeIndex != extractFolderInfoVector.Back().VolumeIndex - #endif - ) - { - extractFolderInfoVector.Add(CExtractFolderInfo( - #ifdef _7Z_VOL - volumeIndex, - #endif - kNumNoIndex, folderIndex)); - const CFolder &folderInfo = db.Folders[folderIndex]; - UInt64 unpackSize = folderInfo.GetUnpackSize(); - importantTotalUnpacked += unpackSize; - extractFolderInfoVector.Back().UnpackSize = unpackSize; - } - - CExtractFolderInfo &efi = extractFolderInfoVector.Back(); - - // const CFolderInfo &folderInfo = m_dam_Folders[folderIndex]; - CNum startIndex = db.FolderStartFileIndex[folderIndex]; - for (CNum index = efi.ExtractStatuses.Size(); - index <= fileIndex - startIndex; index++) - { - // UInt64 unpackSize = _db.Files[startIndex + index].UnpackSize; - // Count partial_folder_size - // efi.UnpackSize += unpackSize; - // importantTotalUnpacked += unpackSize; - efi.ExtractStatuses.Add(index == fileIndex - startIndex); - } - } - } - - extractCallback->SetTotal(importantTotalUnpacked); - - CDecoder decoder( - #ifdef _ST_MODE - false - #else - true - #endif - ); - // CDecoder1 decoder; - - UInt64 currentTotalPacked = 0; - UInt64 currentTotalUnpacked = 0; - UInt64 totalFolderUnpacked; - UInt64 totalFolderPacked; - - CLocalProgress *lps = new CLocalProgress; - CMyComPtr progress = lps; - lps->Init(extractCallback, false); - - for(int i = 0; i < extractFolderInfoVector.Size(); i++, - currentTotalUnpacked += totalFolderUnpacked, - currentTotalPacked += totalFolderPacked) - { - lps->OutSize = currentTotalUnpacked; - lps->InSize = currentTotalPacked; - RINOK(lps->SetCur()); - - const CExtractFolderInfo &efi = extractFolderInfoVector[i]; - totalFolderUnpacked = efi.UnpackSize; - - totalFolderPacked = 0; - - CFolderOutStream *folderOutStream = new CFolderOutStream; - CMyComPtr outStream(folderOutStream); - - #ifdef _7Z_VOL - const CVolume &volume = _volumes[efi.VolumeIndex]; - const CArchiveDatabaseEx &db = volume.Database; - #else - const CArchiveDatabaseEx &db = _db; - #endif - - CNum startIndex; - if (efi.FileIndex != kNumNoIndex) - startIndex = efi.FileIndex; - else - startIndex = db.FolderStartFileIndex[efi.FolderIndex]; - - - HRESULT result = folderOutStream->Init(&db, - #ifdef _7Z_VOL - volume.StartRef2Index, - #else - 0, - #endif - startIndex, - &efi.ExtractStatuses, extractCallback, testMode, _crcSize != 0); - - RINOK(result); - - if (efi.FileIndex != kNumNoIndex) - continue; - - CNum folderIndex = efi.FolderIndex; - const CFolder &folderInfo = db.Folders[folderIndex]; - - totalFolderPacked = _db.GetFolderFullPackSize(folderIndex); - - CNum packStreamIndex = db.FolderStartPackStreamIndex[folderIndex]; - UInt64 folderStartPackPos = db.GetFolderStreamPos(folderIndex, 0); - - #ifndef _NO_CRYPTO - CMyComPtr getTextPassword; - if (extractCallback) - extractCallback.QueryInterface(IID_ICryptoGetTextPassword, &getTextPassword); - #endif - - try - { - #ifndef _NO_CRYPTO - bool passwordIsDefined; - #endif - - HRESULT result = decoder.Decode( - EXTERNAL_CODECS_VARS - #ifdef _7Z_VOL - volume.Stream, - #else - _inStream, - #endif - folderStartPackPos, - &db.PackSizes[packStreamIndex], - folderInfo, - outStream, - progress - #ifndef _NO_CRYPTO - , getTextPassword, passwordIsDefined - #endif - #ifdef COMPRESS_MT - , true, _numThreads - #endif - ); - - if (result == S_FALSE) - { - RINOK(folderOutStream->FlushCorrupted(NArchive::NExtract::NOperationResult::kDataError)); - continue; - } - if (result == E_NOTIMPL) - { - RINOK(folderOutStream->FlushCorrupted(NArchive::NExtract::NOperationResult::kUnSupportedMethod)); - continue; - } - if (result != S_OK) - return result; - if (folderOutStream->WasWritingFinished() != S_OK) - { - RINOK(folderOutStream->FlushCorrupted(NArchive::NExtract::NOperationResult::kDataError)); - continue; - } - } - catch(...) - { - RINOK(folderOutStream->FlushCorrupted(NArchive::NExtract::NOperationResult::kDataError)); - continue; - } - } - return S_OK; - COM_TRY_END -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zFolderInStream.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zFolderInStream.cpp deleted file mode 100644 index 3b11f1686..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zFolderInStream.cpp +++ /dev/null @@ -1,130 +0,0 @@ -// 7zFolderInStream.cpp - -#include "StdAfx.h" - -#include "7zFolderInStream.h" - -namespace NArchive { -namespace N7z { - -CFolderInStream::CFolderInStream() -{ - _inStreamWithHashSpec = new CSequentialInStreamWithCRC; - _inStreamWithHash = _inStreamWithHashSpec; -} - -void CFolderInStream::Init(IArchiveUpdateCallback *updateCallback, - const UInt32 *fileIndices, UInt32 numFiles) -{ - _updateCallback = updateCallback; - _numFiles = numFiles; - _fileIndex = 0; - _fileIndices = fileIndices; - Processed.Clear(); - CRCs.Clear(); - Sizes.Clear(); - _fileIsOpen = false; - _currentSizeIsDefined = false; -} - -HRESULT CFolderInStream::OpenStream() -{ - _filePos = 0; - while (_fileIndex < _numFiles) - { - _currentSizeIsDefined = false; - CMyComPtr stream; - HRESULT result = _updateCallback->GetStream(_fileIndices[_fileIndex], &stream); - if (result != S_OK && result != S_FALSE) - return result; - _fileIndex++; - _inStreamWithHashSpec->SetStream(stream); - _inStreamWithHashSpec->Init(); - if (!stream) - { - RINOK(_updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK)); - Sizes.Add(0); - Processed.Add(result == S_OK); - AddDigest(); - continue; - } - CMyComPtr streamGetSize; - if (stream.QueryInterface(IID_IStreamGetSize, &streamGetSize) == S_OK) - { - if(streamGetSize) - { - _currentSizeIsDefined = true; - RINOK(streamGetSize->GetSize(&_currentSize)); - } - } - - _fileIsOpen = true; - return S_OK; - } - return S_OK; -} - -void CFolderInStream::AddDigest() -{ - CRCs.Add(_inStreamWithHashSpec->GetCRC()); -} - -HRESULT CFolderInStream::CloseStream() -{ - RINOK(_updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK)); - _inStreamWithHashSpec->ReleaseStream(); - _fileIsOpen = false; - Processed.Add(true); - Sizes.Add(_filePos); - AddDigest(); - return S_OK; -} - -STDMETHODIMP CFolderInStream::Read(void *data, UInt32 size, UInt32 *processedSize) -{ - UInt32 realProcessedSize = 0; - while ((_fileIndex < _numFiles || _fileIsOpen) && size > 0) - { - if (_fileIsOpen) - { - UInt32 localProcessedSize; - RINOK(_inStreamWithHash->Read( - ((Byte *)data) + realProcessedSize, size, &localProcessedSize)); - if (localProcessedSize == 0) - { - RINOK(CloseStream()); - continue; - } - realProcessedSize += localProcessedSize; - _filePos += localProcessedSize; - size -= localProcessedSize; - break; - } - else - { - RINOK(OpenStream()); - } - } - if (processedSize != 0) - *processedSize = realProcessedSize; - return S_OK; -} - -STDMETHODIMP CFolderInStream::GetSubStreamSize(UInt64 subStream, UInt64 *value) -{ - *value = 0; - int subStreamIndex = (int)subStream; - if (subStreamIndex < 0 || subStream > Sizes.Size()) - return E_FAIL; - if (subStreamIndex < Sizes.Size()) - { - *value= Sizes[subStreamIndex]; - return S_OK; - } - if (!_currentSizeIsDefined) - return S_FALSE; - *value = _currentSize; - return S_OK; -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zFolderInStream.h b/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zFolderInStream.h deleted file mode 100644 index b4df6d62a..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zFolderInStream.h +++ /dev/null @@ -1,66 +0,0 @@ -// 7z/FolderInStream.h - -#ifndef __7Z_FOLDERINSTREAM_H -#define __7Z_FOLDERINSTREAM_H - -#include "7zItem.h" -#include "7zHeader.h" - -#include "../IArchive.h" -#include "../Common/InStreamWithCRC.h" -#include "../../IStream.h" -#include "../../ICoder.h" - -namespace NArchive { -namespace N7z { - -class CFolderInStream: - public ISequentialInStream, - public ICompressGetSubStreamSize, - public CMyUnknownImp -{ -public: - - MY_UNKNOWN_IMP1(ICompressGetSubStreamSize) - - CFolderInStream(); - - STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); - - STDMETHOD(GetSubStreamSize)(UInt64 subStream, UInt64 *value); -private: - CSequentialInStreamWithCRC *_inStreamWithHashSpec; - CMyComPtr _inStreamWithHash; - CMyComPtr _updateCallback; - - bool _currentSizeIsDefined; - UInt64 _currentSize; - - bool _fileIsOpen; - UInt64 _filePos; - - const UInt32 *_fileIndices; - UInt32 _numFiles; - UInt32 _fileIndex; - - HRESULT OpenStream(); - HRESULT CloseStream(); - void AddDigest(); -public: - void Init(IArchiveUpdateCallback *updateCallback, - const UInt32 *fileIndices, UInt32 numFiles); - CRecordVector Processed; - CRecordVector CRCs; - CRecordVector Sizes; - UInt64 GetFullSize() const - { - UInt64 size = 0; - for (int i = 0; i < Sizes.Size(); i++) - size += Sizes[i]; - return size; - } -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zFolderOutStream.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zFolderOutStream.cpp deleted file mode 100644 index d3a79ee13..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zFolderOutStream.cpp +++ /dev/null @@ -1,164 +0,0 @@ -// 7zFolderOutStream.cpp - -#include "StdAfx.h" - -#include "7zFolderOutStream.h" - -namespace NArchive { -namespace N7z { - -CFolderOutStream::CFolderOutStream() -{ - _outStreamWithHashSpec = new COutStreamWithCRC; - _outStreamWithHash = _outStreamWithHashSpec; -} - -HRESULT CFolderOutStream::Init( - const CArchiveDatabaseEx *archiveDatabase, - UInt32 ref2Offset, - UInt32 startIndex, - const CBoolVector *extractStatuses, - IArchiveExtractCallback *extractCallback, - bool testMode, - bool checkCrc) -{ - _archiveDatabase = archiveDatabase; - _ref2Offset = ref2Offset; - _startIndex = startIndex; - - _extractStatuses = extractStatuses; - _extractCallback = extractCallback; - _testMode = testMode; - - _checkCrc = checkCrc; - - _currentIndex = 0; - _fileIsOpen = false; - return WriteEmptyFiles(); -} - -HRESULT CFolderOutStream::OpenFile() -{ - Int32 askMode; - if((*_extractStatuses)[_currentIndex]) - askMode = _testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; - else - askMode = NArchive::NExtract::NAskMode::kSkip; - CMyComPtr realOutStream; - - UInt32 index = _startIndex + _currentIndex; - RINOK(_extractCallback->GetStream(_ref2Offset + index, &realOutStream, askMode)); - - _outStreamWithHashSpec->SetStream(realOutStream); - _outStreamWithHashSpec->Init(_checkCrc); - if (askMode == NArchive::NExtract::NAskMode::kExtract && - (!realOutStream)) - { - const CFileItem &fi = _archiveDatabase->Files[index]; - if (!_archiveDatabase->IsItemAnti(index) && !fi.IsDir) - askMode = NArchive::NExtract::NAskMode::kSkip; - } - return _extractCallback->PrepareOperation(askMode); -} - -HRESULT CFolderOutStream::WriteEmptyFiles() -{ - for(;_currentIndex < _extractStatuses->Size(); _currentIndex++) - { - UInt32 index = _startIndex + _currentIndex; - const CFileItem &fi = _archiveDatabase->Files[index]; - if (!_archiveDatabase->IsItemAnti(index) && !fi.IsDir && fi.Size != 0) - return S_OK; - RINOK(OpenFile()); - RINOK(_extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK)); - _outStreamWithHashSpec->ReleaseStream(); - } - return S_OK; -} - -STDMETHODIMP CFolderOutStream::Write(const void *data, - UInt32 size, UInt32 *processedSize) -{ - UInt32 realProcessedSize = 0; - while(_currentIndex < _extractStatuses->Size()) - { - if (_fileIsOpen) - { - UInt32 index = _startIndex + _currentIndex; - const CFileItem &fi = _archiveDatabase->Files[index]; - UInt64 fileSize = fi.Size; - - UInt32 numBytesToWrite = (UInt32)MyMin(fileSize - _filePos, - UInt64(size - realProcessedSize)); - - UInt32 processedSizeLocal; - RINOK(_outStreamWithHash->Write((const Byte *)data + realProcessedSize, - numBytesToWrite, &processedSizeLocal)); - - _filePos += processedSizeLocal; - realProcessedSize += processedSizeLocal; - if (_filePos == fileSize) - { - bool digestsAreEqual; - if (fi.CrcDefined && _checkCrc) - digestsAreEqual = fi.Crc == _outStreamWithHashSpec->GetCRC(); - else - digestsAreEqual = true; - - RINOK(_extractCallback->SetOperationResult( - digestsAreEqual ? - NArchive::NExtract::NOperationResult::kOK : - NArchive::NExtract::NOperationResult::kCRCError)); - _outStreamWithHashSpec->ReleaseStream(); - _fileIsOpen = false; - _currentIndex++; - } - if (realProcessedSize == size) - { - if (processedSize != NULL) - *processedSize = realProcessedSize; - return WriteEmptyFiles(); - } - } - else - { - RINOK(OpenFile()); - _fileIsOpen = true; - _filePos = 0; - } - } - if (processedSize != NULL) - *processedSize = size; - return S_OK; -} - -HRESULT CFolderOutStream::FlushCorrupted(Int32 resultEOperationResult) -{ - while(_currentIndex < _extractStatuses->Size()) - { - if (_fileIsOpen) - { - RINOK(_extractCallback->SetOperationResult(resultEOperationResult)); - _outStreamWithHashSpec->ReleaseStream(); - _fileIsOpen = false; - _currentIndex++; - } - else - { - RINOK(OpenFile()); - _fileIsOpen = true; - } - } - return S_OK; -} - -HRESULT CFolderOutStream::WasWritingFinished() -{ - if (_currentIndex == _extractStatuses->Size()) - return S_OK; - return E_FAIL; -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zFolderOutStream.h b/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zFolderOutStream.h deleted file mode 100644 index d88cde985..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zFolderOutStream.h +++ /dev/null @@ -1,60 +0,0 @@ -// 7zFolderOutStream.h - -#ifndef __7Z_FOLDEROUTSTREAM_H -#define __7Z_FOLDEROUTSTREAM_H - -#include "7zIn.h" - -#include "../../IStream.h" -#include "../IArchive.h" -#include "../Common/OutStreamWithCRC.h" - -namespace NArchive { -namespace N7z { - -class CFolderOutStream: - public ISequentialOutStream, - public CMyUnknownImp -{ -public: - MY_UNKNOWN_IMP - - CFolderOutStream(); - - STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); -private: - - COutStreamWithCRC *_outStreamWithHashSpec; - CMyComPtr _outStreamWithHash; - const CArchiveDatabaseEx *_archiveDatabase; - const CBoolVector *_extractStatuses; - UInt32 _startIndex; - UInt32 _ref2Offset; - int _currentIndex; - // UInt64 _currentDataPos; - CMyComPtr _extractCallback; - bool _testMode; - - bool _fileIsOpen; - - bool _checkCrc; - UInt64 _filePos; - - HRESULT OpenFile(); - HRESULT WriteEmptyFiles(); -public: - HRESULT Init( - const CArchiveDatabaseEx *archiveDatabase, - UInt32 ref2Offset, - UInt32 startIndex, - const CBoolVector *extractStatuses, - IArchiveExtractCallback *extractCallback, - bool testMode, - bool checkCrc); - HRESULT FlushCorrupted(Int32 resultEOperationResult); - HRESULT WasWritingFinished(); -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zHandler.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zHandler.cpp deleted file mode 100644 index c76a106f8..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zHandler.cpp +++ /dev/null @@ -1,503 +0,0 @@ -// 7zHandler.cpp - -#include "StdAfx.h" - -extern "C" -{ - #include "../../../../C/CpuArch.h" -} - -#include "../../../Common/ComTry.h" -#include "../../../Common/IntToString.h" - -#ifdef COMPRESS_MT -#include "../../../Windows/System.h" -#endif - -#include "../Common/ItemNameUtils.h" - -#include "7zHandler.h" -#include "7zProperties.h" - -#ifdef __7Z_SET_PROPERTIES -#ifdef EXTRACT_ONLY -#include "../Common/ParseProperties.h" -#endif -#endif - -using namespace NWindows; - -extern UString ConvertMethodIdToString(UInt64 id); - -namespace NArchive { -namespace N7z { - -CHandler::CHandler() -{ - _crcSize = 4; - - #ifndef _NO_CRYPTO - _passwordIsDefined = false; - #endif - - #ifdef EXTRACT_ONLY - #ifdef COMPRESS_MT - _numThreads = NSystem::GetNumberOfProcessors(); - #endif - #else - Init(); - #endif -} - -STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems) -{ - *numItems = _db.Files.Size(); - return S_OK; -} - -#ifdef _SFX - -IMP_IInArchive_ArcProps_NO - -STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 * /* numProperties */) -{ - return E_NOTIMPL; -} - -STDMETHODIMP CHandler::GetPropertyInfo(UInt32 /* index */, - BSTR * /* name */, PROPID * /* propID */, VARTYPE * /* varType */) -{ - return E_NOTIMPL; -} - - -#else - -STATPROPSTG kArcProps[] = -{ - { NULL, kpidMethod, VT_BSTR}, - { NULL, kpidSolid, VT_BOOL}, - { NULL, kpidNumBlocks, VT_UI4}, - { NULL, kpidPhySize, VT_UI8}, - { NULL, kpidHeadersSize, VT_UI8}, - { NULL, kpidOffset, VT_UI8} -}; - -STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value) -{ - COM_TRY_BEGIN - NCOM::CPropVariant prop; - switch(propID) - { - case kpidMethod: - { - UString resString; - CRecordVector ids; - int i; - for (i = 0; i < _db.Folders.Size(); i++) - { - const CFolder &f = _db.Folders[i]; - for (int j = f.Coders.Size() - 1; j >= 0; j--) - ids.AddToUniqueSorted(f.Coders[j].MethodID); - } - - for (i = 0; i < ids.Size(); i++) - { - UInt64 id = ids[i]; - UString methodName; - /* bool methodIsKnown = */ FindMethod(EXTERNAL_CODECS_VARS id, methodName); - if (methodName.IsEmpty()) - methodName = ConvertMethodIdToString(id); - if (!resString.IsEmpty()) - resString += L' '; - resString += methodName; - } - prop = resString; - break; - } - case kpidSolid: prop = _db.IsSolid(); break; - case kpidNumBlocks: prop = (UInt32)_db.Folders.Size(); break; - case kpidHeadersSize: prop = _db.HeadersSize; break; - case kpidPhySize: prop = _db.PhySize; break; - case kpidOffset: if (_db.ArchiveInfo.StartPosition != 0) prop = _db.ArchiveInfo.StartPosition; break; - } - prop.Detach(value); - return S_OK; - COM_TRY_END -} - -IMP_IInArchive_ArcProps - -#endif - -static void SetPropFromUInt64Def(CUInt64DefVector &v, int index, NCOM::CPropVariant &prop) -{ - UInt64 value; - if (v.GetItem(index, value)) - { - FILETIME ft; - ft.dwLowDateTime = (DWORD)value; - ft.dwHighDateTime = (DWORD)(value >> 32); - prop = ft; - } -} - -#ifndef _SFX - -static UString ConvertUInt32ToString(UInt32 value) -{ - wchar_t buffer[32]; - ConvertUInt64ToString(value, buffer); - return buffer; -} - -static UString GetStringForSizeValue(UInt32 value) -{ - for (int i = 31; i >= 0; i--) - if ((UInt32(1) << i) == value) - return ConvertUInt32ToString(i); - UString result; - if (value % (1 << 20) == 0) - { - result += ConvertUInt32ToString(value >> 20); - result += L"m"; - } - else if (value % (1 << 10) == 0) - { - result += ConvertUInt32ToString(value >> 10); - result += L"k"; - } - else - { - result += ConvertUInt32ToString(value); - result += L"b"; - } - return result; -} - -static const UInt64 k_Copy = 0x0; -static const UInt64 k_LZMA = 0x030101; -static const UInt64 k_PPMD = 0x030401; - -static wchar_t GetHex(Byte value) -{ - return (wchar_t)((value < 10) ? (L'0' + value) : (L'A' + (value - 10))); -} -static inline UString GetHex2(Byte value) -{ - UString result; - result += GetHex((Byte)(value >> 4)); - result += GetHex((Byte)(value & 0xF)); - return result; -} - -#endif - -static const UInt64 k_AES = 0x06F10701; - -bool CHandler::IsEncrypted(UInt32 index2) const -{ - CNum folderIndex = _db.FileIndexToFolderIndexMap[index2]; - if (folderIndex != kNumNoIndex) - { - const CFolder &folderInfo = _db.Folders[folderIndex]; - for (int i = folderInfo.Coders.Size() - 1; i >= 0; i--) - if (folderInfo.Coders[i].MethodID == k_AES) - return true; - } - return false; -} - -STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value) -{ - COM_TRY_BEGIN - NCOM::CPropVariant prop; - - /* - const CRef2 &ref2 = _refs[index]; - if (ref2.Refs.IsEmpty()) - return E_FAIL; - const CRef &ref = ref2.Refs.Front(); - */ - - const CFileItem &item = _db.Files[index]; - UInt32 index2 = index; - - switch(propID) - { - case kpidPath: - if (!item.Name.IsEmpty()) - prop = NItemName::GetOSName(item.Name); - break; - case kpidIsDir: prop = item.IsDir; break; - case kpidSize: - { - prop = item.Size; - // prop = ref2.Size; - break; - } - case kpidPackSize: - { - // prop = ref2.PackSize; - { - CNum folderIndex = _db.FileIndexToFolderIndexMap[index2]; - if (folderIndex != kNumNoIndex) - { - if (_db.FolderStartFileIndex[folderIndex] == (CNum)index2) - prop = _db.GetFolderFullPackSize(folderIndex); - /* - else - prop = (UInt64)0; - */ - } - else - prop = (UInt64)0; - } - break; - } - case kpidPosition: { UInt64 v; if (_db.StartPos.GetItem(index2, v)) prop = v; break; } - case kpidCTime: SetPropFromUInt64Def(_db.CTime, index2, prop); break; - case kpidATime: SetPropFromUInt64Def(_db.ATime, index2, prop); break; - case kpidMTime: SetPropFromUInt64Def(_db.MTime, index2, prop); break; - case kpidAttrib: if (item.AttribDefined) prop = item.Attrib; break; - case kpidCRC: if (item.CrcDefined) prop = item.Crc; break; - case kpidEncrypted: prop = IsEncrypted(index2); break; - case kpidIsAnti: prop = _db.IsItemAnti(index2); break; - #ifndef _SFX - case kpidMethod: - { - CNum folderIndex = _db.FileIndexToFolderIndexMap[index2]; - if (folderIndex != kNumNoIndex) - { - const CFolder &folderInfo = _db.Folders[folderIndex]; - UString methodsString; - for (int i = folderInfo.Coders.Size() - 1; i >= 0; i--) - { - const CCoderInfo &coderInfo = folderInfo.Coders[i]; - if (!methodsString.IsEmpty()) - methodsString += L' '; - - { - UString methodName; - bool methodIsKnown = FindMethod( - EXTERNAL_CODECS_VARS - coderInfo.MethodID, methodName); - - if (methodIsKnown) - { - methodsString += methodName; - if (coderInfo.MethodID == k_LZMA) - { - if (coderInfo.Props.GetCapacity() >= 5) - { - methodsString += L":"; - UInt32 dicSize = GetUi32((const Byte *)coderInfo.Props + 1); - methodsString += GetStringForSizeValue(dicSize); - } - } - else if (coderInfo.MethodID == k_PPMD) - { - if (coderInfo.Props.GetCapacity() >= 5) - { - Byte order = *(const Byte *)coderInfo.Props; - methodsString += L":o"; - methodsString += ConvertUInt32ToString(order); - methodsString += L":mem"; - UInt32 dicSize = GetUi32((const Byte *)coderInfo.Props + 1); - methodsString += GetStringForSizeValue(dicSize); - } - } - else if (coderInfo.MethodID == k_AES) - { - if (coderInfo.Props.GetCapacity() >= 1) - { - methodsString += L":"; - const Byte *data = (const Byte *)coderInfo.Props; - Byte firstByte = *data++; - UInt32 numCyclesPower = firstByte & 0x3F; - methodsString += ConvertUInt32ToString(numCyclesPower); - /* - if ((firstByte & 0xC0) != 0) - { - methodsString += L":"; - return S_OK; - UInt32 saltSize = (firstByte >> 7) & 1; - UInt32 ivSize = (firstByte >> 6) & 1; - if (coderInfo.Props.GetCapacity() >= 2) - { - Byte secondByte = *data++; - saltSize += (secondByte >> 4); - ivSize += (secondByte & 0x0F); - } - } - */ - } - } - else - { - if (coderInfo.Props.GetCapacity() > 0) - { - methodsString += L":["; - for (size_t bi = 0; bi < coderInfo.Props.GetCapacity(); bi++) - { - if (bi > 5 && bi + 1 < coderInfo.Props.GetCapacity()) - { - methodsString += L".."; - break; - } - else - methodsString += GetHex2(coderInfo.Props[bi]); - } - methodsString += L"]"; - } - } - } - else - { - methodsString += ConvertMethodIdToString(coderInfo.MethodID); - } - } - } - prop = methodsString; - } - } - break; - case kpidBlock: - { - CNum folderIndex = _db.FileIndexToFolderIndexMap[index2]; - if (folderIndex != kNumNoIndex) - prop = (UInt32)folderIndex; - } - break; - case kpidPackedSize0: - case kpidPackedSize1: - case kpidPackedSize2: - case kpidPackedSize3: - case kpidPackedSize4: - { - CNum folderIndex = _db.FileIndexToFolderIndexMap[index2]; - if (folderIndex != kNumNoIndex) - { - const CFolder &folderInfo = _db.Folders[folderIndex]; - if (_db.FolderStartFileIndex[folderIndex] == (CNum)index2 && - folderInfo.PackStreams.Size() > (int)(propID - kpidPackedSize0)) - { - prop = _db.GetFolderPackStreamSize(folderIndex, propID - kpidPackedSize0); - } - else - prop = (UInt64)0; - } - else - prop = (UInt64)0; - } - break; - #endif - } - prop.Detach(value); - return S_OK; - COM_TRY_END -} - -STDMETHODIMP CHandler::Open(IInStream *stream, - const UInt64 *maxCheckStartPosition, - IArchiveOpenCallback *openArchiveCallback) -{ - COM_TRY_BEGIN - Close(); - #ifndef _SFX - _fileInfoPopIDs.Clear(); - #endif - try - { - CMyComPtr openArchiveCallbackTemp = openArchiveCallback; - - #ifndef _NO_CRYPTO - CMyComPtr getTextPassword; - if (openArchiveCallback) - { - openArchiveCallbackTemp.QueryInterface( - IID_ICryptoGetTextPassword, &getTextPassword); - } - #endif - CInArchive archive; - RINOK(archive.Open(stream, maxCheckStartPosition)); - #ifndef _NO_CRYPTO - _passwordIsDefined = false; - UString password; - #endif - HRESULT result = archive.ReadDatabase( - EXTERNAL_CODECS_VARS - _db - #ifndef _NO_CRYPTO - , getTextPassword, _passwordIsDefined - #endif - ); - RINOK(result); - _db.Fill(); - _inStream = stream; - } - catch(...) - { - Close(); - return S_FALSE; - } - // _inStream = stream; - #ifndef _SFX - FillPopIDs(); - #endif - return S_OK; - COM_TRY_END -} - -STDMETHODIMP CHandler::Close() -{ - COM_TRY_BEGIN - _inStream.Release(); - _db.Clear(); - return S_OK; - COM_TRY_END -} - -#ifdef __7Z_SET_PROPERTIES -#ifdef EXTRACT_ONLY - -STDMETHODIMP CHandler::SetProperties(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties) -{ - COM_TRY_BEGIN - #ifdef COMPRESS_MT - const UInt32 numProcessors = NSystem::GetNumberOfProcessors(); - _numThreads = numProcessors; - #endif - - for (int i = 0; i < numProperties; i++) - { - UString name = names[i]; - name.MakeUpper(); - if (name.IsEmpty()) - return E_INVALIDARG; - const PROPVARIANT &value = values[i]; - UInt32 number; - int index = ParseStringToUInt32(name, number); - if (index == 0) - { - if(name.Left(2).CompareNoCase(L"MT") == 0) - { - #ifdef COMPRESS_MT - RINOK(ParseMtProp(name.Mid(2), value, numProcessors, _numThreads)); - #endif - continue; - } - else - return E_INVALIDARG; - } - } - return S_OK; - COM_TRY_END -} - -#endif -#endif - -IMPL_ISetCompressCodecsInfo - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zHandler.h b/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zHandler.h deleted file mode 100644 index c04a0f931..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zHandler.h +++ /dev/null @@ -1,121 +0,0 @@ -// 7z/Handler.h - -#ifndef __7Z_HANDLER_H -#define __7Z_HANDLER_H - -#include "../../ICoder.h" -#include "../IArchive.h" -#include "7zIn.h" - -#include "7zCompressionMode.h" - -#include "../../Common/CreateCoder.h" - -#ifndef EXTRACT_ONLY -#include "../Common/HandlerOut.h" -#endif - -namespace NArchive { -namespace N7z { - -#ifndef __7Z_SET_PROPERTIES - -#ifdef EXTRACT_ONLY -#ifdef COMPRESS_MT -#define __7Z_SET_PROPERTIES -#endif -#else -#define __7Z_SET_PROPERTIES -#endif - -#endif - - -class CHandler: - #ifndef EXTRACT_ONLY - public NArchive::COutHandler, - #endif - public IInArchive, - #ifdef __7Z_SET_PROPERTIES - public ISetProperties, - #endif - #ifndef EXTRACT_ONLY - public IOutArchive, - #endif - PUBLIC_ISetCompressCodecsInfo - public CMyUnknownImp -{ -public: - MY_QUERYINTERFACE_BEGIN2(IInArchive) - #ifdef __7Z_SET_PROPERTIES - MY_QUERYINTERFACE_ENTRY(ISetProperties) - #endif - #ifndef EXTRACT_ONLY - MY_QUERYINTERFACE_ENTRY(IOutArchive) - #endif - QUERY_ENTRY_ISetCompressCodecsInfo - MY_QUERYINTERFACE_END - MY_ADDREF_RELEASE - - INTERFACE_IInArchive(;) - - #ifdef __7Z_SET_PROPERTIES - STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties); - #endif - - #ifndef EXTRACT_ONLY - INTERFACE_IOutArchive(;) - #endif - - DECL_ISetCompressCodecsInfo - - CHandler(); - -private: - CMyComPtr _inStream; - NArchive::N7z::CArchiveDatabaseEx _db; - #ifndef _NO_CRYPTO - bool _passwordIsDefined; - #endif - - #ifdef EXTRACT_ONLY - - #ifdef COMPRESS_MT - UInt32 _numThreads; - #endif - - UInt32 _crcSize; - - #else - - CRecordVector _binds; - - HRESULT SetPassword(CCompressionMethodMode &methodMode, IArchiveUpdateCallback *updateCallback); - - HRESULT SetCompressionMethod(CCompressionMethodMode &method, - CObjectVector &methodsInfo - #ifdef COMPRESS_MT - , UInt32 numThreads - #endif - ); - - HRESULT SetCompressionMethod( - CCompressionMethodMode &method, - CCompressionMethodMode &headerMethod); - - #endif - - bool IsEncrypted(UInt32 index2) const; - #ifndef _SFX - - CRecordVector _fileInfoPopIDs; - void FillPopIDs(); - - #endif - - DECL_EXTERNAL_CODECS_VARS -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zHeader.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zHeader.cpp deleted file mode 100644 index c010f3671..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zHeader.cpp +++ /dev/null @@ -1,27 +0,0 @@ -// 7z/Header.cpp - -#include "StdAfx.h" -#include "7zHeader.h" - -namespace NArchive { -namespace N7z { - -Byte kSignature[kSignatureSize] = {'7' + 1, 'z', 0xBC, 0xAF, 0x27, 0x1C}; -#ifdef _7Z_VOL -Byte kFinishSignature[kSignatureSize] = {'7' + 1, 'z', 0xBC, 0xAF, 0x27, 0x1C + 1}; -#endif - -class SignatureInitializer -{ -public: - SignatureInitializer() - { - kSignature[0]--; - #ifdef _7Z_VOL - kFinishSignature[0]--; - #endif - }; -} g_SignatureInitializer; - -}} - diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zHeader.h b/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zHeader.h deleted file mode 100644 index 57f455b81..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zHeader.h +++ /dev/null @@ -1,97 +0,0 @@ -// 7z/7zHeader.h - -#ifndef __7Z_HEADER_H -#define __7Z_HEADER_H - -#include "../../../Common/Types.h" - -namespace NArchive { -namespace N7z { - -const int kSignatureSize = 6; -extern Byte kSignature[kSignatureSize]; - -// #define _7Z_VOL -// 7z-MultiVolume is not finished yet. -// It can work already, but I still do not like some -// things of that new multivolume format. -// So please keep it commented. - -#ifdef _7Z_VOL -extern Byte kFinishSignature[kSignatureSize]; -#endif - -struct CArchiveVersion -{ - Byte Major; - Byte Minor; -}; - -const Byte kMajorVersion = 0; - -struct CStartHeader -{ - UInt64 NextHeaderOffset; - UInt64 NextHeaderSize; - UInt32 NextHeaderCRC; -}; - -const UInt32 kStartHeaderSize = 20; - -#ifdef _7Z_VOL -struct CFinishHeader: public CStartHeader -{ - UInt64 ArchiveStartOffset; // data offset from end if that struct - UInt64 AdditionalStartBlockSize; // start signature & start header size -}; - -const UInt32 kFinishHeaderSize = kStartHeaderSize + 16; -#endif - -namespace NID -{ - enum EEnum - { - kEnd, - - kHeader, - - kArchiveProperties, - - kAdditionalStreamsInfo, - kMainStreamsInfo, - kFilesInfo, - - kPackInfo, - kUnpackInfo, - kSubStreamsInfo, - - kSize, - kCRC, - - kFolder, - - kCodersUnpackSize, - kNumUnpackStream, - - kEmptyStream, - kEmptyFile, - kAnti, - - kName, - kCTime, - kATime, - kMTime, - kWinAttributes, - kComment, - - kEncodedHeader, - - kStartPos, - kDummy - }; -} - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zIn.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zIn.cpp deleted file mode 100644 index a9fecf8e1..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zIn.cpp +++ /dev/null @@ -1,1260 +0,0 @@ -// 7zIn.cpp - -#include "StdAfx.h" - -extern "C" -{ - #include "../../../../C/7zCrc.h" - #include "../../../../C/CpuArch.h" -} - -#include "../../Common/StreamObjects.h" -#include "../../Common/StreamUtils.h" - -#include "7zDecode.h" -#include "7zIn.h" - -#define Get16(p) GetUi16(p) -#define Get32(p) GetUi32(p) -#define Get64(p) GetUi64(p) - -// define FORMAT_7Z_RECOVERY if you want to recover multivolume archives with empty StartHeader -#ifndef _SFX -#define FORMAT_7Z_RECOVERY -#endif - -namespace NArchive { -namespace N7z { - -static void BoolVector_Fill_False(CBoolVector &v, int size) -{ - v.Clear(); - v.Reserve(size); - for (int i = 0; i < size; i++) - v.Add(false); -} - -static bool BoolVector_GetAndSet(CBoolVector &v, UInt32 index) -{ - if (index >= (UInt32)v.Size()) - return true; - bool res = v[index]; - v[index] = true; - return res; -} - -bool CFolder::CheckStructure() const -{ - const int kNumCodersMax = sizeof(UInt32) * 8; // don't change it - const int kMaskSize = sizeof(UInt32) * 8; // it must be >= kNumCodersMax - const int kNumBindsMax = 32; - - if (Coders.Size() > kNumCodersMax || BindPairs.Size() > kNumBindsMax) - return false; - - { - CBoolVector v; - BoolVector_Fill_False(v, BindPairs.Size() + PackStreams.Size()); - - int i; - for (i = 0; i < BindPairs.Size(); i++) - if (BoolVector_GetAndSet(v, BindPairs[i].InIndex)) - return false; - for (i = 0; i < PackStreams.Size(); i++) - if (BoolVector_GetAndSet(v, PackStreams[i])) - return false; - - BoolVector_Fill_False(v, UnpackSizes.Size()); - for (i = 0; i < BindPairs.Size(); i++) - if (BoolVector_GetAndSet(v, BindPairs[i].OutIndex)) - return false; - } - - UInt32 mask[kMaskSize]; - int i; - for (i = 0; i < kMaskSize; i++) - mask[i] = 0; - - { - CIntVector inStreamToCoder, outStreamToCoder; - for (i = 0; i < Coders.Size(); i++) - { - CNum j; - const CCoderInfo &coder = Coders[i]; - for (j = 0; j < coder.NumInStreams; j++) - inStreamToCoder.Add(i); - for (j = 0; j < coder.NumOutStreams; j++) - outStreamToCoder.Add(i); - } - - for (i = 0; i < BindPairs.Size(); i++) - { - const CBindPair &bp = BindPairs[i]; - mask[inStreamToCoder[bp.InIndex]] |= (1 << outStreamToCoder[bp.OutIndex]); - } - } - - for (i = 0; i < kMaskSize; i++) - for (int j = 0; j < kMaskSize; j++) - if (((1 << j) & mask[i]) != 0) - mask[i] |= mask[j]; - - for (i = 0; i < kMaskSize; i++) - if (((1 << i) & mask[i]) != 0) - return false; - - return true; -} - -class CInArchiveException {}; - -static void ThrowException() { throw CInArchiveException(); } -static inline void ThrowEndOfData() { ThrowException(); } -static inline void ThrowUnsupported() { ThrowException(); } -static inline void ThrowIncorrect() { ThrowException(); } -static inline void ThrowUnsupportedVersion() { ThrowException(); } - -/* -class CInArchiveException -{ -public: - enum CCauseType - { - kUnsupportedVersion = 0, - kUnsupported, - kIncorrect, - kEndOfData, - } Cause; - CInArchiveException(CCauseType cause): Cause(cause) {}; -}; - -static void ThrowException(CInArchiveException::CCauseType c) { throw CInArchiveException(c); } -static void ThrowEndOfData() { ThrowException(CInArchiveException::kEndOfData); } -static void ThrowUnsupported() { ThrowException(CInArchiveException::kUnsupported); } -static void ThrowIncorrect() { ThrowException(CInArchiveException::kIncorrect); } -static void ThrowUnsupportedVersion() { ThrowException(CInArchiveException::kUnsupportedVersion); } -*/ - -class CStreamSwitch -{ - CInArchive *_archive; - bool _needRemove; -public: - CStreamSwitch(): _needRemove(false) {} - ~CStreamSwitch() { Remove(); } - void Remove(); - void Set(CInArchive *archive, const Byte *data, size_t size); - void Set(CInArchive *archive, const CByteBuffer &byteBuffer); - void Set(CInArchive *archive, const CObjectVector *dataVector); -}; - -void CStreamSwitch::Remove() -{ - if (_needRemove) - { - _archive->DeleteByteStream(); - _needRemove = false; - } -} - -void CStreamSwitch::Set(CInArchive *archive, const Byte *data, size_t size) -{ - Remove(); - _archive = archive; - _archive->AddByteStream(data, size); - _needRemove = true; -} - -void CStreamSwitch::Set(CInArchive *archive, const CByteBuffer &byteBuffer) -{ - Set(archive, byteBuffer, byteBuffer.GetCapacity()); -} - -void CStreamSwitch::Set(CInArchive *archive, const CObjectVector *dataVector) -{ - Remove(); - Byte external = archive->ReadByte(); - if (external != 0) - { - int dataIndex = (int)archive->ReadNum(); - if (dataIndex < 0 || dataIndex >= dataVector->Size()) - ThrowIncorrect(); - Set(archive, (*dataVector)[dataIndex]); - } -} - -Byte CInByte2::ReadByte() -{ - if (_pos >= _size) - ThrowEndOfData(); - return _buffer[_pos++]; -} - -void CInByte2::ReadBytes(Byte *data, size_t size) -{ - if (size > _size - _pos) - ThrowEndOfData(); - for (size_t i = 0; i < size; i++) - data[i] = _buffer[_pos++]; -} - -void CInByte2::SkeepData(UInt64 size) -{ - if (size > _size - _pos) - ThrowEndOfData(); - _pos += (size_t)size; -} - -void CInByte2::SkeepData() -{ - SkeepData(ReadNumber()); -} - -UInt64 CInByte2::ReadNumber() -{ - if (_pos >= _size) - ThrowEndOfData(); - Byte firstByte = _buffer[_pos++]; - Byte mask = 0x80; - UInt64 value = 0; - for (int i = 0; i < 8; i++) - { - if ((firstByte & mask) == 0) - { - UInt64 highPart = firstByte & (mask - 1); - value += (highPart << (i * 8)); - return value; - } - if (_pos >= _size) - ThrowEndOfData(); - value |= ((UInt64)_buffer[_pos++] << (8 * i)); - mask >>= 1; - } - return value; -} - -CNum CInByte2::ReadNum() -{ - UInt64 value = ReadNumber(); - if (value > kNumMax) - ThrowUnsupported(); - return (CNum)value; -} - -UInt32 CInByte2::ReadUInt32() -{ - if (_pos + 4 > _size) - ThrowEndOfData(); - UInt32 res = Get32(_buffer + _pos); - _pos += 4; - return res; -} - -UInt64 CInByte2::ReadUInt64() -{ - if (_pos + 8 > _size) - ThrowEndOfData(); - UInt64 res = Get64(_buffer + _pos); - _pos += 8; - return res; -} - -void CInByte2::ReadString(UString &s) -{ - const Byte *buf = _buffer + _pos; - size_t rem = (_size - _pos) / 2 * 2; - { - size_t i; - for (i = 0; i < rem; i += 2) - if (buf[i] == 0 && buf[i + 1] == 0) - break; - if (i == rem) - ThrowEndOfData(); - rem = i; - } - int len = (int)(rem / 2); - if (len < 0 || (size_t)len * 2 != rem) - ThrowUnsupported(); - wchar_t *p = s.GetBuffer(len); - int i; - for (i = 0; i < len; i++, buf += 2) - p[i] = (wchar_t)Get16(buf); - s.ReleaseBuffer(len); - _pos += rem + 2; -} - -static inline bool TestSignatureCandidate(const Byte *p) -{ - for (int i = 0; i < kSignatureSize; i++) - if (p[i] != kSignature[i]) - return false; - return (p[0x1A] == 0 && p[0x1B] == 0); -} - -HRESULT CInArchive::FindAndReadSignature(IInStream *stream, const UInt64 *searchHeaderSizeLimit) -{ - RINOK(ReadStream_FALSE(stream, _header, kHeaderSize)); - - if (TestSignatureCandidate(_header)) - return S_OK; - - CByteBuffer byteBuffer; - const UInt32 kBufferSize = (1 << 16); - byteBuffer.SetCapacity(kBufferSize); - Byte *buffer = byteBuffer; - UInt32 numPrevBytes = kHeaderSize - 1; - memcpy(buffer, _header + 1, numPrevBytes); - UInt64 curTestPos = _arhiveBeginStreamPosition + 1; - for (;;) - { - if (searchHeaderSizeLimit != NULL) - if (curTestPos - _arhiveBeginStreamPosition > *searchHeaderSizeLimit) - break; - do - { - UInt32 numReadBytes = kBufferSize - numPrevBytes; - UInt32 processedSize; - RINOK(stream->Read(buffer + numPrevBytes, numReadBytes, &processedSize)); - numPrevBytes += processedSize; - if (processedSize == 0) - return S_FALSE; - } - while (numPrevBytes < kHeaderSize); - UInt32 numTests = numPrevBytes - kHeaderSize + 1; - for (UInt32 pos = 0; pos < numTests; pos++) - { - for (; buffer[pos] != '7' && pos < numTests; pos++); - if (pos == numTests) - break; - if (TestSignatureCandidate(buffer + pos)) - { - memcpy(_header, buffer + pos, kHeaderSize); - curTestPos += pos; - _arhiveBeginStreamPosition = curTestPos; - return stream->Seek(curTestPos + kHeaderSize, STREAM_SEEK_SET, NULL); - } - } - curTestPos += numTests; - numPrevBytes -= numTests; - memmove(buffer, buffer + numTests, numPrevBytes); - } - return S_FALSE; -} - -// S_FALSE means that file is not archive -HRESULT CInArchive::Open(IInStream *stream, const UInt64 *searchHeaderSizeLimit) -{ - HeadersSize = 0; - Close(); - RINOK(stream->Seek(0, STREAM_SEEK_CUR, &_arhiveBeginStreamPosition)) - RINOK(FindAndReadSignature(stream, searchHeaderSizeLimit)); - _stream = stream; - return S_OK; -} - -void CInArchive::Close() -{ - _stream.Release(); -} - -void CInArchive::ReadArchiveProperties(CInArchiveInfo & /* archiveInfo */) -{ - for (;;) - { - if (ReadID() == NID::kEnd) - break; - SkeepData(); - } -} - -void CInArchive::GetNextFolderItem(CFolder &folder) -{ - CNum numCoders = ReadNum(); - - folder.Coders.Clear(); - folder.Coders.Reserve((int)numCoders); - CNum numInStreams = 0; - CNum numOutStreams = 0; - CNum i; - for (i = 0; i < numCoders; i++) - { - folder.Coders.Add(CCoderInfo()); - CCoderInfo &coder = folder.Coders.Back(); - - { - Byte mainByte = ReadByte(); - int idSize = (mainByte & 0xF); - Byte longID[15]; - ReadBytes(longID, idSize); - if (idSize > 8) - ThrowUnsupported(); - UInt64 id = 0; - for (int j = 0; j < idSize; j++) - id |= (UInt64)longID[idSize - 1 - j] << (8 * j); - coder.MethodID = id; - - if ((mainByte & 0x10) != 0) - { - coder.NumInStreams = ReadNum(); - coder.NumOutStreams = ReadNum(); - } - else - { - coder.NumInStreams = 1; - coder.NumOutStreams = 1; - } - if ((mainByte & 0x20) != 0) - { - CNum propsSize = ReadNum(); - coder.Props.SetCapacity((size_t)propsSize); - ReadBytes((Byte *)coder.Props, (size_t)propsSize); - } - if ((mainByte & 0x80) != 0) - ThrowUnsupported(); - } - numInStreams += coder.NumInStreams; - numOutStreams += coder.NumOutStreams; - } - - CNum numBindPairs = numOutStreams - 1; - folder.BindPairs.Clear(); - folder.BindPairs.Reserve(numBindPairs); - for (i = 0; i < numBindPairs; i++) - { - CBindPair bp; - bp.InIndex = ReadNum(); - bp.OutIndex = ReadNum(); - folder.BindPairs.Add(bp); - } - - if (numInStreams < numBindPairs) - ThrowUnsupported(); - CNum numPackStreams = numInStreams - numBindPairs; - folder.PackStreams.Reserve(numPackStreams); - if (numPackStreams == 1) - { - for (i = 0; i < numInStreams; i++) - if (folder.FindBindPairForInStream(i) < 0) - { - folder.PackStreams.Add(i); - break; - } - if (folder.PackStreams.Size() != 1) - ThrowUnsupported(); - } - else - for (i = 0; i < numPackStreams; i++) - folder.PackStreams.Add(ReadNum()); -} - -void CInArchive::WaitAttribute(UInt64 attribute) -{ - for (;;) - { - UInt64 type = ReadID(); - if (type == attribute) - return; - if (type == NID::kEnd) - ThrowIncorrect(); - SkeepData(); - } -} - -void CInArchive::ReadHashDigests(int numItems, - CBoolVector &digestsDefined, - CRecordVector &digests) -{ - ReadBoolVector2(numItems, digestsDefined); - digests.Clear(); - digests.Reserve(numItems); - for (int i = 0; i < numItems; i++) - { - UInt32 crc = 0; - if (digestsDefined[i]) - crc = ReadUInt32(); - digests.Add(crc); - } -} - -void CInArchive::ReadPackInfo( - UInt64 &dataOffset, - CRecordVector &packSizes, - CBoolVector &packCRCsDefined, - CRecordVector &packCRCs) -{ - dataOffset = ReadNumber(); - CNum numPackStreams = ReadNum(); - - WaitAttribute(NID::kSize); - packSizes.Clear(); - packSizes.Reserve(numPackStreams); - for (CNum i = 0; i < numPackStreams; i++) - packSizes.Add(ReadNumber()); - - UInt64 type; - for (;;) - { - type = ReadID(); - if (type == NID::kEnd) - break; - if (type == NID::kCRC) - { - ReadHashDigests(numPackStreams, packCRCsDefined, packCRCs); - continue; - } - SkeepData(); - } - if (packCRCsDefined.IsEmpty()) - { - BoolVector_Fill_False(packCRCsDefined, numPackStreams); - packCRCs.Reserve(numPackStreams); - packCRCs.Clear(); - for (CNum i = 0; i < numPackStreams; i++) - packCRCs.Add(0); - } -} - -void CInArchive::ReadUnpackInfo( - const CObjectVector *dataVector, - CObjectVector &folders) -{ - WaitAttribute(NID::kFolder); - CNum numFolders = ReadNum(); - - { - CStreamSwitch streamSwitch; - streamSwitch.Set(this, dataVector); - folders.Clear(); - folders.Reserve(numFolders); - for (CNum i = 0; i < numFolders; i++) - { - folders.Add(CFolder()); - GetNextFolderItem(folders.Back()); - } - } - - WaitAttribute(NID::kCodersUnpackSize); - - CNum i; - for (i = 0; i < numFolders; i++) - { - CFolder &folder = folders[i]; - CNum numOutStreams = folder.GetNumOutStreams(); - folder.UnpackSizes.Reserve(numOutStreams); - for (CNum j = 0; j < numOutStreams; j++) - folder.UnpackSizes.Add(ReadNumber()); - } - - for (;;) - { - UInt64 type = ReadID(); - if (type == NID::kEnd) - return; - if (type == NID::kCRC) - { - CBoolVector crcsDefined; - CRecordVector crcs; - ReadHashDigests(numFolders, crcsDefined, crcs); - for (i = 0; i < numFolders; i++) - { - CFolder &folder = folders[i]; - folder.UnpackCRCDefined = crcsDefined[i]; - folder.UnpackCRC = crcs[i]; - } - continue; - } - SkeepData(); - } -} - -void CInArchive::ReadSubStreamsInfo( - const CObjectVector &folders, - CRecordVector &numUnpackStreamsInFolders, - CRecordVector &unpackSizes, - CBoolVector &digestsDefined, - CRecordVector &digests) -{ - numUnpackStreamsInFolders.Clear(); - numUnpackStreamsInFolders.Reserve(folders.Size()); - UInt64 type; - for (;;) - { - type = ReadID(); - if (type == NID::kNumUnpackStream) - { - for (int i = 0; i < folders.Size(); i++) - numUnpackStreamsInFolders.Add(ReadNum()); - continue; - } - if (type == NID::kCRC || type == NID::kSize) - break; - if (type == NID::kEnd) - break; - SkeepData(); - } - - if (numUnpackStreamsInFolders.IsEmpty()) - for (int i = 0; i < folders.Size(); i++) - numUnpackStreamsInFolders.Add(1); - - int i; - for (i = 0; i < numUnpackStreamsInFolders.Size(); i++) - { - // v3.13 incorrectly worked with empty folders - // v4.07: we check that folder is empty - CNum numSubstreams = numUnpackStreamsInFolders[i]; - if (numSubstreams == 0) - continue; - UInt64 sum = 0; - for (CNum j = 1; j < numSubstreams; j++) - if (type == NID::kSize) - { - UInt64 size = ReadNumber(); - unpackSizes.Add(size); - sum += size; - } - unpackSizes.Add(folders[i].GetUnpackSize() - sum); - } - if (type == NID::kSize) - type = ReadID(); - - int numDigests = 0; - int numDigestsTotal = 0; - for (i = 0; i < folders.Size(); i++) - { - CNum numSubstreams = numUnpackStreamsInFolders[i]; - if (numSubstreams != 1 || !folders[i].UnpackCRCDefined) - numDigests += numSubstreams; - numDigestsTotal += numSubstreams; - } - - for (;;) - { - if (type == NID::kCRC) - { - CBoolVector digestsDefined2; - CRecordVector digests2; - ReadHashDigests(numDigests, digestsDefined2, digests2); - int digestIndex = 0; - for (i = 0; i < folders.Size(); i++) - { - CNum numSubstreams = numUnpackStreamsInFolders[i]; - const CFolder &folder = folders[i]; - if (numSubstreams == 1 && folder.UnpackCRCDefined) - { - digestsDefined.Add(true); - digests.Add(folder.UnpackCRC); - } - else - for (CNum j = 0; j < numSubstreams; j++, digestIndex++) - { - digestsDefined.Add(digestsDefined2[digestIndex]); - digests.Add(digests2[digestIndex]); - } - } - } - else if (type == NID::kEnd) - { - if (digestsDefined.IsEmpty()) - { - BoolVector_Fill_False(digestsDefined, numDigestsTotal); - digests.Clear(); - for (int i = 0; i < numDigestsTotal; i++) - digests.Add(0); - } - return; - } - else - SkeepData(); - type = ReadID(); - } -} - -void CInArchive::ReadStreamsInfo( - const CObjectVector *dataVector, - UInt64 &dataOffset, - CRecordVector &packSizes, - CBoolVector &packCRCsDefined, - CRecordVector &packCRCs, - CObjectVector &folders, - CRecordVector &numUnpackStreamsInFolders, - CRecordVector &unpackSizes, - CBoolVector &digestsDefined, - CRecordVector &digests) -{ - for (;;) - { - UInt64 type = ReadID(); - if (type > ((UInt32)1 << 30)) - ThrowIncorrect(); - switch((UInt32)type) - { - case NID::kEnd: - return; - case NID::kPackInfo: - { - ReadPackInfo(dataOffset, packSizes, packCRCsDefined, packCRCs); - break; - } - case NID::kUnpackInfo: - { - ReadUnpackInfo(dataVector, folders); - break; - } - case NID::kSubStreamsInfo: - { - ReadSubStreamsInfo(folders, numUnpackStreamsInFolders, - unpackSizes, digestsDefined, digests); - break; - } - default: - ThrowIncorrect(); - } - } -} - -void CInArchive::ReadBoolVector(int numItems, CBoolVector &v) -{ - v.Clear(); - v.Reserve(numItems); - Byte b = 0; - Byte mask = 0; - for (int i = 0; i < numItems; i++) - { - if (mask == 0) - { - b = ReadByte(); - mask = 0x80; - } - v.Add((b & mask) != 0); - mask >>= 1; - } -} - -void CInArchive::ReadBoolVector2(int numItems, CBoolVector &v) -{ - Byte allAreDefined = ReadByte(); - if (allAreDefined == 0) - { - ReadBoolVector(numItems, v); - return; - } - v.Clear(); - v.Reserve(numItems); - for (int i = 0; i < numItems; i++) - v.Add(true); -} - -void CInArchive::ReadUInt64DefVector(const CObjectVector &dataVector, - CUInt64DefVector &v, int numFiles) -{ - ReadBoolVector2(numFiles, v.Defined); - - CStreamSwitch streamSwitch; - streamSwitch.Set(this, &dataVector); - v.Values.Reserve(numFiles); - - for (int i = 0; i < numFiles; i++) - { - UInt64 t = 0; - if (v.Defined[i]) - t = ReadUInt64(); - v.Values.Add(t); - } -} - -HRESULT CInArchive::ReadAndDecodePackedStreams( - DECL_EXTERNAL_CODECS_LOC_VARS - UInt64 baseOffset, - UInt64 &dataOffset, CObjectVector &dataVector - #ifndef _NO_CRYPTO - , ICryptoGetTextPassword *getTextPassword, bool &passwordIsDefined - #endif - ) -{ - CRecordVector packSizes; - CBoolVector packCRCsDefined; - CRecordVector packCRCs; - CObjectVector folders; - - CRecordVector numUnpackStreamsInFolders; - CRecordVector unpackSizes; - CBoolVector digestsDefined; - CRecordVector digests; - - ReadStreamsInfo(NULL, - dataOffset, - packSizes, - packCRCsDefined, - packCRCs, - folders, - numUnpackStreamsInFolders, - unpackSizes, - digestsDefined, - digests); - - // db.ArchiveInfo.DataStartPosition2 += db.ArchiveInfo.StartPositionAfterHeader; - - CNum packIndex = 0; - CDecoder decoder( - #ifdef _ST_MODE - false - #else - true - #endif - ); - UInt64 dataStartPos = baseOffset + dataOffset; - for (int i = 0; i < folders.Size(); i++) - { - const CFolder &folder = folders[i]; - dataVector.Add(CByteBuffer()); - CByteBuffer &data = dataVector.Back(); - UInt64 unpackSize64 = folder.GetUnpackSize(); - size_t unpackSize = (size_t)unpackSize64; - if (unpackSize != unpackSize64) - ThrowUnsupported(); - data.SetCapacity(unpackSize); - - CSequentialOutStreamImp2 *outStreamSpec = new CSequentialOutStreamImp2; - CMyComPtr outStream = outStreamSpec; - outStreamSpec->Init(data, unpackSize); - - HRESULT result = decoder.Decode( - EXTERNAL_CODECS_LOC_VARS - _stream, dataStartPos, - &packSizes[packIndex], folder, outStream, NULL - #ifndef _NO_CRYPTO - , getTextPassword, passwordIsDefined - #endif - #ifdef COMPRESS_MT - , false, 1 - #endif - ); - RINOK(result); - - if (folder.UnpackCRCDefined) - if (CrcCalc(data, unpackSize) != folder.UnpackCRC) - ThrowIncorrect(); - for (int j = 0; j < folder.PackStreams.Size(); j++) - { - UInt64 packSize = packSizes[packIndex++]; - dataStartPos += packSize; - HeadersSize += packSize; - } - } - return S_OK; -} - -HRESULT CInArchive::ReadHeader( - DECL_EXTERNAL_CODECS_LOC_VARS - CArchiveDatabaseEx &db - #ifndef _NO_CRYPTO - , ICryptoGetTextPassword *getTextPassword, bool &passwordIsDefined - #endif - ) -{ - UInt64 type = ReadID(); - - if (type == NID::kArchiveProperties) - { - ReadArchiveProperties(db.ArchiveInfo); - type = ReadID(); - } - - CObjectVector dataVector; - - if (type == NID::kAdditionalStreamsInfo) - { - HRESULT result = ReadAndDecodePackedStreams( - EXTERNAL_CODECS_LOC_VARS - db.ArchiveInfo.StartPositionAfterHeader, - db.ArchiveInfo.DataStartPosition2, - dataVector - #ifndef _NO_CRYPTO - , getTextPassword, passwordIsDefined - #endif - ); - RINOK(result); - db.ArchiveInfo.DataStartPosition2 += db.ArchiveInfo.StartPositionAfterHeader; - type = ReadID(); - } - - CRecordVector unpackSizes; - CBoolVector digestsDefined; - CRecordVector digests; - - if (type == NID::kMainStreamsInfo) - { - ReadStreamsInfo(&dataVector, - db.ArchiveInfo.DataStartPosition, - db.PackSizes, - db.PackCRCsDefined, - db.PackCRCs, - db.Folders, - db.NumUnpackStreamsVector, - unpackSizes, - digestsDefined, - digests); - db.ArchiveInfo.DataStartPosition += db.ArchiveInfo.StartPositionAfterHeader; - type = ReadID(); - } - else - { - for (int i = 0; i < db.Folders.Size(); i++) - { - db.NumUnpackStreamsVector.Add(1); - CFolder &folder = db.Folders[i]; - unpackSizes.Add(folder.GetUnpackSize()); - digestsDefined.Add(folder.UnpackCRCDefined); - digests.Add(folder.UnpackCRC); - } - } - - db.Files.Clear(); - - if (type == NID::kEnd) - return S_OK; - if (type != NID::kFilesInfo) - ThrowIncorrect(); - - CNum numFiles = ReadNum(); - db.Files.Reserve(numFiles); - CNum i; - for (i = 0; i < numFiles; i++) - db.Files.Add(CFileItem()); - - db.ArchiveInfo.FileInfoPopIDs.Add(NID::kSize); - if (!db.PackSizes.IsEmpty()) - db.ArchiveInfo.FileInfoPopIDs.Add(NID::kPackInfo); - if (numFiles > 0 && !digests.IsEmpty()) - db.ArchiveInfo.FileInfoPopIDs.Add(NID::kCRC); - - CBoolVector emptyStreamVector; - BoolVector_Fill_False(emptyStreamVector, (int)numFiles); - CBoolVector emptyFileVector; - CBoolVector antiFileVector; - CNum numEmptyStreams = 0; - - for (;;) - { - UInt64 type = ReadID(); - if (type == NID::kEnd) - break; - UInt64 size = ReadNumber(); - size_t ppp = _inByteBack->_pos; - bool addPropIdToList = true; - bool isKnownType = true; - if (type > ((UInt32)1 << 30)) - isKnownType = false; - else switch((UInt32)type) - { - case NID::kName: - { - CStreamSwitch streamSwitch; - streamSwitch.Set(this, &dataVector); - for (int i = 0; i < db.Files.Size(); i++) - _inByteBack->ReadString(db.Files[i].Name); - break; - } - case NID::kWinAttributes: - { - CBoolVector boolVector; - ReadBoolVector2(db.Files.Size(), boolVector); - CStreamSwitch streamSwitch; - streamSwitch.Set(this, &dataVector); - for (i = 0; i < numFiles; i++) - { - CFileItem &file = db.Files[i]; - file.AttribDefined = boolVector[i]; - if (file.AttribDefined) - file.Attrib = ReadUInt32(); - } - break; - } - case NID::kEmptyStream: - { - ReadBoolVector(numFiles, emptyStreamVector); - for (i = 0; i < (CNum)emptyStreamVector.Size(); i++) - if (emptyStreamVector[i]) - numEmptyStreams++; - - BoolVector_Fill_False(emptyFileVector, numEmptyStreams); - BoolVector_Fill_False(antiFileVector, numEmptyStreams); - - break; - } - case NID::kEmptyFile: ReadBoolVector(numEmptyStreams, emptyFileVector); break; - case NID::kAnti: ReadBoolVector(numEmptyStreams, antiFileVector); break; - case NID::kStartPos: ReadUInt64DefVector(dataVector, db.StartPos, (int)numFiles); break; - case NID::kCTime: ReadUInt64DefVector(dataVector, db.CTime, (int)numFiles); break; - case NID::kATime: ReadUInt64DefVector(dataVector, db.ATime, (int)numFiles); break; - case NID::kMTime: ReadUInt64DefVector(dataVector, db.MTime, (int)numFiles); break; - case NID::kDummy: - { - for (UInt64 j = 0; j < size; j++) - if (ReadByte() != 0) - ThrowIncorrect(); - addPropIdToList = false; - break; - } - default: - addPropIdToList = isKnownType = false; - } - if (isKnownType) - { - if(addPropIdToList) - db.ArchiveInfo.FileInfoPopIDs.Add(type); - } - else - SkeepData(size); - bool checkRecordsSize = (db.ArchiveInfo.Version.Major > 0 || - db.ArchiveInfo.Version.Minor > 2); - if (checkRecordsSize && _inByteBack->_pos - ppp != size) - ThrowIncorrect(); - } - - CNum emptyFileIndex = 0; - CNum sizeIndex = 0; - - CNum numAntiItems = 0; - for (i = 0; i < numEmptyStreams; i++) - if (antiFileVector[i]) - numAntiItems++; - - for (i = 0; i < numFiles; i++) - { - CFileItem &file = db.Files[i]; - bool isAnti; - file.HasStream = !emptyStreamVector[i]; - if (file.HasStream) - { - file.IsDir = false; - isAnti = false; - file.Size = unpackSizes[sizeIndex]; - file.Crc = digests[sizeIndex]; - file.CrcDefined = digestsDefined[sizeIndex]; - sizeIndex++; - } - else - { - file.IsDir = !emptyFileVector[emptyFileIndex]; - isAnti = antiFileVector[emptyFileIndex]; - emptyFileIndex++; - file.Size = 0; - file.CrcDefined = false; - } - if (numAntiItems != 0) - db.IsAnti.Add(isAnti); - } - return S_OK; -} - - -void CArchiveDatabaseEx::FillFolderStartPackStream() -{ - FolderStartPackStreamIndex.Clear(); - FolderStartPackStreamIndex.Reserve(Folders.Size()); - CNum startPos = 0; - for (int i = 0; i < Folders.Size(); i++) - { - FolderStartPackStreamIndex.Add(startPos); - startPos += (CNum)Folders[i].PackStreams.Size(); - } -} - -void CArchiveDatabaseEx::FillStartPos() -{ - PackStreamStartPositions.Clear(); - PackStreamStartPositions.Reserve(PackSizes.Size()); - UInt64 startPos = 0; - for (int i = 0; i < PackSizes.Size(); i++) - { - PackStreamStartPositions.Add(startPos); - startPos += PackSizes[i]; - } -} - -void CArchiveDatabaseEx::FillFolderStartFileIndex() -{ - FolderStartFileIndex.Clear(); - FolderStartFileIndex.Reserve(Folders.Size()); - FileIndexToFolderIndexMap.Clear(); - FileIndexToFolderIndexMap.Reserve(Files.Size()); - - int folderIndex = 0; - CNum indexInFolder = 0; - for (int i = 0; i < Files.Size(); i++) - { - const CFileItem &file = Files[i]; - bool emptyStream = !file.HasStream; - if (emptyStream && indexInFolder == 0) - { - FileIndexToFolderIndexMap.Add(kNumNoIndex); - continue; - } - if (indexInFolder == 0) - { - // v3.13 incorrectly worked with empty folders - // v4.07: Loop for skipping empty folders - for (;;) - { - if (folderIndex >= Folders.Size()) - ThrowIncorrect(); - FolderStartFileIndex.Add(i); // check it - if (NumUnpackStreamsVector[folderIndex] != 0) - break; - folderIndex++; - } - } - FileIndexToFolderIndexMap.Add(folderIndex); - if (emptyStream) - continue; - indexInFolder++; - if (indexInFolder >= NumUnpackStreamsVector[folderIndex]) - { - folderIndex++; - indexInFolder = 0; - } - } -} - -HRESULT CInArchive::ReadDatabase2( - DECL_EXTERNAL_CODECS_LOC_VARS - CArchiveDatabaseEx &db - #ifndef _NO_CRYPTO - , ICryptoGetTextPassword *getTextPassword, bool &passwordIsDefined - #endif - ) -{ - db.Clear(); - db.ArchiveInfo.StartPosition = _arhiveBeginStreamPosition; - - db.ArchiveInfo.Version.Major = _header[6]; - db.ArchiveInfo.Version.Minor = _header[7]; - - if (db.ArchiveInfo.Version.Major != kMajorVersion) - ThrowUnsupportedVersion(); - - UInt32 crcFromArchive = Get32(_header + 8); - UInt64 nextHeaderOffset = Get64(_header + 0xC); - UInt64 nextHeaderSize = Get64(_header + 0x14); - UInt32 nextHeaderCRC = Get32(_header + 0x1C); - UInt32 crc = CrcCalc(_header + 0xC, 20); - - #ifdef FORMAT_7Z_RECOVERY - if (crcFromArchive == 0 && nextHeaderOffset == 0 && nextHeaderSize == 0 && nextHeaderCRC == 0) - { - UInt64 cur, cur2; - RINOK(_stream->Seek(0, STREAM_SEEK_CUR, &cur)); - const int kCheckSize = 500; - Byte buf[kCheckSize]; - RINOK(_stream->Seek(0, STREAM_SEEK_END, &cur2)); - int checkSize = kCheckSize; - if (cur2 - cur < kCheckSize) - checkSize = (int)(cur2 - cur); - RINOK(_stream->Seek(-checkSize, STREAM_SEEK_END, &cur2)); - - RINOK(ReadStream_FALSE(_stream, buf, (size_t)checkSize)); - - int i; - for (i = (int)checkSize - 2; i >= 0; i--) - if (buf[i] == 0x17 && buf[i + 1] == 0x6 || buf[i] == 0x01 && buf[i + 1] == 0x04) - break; - if (i < 0) - return S_FALSE; - nextHeaderSize = checkSize - i; - nextHeaderOffset = cur2 - cur + i; - nextHeaderCRC = CrcCalc(buf + i, (size_t)nextHeaderSize); - RINOK(_stream->Seek(cur, STREAM_SEEK_SET, NULL)); - } - #endif - - #ifdef FORMAT_7Z_RECOVERY - crcFromArchive = crc; - #endif - - db.ArchiveInfo.StartPositionAfterHeader = _arhiveBeginStreamPosition + kHeaderSize; - - if (crc != crcFromArchive) - ThrowIncorrect(); - - if (nextHeaderSize == 0) - return S_OK; - - if (nextHeaderSize > (UInt64)0xFFFFFFFF) - return S_FALSE; - - RINOK(_stream->Seek(nextHeaderOffset, STREAM_SEEK_CUR, NULL)); - - CByteBuffer buffer2; - buffer2.SetCapacity((size_t)nextHeaderSize); - - RINOK(ReadStream_FALSE(_stream, buffer2, (size_t)nextHeaderSize)); - HeadersSize += kHeaderSize + nextHeaderSize; - db.PhySize = kHeaderSize + nextHeaderOffset + nextHeaderSize; - - if (CrcCalc(buffer2, (UInt32)nextHeaderSize) != nextHeaderCRC) - ThrowIncorrect(); - - CStreamSwitch streamSwitch; - streamSwitch.Set(this, buffer2); - - CObjectVector dataVector; - - UInt64 type = ReadID(); - if (type != NID::kHeader) - { - if (type != NID::kEncodedHeader) - ThrowIncorrect(); - HRESULT result = ReadAndDecodePackedStreams( - EXTERNAL_CODECS_LOC_VARS - db.ArchiveInfo.StartPositionAfterHeader, - db.ArchiveInfo.DataStartPosition2, - dataVector - #ifndef _NO_CRYPTO - , getTextPassword, passwordIsDefined - #endif - ); - RINOK(result); - if (dataVector.Size() == 0) - return S_OK; - if (dataVector.Size() > 1) - ThrowIncorrect(); - streamSwitch.Remove(); - streamSwitch.Set(this, dataVector.Front()); - if (ReadID() != NID::kHeader) - ThrowIncorrect(); - } - - db.HeadersSize = HeadersSize; - - return ReadHeader( - EXTERNAL_CODECS_LOC_VARS - db - #ifndef _NO_CRYPTO - , getTextPassword, passwordIsDefined - #endif - ); -} - -HRESULT CInArchive::ReadDatabase( - DECL_EXTERNAL_CODECS_LOC_VARS - CArchiveDatabaseEx &db - #ifndef _NO_CRYPTO - , ICryptoGetTextPassword *getTextPassword, bool &passwordIsDefined - #endif - ) -{ - try - { - return ReadDatabase2( - EXTERNAL_CODECS_LOC_VARS db - #ifndef _NO_CRYPTO - , getTextPassword, passwordIsDefined - #endif - ); - } - catch(CInArchiveException &) { return S_FALSE; } -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zIn.h b/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zIn.h deleted file mode 100644 index bfec78564..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zIn.h +++ /dev/null @@ -1,245 +0,0 @@ -// 7zIn.h - -#ifndef __7Z_IN_H -#define __7Z_IN_H - -#include "../../../Common/MyCom.h" - -#include "../../IPassword.h" -#include "../../IStream.h" - -#include "../../Common/CreateCoder.h" -#include "../../Common/InBuffer.h" - -#include "7zItem.h" - -namespace NArchive { -namespace N7z { - -struct CInArchiveInfo -{ - CArchiveVersion Version; - UInt64 StartPosition; - UInt64 StartPositionAfterHeader; - UInt64 DataStartPosition; - UInt64 DataStartPosition2; - CRecordVector FileInfoPopIDs; - void Clear() - { - FileInfoPopIDs.Clear(); - } -}; - -struct CArchiveDatabaseEx: public CArchiveDatabase -{ - CInArchiveInfo ArchiveInfo; - CRecordVector PackStreamStartPositions; - CRecordVector FolderStartPackStreamIndex; - CRecordVector FolderStartFileIndex; - CRecordVector FileIndexToFolderIndexMap; - - UInt64 HeadersSize; - UInt64 PhySize; - - void Clear() - { - CArchiveDatabase::Clear(); - ArchiveInfo.Clear(); - PackStreamStartPositions.Clear(); - FolderStartPackStreamIndex.Clear(); - FolderStartFileIndex.Clear(); - FileIndexToFolderIndexMap.Clear(); - - HeadersSize = 0; - PhySize = 0; - } - - void FillFolderStartPackStream(); - void FillStartPos(); - void FillFolderStartFileIndex(); - - void Fill() - { - FillFolderStartPackStream(); - FillStartPos(); - FillFolderStartFileIndex(); - } - - UInt64 GetFolderStreamPos(int folderIndex, int indexInFolder) const - { - return ArchiveInfo.DataStartPosition + - PackStreamStartPositions[FolderStartPackStreamIndex[folderIndex] + indexInFolder]; - } - - UInt64 GetFolderFullPackSize(int folderIndex) const - { - CNum packStreamIndex = FolderStartPackStreamIndex[folderIndex]; - const CFolder &folder = Folders[folderIndex]; - UInt64 size = 0; - for (int i = 0; i < folder.PackStreams.Size(); i++) - size += PackSizes[packStreamIndex + i]; - return size; - } - - UInt64 GetFolderPackStreamSize(int folderIndex, int streamIndex) const - { - return PackSizes[FolderStartPackStreamIndex[folderIndex] + streamIndex]; - } - - UInt64 GetFilePackSize(CNum fileIndex) const - { - CNum folderIndex = FileIndexToFolderIndexMap[fileIndex]; - if (folderIndex != kNumNoIndex) - if (FolderStartFileIndex[folderIndex] == fileIndex) - return GetFolderFullPackSize(folderIndex); - return 0; - } -}; - -class CInByte2 -{ - const Byte *_buffer; - size_t _size; -public: - size_t _pos; - void Init(const Byte *buffer, size_t size) - { - _buffer = buffer; - _size = size; - _pos = 0; - } - Byte ReadByte(); - void ReadBytes(Byte *data, size_t size); - void SkeepData(UInt64 size); - void SkeepData(); - UInt64 ReadNumber(); - CNum ReadNum(); - UInt32 ReadUInt32(); - UInt64 ReadUInt64(); - void ReadString(UString &s); -}; - -class CStreamSwitch; - -const UInt32 kHeaderSize = 32; - -class CInArchive -{ - friend class CStreamSwitch; - - CMyComPtr _stream; - - CObjectVector _inByteVector; - CInByte2 *_inByteBack; - - UInt64 _arhiveBeginStreamPosition; - - Byte _header[kHeaderSize]; - - UInt64 HeadersSize; - - void AddByteStream(const Byte *buffer, size_t size) - { - _inByteVector.Add(CInByte2()); - _inByteBack = &_inByteVector.Back(); - _inByteBack->Init(buffer, size); - } - - void DeleteByteStream() - { - _inByteVector.DeleteBack(); - if (!_inByteVector.IsEmpty()) - _inByteBack = &_inByteVector.Back(); - } - -private: - HRESULT FindAndReadSignature(IInStream *stream, const UInt64 *searchHeaderSizeLimit); - - void ReadBytes(Byte *data, size_t size) { _inByteBack->ReadBytes(data, size); } - Byte ReadByte() { return _inByteBack->ReadByte(); } - UInt64 ReadNumber() { return _inByteBack->ReadNumber(); } - CNum ReadNum() { return _inByteBack->ReadNum(); } - UInt64 ReadID() { return _inByteBack->ReadNumber(); } - UInt32 ReadUInt32() { return _inByteBack->ReadUInt32(); } - UInt64 ReadUInt64() { return _inByteBack->ReadUInt64(); } - void SkeepData(UInt64 size) { _inByteBack->SkeepData(size); } - void SkeepData() { _inByteBack->SkeepData(); } - void WaitAttribute(UInt64 attribute); - - void ReadArchiveProperties(CInArchiveInfo &archiveInfo); - void GetNextFolderItem(CFolder &itemInfo); - void ReadHashDigests(int numItems, - CBoolVector &digestsDefined, CRecordVector &digests); - - void ReadPackInfo( - UInt64 &dataOffset, - CRecordVector &packSizes, - CBoolVector &packCRCsDefined, - CRecordVector &packCRCs); - - void ReadUnpackInfo( - const CObjectVector *dataVector, - CObjectVector &folders); - - void ReadSubStreamsInfo( - const CObjectVector &folders, - CRecordVector &numUnpackStreamsInFolders, - CRecordVector &unpackSizes, - CBoolVector &digestsDefined, - CRecordVector &digests); - - void ReadStreamsInfo( - const CObjectVector *dataVector, - UInt64 &dataOffset, - CRecordVector &packSizes, - CBoolVector &packCRCsDefined, - CRecordVector &packCRCs, - CObjectVector &folders, - CRecordVector &numUnpackStreamsInFolders, - CRecordVector &unpackSizes, - CBoolVector &digestsDefined, - CRecordVector &digests); - - - void ReadBoolVector(int numItems, CBoolVector &v); - void ReadBoolVector2(int numItems, CBoolVector &v); - void ReadUInt64DefVector(const CObjectVector &dataVector, - CUInt64DefVector &v, int numFiles); - HRESULT ReadAndDecodePackedStreams( - DECL_EXTERNAL_CODECS_LOC_VARS - UInt64 baseOffset, UInt64 &dataOffset, - CObjectVector &dataVector - #ifndef _NO_CRYPTO - , ICryptoGetTextPassword *getTextPassword, bool &passwordIsDefined - #endif - ); - HRESULT ReadHeader( - DECL_EXTERNAL_CODECS_LOC_VARS - CArchiveDatabaseEx &db - #ifndef _NO_CRYPTO - ,ICryptoGetTextPassword *getTextPassword, bool &passwordIsDefined - #endif - ); - HRESULT ReadDatabase2( - DECL_EXTERNAL_CODECS_LOC_VARS - CArchiveDatabaseEx &db - #ifndef _NO_CRYPTO - ,ICryptoGetTextPassword *getTextPassword, bool &passwordIsDefined - #endif - ); -public: - HRESULT Open(IInStream *stream, const UInt64 *searchHeaderSizeLimit); // S_FALSE means is not archive - void Close(); - - HRESULT ReadDatabase( - DECL_EXTERNAL_CODECS_LOC_VARS - CArchiveDatabaseEx &db - #ifndef _NO_CRYPTO - ,ICryptoGetTextPassword *getTextPassword, bool &passwordIsDefined - #endif - ); -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zItem.h b/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zItem.h deleted file mode 100644 index 6cc9ccc55..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zItem.h +++ /dev/null @@ -1,258 +0,0 @@ -// 7zItem.h - -#ifndef __7Z_ITEM_H -#define __7Z_ITEM_H - -#include "../../../Common/Buffer.h" -#include "../../../Common/MyString.h" - -#include "../../Common/MethodId.h" - -#include "7zHeader.h" - -namespace NArchive { -namespace N7z { - -typedef UInt32 CNum; -const CNum kNumMax = 0x7FFFFFFF; -const CNum kNumNoIndex = 0xFFFFFFFF; - -struct CCoderInfo -{ - CMethodId MethodID; - CByteBuffer Props; - CNum NumInStreams; - CNum NumOutStreams; - bool IsSimpleCoder() const { return (NumInStreams == 1) && (NumOutStreams == 1); } -}; - -struct CBindPair -{ - CNum InIndex; - CNum OutIndex; -}; - -struct CFolder -{ - CObjectVector Coders; - CRecordVector BindPairs; - CRecordVector PackStreams; - CRecordVector UnpackSizes; - UInt32 UnpackCRC; - bool UnpackCRCDefined; - - CFolder(): UnpackCRCDefined(false) {} - - UInt64 GetUnpackSize() const // test it - { - if (UnpackSizes.IsEmpty()) - return 0; - for (int i = UnpackSizes.Size() - 1; i >= 0; i--) - if (FindBindPairForOutStream(i) < 0) - return UnpackSizes[i]; - throw 1; - } - - CNum GetNumOutStreams() const - { - CNum result = 0; - for (int i = 0; i < Coders.Size(); i++) - result += Coders[i].NumOutStreams; - return result; - } - - int FindBindPairForInStream(CNum inStreamIndex) const - { - for(int i = 0; i < BindPairs.Size(); i++) - if (BindPairs[i].InIndex == inStreamIndex) - return i; - return -1; - } - int FindBindPairForOutStream(CNum outStreamIndex) const - { - for(int i = 0; i < BindPairs.Size(); i++) - if (BindPairs[i].OutIndex == outStreamIndex) - return i; - return -1; - } - int FindPackStreamArrayIndex(CNum inStreamIndex) const - { - for(int i = 0; i < PackStreams.Size(); i++) - if (PackStreams[i] == inStreamIndex) - return i; - return -1; - } - - bool CheckStructure() const; -}; - -struct CUInt64DefVector -{ - CRecordVector Values; - CRecordVector Defined; - - void Clear() - { - Values.Clear(); - Defined.Clear(); - } - - void ReserveDown() - { - Values.ReserveDown(); - Values.ReserveDown(); - } - - bool GetItem(int index, UInt64 &value) const - { - if (index < Defined.Size() && Defined[index]) - { - value = Values[index]; - return true; - } - value = 0; - return false; - } - - void SetItem(int index, bool defined, UInt64 value) - { - while (index >= Defined.Size()) - Defined.Add(false); - Defined[index] = defined; - if (!defined) - return; - while (index >= Values.Size()) - Values.Add(0); - Values[index] = value; - } - - bool CheckSize(int size) const { return Defined.Size() == size || Defined.Size() == 0; } -}; - -struct CFileItem -{ - UInt64 Size; - UInt32 Attrib; - UInt32 Crc; - UString Name; - - bool HasStream; // Test it !!! it means that there is - // stream in some folder. It can be empty stream - bool IsDir; - bool CrcDefined; - bool AttribDefined; - - CFileItem(): - HasStream(true), - IsDir(false), - CrcDefined(false), - AttribDefined(false) - {} - void SetAttrib(UInt32 attrib) - { - AttribDefined = true; - Attrib = attrib; - } -}; - -struct CFileItem2 -{ - UInt64 CTime; - UInt64 ATime; - UInt64 MTime; - UInt64 StartPos; - bool CTimeDefined; - bool ATimeDefined; - bool MTimeDefined; - bool StartPosDefined; - bool IsAnti; -}; - -struct CArchiveDatabase -{ - CRecordVector PackSizes; - CRecordVector PackCRCsDefined; - CRecordVector PackCRCs; - CObjectVector Folders; - CRecordVector NumUnpackStreamsVector; - CObjectVector Files; - - CUInt64DefVector CTime; - CUInt64DefVector ATime; - CUInt64DefVector MTime; - CUInt64DefVector StartPos; - CRecordVector IsAnti; - - void Clear() - { - PackSizes.Clear(); - PackCRCsDefined.Clear(); - PackCRCs.Clear(); - Folders.Clear(); - NumUnpackStreamsVector.Clear(); - Files.Clear(); - CTime.Clear(); - ATime.Clear(); - MTime.Clear(); - StartPos.Clear(); - IsAnti.Clear(); - } - - void ReserveDown() - { - PackSizes.ReserveDown(); - PackCRCsDefined.ReserveDown(); - PackCRCs.ReserveDown(); - Folders.ReserveDown(); - NumUnpackStreamsVector.ReserveDown(); - Files.ReserveDown(); - CTime.ReserveDown(); - ATime.ReserveDown(); - MTime.ReserveDown(); - StartPos.ReserveDown(); - IsAnti.ReserveDown(); - } - - bool IsEmpty() const - { - return (PackSizes.IsEmpty() && - PackCRCsDefined.IsEmpty() && - PackCRCs.IsEmpty() && - Folders.IsEmpty() && - NumUnpackStreamsVector.IsEmpty() && - Files.IsEmpty()); - } - - bool CheckNumFiles() const - { - int size = Files.Size(); - return ( - CTime.CheckSize(size) && - ATime.CheckSize(size) && - MTime.CheckSize(size) && - StartPos.CheckSize(size) && - (size == IsAnti.Size() || IsAnti.Size() == 0)); - } - - bool IsSolid() const - { - for (int i = 0; i < NumUnpackStreamsVector.Size(); i++) - if (NumUnpackStreamsVector[i] > 1) - return true; - return false; - } - bool IsItemAnti(int index) const { return (index < IsAnti.Size() && IsAnti[index]); } - void SetItemAnti(int index, bool isAnti) - { - while (index >= IsAnti.Size()) - IsAnti.Add(false); - IsAnti[index] = isAnti; - } - - void GetFile(int index, CFileItem &file, CFileItem2 &file2) const; - void AddFile(const CFileItem &file, const CFileItem2 &file2); -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zProperties.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zProperties.cpp deleted file mode 100644 index f5ac3b9bf..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zProperties.cpp +++ /dev/null @@ -1,163 +0,0 @@ -// 7zProperties.cpp - -#include "StdAfx.h" - -#include "7zProperties.h" -#include "7zHeader.h" -#include "7zHandler.h" - -// #define _MULTI_PACK - -namespace NArchive { -namespace N7z { - -struct CPropMap -{ - UInt64 FilePropID; - STATPROPSTG StatPROPSTG; -}; - -CPropMap kPropMap[] = -{ - { NID::kName, NULL, kpidPath, VT_BSTR}, - { NID::kSize, NULL, kpidSize, VT_UI8}, - { NID::kPackInfo, NULL, kpidPackSize, VT_UI8}, - - #ifdef _MULTI_PACK - { 100, L"Pack0", kpidPackedSize0, VT_UI8}, - { 101, L"Pack1", kpidPackedSize1, VT_UI8}, - { 102, L"Pack2", kpidPackedSize2, VT_UI8}, - { 103, L"Pack3", kpidPackedSize3, VT_UI8}, - { 104, L"Pack4", kpidPackedSize4, VT_UI8}, - #endif - - { NID::kCTime, NULL, kpidCTime, VT_FILETIME}, - { NID::kMTime, NULL, kpidMTime, VT_FILETIME}, - { NID::kATime, NULL, kpidATime, VT_FILETIME}, - { NID::kWinAttributes, NULL, kpidAttrib, VT_UI4}, - { NID::kStartPos, NULL, kpidPosition, VT_UI4}, - - { NID::kCRC, NULL, kpidCRC, VT_UI4}, - - { NID::kAnti, NULL, kpidIsAnti, VT_BOOL}, - - #ifndef _SFX - { 97, NULL, kpidEncrypted, VT_BOOL}, - { 98, NULL, kpidMethod, VT_BSTR}, - { 99, NULL, kpidBlock, VT_UI4} - #endif -}; - -static const int kPropMapSize = sizeof(kPropMap) / sizeof(kPropMap[0]); - -static int FindPropInMap(UInt64 filePropID) -{ - for (int i = 0; i < kPropMapSize; i++) - if (kPropMap[i].FilePropID == filePropID) - return i; - return -1; -} - -static void CopyOneItem(CRecordVector &src, - CRecordVector &dest, UInt32 item) -{ - for (int i = 0; i < src.Size(); i++) - if (src[i] == item) - { - dest.Add(item); - src.Delete(i); - return; - } -} - -static void RemoveOneItem(CRecordVector &src, UInt32 item) -{ - for (int i = 0; i < src.Size(); i++) - if (src[i] == item) - { - src.Delete(i); - return; - } -} - -static void InsertToHead(CRecordVector &dest, UInt32 item) -{ - for (int i = 0; i < dest.Size(); i++) - if (dest[i] == item) - { - dest.Delete(i); - break; - } - dest.Insert(0, item); -} - -void CHandler::FillPopIDs() -{ - _fileInfoPopIDs.Clear(); - - #ifdef _7Z_VOL - if(_volumes.Size() < 1) - return; - const CVolume &volume = _volumes.Front(); - const CArchiveDatabaseEx &_db = volume.Database; - #endif - - CRecordVector fileInfoPopIDs = _db.ArchiveInfo.FileInfoPopIDs; - - RemoveOneItem(fileInfoPopIDs, NID::kEmptyStream); - RemoveOneItem(fileInfoPopIDs, NID::kEmptyFile); - - CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kName); - CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kAnti); - CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kSize); - CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kPackInfo); - CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kCTime); - CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kMTime); - CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kATime); - CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kWinAttributes); - CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kCRC); - CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kComment); - _fileInfoPopIDs += fileInfoPopIDs; - - #ifndef _SFX - _fileInfoPopIDs.Add(97); - _fileInfoPopIDs.Add(98); - _fileInfoPopIDs.Add(99); - #endif - #ifdef _MULTI_PACK - _fileInfoPopIDs.Add(100); - _fileInfoPopIDs.Add(101); - _fileInfoPopIDs.Add(102); - _fileInfoPopIDs.Add(103); - _fileInfoPopIDs.Add(104); - #endif - - #ifndef _SFX - InsertToHead(_fileInfoPopIDs, NID::kMTime); - InsertToHead(_fileInfoPopIDs, NID::kPackInfo); - InsertToHead(_fileInfoPopIDs, NID::kSize); - InsertToHead(_fileInfoPopIDs, NID::kName); - #endif -} - -STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 *numProperties) -{ - *numProperties = _fileInfoPopIDs.Size(); - return S_OK; -} - -STDMETHODIMP CHandler::GetPropertyInfo(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) -{ - if ((int)index >= _fileInfoPopIDs.Size()) - return E_INVALIDARG; - int indexInMap = FindPropInMap(_fileInfoPopIDs[index]); - if (indexInMap == -1) - return E_INVALIDARG; - const STATPROPSTG &srcItem = kPropMap[indexInMap].StatPROPSTG; - *propID = srcItem.propid; - *varType = srcItem.vt; - *name = 0; - return S_OK; -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zProperties.h b/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zProperties.h deleted file mode 100644 index 7b78130ef..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zProperties.h +++ /dev/null @@ -1,22 +0,0 @@ -// 7zProperties.h - -#ifndef __7Z_PROPERTIES_H -#define __7Z_PROPERTIES_H - -#include "../../PropID.h" - -namespace NArchive { -namespace N7z { - -enum -{ - kpidPackedSize0 = kpidUserDefined, - kpidPackedSize1, - kpidPackedSize2, - kpidPackedSize3, - kpidPackedSize4 -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zRegister.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zRegister.cpp deleted file mode 100644 index 4450498f0..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zRegister.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// 7zRegister.cpp - -#include "StdAfx.h" - -#include "../../Common/RegisterArc.h" - -#include "7zHandler.h" -static IInArchive *CreateArc() { return new NArchive::N7z::CHandler; } -#ifndef EXTRACT_ONLY -static IOutArchive *CreateArcOut() { return new NArchive::N7z::CHandler; } -#else -#define CreateArcOut 0 -#endif - -static CArcInfo g_ArcInfo = - { L"7z", L"7z", 0, 7, {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C}, 6, false, CreateArc, CreateArcOut }; - -REGISTER_ARC(7z) diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zSpecStream.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zSpecStream.cpp deleted file mode 100644 index 58f2ec459..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zSpecStream.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// 7zSpecStream.cpp - -#include "StdAfx.h" - -#include "7zSpecStream.h" - -STDMETHODIMP CSequentialInStreamSizeCount2::Read(void *data, UInt32 size, UInt32 *processedSize) -{ - UInt32 realProcessedSize; - HRESULT result = _stream->Read(data, size, &realProcessedSize); - _size += realProcessedSize; - if (processedSize != 0) - *processedSize = realProcessedSize; - return result; -} - -STDMETHODIMP CSequentialInStreamSizeCount2::GetSubStreamSize( - UInt64 subStream, UInt64 *value) -{ - if (_getSubStreamSize == NULL) - return E_NOTIMPL; - return _getSubStreamSize->GetSubStreamSize(subStream, value); -} - diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zSpecStream.h b/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zSpecStream.h deleted file mode 100644 index 0058ac27c..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/7z/7zSpecStream.h +++ /dev/null @@ -1,35 +0,0 @@ -// 7zSpecStream.h - -#ifndef __7Z_SPEC_STREAM_H -#define __7Z_SPEC_STREAM_H - -#include "../../IStream.h" -#include "../../ICoder.h" -#include "../../../Common/MyCom.h" - -class CSequentialInStreamSizeCount2: - public ISequentialInStream, - public ICompressGetSubStreamSize, - public CMyUnknownImp -{ - CMyComPtr _stream; - CMyComPtr _getSubStreamSize; - UInt64 _size; -public: - void Init(ISequentialInStream *stream) - { - _stream = stream; - _getSubStreamSize = 0; - _stream.QueryInterface(IID_ICompressGetSubStreamSize, &_getSubStreamSize); - _size = 0; - } - UInt64 GetSize() const { return _size; } - - MY_UNKNOWN_IMP1(ICompressGetSubStreamSize) - - STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); - - STDMETHOD(GetSubStreamSize)(UInt64 subStream, UInt64 *value); -}; - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/7z/StdAfx.h b/desmume/src/windows/7z/CPP/7zip/Archive/7z/StdAfx.h deleted file mode 100644 index a4e617312..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/7z/StdAfx.h +++ /dev/null @@ -1,9 +0,0 @@ -// StdAfx.h - -#ifndef __STDAFX_H -#define __STDAFX_H - -#include "../../../Common/MyWindows.h" -#include "../../../Common/NewHandler.h" - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/ArchiveExports.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/ArchiveExports.cpp deleted file mode 100644 index 054f1b081..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/ArchiveExports.cpp +++ /dev/null @@ -1,130 +0,0 @@ -// ArchiveExports.cpp - -#include "StdAfx.h" - -#include "../../Common/ComTry.h" -#include "../../Common/Types.h" -#include "../../Windows/PropVariant.h" -#include "../Common/RegisterArc.h" - -#include "IArchive.h" -#include "../ICoder.h" -#include "../IPassword.h" - -static const unsigned int kNumArcsMax = 32; -static unsigned int g_NumArcs = 0; -static const CArcInfo *g_Arcs[kNumArcsMax]; -void RegisterArc(const CArcInfo *arcInfo) -{ - if (g_NumArcs < kNumArcsMax) - g_Arcs[g_NumArcs++] = arcInfo; -} - -DEFINE_GUID(CLSID_CArchiveHandler, -0x23170F69, 0x40C1, 0x278A, 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00); - -#define CLS_ARC_ID_ITEM(cls) ((cls).Data4[5]) - -static inline HRESULT SetPropString(const char *s, unsigned int size, PROPVARIANT *value) -{ - if ((value->bstrVal = ::SysAllocStringByteLen(s, size)) != 0) - value->vt = VT_BSTR; - return S_OK; -} - -static inline HRESULT SetPropGUID(const GUID &guid, PROPVARIANT *value) -{ - return SetPropString((const char *)&guid, sizeof(GUID), value); -} - -int FindFormatCalssId(const GUID *clsID) -{ - GUID cls = *clsID; - CLS_ARC_ID_ITEM(cls) = 0; - if (cls != CLSID_CArchiveHandler) - return -1; - Byte id = CLS_ARC_ID_ITEM(*clsID); - for (unsigned i = 0; i < g_NumArcs; i++) - if (g_Arcs[i]->ClassId == id) - return (int)i; - return -1; -} - -STDAPI CreateArchiver(const GUID *clsid, const GUID *iid, void **outObject) -{ - COM_TRY_BEGIN - { - int needIn = (*iid == IID_IInArchive); - int needOut = (*iid == IID_IOutArchive); - if (!needIn && !needOut) - return E_NOINTERFACE; - int formatIndex = FindFormatCalssId(clsid); - if (formatIndex < 0) - return CLASS_E_CLASSNOTAVAILABLE; - - const CArcInfo &arc = *g_Arcs[formatIndex]; - if (needIn) - { - *outObject = arc.CreateInArchive(); - ((IInArchive *)*outObject)->AddRef(); - } - else - { - if (!arc.CreateOutArchive) - return CLASS_E_CLASSNOTAVAILABLE; - *outObject = arc.CreateOutArchive(); - ((IOutArchive *)*outObject)->AddRef(); - } - } - COM_TRY_END - return S_OK; -} - -STDAPI GetHandlerProperty2(UInt32 formatIndex, PROPID propID, PROPVARIANT *value) -{ - if (formatIndex >= g_NumArcs) - return E_INVALIDARG; - const CArcInfo &arc = *g_Arcs[formatIndex]; - NWindows::NCOM::CPropVariant prop; - switch(propID) - { - case NArchive::kName: - prop = arc.Name; - break; - case NArchive::kClassID: - { - GUID clsId = CLSID_CArchiveHandler; - CLS_ARC_ID_ITEM(clsId) = arc.ClassId; - return SetPropGUID(clsId, value); - } - case NArchive::kExtension: - if (arc.Ext != 0) - prop = arc.Ext; - break; - case NArchive::kAddExtension: - if (arc.AddExt != 0) - prop = arc.AddExt; - break; - case NArchive::kUpdate: - prop = (bool)(arc.CreateOutArchive != 0); - break; - case NArchive::kKeepName: - prop = arc.KeepName; - break; - case NArchive::kStartSignature: - return SetPropString((const char *)arc.Signature, arc.SignatureSize, value); - } - prop.Detach(value); - return S_OK; -} - -STDAPI GetHandlerProperty(PROPID propID, PROPVARIANT *value) -{ - return GetHandlerProperty2(0, propID, value); -} - -STDAPI GetNumberOfFormats(UINT32 *numFormats) -{ - *numFormats = g_NumArcs; - return S_OK; -} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/BZip2/BZip2Handler.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/BZip2/BZip2Handler.cpp deleted file mode 100644 index a797b6ddd..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/BZip2/BZip2Handler.cpp +++ /dev/null @@ -1,216 +0,0 @@ -// BZip2Handler.cpp - -#include "StdAfx.h" - -#include "Common/ComTry.h" - -#include "Windows/PropVariant.h" - -#include "../../Common/CreateCoder.h" -#include "../../Common/ProgressUtils.h" -#include "../../Common/StreamUtils.h" - -#include "../Common/DummyOutStream.h" - -#include "BZip2Handler.h" - -using namespace NWindows; - -namespace NArchive { -namespace NBZip2 { - -static const CMethodId kMethodId_BZip2 = 0x040202; - -STATPROPSTG kProps[] = -{ - { NULL, kpidPackSize, VT_UI8} -}; - -IMP_IInArchive_Props -IMP_IInArchive_ArcProps_NO - -STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems) -{ - *numItems = 1; - return S_OK; -} - -STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIANT *value) -{ - NWindows::NCOM::CPropVariant prop; - switch(propID) - { - case kpidPackSize: prop = _item.PackSize; break; - } - prop.Detach(value); - return S_OK; -} - -STDMETHODIMP CHandler::Open(IInStream *stream, - const UInt64 * /* maxCheckStartPosition */, - IArchiveOpenCallback * /* openArchiveCallback */) -{ - COM_TRY_BEGIN - try - { - RINOK(stream->Seek(0, STREAM_SEEK_CUR, &_streamStartPosition)); - const int kSignatureSize = 3; - Byte buffer[kSignatureSize]; - RINOK(ReadStream_FALSE(stream, buffer, kSignatureSize)); - if (buffer[0] != 'B' || buffer[1] != 'Z' || buffer[2] != 'h') - return S_FALSE; - - UInt64 endPosition; - RINOK(stream->Seek(0, STREAM_SEEK_END, &endPosition)); - _item.PackSize = endPosition - _streamStartPosition; - - _stream = stream; - } - catch(...) - { - return S_FALSE; - } - return S_OK; - COM_TRY_END -} - -STDMETHODIMP CHandler::Close() -{ - _stream.Release(); - return S_OK; -} - - -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 testModeSpec, IArchiveExtractCallback *extractCallback) -{ - COM_TRY_BEGIN - bool allFilesMode = (numItems == UInt32(-1)); - if (!allFilesMode) - { - if (numItems == 0) - return S_OK; - if (numItems != 1) - return E_INVALIDARG; - if (indices[0] != 0) - return E_INVALIDARG; - } - - bool testMode = (testModeSpec != 0); - - extractCallback->SetTotal(_item.PackSize); - - UInt64 currentTotalPacked = 0; - - RINOK(extractCallback->SetCompleted(¤tTotalPacked)); - - CMyComPtr realOutStream; - Int32 askMode; - askMode = testMode ? NExtract::NAskMode::kTest : - NExtract::NAskMode::kExtract; - - RINOK(extractCallback->GetStream(0, &realOutStream, askMode)); - - if(!testMode && !realOutStream) - return S_OK; - - - extractCallback->PrepareOperation(askMode); - - CMyComPtr decoder; - HRESULT loadResult = CreateCoder( - EXTERNAL_CODECS_VARS - kMethodId_BZip2, decoder, false); - if (loadResult != S_OK || !decoder) - { - RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod)); - return S_OK; - } - - #ifdef COMPRESS_MT - { - CMyComPtr setCoderMt; - decoder.QueryInterface(IID_ICompressSetCoderMt, &setCoderMt); - if (setCoderMt) - { - RINOK(setCoderMt->SetNumberOfThreads(_numThreads)); - } - } - #endif - - CDummyOutStream *outStreamSpec = new CDummyOutStream; - CMyComPtr outStream(outStreamSpec); - outStreamSpec->SetStream(realOutStream); - outStreamSpec->Init(); - - realOutStream.Release(); - - CLocalProgress *lps = new CLocalProgress; - CMyComPtr progress = lps; - lps->Init(extractCallback, true); - - RINOK(_stream->Seek(_streamStartPosition, STREAM_SEEK_SET, NULL)); - - HRESULT result = S_OK; - - bool firstItem = true; - for (;;) - { - lps->InSize = currentTotalPacked; - lps->OutSize = outStreamSpec->GetSize(); - - RINOK(lps->SetCur()); - - const int kSignatureSize = 3; - Byte buffer[kSignatureSize]; - size_t processedSize = kSignatureSize; - RINOK(ReadStream(_stream, buffer, &processedSize)); - if (processedSize != kSignatureSize) - { - if (firstItem) - return E_FAIL; - break; - } - if (buffer[0] != 'B' || buffer[1] != 'Z' || buffer[2] != 'h') - { - if (firstItem) - return E_FAIL; - break; - } - firstItem = false; - - UInt64 dataStartPos; - RINOK(_stream->Seek((UInt64)(Int64)(-3), STREAM_SEEK_CUR, &dataStartPos)); - - result = decoder->Code(_stream, outStream, NULL, NULL, progress); - - if (result != S_OK) - break; - - CMyComPtr getInStreamProcessedSize; - decoder.QueryInterface(IID_ICompressGetInStreamProcessedSize, &getInStreamProcessedSize); - if (!getInStreamProcessedSize) - break; - UInt64 packSize; - RINOK(getInStreamProcessedSize->GetInStreamProcessedSize(&packSize)); - UInt64 pos; - RINOK(_stream->Seek(dataStartPos + packSize, STREAM_SEEK_SET, &pos)); - currentTotalPacked = pos - _streamStartPosition; - } - outStream.Release(); - - Int32 retResult; - if (result == S_OK) - retResult = NExtract::NOperationResult::kOK; - else if (result == S_FALSE) - retResult = NExtract::NOperationResult::kDataError; - else - return result; - return extractCallback->SetOperationResult(retResult); - - COM_TRY_END -} - -IMPL_ISetCompressCodecsInfo - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/BZip2/BZip2Handler.h b/desmume/src/windows/7z/CPP/7zip/Archive/BZip2/BZip2Handler.h deleted file mode 100644 index 5d9fb1430..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/BZip2/BZip2Handler.h +++ /dev/null @@ -1,70 +0,0 @@ -// BZip2/Handler.h - -#ifndef __BZIP2_HANDLER_H -#define __BZIP2_HANDLER_H - -#include "Common/MyCom.h" -#include "../IArchive.h" -#include "../../Common/CreateCoder.h" -#include "BZip2Item.h" - -#ifdef COMPRESS_MT -#include "../../../Windows/System.h" -#endif - -namespace NArchive { -namespace NBZip2 { - -class CHandler: - public IInArchive, - public IOutArchive, - public ISetProperties, - PUBLIC_ISetCompressCodecsInfo - public CMyUnknownImp -{ - CMyComPtr _stream; - NArchive::NBZip2::CItem _item; - UInt64 _streamStartPosition; - - UInt32 _level; - UInt32 _dicSize; - UInt32 _numPasses; - #ifdef COMPRESS_MT - UInt32 _numThreads; - #endif - - DECL_EXTERNAL_CODECS_VARS - - void InitMethodProperties() - { - _level = 5; - _dicSize = - _numPasses = 0xFFFFFFFF; - #ifdef COMPRESS_MT - _numThreads = NWindows::NSystem::GetNumberOfProcessors();; - #endif - } - -public: - MY_QUERYINTERFACE_BEGIN2(IInArchive) - MY_QUERYINTERFACE_ENTRY(IOutArchive) - MY_QUERYINTERFACE_ENTRY(ISetProperties) - QUERY_ENTRY_ISetCompressCodecsInfo - MY_QUERYINTERFACE_END - MY_ADDREF_RELEASE - - INTERFACE_IInArchive(;) -#ifndef EXTRACT_ONLY - INTERFACE_IOutArchive(;) - - STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties); -#endif - - DECL_ISetCompressCodecsInfo - - CHandler() { InitMethodProperties(); } -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/BZip2/BZip2Item.h b/desmume/src/windows/7z/CPP/7zip/Archive/BZip2/BZip2Item.h deleted file mode 100644 index f3fce499a..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/BZip2/BZip2Item.h +++ /dev/null @@ -1,20 +0,0 @@ -// Archive/BZip2Item.h - -#ifndef __ARCHIVE_BZIP2_ITEM_H -#define __ARCHIVE_BZIP2_ITEM_H - -namespace NArchive { -namespace NBZip2 { - -struct CItem -{ - UInt64 PackSize; - UInt64 UnPackSize; -}; - -}} - -#endif - - - diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/BZip2/StdAfx.h b/desmume/src/windows/7z/CPP/7zip/Archive/BZip2/StdAfx.h deleted file mode 100644 index 83fdd22d5..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/BZip2/StdAfx.h +++ /dev/null @@ -1,8 +0,0 @@ -// StdAfx.h - -#ifndef __STDAFX_H -#define __STDAFX_H - -#include "../../../Common/MyWindows.h" - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/BZip2/bz2Register.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/BZip2/bz2Register.cpp deleted file mode 100644 index f4a706ed1..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/BZip2/bz2Register.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// BZip2Register.cpp - -#include "StdAfx.h" - -#include "../../Common/RegisterArc.h" - -#include "BZip2Handler.h" -static IInArchive *CreateArc() { return new NArchive::NBZip2::CHandler; } -#ifndef EXTRACT_ONLY -static IOutArchive *CreateArcOut() { return new NArchive::NBZip2::CHandler; } -#else -#define CreateArcOut 0 -#endif - -static CArcInfo g_ArcInfo = - { L"BZip2", L"bz2 bzip2 tbz2 tbz", L"* * .tar .tar", 2, { 'B', 'Z', 'h' }, 3, true, CreateArc, CreateArcOut }; - -REGISTER_ARC(BZip2) diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Common/CoderMixer2.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Common/CoderMixer2.cpp deleted file mode 100644 index c4333f234..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Common/CoderMixer2.cpp +++ /dev/null @@ -1,121 +0,0 @@ -// CoderMixer2.cpp - -#include "StdAfx.h" - -#include "CoderMixer2.h" - -namespace NCoderMixer { - -CBindReverseConverter::CBindReverseConverter(const CBindInfo &srcBindInfo): - _srcBindInfo(srcBindInfo) -{ - srcBindInfo.GetNumStreams(NumSrcInStreams, _numSrcOutStreams); - - UInt32 j; - for (j = 0; j < NumSrcInStreams; j++) - { - _srcInToDestOutMap.Add(0); - DestOutToSrcInMap.Add(0); - } - for (j = 0; j < _numSrcOutStreams; j++) - { - _srcOutToDestInMap.Add(0); - _destInToSrcOutMap.Add(0); - } - - UInt32 destInOffset = 0; - UInt32 destOutOffset = 0; - UInt32 srcInOffset = NumSrcInStreams; - UInt32 srcOutOffset = _numSrcOutStreams; - - for (int i = srcBindInfo.Coders.Size() - 1; i >= 0; i--) - { - const CCoderStreamsInfo &srcCoderInfo = srcBindInfo.Coders[i]; - - srcInOffset -= srcCoderInfo.NumInStreams; - srcOutOffset -= srcCoderInfo.NumOutStreams; - - UInt32 j; - for (j = 0; j < srcCoderInfo.NumInStreams; j++, destOutOffset++) - { - UInt32 index = srcInOffset + j; - _srcInToDestOutMap[index] = destOutOffset; - DestOutToSrcInMap[destOutOffset] = index; - } - for (j = 0; j < srcCoderInfo.NumOutStreams; j++, destInOffset++) - { - UInt32 index = srcOutOffset + j; - _srcOutToDestInMap[index] = destInOffset; - _destInToSrcOutMap[destInOffset] = index; - } - } -} - -void CBindReverseConverter::CreateReverseBindInfo(CBindInfo &destBindInfo) -{ - destBindInfo.Coders.Clear(); - destBindInfo.BindPairs.Clear(); - destBindInfo.InStreams.Clear(); - destBindInfo.OutStreams.Clear(); - - int i; - for (i = _srcBindInfo.Coders.Size() - 1; i >= 0; i--) - { - const CCoderStreamsInfo &srcCoderInfo = _srcBindInfo.Coders[i]; - CCoderStreamsInfo destCoderInfo; - destCoderInfo.NumInStreams = srcCoderInfo.NumOutStreams; - destCoderInfo.NumOutStreams = srcCoderInfo.NumInStreams; - destBindInfo.Coders.Add(destCoderInfo); - } - for (i = _srcBindInfo.BindPairs.Size() - 1; i >= 0; i--) - { - const CBindPair &srcBindPair = _srcBindInfo.BindPairs[i]; - CBindPair destBindPair; - destBindPair.InIndex = _srcOutToDestInMap[srcBindPair.OutIndex]; - destBindPair.OutIndex = _srcInToDestOutMap[srcBindPair.InIndex]; - destBindInfo.BindPairs.Add(destBindPair); - } - for (i = 0; i < _srcBindInfo.InStreams.Size(); i++) - destBindInfo.OutStreams.Add(_srcInToDestOutMap[_srcBindInfo.InStreams[i]]); - for (i = 0; i < _srcBindInfo.OutStreams.Size(); i++) - destBindInfo.InStreams.Add(_srcOutToDestInMap[_srcBindInfo.OutStreams[i]]); -} - -CCoderInfo2::CCoderInfo2(UInt32 numInStreams, UInt32 numOutStreams): - NumInStreams(numInStreams), - NumOutStreams(numOutStreams) -{ - InSizes.Reserve(NumInStreams); - InSizePointers.Reserve(NumInStreams); - OutSizePointers.Reserve(NumOutStreams); - OutSizePointers.Reserve(NumOutStreams); -} - -static void SetSizes(const UInt64 **srcSizes, CRecordVector &sizes, - CRecordVector &sizePointers, UInt32 numItems) -{ - sizes.Clear(); - sizePointers.Clear(); - for(UInt32 i = 0; i < numItems; i++) - { - if (srcSizes == 0 || srcSizes[i] == NULL) - { - sizes.Add(0); - sizePointers.Add(NULL); - } - else - { - sizes.Add(*srcSizes[i]); - sizePointers.Add(&sizes.Back()); - } - } -} - -void CCoderInfo2::SetCoderInfo(const UInt64 **inSizes, - const UInt64 **outSizes) -{ - SetSizes(inSizes, InSizes, InSizePointers, NumInStreams); - SetSizes(outSizes, OutSizes, OutSizePointers, NumOutStreams); -} - -} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Common/CoderMixer2.h b/desmume/src/windows/7z/CPP/7zip/Archive/Common/CoderMixer2.h deleted file mode 100644 index b1893b217..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Common/CoderMixer2.h +++ /dev/null @@ -1,174 +0,0 @@ -// CoderMixer2.h - -#ifndef __CODER_MIXER2_H -#define __CODER_MIXER2_H - -#include "../../../Common/MyVector.h" -#include "../../../Common/Types.h" -#include "../../../Common/MyCom.h" -#include "../../ICoder.h" - -namespace NCoderMixer { - -struct CBindPair -{ - UInt32 InIndex; - UInt32 OutIndex; -}; - -struct CCoderStreamsInfo -{ - UInt32 NumInStreams; - UInt32 NumOutStreams; -}; - -struct CBindInfo -{ - CRecordVector Coders; - CRecordVector BindPairs; - CRecordVector InStreams; - CRecordVector OutStreams; - - void Clear() - { - Coders.Clear(); - BindPairs.Clear(); - InStreams.Clear(); - OutStreams.Clear(); - } - - /* - UInt32 GetCoderStartOutStream(UInt32 coderIndex) const - { - UInt32 numOutStreams = 0; - for (UInt32 i = 0; i < coderIndex; i++) - numOutStreams += Coders[i].NumOutStreams; - return numOutStreams; - } - */ - - - void GetNumStreams(UInt32 &numInStreams, UInt32 &numOutStreams) const - { - numInStreams = 0; - numOutStreams = 0; - for (int i = 0; i < Coders.Size(); i++) - { - const CCoderStreamsInfo &coderStreamsInfo = Coders[i]; - numInStreams += coderStreamsInfo.NumInStreams; - numOutStreams += coderStreamsInfo.NumOutStreams; - } - } - - int FindBinderForInStream(UInt32 inStream) const - { - for (int i = 0; i < BindPairs.Size(); i++) - if (BindPairs[i].InIndex == inStream) - return i; - return -1; - } - int FindBinderForOutStream(UInt32 outStream) const - { - for (int i = 0; i < BindPairs.Size(); i++) - if (BindPairs[i].OutIndex == outStream) - return i; - return -1; - } - - UInt32 GetCoderInStreamIndex(UInt32 coderIndex) const - { - UInt32 streamIndex = 0; - for (UInt32 i = 0; i < coderIndex; i++) - streamIndex += Coders[i].NumInStreams; - return streamIndex; - } - - UInt32 GetCoderOutStreamIndex(UInt32 coderIndex) const - { - UInt32 streamIndex = 0; - for (UInt32 i = 0; i < coderIndex; i++) - streamIndex += Coders[i].NumOutStreams; - return streamIndex; - } - - - void FindInStream(UInt32 streamIndex, UInt32 &coderIndex, - UInt32 &coderStreamIndex) const - { - for (coderIndex = 0; coderIndex < (UInt32)Coders.Size(); coderIndex++) - { - UInt32 curSize = Coders[coderIndex].NumInStreams; - if (streamIndex < curSize) - { - coderStreamIndex = streamIndex; - return; - } - streamIndex -= curSize; - } - throw 1; - } - void FindOutStream(UInt32 streamIndex, UInt32 &coderIndex, - UInt32 &coderStreamIndex) const - { - for (coderIndex = 0; coderIndex < (UInt32)Coders.Size(); coderIndex++) - { - UInt32 curSize = Coders[coderIndex].NumOutStreams; - if (streamIndex < curSize) - { - coderStreamIndex = streamIndex; - return; - } - streamIndex -= curSize; - } - throw 1; - } -}; - -class CBindReverseConverter -{ - UInt32 _numSrcOutStreams; - NCoderMixer::CBindInfo _srcBindInfo; - CRecordVector _srcInToDestOutMap; - CRecordVector _srcOutToDestInMap; - CRecordVector _destInToSrcOutMap; -public: - UInt32 NumSrcInStreams; - CRecordVector DestOutToSrcInMap; - - CBindReverseConverter(const NCoderMixer::CBindInfo &srcBindInfo); - void CreateReverseBindInfo(NCoderMixer::CBindInfo &destBindInfo); -}; - -struct CCoderInfo2 -{ - CMyComPtr Coder; - CMyComPtr Coder2; - UInt32 NumInStreams; - UInt32 NumOutStreams; - - CRecordVector InSizes; - CRecordVector OutSizes; - CRecordVector InSizePointers; - CRecordVector OutSizePointers; - - CCoderInfo2(UInt32 numInStreams, UInt32 numOutStreams); - void SetCoderInfo(const UInt64 **inSizes, const UInt64 **outSizes); - - HRESULT QueryInterface(REFGUID iid, void** pp) const - { - IUnknown *p = Coder ? (IUnknown *)Coder : (IUnknown *)Coder2; - return p->QueryInterface(iid, pp); - } -}; - -class CCoderMixer2 -{ -public: - virtual HRESULT SetBindInfo(const CBindInfo &bindInfo) = 0; - virtual void ReInit() = 0; - virtual void SetCoderInfo(UInt32 coderIndex, const UInt64 **inSizes, const UInt64 **outSizes) = 0; -}; - -} -#endif - diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Common/CoderMixer2MT.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Common/CoderMixer2MT.cpp deleted file mode 100644 index f3bea728d..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Common/CoderMixer2MT.cpp +++ /dev/null @@ -1,230 +0,0 @@ -// CoderMixer2MT.cpp - -#include "StdAfx.h" - -#include "CoderMixer2MT.h" - -namespace NCoderMixer { - -CCoder2::CCoder2(UInt32 numInStreams, UInt32 numOutStreams): - CCoderInfo2(numInStreams, numOutStreams) -{ - InStreams.Reserve(NumInStreams); - InStreamPointers.Reserve(NumInStreams); - OutStreams.Reserve(NumOutStreams); - OutStreamPointers.Reserve(NumOutStreams); -} - -void CCoder2::Execute() { Code(NULL); } - -void CCoder2::Code(ICompressProgressInfo *progress) -{ - InStreamPointers.Clear(); - OutStreamPointers.Clear(); - UInt32 i; - for (i = 0; i < NumInStreams; i++) - { - if (InSizePointers[i] != NULL) - InSizePointers[i] = &InSizes[i]; - InStreamPointers.Add((ISequentialInStream *)InStreams[i]); - } - for (i = 0; i < NumOutStreams; i++) - { - if (OutSizePointers[i] != NULL) - OutSizePointers[i] = &OutSizes[i]; - OutStreamPointers.Add((ISequentialOutStream *)OutStreams[i]); - } - if (Coder) - Result = Coder->Code(InStreamPointers[0], OutStreamPointers[0], - InSizePointers[0], OutSizePointers[0], progress); - else - Result = Coder2->Code(&InStreamPointers.Front(), &InSizePointers.Front(), NumInStreams, - &OutStreamPointers.Front(), &OutSizePointers.Front(), NumOutStreams, progress); - { - int i; - for (i = 0; i < InStreams.Size(); i++) - InStreams[i].Release(); - for (i = 0; i < OutStreams.Size(); i++) - OutStreams[i].Release(); - } -} - -static void SetSizes(const UInt64 **srcSizes, CRecordVector &sizes, - CRecordVector &sizePointers, UInt32 numItems) -{ - sizes.Clear(); - sizePointers.Clear(); - for(UInt32 i = 0; i < numItems; i++) - { - if (srcSizes == 0 || srcSizes[i] == NULL) - { - sizes.Add(0); - sizePointers.Add(NULL); - } - else - { - sizes.Add(*srcSizes[i]); - sizePointers.Add(&sizes.Back()); - } - } -} - - -void CCoder2::SetCoderInfo(const UInt64 **inSizes, const UInt64 **outSizes) -{ - SetSizes(inSizes, InSizes, InSizePointers, NumInStreams); - SetSizes(outSizes, OutSizes, OutSizePointers, NumOutStreams); -} - -////////////////////////////////////// -// CCoderMixer2MT - -HRESULT CCoderMixer2MT::SetBindInfo(const CBindInfo &bindInfo) -{ - _bindInfo = bindInfo; - _streamBinders.Clear(); - for(int i = 0; i < _bindInfo.BindPairs.Size(); i++) - { - _streamBinders.Add(CStreamBinder()); - RINOK(_streamBinders.Back().CreateEvents()); - } - return S_OK; -} - -void CCoderMixer2MT::AddCoderCommon() -{ - const CCoderStreamsInfo &c = _bindInfo.Coders[_coders.Size()]; - CCoder2 threadCoderInfo(c.NumInStreams, c.NumOutStreams); - _coders.Add(threadCoderInfo); -} - -void CCoderMixer2MT::AddCoder(ICompressCoder *coder) -{ - AddCoderCommon(); - _coders.Back().Coder = coder; -} - -void CCoderMixer2MT::AddCoder2(ICompressCoder2 *coder) -{ - AddCoderCommon(); - _coders.Back().Coder2 = coder; -} - - -void CCoderMixer2MT::ReInit() -{ - for(int i = 0; i < _streamBinders.Size(); i++) - _streamBinders[i].ReInit(); -} - - -HRESULT CCoderMixer2MT::Init(ISequentialInStream **inStreams, ISequentialOutStream **outStreams) -{ - /* - if (_coders.Size() != _bindInfo.Coders.Size()) - throw 0; - */ - int i; - for(i = 0; i < _coders.Size(); i++) - { - CCoder2 &coderInfo = _coders[i]; - const CCoderStreamsInfo &coderStreamsInfo = _bindInfo.Coders[i]; - coderInfo.InStreams.Clear(); - UInt32 j; - for(j = 0; j < coderStreamsInfo.NumInStreams; j++) - coderInfo.InStreams.Add(NULL); - coderInfo.OutStreams.Clear(); - for(j = 0; j < coderStreamsInfo.NumOutStreams; j++) - coderInfo.OutStreams.Add(NULL); - } - - for(i = 0; i < _bindInfo.BindPairs.Size(); i++) - { - const CBindPair &bindPair = _bindInfo.BindPairs[i]; - UInt32 inCoderIndex, inCoderStreamIndex; - UInt32 outCoderIndex, outCoderStreamIndex; - _bindInfo.FindInStream(bindPair.InIndex, inCoderIndex, inCoderStreamIndex); - _bindInfo.FindOutStream(bindPair.OutIndex, outCoderIndex, outCoderStreamIndex); - - _streamBinders[i].CreateStreams( - &_coders[inCoderIndex].InStreams[inCoderStreamIndex], - &_coders[outCoderIndex].OutStreams[outCoderStreamIndex]); - } - - for(i = 0; i < _bindInfo.InStreams.Size(); i++) - { - UInt32 inCoderIndex, inCoderStreamIndex; - _bindInfo.FindInStream(_bindInfo.InStreams[i], inCoderIndex, inCoderStreamIndex); - _coders[inCoderIndex].InStreams[inCoderStreamIndex] = inStreams[i]; - } - - for(i = 0; i < _bindInfo.OutStreams.Size(); i++) - { - UInt32 outCoderIndex, outCoderStreamIndex; - _bindInfo.FindOutStream(_bindInfo.OutStreams[i], outCoderIndex, outCoderStreamIndex); - _coders[outCoderIndex].OutStreams[outCoderStreamIndex] = outStreams[i]; - } - return S_OK; -} - -HRESULT CCoderMixer2MT::ReturnIfError(HRESULT code) -{ - for (int i = 0; i < _coders.Size(); i++) - if (_coders[i].Result == code) - return code; - return S_OK; -} - -STDMETHODIMP CCoderMixer2MT::Code(ISequentialInStream **inStreams, - const UInt64 ** /* inSizes */, - UInt32 numInStreams, - ISequentialOutStream **outStreams, - const UInt64 ** /* outSizes */, - UInt32 numOutStreams, - ICompressProgressInfo *progress) -{ - if (numInStreams != (UInt32)_bindInfo.InStreams.Size() || - numOutStreams != (UInt32)_bindInfo.OutStreams.Size()) - return E_INVALIDARG; - - Init(inStreams, outStreams); - - int i; - for (i = 0; i < _coders.Size(); i++) - if (i != _progressCoderIndex) - { - RINOK(_coders[i].Create()); - } - - for (i = 0; i < _coders.Size(); i++) - if (i != _progressCoderIndex) - _coders[i].Start(); - - _coders[_progressCoderIndex].Code(progress); - - for (i = 0; i < _coders.Size(); i++) - if (i != _progressCoderIndex) - _coders[i].WaitFinish(); - - RINOK(ReturnIfError(E_ABORT)); - RINOK(ReturnIfError(E_OUTOFMEMORY)); - - for (i = 0; i < _coders.Size(); i++) - { - HRESULT result = _coders[i].Result; - if (result != S_OK && result != E_FAIL && result != S_FALSE) - return result; - } - - RINOK(ReturnIfError(S_FALSE)); - - for (i = 0; i < _coders.Size(); i++) - { - HRESULT result = _coders[i].Result; - if (result != S_OK) - return result; - } - return S_OK; -} - -} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Common/CoderMixer2MT.h b/desmume/src/windows/7z/CPP/7zip/Archive/Common/CoderMixer2MT.h deleted file mode 100644 index acecc390f..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Common/CoderMixer2MT.h +++ /dev/null @@ -1,80 +0,0 @@ -// CoderMixer2MT.h - -#ifndef __CODER_MIXER2_MT_H -#define __CODER_MIXER2_MT_H - -#include "CoderMixer2.h" -#include "../../../Common/MyCom.h" -#include "../../Common/StreamBinder.h" -#include "../../Common/VirtThread.h" - -namespace NCoderMixer { - -struct CCoder2: public CCoderInfo2, public CVirtThread -{ - HRESULT Result; - CObjectVector< CMyComPtr > InStreams; - CObjectVector< CMyComPtr > OutStreams; - CRecordVector InStreamPointers; - CRecordVector OutStreamPointers; - - CCoder2(UInt32 numInStreams, UInt32 numOutStreams); - void SetCoderInfo(const UInt64 **inSizes, const UInt64 **outSizes); - virtual void Execute(); - void Code(ICompressProgressInfo *progress); -}; - - -/* - SetBindInfo() - for each coder - AddCoder[2]() - SetProgressIndex(UInt32 coderIndex); - - for each file - { - ReInit() - for each coder - SetCoderInfo - Code - } -*/ - -class CCoderMixer2MT: - public ICompressCoder2, - public CCoderMixer2, - public CMyUnknownImp -{ - CBindInfo _bindInfo; - CObjectVector _streamBinders; - int _progressCoderIndex; - - void AddCoderCommon(); - HRESULT Init(ISequentialInStream **inStreams, ISequentialOutStream **outStreams); - HRESULT ReturnIfError(HRESULT code); -public: - CObjectVector _coders; - MY_UNKNOWN_IMP - - STDMETHOD(Code)(ISequentialInStream **inStreams, - const UInt64 **inSizes, - UInt32 numInStreams, - ISequentialOutStream **outStreams, - const UInt64 **outSizes, - UInt32 numOutStreams, - ICompressProgressInfo *progress); - - HRESULT SetBindInfo(const CBindInfo &bindInfo); - void AddCoder(ICompressCoder *coder); - void AddCoder2(ICompressCoder2 *coder); - void SetProgressCoderIndex(int coderIndex) { _progressCoderIndex = coderIndex; } - - void ReInit(); - void SetCoderInfo(UInt32 coderIndex, const UInt64 **inSizes, const UInt64 **outSizes) - { _coders[coderIndex].SetCoderInfo(inSizes, outSizes); } - UInt64 GetWriteProcessedSize(UInt32 binderIndex) const - { return _streamBinders[binderIndex].ProcessedSize; } -}; - -} -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Common/DummyOutStream.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Common/DummyOutStream.cpp deleted file mode 100644 index 237e01e59..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Common/DummyOutStream.cpp +++ /dev/null @@ -1,22 +0,0 @@ -// DummyOutStream.cpp - -#include "StdAfx.h" - -#include "DummyOutStream.h" - -STDMETHODIMP CDummyOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize) -{ - UInt32 realProcessedSize; - HRESULT result; - if(!_stream) - { - realProcessedSize = size; - result = S_OK; - } - else - result = _stream->Write(data, size, &realProcessedSize); - _size += realProcessedSize; - if(processedSize != NULL) - *processedSize = realProcessedSize; - return result; -} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Common/DummyOutStream.h b/desmume/src/windows/7z/CPP/7zip/Archive/Common/DummyOutStream.h deleted file mode 100644 index c993bb3dd..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Common/DummyOutStream.h +++ /dev/null @@ -1,24 +0,0 @@ -// DummyOutStream.h - -#ifndef __DUMMYOUTSTREAM_H -#define __DUMMYOUTSTREAM_H - -#include "../../IStream.h" -#include "Common/MyCom.h" - -class CDummyOutStream: - public ISequentialOutStream, - public CMyUnknownImp -{ - CMyComPtr _stream; - UInt64 _size; -public: - void SetStream(ISequentialOutStream *outStream) { _stream = outStream; } - void ReleaseStream() { _stream.Release(); } - void Init() { _size = 0; } - MY_UNKNOWN_IMP - STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); - UInt64 GetSize() const { return _size; } -}; - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Common/FindSignature.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Common/FindSignature.cpp deleted file mode 100644 index ad04bfcb7..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Common/FindSignature.cpp +++ /dev/null @@ -1,62 +0,0 @@ -// FindSignature.cpp - -#include "StdAfx.h" - -#include "Common/Buffer.h" - -#include "FindSignature.h" - -#include "../../Common/StreamUtils.h" - -HRESULT FindSignatureInStream(ISequentialInStream *stream, - const Byte *signature, unsigned signatureSize, - const UInt64 *limit, UInt64 &resPos) -{ - resPos = 0; - CByteBuffer byteBuffer2; - byteBuffer2.SetCapacity(signatureSize); - RINOK(ReadStream_FALSE(stream, byteBuffer2, signatureSize)); - - if (memcmp(byteBuffer2, signature, signatureSize) == 0) - return S_OK; - - const UInt32 kBufferSize = (1 << 16); - CByteBuffer byteBuffer; - byteBuffer.SetCapacity(kBufferSize); - Byte *buffer = byteBuffer; - UInt32 numPrevBytes = signatureSize - 1; - memcpy(buffer, (const Byte *)byteBuffer2 + 1, numPrevBytes); - resPos = 1; - for (;;) - { - if (limit != NULL) - if (resPos > *limit) - return S_FALSE; - do - { - UInt32 numReadBytes = kBufferSize - numPrevBytes; - UInt32 processedSize; - RINOK(stream->Read(buffer + numPrevBytes, numReadBytes, &processedSize)); - numPrevBytes += processedSize; - if (processedSize == 0) - return S_FALSE; - } - while (numPrevBytes < signatureSize); - UInt32 numTests = numPrevBytes - signatureSize + 1; - for (UInt32 pos = 0; pos < numTests; pos++) - { - Byte b = signature[0]; - for (; buffer[pos] != b && pos < numTests; pos++); - if (pos == numTests) - break; - if (memcmp(buffer + pos, signature, signatureSize) == 0) - { - resPos += pos; - return S_OK; - } - } - resPos += numTests; - numPrevBytes -= numTests; - memmove(buffer, buffer + numTests, numPrevBytes); - } -} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Common/FindSignature.h b/desmume/src/windows/7z/CPP/7zip/Archive/Common/FindSignature.h deleted file mode 100644 index f801d9860..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Common/FindSignature.h +++ /dev/null @@ -1,12 +0,0 @@ -// FindSignature.h - -#ifndef __FINDSIGNATURE_H -#define __FINDSIGNATURE_H - -#include "../../IStream.h" - -HRESULT FindSignatureInStream(ISequentialInStream *stream, - const Byte *signature, unsigned signatureSize, - const UInt64 *limit, UInt64 &resPos); - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Common/InStreamWithCRC.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Common/InStreamWithCRC.cpp deleted file mode 100644 index 4b87a43c0..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Common/InStreamWithCRC.cpp +++ /dev/null @@ -1,40 +0,0 @@ -// InStreamWithCRC.cpp - -#include "StdAfx.h" - -#include "InStreamWithCRC.h" - -STDMETHODIMP CSequentialInStreamWithCRC::Read(void *data, UInt32 size, UInt32 *processedSize) -{ - UInt32 realProcessedSize; - HRESULT result = _stream->Read(data, size, &realProcessedSize); - _size += realProcessedSize; - if (size > 0 && realProcessedSize == 0) - _wasFinished = true; - _crc = CrcUpdate(_crc, data, realProcessedSize); - if(processedSize != NULL) - *processedSize = realProcessedSize; - return result; -} - -STDMETHODIMP CInStreamWithCRC::Read(void *data, UInt32 size, UInt32 *processedSize) -{ - UInt32 realProcessedSize; - HRESULT result = _stream->Read(data, size, &realProcessedSize); - if (size > 0 && realProcessedSize == 0) - _wasFinished = true; - _size += realProcessedSize; - _crc = CrcUpdate(_crc, data, realProcessedSize); - if(processedSize != NULL) - *processedSize = realProcessedSize; - return result; -} - -STDMETHODIMP CInStreamWithCRC::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) -{ - if (seekOrigin != STREAM_SEEK_SET || offset != 0) - return E_FAIL; - _size = 0; - _crc = CRC_INIT_VAL; - return _stream->Seek(offset, seekOrigin, newPosition); -} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Common/InStreamWithCRC.h b/desmume/src/windows/7z/CPP/7zip/Archive/Common/InStreamWithCRC.h deleted file mode 100644 index d73f658e3..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Common/InStreamWithCRC.h +++ /dev/null @@ -1,69 +0,0 @@ -// InStreamWithCRC.h - -#ifndef __INSTREAMWITHCRC_H -#define __INSTREAMWITHCRC_H - -#include "../../../Common/MyCom.h" -#include "../../IStream.h" - -extern "C" -{ -#include "../../../../C/7zCrc.h" -} - -class CSequentialInStreamWithCRC: - public ISequentialInStream, - public CMyUnknownImp -{ -public: - MY_UNKNOWN_IMP - - STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); -private: - CMyComPtr _stream; - UInt64 _size; - UInt32 _crc; - bool _wasFinished; -public: - void SetStream(ISequentialInStream *stream) { _stream = stream; } - void Init() - { - _size = 0; - _wasFinished = false; - _crc = CRC_INIT_VAL; - } - void ReleaseStream() { _stream.Release(); } - UInt32 GetCRC() const { return CRC_GET_DIGEST(_crc); } - UInt64 GetSize() const { return _size; } - bool WasFinished() const { return _wasFinished; } -}; - -class CInStreamWithCRC: - public IInStream, - public CMyUnknownImp -{ -public: - MY_UNKNOWN_IMP1(IInStream) - - STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); - STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); -private: - CMyComPtr _stream; - UInt64 _size; - UInt32 _crc; - bool _wasFinished; -public: - void SetStream(IInStream *stream) { _stream = stream; } - void Init() - { - _size = 0; - _wasFinished = false; - _crc = CRC_INIT_VAL; - } - void ReleaseStream() { _stream.Release(); } - UInt32 GetCRC() const { return CRC_GET_DIGEST(_crc); } - UInt64 GetSize() const { return _size; } - bool WasFinished() const { return _wasFinished; } -}; - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Common/ItemNameUtils.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Common/ItemNameUtils.cpp deleted file mode 100644 index b4fee7c06..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Common/ItemNameUtils.cpp +++ /dev/null @@ -1,59 +0,0 @@ -// Archive/Common/ItemNameUtils.cpp - -#include "StdAfx.h" - -#include "ItemNameUtils.h" - -namespace NArchive { -namespace NItemName { - -static const wchar_t kOSDirDelimiter = WCHAR_PATH_SEPARATOR; -static const wchar_t kDirDelimiter = L'/'; - -UString MakeLegalName(const UString &name) -{ - UString zipName = name; - zipName.Replace(kOSDirDelimiter, kDirDelimiter); - return zipName; -} - -UString GetOSName(const UString &name) -{ - UString newName = name; - newName.Replace(kDirDelimiter, kOSDirDelimiter); - return newName; -} - -UString GetOSName2(const UString &name) -{ - if (name.IsEmpty()) - return UString(); - UString newName = GetOSName(name); - if (newName[newName.Length() - 1] == kOSDirDelimiter) - newName.Delete(newName.Length() - 1); - return newName; -} - -bool HasTailSlash(const AString &name, UINT codePage) -{ - if (name.IsEmpty()) - return false; - LPCSTR prev = - #ifdef _WIN32 - CharPrevExA((WORD)codePage, name, &name[name.Length()], 0); - #else - (LPCSTR)(name) + (name.Length() - 1); - #endif - return (*prev == '/'); -} - -#ifndef _WIN32 -UString WinNameToOSName(const UString &name) -{ - UString newName = name; - newName.Replace(L'\\', kOSDirDelimiter); - return newName; -} -#endif - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Common/ItemNameUtils.h b/desmume/src/windows/7z/CPP/7zip/Archive/Common/ItemNameUtils.h deleted file mode 100644 index 8b91d1c68..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Common/ItemNameUtils.h +++ /dev/null @@ -1,24 +0,0 @@ -// Archive/Common/ItemNameUtils.h - -#ifndef __ARCHIVE_ITEMNAMEUTILS_H -#define __ARCHIVE_ITEMNAMEUTILS_H - -#include "../../../Common/MyString.h" - -namespace NArchive { -namespace NItemName { - - UString MakeLegalName(const UString &name); - UString GetOSName(const UString &name); - UString GetOSName2(const UString &name); - bool HasTailSlash(const AString &name, UINT codePage); - - #ifdef _WIN32 - inline UString WinNameToOSName(const UString &name) { return name; } - #else - UString WinNameToOSName(const UString &name); - #endif - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Common/MultiStream.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Common/MultiStream.cpp deleted file mode 100644 index 33bb91ed8..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Common/MultiStream.cpp +++ /dev/null @@ -1,201 +0,0 @@ -// MultiStream.cpp - -#include "StdAfx.h" - -#include "MultiStream.h" - -STDMETHODIMP CMultiStream::Read(void *data, UInt32 size, UInt32 *processedSize) -{ - if(processedSize != NULL) - *processedSize = 0; - while(_streamIndex < Streams.Size() && size > 0) - { - CSubStreamInfo &s = Streams[_streamIndex]; - if (_pos == s.Size) - { - _streamIndex++; - _pos = 0; - continue; - } - RINOK(s.Stream->Seek(s.Pos + _pos, STREAM_SEEK_SET, 0)); - UInt32 sizeToRead = UInt32(MyMin((UInt64)size, s.Size - _pos)); - UInt32 realProcessed; - HRESULT result = s.Stream->Read(data, sizeToRead, &realProcessed); - data = (void *)((Byte *)data + realProcessed); - size -= realProcessed; - if(processedSize != NULL) - *processedSize += realProcessed; - _pos += realProcessed; - _seekPos += realProcessed; - RINOK(result); - break; - } - return S_OK; -} - -STDMETHODIMP CMultiStream::Seek(Int64 offset, UInt32 seekOrigin, - UInt64 *newPosition) -{ - UInt64 newPos; - switch(seekOrigin) - { - case STREAM_SEEK_SET: - newPos = offset; - break; - case STREAM_SEEK_CUR: - newPos = _seekPos + offset; - break; - case STREAM_SEEK_END: - newPos = _totalLength + offset; - break; - default: - return STG_E_INVALIDFUNCTION; - } - _seekPos = 0; - for (_streamIndex = 0; _streamIndex < Streams.Size(); _streamIndex++) - { - UInt64 size = Streams[_streamIndex].Size; - if (newPos < _seekPos + size) - { - _pos = newPos - _seekPos; - _seekPos += _pos; - if (newPosition != 0) - *newPosition = newPos; - return S_OK; - } - _seekPos += size; - } - if (newPos == _seekPos) - { - if (newPosition != 0) - *newPosition = newPos; - return S_OK; - } - return E_FAIL; -} - - -/* -class COutVolumeStream: - public ISequentialOutStream, - public CMyUnknownImp -{ - int _volIndex; - UInt64 _volSize; - UInt64 _curPos; - CMyComPtr _volumeStream; - COutArchive _archive; - CCRC _crc; - -public: - MY_UNKNOWN_IMP - - CFileItem _file; - CUpdateOptions _options; - CMyComPtr VolumeCallback; - void Init(IArchiveUpdateCallback2 *volumeCallback, - const UString &name) - { - _file.Name = name; - _file.IsStartPosDefined = true; - _file.StartPos = 0; - - VolumeCallback = volumeCallback; - _volIndex = 0; - _volSize = 0; - } - - HRESULT Flush(); - STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); -}; - -HRESULT COutVolumeStream::Flush() -{ - if (_volumeStream) - { - _file.UnPackSize = _curPos; - _file.FileCRC = _crc.GetDigest(); - RINOK(WriteVolumeHeader(_archive, _file, _options)); - _archive.Close(); - _volumeStream.Release(); - _file.StartPos += _file.UnPackSize; - } - return S_OK; -} -*/ - -/* -STDMETHODIMP COutMultiStream::Write(const void *data, UInt32 size, UInt32 *processedSize) -{ - if(processedSize != NULL) - *processedSize = 0; - while(size > 0) - { - if (_streamIndex >= Streams.Size()) - { - CSubStreamInfo subStream; - RINOK(VolumeCallback->GetVolumeSize(Streams.Size(), &subStream.Size)); - RINOK(VolumeCallback->GetVolumeStream(Streams.Size(), &subStream.Stream)); - subStream.Pos = 0; - Streams.Add(subStream); - continue; - } - CSubStreamInfo &subStream = Streams[_streamIndex]; - if (_offsetPos >= subStream.Size) - { - _offsetPos -= subStream.Size; - _streamIndex++; - continue; - } - if (_offsetPos != subStream.Pos) - { - CMyComPtr outStream; - RINOK(subStream.Stream.QueryInterface(IID_IOutStream, &outStream)); - RINOK(outStream->Seek(_offsetPos, STREAM_SEEK_SET, NULL)); - subStream.Pos = _offsetPos; - } - - UInt32 curSize = (UInt32)MyMin((UInt64)size, subStream.Size - subStream.Pos); - UInt32 realProcessed; - RINOK(subStream.Stream->Write(data, curSize, &realProcessed)); - data = (void *)((Byte *)data + realProcessed); - size -= realProcessed; - subStream.Pos += realProcessed; - _offsetPos += realProcessed; - _absPos += realProcessed; - if (_absPos > _length) - _length = _absPos; - if(processedSize != NULL) - *processedSize += realProcessed; - if (subStream.Pos == subStream.Size) - { - _streamIndex++; - _offsetPos = 0; - } - if (realProcessed != curSize && realProcessed == 0) - return E_FAIL; - } - return S_OK; -} - -STDMETHODIMP COutMultiStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) -{ - if(seekOrigin >= 3) - return STG_E_INVALIDFUNCTION; - switch(seekOrigin) - { - case STREAM_SEEK_SET: - _absPos = offset; - break; - case STREAM_SEEK_CUR: - _absPos += offset; - break; - case STREAM_SEEK_END: - _absPos = _length + offset; - break; - } - _offsetPos = _absPos; - _streamIndex = 0; - return S_OK; -} -*/ diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Common/MultiStream.h b/desmume/src/windows/7z/CPP/7zip/Archive/Common/MultiStream.h deleted file mode 100644 index 133a06f9f..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Common/MultiStream.h +++ /dev/null @@ -1,76 +0,0 @@ -// MultiStream.h - -#ifndef __MULTISTREAM_H -#define __MULTISTREAM_H - -#include "../../../Common/MyCom.h" -#include "../../../Common/MyVector.h" -#include "../../Archive/IArchive.h" - -class CMultiStream: - public IInStream, - public CMyUnknownImp -{ - int _streamIndex; - UInt64 _pos; - UInt64 _seekPos; - UInt64 _totalLength; -public: - struct CSubStreamInfo - { - CMyComPtr Stream; - UInt64 Pos; - UInt64 Size; - }; - CObjectVector Streams; - void Init() - { - _streamIndex = 0; - _pos = 0; - _seekPos = 0; - _totalLength = 0; - for (int i = 0; i < Streams.Size(); i++) - _totalLength += Streams[i].Size; - } - - MY_UNKNOWN_IMP1(IInStream) - - STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); - STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); -}; - -/* -class COutMultiStream: - public IOutStream, - public CMyUnknownImp -{ - int _streamIndex; // required stream - UInt64 _offsetPos; // offset from start of _streamIndex index - UInt64 _absPos; - UInt64 _length; - - struct CSubStreamInfo - { - CMyComPtr Stream; - UInt64 Size; - UInt64 Pos; - }; - CObjectVector Streams; -public: - CMyComPtr VolumeCallback; - void Init() - { - _streamIndex = 0; - _offsetPos = 0; - _absPos = 0; - _length = 0; - } - - MY_UNKNOWN_IMP1(IOutStream) - - STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); - STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); -}; -*/ - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Common/OutStreamWithCRC.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Common/OutStreamWithCRC.cpp deleted file mode 100644 index 37b157d1e..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Common/OutStreamWithCRC.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// OutStreamWithCRC.cpp - -#include "StdAfx.h" - -#include "OutStreamWithCRC.h" - -STDMETHODIMP COutStreamWithCRC::Write(const void *data, UInt32 size, UInt32 *processedSize) -{ - UInt32 realProcessedSize; - HRESULT result; - if(!_stream) - { - realProcessedSize = size; - result = S_OK; - } - else - result = _stream->Write(data, size, &realProcessedSize); - if (_calculate) - _crc = CrcUpdate(_crc, data, realProcessedSize); - _size += realProcessedSize; - if(processedSize != NULL) - *processedSize = realProcessedSize; - return result; -} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Common/OutStreamWithCRC.h b/desmume/src/windows/7z/CPP/7zip/Archive/Common/OutStreamWithCRC.h deleted file mode 100644 index 44e5eb24b..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Common/OutStreamWithCRC.h +++ /dev/null @@ -1,38 +0,0 @@ -// OutStreamWithCRC.h - -#ifndef __OUT_STREAM_WITH_CRC_H -#define __OUT_STREAM_WITH_CRC_H - -#include "../../../Common/MyCom.h" -#include "../../IStream.h" - -extern "C" -{ -#include "../../../../C/7zCrc.h" -} - -class COutStreamWithCRC: - public ISequentialOutStream, - public CMyUnknownImp -{ - CMyComPtr _stream; - UInt64 _size; - UInt32 _crc; - bool _calculate; -public: - MY_UNKNOWN_IMP - STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); - void SetStream(ISequentialOutStream *stream) { _stream = stream; } - void ReleaseStream() { _stream.Release(); } - void Init(bool calculate = true) - { - _size = 0; - _calculate = calculate; - _crc = CRC_INIT_VAL; - } - void InitCRC() { _crc = CRC_INIT_VAL; } - UInt64 GetSize() const { return _size; } - UInt32 GetCRC() const { return CRC_GET_DIGEST(_crc); } -}; - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Common/ParseProperties.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Common/ParseProperties.cpp deleted file mode 100644 index 5550a23bc..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Common/ParseProperties.cpp +++ /dev/null @@ -1,177 +0,0 @@ -// ParseProperties.cpp - -#include "StdAfx.h" - -#include "ParseProperties.h" - -#include "Common/StringToInt.h" -#include "Common/MyCom.h" - -HRESULT ParsePropValue(const UString &name, const PROPVARIANT &prop, UInt32 &resValue) -{ - if (prop.vt == VT_UI4) - { - if (!name.IsEmpty()) - return E_INVALIDARG; - resValue = prop.ulVal; - } - else if (prop.vt == VT_EMPTY) - { - if(!name.IsEmpty()) - { - const wchar_t *start = name; - const wchar_t *end; - UInt64 v = ConvertStringToUInt64(start, &end); - if (end - start != name.Length()) - return E_INVALIDARG; - resValue = (UInt32)v; - } - } - else - return E_INVALIDARG; - return S_OK; -} - -static const int kLogarithmicSizeLimit = 32; -static const wchar_t kByteSymbol = L'B'; -static const wchar_t kKiloByteSymbol = L'K'; -static const wchar_t kMegaByteSymbol = L'M'; - -HRESULT ParsePropDictionaryValue(const UString &srcStringSpec, UInt32 &dicSize) -{ - UString srcString = srcStringSpec; - srcString.MakeUpper(); - - const wchar_t *start = srcString; - const wchar_t *end; - UInt64 number = ConvertStringToUInt64(start, &end); - int numDigits = (int)(end - start); - if (numDigits == 0 || srcString.Length() > numDigits + 1) - return E_INVALIDARG; - if (srcString.Length() == numDigits) - { - if (number >= kLogarithmicSizeLimit) - return E_INVALIDARG; - dicSize = (UInt32)1 << (int)number; - return S_OK; - } - switch (srcString[numDigits]) - { - case kByteSymbol: - if (number >= ((UInt64)1 << kLogarithmicSizeLimit)) - return E_INVALIDARG; - dicSize = (UInt32)number; - break; - case kKiloByteSymbol: - if (number >= ((UInt64)1 << (kLogarithmicSizeLimit - 10))) - return E_INVALIDARG; - dicSize = (UInt32)(number << 10); - break; - case kMegaByteSymbol: - if (number >= ((UInt64)1 << (kLogarithmicSizeLimit - 20))) - return E_INVALIDARG; - dicSize = (UInt32)(number << 20); - break; - default: - return E_INVALIDARG; - } - return S_OK; -} - -HRESULT ParsePropDictionaryValue(const UString &name, const PROPVARIANT &prop, UInt32 &resValue) -{ - if (name.IsEmpty()) - { - if (prop.vt == VT_UI4) - { - UInt32 logDicSize = prop.ulVal; - if (logDicSize >= 32) - return E_INVALIDARG; - resValue = (UInt32)1 << logDicSize; - return S_OK; - } - if (prop.vt == VT_BSTR) - return ParsePropDictionaryValue(prop.bstrVal, resValue); - return E_INVALIDARG; - } - return ParsePropDictionaryValue(name, resValue); -} - -bool StringToBool(const UString &s, bool &res) -{ - if (s.IsEmpty() || s.CompareNoCase(L"ON") == 0 || s.Compare(L"+") == 0) - { - res = true; - return true; - } - if (s.CompareNoCase(L"OFF") == 0 || s.Compare(L"-") == 0) - { - res = false; - return true; - } - return false; -} - -HRESULT SetBoolProperty(bool &dest, const PROPVARIANT &value) -{ - switch(value.vt) - { - case VT_EMPTY: - dest = true; - return S_OK; - case VT_BOOL: - dest = (value.boolVal != VARIANT_FALSE); - return S_OK; - /* - case VT_UI4: - dest = (value.ulVal != 0); - break; - */ - case VT_BSTR: - return StringToBool(value.bstrVal, dest) ? S_OK : E_INVALIDARG; - } - return E_INVALIDARG; -} - -int ParseStringToUInt32(const UString &srcString, UInt32 &number) -{ - const wchar_t *start = srcString; - const wchar_t *end; - UInt64 number64 = ConvertStringToUInt64(start, &end); - if (number64 > 0xFFFFFFFF) - { - number = 0; - return 0; - } - number = (UInt32)number64; - return (int)(end - start); -} - -HRESULT ParseMtProp(const UString &name, const PROPVARIANT &prop, UInt32 defaultNumThreads, UInt32 &numThreads) -{ - if (name.IsEmpty()) - { - switch(prop.vt) - { - case VT_UI4: - numThreads = prop.ulVal; - break; - default: - { - bool val; - RINOK(SetBoolProperty(val, prop)); - numThreads = (val ? defaultNumThreads : 1); - break; - } - } - } - else - { - UInt32 number; - int index = ParseStringToUInt32(name, number); - if (index != name.Length()) - return E_INVALIDARG; - numThreads = number; - } - return S_OK; -} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Common/ParseProperties.h b/desmume/src/windows/7z/CPP/7zip/Archive/Common/ParseProperties.h deleted file mode 100644 index c64fc1ea1..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Common/ParseProperties.h +++ /dev/null @@ -1,18 +0,0 @@ -// ParseProperties.h - -#ifndef __PARSEPROPERTIES_H -#define __PARSEPROPERTIES_H - -#include "Common/MyString.h" -#include "Common/Types.h" - -HRESULT ParsePropValue(const UString &name, const PROPVARIANT &prop, UInt32 &resValue); -HRESULT ParsePropDictionaryValue(const UString &srcStringSpec, UInt32 &dicSize); -HRESULT ParsePropDictionaryValue(const UString &name, const PROPVARIANT &prop, UInt32 &resValue); - -bool StringToBool(const UString &s, bool &res); -HRESULT SetBoolProperty(bool &dest, const PROPVARIANT &value); -int ParseStringToUInt32(const UString &srcString, UInt32 &number); -HRESULT ParseMtProp(const UString &name, const PROPVARIANT &prop, UInt32 defaultNumThreads, UInt32 &numThreads); - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Common/StdAfx.h b/desmume/src/windows/7z/CPP/7zip/Archive/Common/StdAfx.h deleted file mode 100644 index a4e617312..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Common/StdAfx.h +++ /dev/null @@ -1,9 +0,0 @@ -// StdAfx.h - -#ifndef __STDAFX_H -#define __STDAFX_H - -#include "../../../Common/MyWindows.h" -#include "../../../Common/NewHandler.h" - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/DllExports2.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/DllExports2.cpp deleted file mode 100644 index 7f4764654..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/DllExports2.cpp +++ /dev/null @@ -1,83 +0,0 @@ -// DLLExports.cpp - -#include "StdAfx.h" - -#include "../../Common/MyInitGuid.h" -#include "../../Common/ComTry.h" -#include "../../Common/Types.h" -#include "../../Windows/PropVariant.h" -#if defined(_WIN32) && defined(_7ZIP_LARGE_PAGES) -extern "C" -{ -#include "../../../C/Alloc.h" -} -#endif - -#include "IArchive.h" -#include "../ICoder.h" -#include "../IPassword.h" - -HINSTANCE g_hInstance; -#ifndef _UNICODE -#ifdef _WIN32 -bool g_IsNT = false; -static bool IsItWindowsNT() -{ - OSVERSIONINFO versionInfo; - versionInfo.dwOSVersionInfoSize = sizeof(versionInfo); - if (!::GetVersionEx(&versionInfo)) - return false; - return (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT); -} -#endif -#endif - -//desmume 27-jun-09 - dont want this in a static library -//extern "C" -//BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/) -//{ -// if (dwReason == DLL_PROCESS_ATTACH) -// { -// g_hInstance = hInstance; -// #ifndef _UNICODE -// #ifdef _WIN32 -// g_IsNT = IsItWindowsNT(); -// #endif -// #endif -// } -// return TRUE; -//} - -DEFINE_GUID(CLSID_CArchiveHandler, -0x23170F69, 0x40C1, 0x278A, 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00); - -static const UInt16 kDecodeId = 0x2790; - -DEFINE_GUID(CLSID_CCodec, -0x23170F69, 0x40C1, kDecodeId, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); - -STDAPI CreateCoder(const GUID *clsid, const GUID *iid, void **outObject); -STDAPI CreateArchiver(const GUID *classID, const GUID *iid, void **outObject); - -STDAPI CreateObject(const GUID *clsid, const GUID *iid, void **outObject) -{ - // COM_TRY_BEGIN - *outObject = 0; - if (*iid == IID_ICompressCoder || *iid == IID_ICompressCoder2 || *iid == IID_ICompressFilter) - { - return CreateCoder(clsid, iid, outObject); - } - else - { - return CreateArchiver(clsid, iid, outObject); - } - // COM_TRY_END -} - -STDAPI SetLargePageMode() -{ - #if defined(_WIN32) && defined(_7ZIP_LARGE_PAGES) - SetLargePageSize(); - #endif - return S_OK; -} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipHandler.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipHandler.cpp deleted file mode 100644 index 01a5c9f99..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipHandler.cpp +++ /dev/null @@ -1,284 +0,0 @@ -// GZipHandler.cpp - -#include "StdAfx.h" - -#include "GZipHandler.h" - -#include "Common/Defs.h" -#include "Common/StringConvert.h" -#include "Common/ComTry.h" -#include "Windows/PropVariant.h" -#include "Windows/Time.h" - -#include "../../ICoder.h" -#include "../../Common/ProgressUtils.h" -#include "../../Common/CreateCoder.h" -#include "../Common/OutStreamWithCRC.h" - -using namespace NWindows; - -namespace NArchive { -namespace NGZip { - -static const CMethodId kMethodId_Deflate = 0x040108; - -const wchar_t *kHostOS[] = -{ - L"FAT", - L"AMIGA", - L"VMS", - L"Unix", - L"VM_CMS", - L"Atari", // what if it's a minix filesystem? [cjh] - L"HPFS", // filesystem used by OS/2 (and NT 3.x) - L"Mac", - L"Z_System", - L"CPM", - L"TOPS20", // pkzip 2.50 NTFS - L"NTFS", // filesystem used by Windows NT - L"QDOS ", // SMS/QDOS - L"Acorn", // Archimedes Acorn RISC OS - L"VFAT", // filesystem used by Windows 95, NT - L"MVS", - L"BeOS", // hybrid POSIX/database filesystem - // BeBOX or PowerMac - L"Tandem", - L"THEOS" -}; - -static const int kNumHostOSes = sizeof(kHostOS) / sizeof(kHostOS[0]); - -static const wchar_t *kUnknownOS = L"Unknown"; - -/* -enum // PropID -{ - kpidExtraIsPresent = kpidUserDefined, - kpidExtraFlags, - kpidIsText -}; -*/ - -STATPROPSTG kProps[] = -{ - { NULL, kpidPath, VT_BSTR}, - { NULL, kpidSize, VT_UI8}, - { NULL, kpidPackSize, VT_UI8}, - { NULL, kpidMTime, VT_FILETIME}, - // { NULL, kpidMethod, VT_UI1}, - { NULL, kpidHostOS, VT_BSTR}, - { NULL, kpidCRC, VT_UI4} - // { L"Extra", kpidExtraIsPresent, VT_BOOL} - // { L"Extra flags", kpidExtraFlags, VT_UI1}, - // { L"Is Text", kpidIsText, VT_BOOL}, -}; - -IMP_IInArchive_Props -IMP_IInArchive_ArcProps_NO - -STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems) -{ - *numItems = 1; - return S_OK; -} - -STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIANT *value) -{ - COM_TRY_BEGIN - NWindows::NCOM::CPropVariant prop; - switch(propID) - { - case kpidPath: - if (m_Item.NameIsPresent()) - prop = MultiByteToUnicodeString(m_Item.Name, CP_ACP); - break; - case kpidMTime: - { - FILETIME utcTime; - if (m_Item.Time != 0) - { - NTime::UnixTimeToFileTime((UInt32)m_Item.Time, utcTime); - prop = utcTime; - } - else - { - // utcTime.dwLowDateTime = utcTime.dwHighDateTime = 0; - // prop = utcTime; - } - break; - } - case kpidSize: prop = UInt64(m_Item.UnPackSize32); break; - case kpidPackSize: prop = m_PackSize; break; - case kpidCommented: prop = m_Item.CommentIsPresent(); break; - case kpidHostOS: - prop = (m_Item.HostOS < kNumHostOSes) ? - kHostOS[m_Item.HostOS] : kUnknownOS; - break; - case kpidMethod: prop = m_Item.CompressionMethod; break; - case kpidCRC: prop = m_Item.FileCRC; break; - /* - case kpidExtraFlags: prop = m_Item.ExtraFlags; break; - case kpidIsText: prop = m_Item.IsText(); break; - case kpidExtraIsPresent: prop = m_Item.ExtraFieldIsPresent(); break; - */ - } - prop.Detach(value); - return S_OK; - COM_TRY_END -} - -STDMETHODIMP CHandler::Open(IInStream *inStream, - const UInt64 * /* maxCheckStartPosition */, - IArchiveOpenCallback * /* openArchiveCallback */) -{ - COM_TRY_BEGIN - try - { - CInArchive archive; - RINOK(inStream->Seek(0, STREAM_SEEK_CUR, &m_StreamStartPosition)); - RINOK(archive.ReadHeader(inStream, m_Item)); - m_DataOffset = archive.GetOffset(); - UInt64 newPosition; - RINOK(inStream->Seek(-8, STREAM_SEEK_END, &newPosition)); - m_PackSize = newPosition - (m_StreamStartPosition + m_DataOffset); - if (archive.ReadPostHeader(inStream, m_Item) != S_OK) - return S_FALSE; - m_Stream = inStream; - } - catch(...) - { - return S_FALSE; - } - return S_OK; - COM_TRY_END -} - -STDMETHODIMP CHandler::Close() -{ - m_Stream.Release(); - return S_OK; -} - -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) -{ - COM_TRY_BEGIN - bool allFilesMode = (numItems == UInt32(-1)); - if (!allFilesMode) - { - if (numItems == 0) - return S_OK; - if (numItems != 1) - return E_INVALIDARG; - if (indices[0] != 0) - return E_INVALIDARG; - } - - bool testMode = (_aTestMode != 0); - - extractCallback->SetTotal(m_PackSize); - - UInt64 currentTotalPacked = 0; - - RINOK(extractCallback->SetCompleted(¤tTotalPacked)); - CMyComPtr realOutStream; - Int32 askMode; - askMode = testMode ? NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; - - RINOK(extractCallback->GetStream(0, &realOutStream, askMode)); - - if(!testMode && !realOutStream) - return S_OK; - - extractCallback->PrepareOperation(askMode); - - COutStreamWithCRC *outStreamSpec = new COutStreamWithCRC; - CMyComPtr outStream(outStreamSpec); - outStreamSpec->SetStream(realOutStream); - outStreamSpec->Init(); - realOutStream.Release(); - - CLocalProgress *lps = new CLocalProgress; - CMyComPtr progress = lps; - lps->Init(extractCallback, true); - - CMyComPtr deflateDecoder; - bool firstItem = true; - RINOK(m_Stream->Seek(m_StreamStartPosition, STREAM_SEEK_SET, NULL)); - Int32 opRes; - for (;;) - { - lps->InSize = currentTotalPacked; - lps->OutSize = outStreamSpec->GetSize(); - - CInArchive archive; - CItem item; - HRESULT result = archive.ReadHeader(m_Stream, item); - if (result != S_OK) - { - if (firstItem) - return E_FAIL; - opRes = NArchive::NExtract::NOperationResult::kOK; - break; - } - firstItem = false; - - UInt64 dataStartPos; - RINOK(m_Stream->Seek(0, STREAM_SEEK_CUR, &dataStartPos)); - - outStreamSpec->InitCRC(); - - if (item.CompressionMethod != NFileHeader::NCompressionMethod::kDeflate) - { - opRes = NArchive::NExtract::NOperationResult::kUnSupportedMethod; - break; - } - - if (!deflateDecoder) - { - RINOK(CreateCoder( - EXTERNAL_CODECS_VARS - kMethodId_Deflate, deflateDecoder, false)); - if (!deflateDecoder) - { - opRes = NArchive::NExtract::NOperationResult::kUnSupportedMethod; - break; - } - } - result = deflateDecoder->Code(m_Stream, outStream, NULL, NULL, progress); - if (result != S_OK) - { - if (result != S_FALSE) - return result; - opRes = NArchive::NExtract::NOperationResult::kDataError; - break; - } - - CMyComPtr getInStreamProcessedSize; - RINOK(deflateDecoder.QueryInterface(IID_ICompressGetInStreamProcessedSize, - &getInStreamProcessedSize)); - UInt64 packSize; - RINOK(getInStreamProcessedSize->GetInStreamProcessedSize(&packSize)); - UInt64 pos; - RINOK(m_Stream->Seek(dataStartPos + packSize, STREAM_SEEK_SET, &pos)); - - currentTotalPacked = pos - m_StreamStartPosition; - - CItem postItem; - if (archive.ReadPostHeader(m_Stream, postItem) != S_OK) - return E_FAIL; - if((outStreamSpec->GetCRC() != postItem.FileCRC)) - { - opRes = NArchive::NExtract::NOperationResult::kCRCError; - break; - } - } - outStream.Release(); - return extractCallback->SetOperationResult(opRes); - COM_TRY_END -} - -IMPL_ISetCompressCodecsInfo - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipHandler.h b/desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipHandler.h deleted file mode 100644 index 31f5a430f..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipHandler.h +++ /dev/null @@ -1,65 +0,0 @@ -// GZip/Handler.h - -#ifndef __GZIP_HANDLER_H -#define __GZIP_HANDLER_H - -#include "Common/MyCom.h" - -#include "../IArchive.h" - -#include "../../Common/CreateCoder.h" - -#include "GZipIn.h" -#include "GZipUpdate.h" - -namespace NArchive { -namespace NGZip { - -class CHandler: - public IInArchive, - public IOutArchive, - public ISetProperties, - PUBLIC_ISetCompressCodecsInfo - public CMyUnknownImp -{ -public: - MY_QUERYINTERFACE_BEGIN2(IInArchive) - MY_QUERYINTERFACE_ENTRY(IOutArchive) - MY_QUERYINTERFACE_ENTRY(ISetProperties) - QUERY_ENTRY_ISetCompressCodecsInfo - MY_QUERYINTERFACE_END - MY_ADDREF_RELEASE - - INTERFACE_IInArchive(;) -#ifndef EXTRACT_ONLY - INTERFACE_IOutArchive(;) - - STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties); -#endif - - DECL_ISetCompressCodecsInfo - - CHandler() { InitMethodProperties(); } - -private: - NArchive::NGZip::CItem m_Item; - UInt64 m_StreamStartPosition; - UInt64 m_DataOffset; - UInt64 m_PackSize; - CMyComPtr m_Stream; - CCompressionMethodMode m_Method; - UInt32 m_Level; - - DECL_EXTERNAL_CODECS_VARS - - void InitMethodProperties() - { - m_Method.NumMatchFinderCyclesDefined = false; - m_Level = m_Method.NumPasses = m_Method.NumFastBytes = - m_Method.NumMatchFinderCycles = m_Method.Algo = 0xFFFFFFFF; - } -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipHeader.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipHeader.cpp deleted file mode 100644 index 508d6bd5b..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipHeader.cpp +++ /dev/null @@ -1,20 +0,0 @@ -// Archive/GZip/Header.h - -#include "StdAfx.h" - -#include "GZipHeader.h" - -namespace NArchive { -namespace NGZip { - -extern UInt16 kSignature = 0x8B1F + 1; - -class CMarkersInitializer -{ -public: - CMarkersInitializer() - { kSignature--; } -} g_MarkerInitializer; - -}} - diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipHeader.h b/desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipHeader.h deleted file mode 100644 index 3e76ad6d2..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipHeader.h +++ /dev/null @@ -1,85 +0,0 @@ -// Archive/GZip/Header.h - -#ifndef __ARCHIVE_GZIP_HEADER_H -#define __ARCHIVE_GZIP_HEADER_H - -#include "Common/Types.h" - -namespace NArchive { -namespace NGZip { - -extern UInt16 kSignature; -static const UInt32 kSignatureSize = 2; - -namespace NFileHeader -{ - /* - struct CBlock - { - UInt16 Id; - Byte CompressionMethod; - Byte Flags; - UInt32 Time; - Byte ExtraFlags; - Byte HostOS; - }; - */ - - namespace NFlags - { - const int kDataIsText = 1 << 0; - const int kHeaderCRCIsPresent = 1 << 1; - const int kExtraIsPresent = 1 << 2; - const int kNameIsPresent = 1 << 3; - const int kComentIsPresent = 1 << 4; - } - - namespace NExtraFlags - { - enum EEnum - { - kMaximum = 2, - kFastest = 4 - }; - } - - namespace NCompressionMethod - { - const Byte kDeflate = 8; - } - - namespace NHostOS - { - enum EEnum - { - kFAT = 0, // filesystem used by MS-DOS, OS/2, Win32 - // pkzip 2.50 (FAT / VFAT / FAT32 file systems) - kAMIGA = 1, - kVMS = 2, // VAX/VMS - kUnix = 3, - kVM_CMS = 4, - kAtari = 5, // what if it's a minix filesystem? [cjh] - kHPFS = 6, // filesystem used by OS/2 (and NT 3.x) - kMac = 7, - kZ_System = 8, - kCPM = 9, - kTOPS20 = 10, // pkzip 2.50 NTFS - kNTFS = 11, // filesystem used by Windows NT - kQDOS = 12, // SMS/QDOS - kAcorn = 13, // Archimedes Acorn RISC OS - kVFAT = 14, // filesystem used by Windows 95, NT - kMVS = 15, - kBeOS = 16, // hybrid POSIX/database filesystem - // BeBOX or PowerMac - kTandem = 17, - kTHEOS = 18, - - kUnknown = 255 - }; - const int kNumHostSystems = 19; - } -} - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipIn.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipIn.cpp deleted file mode 100644 index b29f10e08..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipIn.cpp +++ /dev/null @@ -1,119 +0,0 @@ -// Archive/GZipIn.cpp - -#include "StdAfx.h" - -#include "GZipIn.h" - -#include "Common/Defs.h" -#include "Common/MyCom.h" -#include "Windows/Defs.h" - -#include "../../Common/StreamUtils.h" - -extern "C" -{ - #include "../../../../C/7zCrc.h" -} - -namespace NArchive { -namespace NGZip { - -HRESULT CInArchive::ReadBytes(ISequentialInStream *inStream, void *data, UInt32 size) -{ - RINOK(ReadStream_FALSE(inStream, data, size)); - m_Position += size; - return S_OK; -} - -HRESULT CInArchive::ReadByte(ISequentialInStream *inStream, Byte &value, UInt32 &crc) -{ - RINOK(ReadBytes(inStream, &value, 1)); - crc = CRC_UPDATE_BYTE(crc, value); - return S_OK; -} - -HRESULT CInArchive::ReadUInt16(ISequentialInStream *inStream, UInt16 &value, UInt32 &crc) -{ - value = 0; - for (int i = 0; i < 2; i++) - { - Byte b; - RINOK(ReadByte(inStream, b, crc)); - value |= (UInt16(b) << (8 * i)); - } - return S_OK; -} - -HRESULT CInArchive::ReadUInt32(ISequentialInStream *inStream, UInt32 &value, UInt32 &crc) -{ - value = 0; - for (int i = 0; i < 4; i++) - { - Byte b; - RINOK(ReadByte(inStream, b, crc)); - value |= (UInt32(b) << (8 * i)); - } - return S_OK; -} - -HRESULT CInArchive::ReadZeroTerminatedString(ISequentialInStream *inStream, AString &resString, UInt32 &crc) -{ - resString.Empty(); - for (;;) - { - Byte c; - RINOK(ReadByte(inStream, c, crc)); - if (c == 0) - return S_OK; - resString += char(c); - } -} - -HRESULT CInArchive::ReadHeader(ISequentialInStream *inStream, CItem &item) -{ - item.Clear(); - m_Position = 0; - - UInt16 signature; - UInt32 crc = CRC_INIT_VAL;; - RINOK(ReadUInt16(inStream, signature, crc)); - if (signature != kSignature) - return S_FALSE; - - RINOK(ReadByte(inStream, item.CompressionMethod, crc)); - RINOK(ReadByte(inStream, item.Flags, crc)); - RINOK(ReadUInt32(inStream, item.Time, crc)); - RINOK(ReadByte(inStream, item.ExtraFlags, crc)); - RINOK(ReadByte(inStream, item.HostOS, crc)); - - if (item.ExtraFieldIsPresent()) - { - UInt16 extraSize; - RINOK(ReadUInt16(inStream, extraSize, crc)); - item.Extra.SetCapacity(extraSize); - RINOK(ReadBytes(inStream, item.Extra, extraSize)); - crc = CrcUpdate(crc, item.Extra, extraSize); - } - if (item.NameIsPresent()) - RINOK(ReadZeroTerminatedString(inStream, item.Name, crc)); - if (item.CommentIsPresent()) - RINOK(ReadZeroTerminatedString(inStream, item.Comment, crc)); - if (item.HeaderCRCIsPresent()) - { - UInt16 headerCRC; - UInt32 dummy = 0; - RINOK(ReadUInt16(inStream, headerCRC, dummy)); - if ((UInt16)CRC_GET_DIGEST(crc) != headerCRC) - return S_FALSE; - } - return S_OK; -} - -HRESULT CInArchive::ReadPostHeader(ISequentialInStream *inStream, CItem &item) -{ - UInt32 dummy = 0; - RINOK(ReadUInt32(inStream, item.FileCRC, dummy)); - return ReadUInt32(inStream, item.UnPackSize32, dummy); -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipIn.h b/desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipIn.h deleted file mode 100644 index 1204d667c..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipIn.h +++ /dev/null @@ -1,30 +0,0 @@ -// Archive/GZipIn.h - -#ifndef __ARCHIVE_GZIP_IN_H -#define __ARCHIVE_GZIP_IN_H - -#include "GZipHeader.h" -#include "GZipItem.h" -#include "../../IStream.h" - -namespace NArchive { -namespace NGZip { - -class CInArchive -{ - UInt64 m_Position; - - HRESULT ReadBytes(ISequentialInStream *inStream, void *data, UInt32 size); - HRESULT ReadZeroTerminatedString(ISequentialInStream *inStream, AString &resString, UInt32 &crc); - HRESULT ReadByte(ISequentialInStream *inStream, Byte &value, UInt32 &crc); - HRESULT ReadUInt16(ISequentialInStream *inStream, UInt16 &value, UInt32 &crc); - HRESULT ReadUInt32(ISequentialInStream *inStream, UInt32 &value, UInt32 &crc); -public: - HRESULT ReadHeader(ISequentialInStream *inStream, CItem &item); - HRESULT ReadPostHeader(ISequentialInStream *inStream, CItem &item); - UInt64 GetOffset() const { return m_Position; } -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipItem.h b/desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipItem.h deleted file mode 100644 index 50eaef8a8..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipItem.h +++ /dev/null @@ -1,59 +0,0 @@ -// Archive/GZipItem.h - -#ifndef __ARCHIVE_GZIP_ITEM_H -#define __ARCHIVE_GZIP_ITEM_H - -#include "Common/Types.h" -#include "Common/MyString.h" -#include "Common/Buffer.h" - -namespace NArchive { -namespace NGZip { - -class CItem -{ -private: - bool TestFlag(Byte flag) const { return ((Flags & flag) != 0); } -public: - Byte CompressionMethod; - Byte Flags; - UInt32 Time; - Byte ExtraFlags; - Byte HostOS; - UInt32 FileCRC; - UInt32 UnPackSize32; - - AString Name; - AString Comment; - CByteBuffer Extra; - - bool IsText() const - { return TestFlag(NFileHeader::NFlags::kDataIsText); } - bool HeaderCRCIsPresent() const - { return TestFlag(NFileHeader::NFlags::kHeaderCRCIsPresent); } - bool ExtraFieldIsPresent() const - { return TestFlag(NFileHeader::NFlags::kExtraIsPresent); } - bool NameIsPresent() const - { return TestFlag(NFileHeader::NFlags::kNameIsPresent); } - bool CommentIsPresent() const - { return TestFlag(NFileHeader::NFlags::kComentIsPresent); } - - void SetNameIsPresentFlag(bool nameIsPresent) - { - if (nameIsPresent) - Flags |= NFileHeader::NFlags::kNameIsPresent; - else - Flags &= (~NFileHeader::NFlags::kNameIsPresent); - } - - void Clear() - { - Name.Empty(); - Comment.Empty();; - Extra.SetCapacity(0); - } -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipRegister.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipRegister.cpp deleted file mode 100644 index 0c1065088..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipRegister.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// GZipRegister.cpp - -#include "StdAfx.h" - -#include "../../Common/RegisterArc.h" - -#include "GZipHandler.h" -static IInArchive *CreateArc() { return new NArchive::NGZip::CHandler; } -#ifndef EXTRACT_ONLY -static IOutArchive *CreateArcOut() { return new NArchive::NGZip::CHandler; } -#else -#define CreateArcOut 0 -#endif - -static CArcInfo g_ArcInfo = - { L"GZip", L"gz gzip tgz tpz", L"* * .tar .tar", 0xEF, { 0x1F, 0x8B, 8 }, 3, true, CreateArc, CreateArcOut }; - -REGISTER_ARC(GZip) diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipUpdate.h b/desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipUpdate.h deleted file mode 100644 index 59115ba2d..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/GZip/GZipUpdate.h +++ /dev/null @@ -1,39 +0,0 @@ -// GZip/Update.h - -#ifndef __GZIP_UPDATE_H -#define __GZIP_UPDATE_H - -#include "../IArchive.h" - -#include "../../Common/CreateCoder.h" - -#ifndef EXTRACT_ONLY -#include "GZipOut.h" -#endif -#include "GZipItem.h" - -namespace NArchive { -namespace NGZip { - -struct CCompressionMethodMode -{ - UInt32 NumPasses; - UInt32 NumFastBytes; - UInt32 Algo; - bool NumMatchFinderCyclesDefined; - UInt32 NumMatchFinderCycles; -}; - -HRESULT UpdateArchive( - DECL_EXTERNAL_CODECS_LOC_VARS - IInStream *inStream, - UInt64 unpackSize, - ISequentialOutStream *outStream, - const CItem &newItem, - const CCompressionMethodMode &compressionMethod, - int indexInClient, - IArchiveUpdateCallback *updateCallback); - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/GZip/StdAfx.h b/desmume/src/windows/7z/CPP/7zip/Archive/GZip/StdAfx.h deleted file mode 100644 index 83fdd22d5..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/GZip/StdAfx.h +++ /dev/null @@ -1,8 +0,0 @@ -// StdAfx.h - -#ifndef __STDAFX_H -#define __STDAFX_H - -#include "../../../Common/MyWindows.h" - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/IArchive.h b/desmume/src/windows/7z/CPP/7zip/Archive/IArchive.h deleted file mode 100644 index 2ab476324..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/IArchive.h +++ /dev/null @@ -1,237 +0,0 @@ -// IArchive.h - -#ifndef __IARCHIVE_H -#define __IARCHIVE_H - -#include "../IStream.h" -#include "../IProgress.h" -#include "../PropID.h" - -#define ARCHIVE_INTERFACE_SUB(i, base, x) DECL_INTERFACE_SUB(i, base, 6, x) -#define ARCHIVE_INTERFACE(i, x) ARCHIVE_INTERFACE_SUB(i, IUnknown, x) - -namespace NFileTimeType -{ - enum EEnum - { - kWindows, - kUnix, - kDOS - }; -} - -namespace NArchive -{ - enum - { - kName = 0, - kClassID, - kExtension, - kAddExtension, - kUpdate, - kKeepName, - kStartSignature, - kFinishSignature, - kAssociate - }; - - namespace NExtract - { - namespace NAskMode - { - enum - { - kExtract = 0, - kTest, - kSkip - }; - } - namespace NOperationResult - { - enum - { - kOK = 0, - kUnSupportedMethod, - kDataError, - kCRCError - }; - } - } - namespace NUpdate - { - namespace NOperationResult - { - enum - { - kOK = 0, - kError - }; - } - } -} - -#define INTERFACE_IArchiveOpenCallback(x) \ - STDMETHOD(SetTotal)(const UInt64 *files, const UInt64 *bytes) x; \ - STDMETHOD(SetCompleted)(const UInt64 *files, const UInt64 *bytes) x; \ - -ARCHIVE_INTERFACE(IArchiveOpenCallback, 0x10) -{ - INTERFACE_IArchiveOpenCallback(PURE); -}; - - -#define INTERFACE_IArchiveExtractCallback(x) \ - INTERFACE_IProgress(x) \ - /* GetStream OUT: S_OK - OK, S_FALSE - skeep this file */ \ - STDMETHOD(GetStream)(UInt32 index, ISequentialOutStream **outStream, Int32 askExtractMode) x; \ - STDMETHOD(PrepareOperation)(Int32 askExtractMode) x; \ - STDMETHOD(SetOperationResult)(Int32 resultEOperationResult) x; \ - -ARCHIVE_INTERFACE_SUB(IArchiveExtractCallback, IProgress, 0x20) -{ - INTERFACE_IArchiveExtractCallback(PURE) -}; - - -#define INTERFACE_IArchiveOpenVolumeCallback(x) \ - STDMETHOD(GetProperty)(PROPID propID, PROPVARIANT *value) x; \ - STDMETHOD(GetStream)(const wchar_t *name, IInStream **inStream) x; \ - -ARCHIVE_INTERFACE(IArchiveOpenVolumeCallback, 0x30) -{ - INTERFACE_IArchiveOpenVolumeCallback(PURE); -}; - - -ARCHIVE_INTERFACE(IInArchiveGetStream, 0x40) -{ - STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream) PURE; -}; - - -ARCHIVE_INTERFACE(IArchiveOpenSetSubArchiveName, 0x50) -{ - STDMETHOD(SetSubArchiveName)(const wchar_t *name) PURE; -}; - - -/* -IInArchive::Extract: - indices must be sorted - numItems = 0xFFFFFFFF means "all files" - testMode != 0 means "test files without writing to outStream" -*/ - -#define INTERFACE_IInArchive(x) \ - STDMETHOD(Open)(IInStream *stream, const UInt64 *maxCheckStartPosition, IArchiveOpenCallback *openArchiveCallback) x; \ - STDMETHOD(Close)() x; \ - STDMETHOD(GetNumberOfItems)(UInt32 *numItems) x; \ - STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value) x; \ - STDMETHOD(Extract)(const UInt32* indices, UInt32 numItems, Int32 testMode, IArchiveExtractCallback *extractCallback) x; \ - STDMETHOD(GetArchiveProperty)(PROPID propID, PROPVARIANT *value) x; \ - STDMETHOD(GetNumberOfProperties)(UInt32 *numProperties) x; \ - STDMETHOD(GetPropertyInfo)(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) x; \ - STDMETHOD(GetNumberOfArchiveProperties)(UInt32 *numProperties) x; \ - STDMETHOD(GetArchivePropertyInfo)(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) x; - -ARCHIVE_INTERFACE(IInArchive, 0x60) -{ - INTERFACE_IInArchive(PURE) - virtual ~IInArchive() {} -}; - - -#define INTERFACE_IArchiveUpdateCallback(x) \ - INTERFACE_IProgress(x); \ - STDMETHOD(GetUpdateItemInfo)(UInt32 index, \ - Int32 *newData, /*1 - new data, 0 - old data */ \ - Int32 *newProperties, /* 1 - new properties, 0 - old properties */ \ - UInt32 *indexInArchive /* -1 if there is no in archive, or if doesn't matter */ \ - ) x; \ - STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value) x; \ - STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **inStream) x; \ - STDMETHOD(SetOperationResult)(Int32 operationResult) x; \ - -ARCHIVE_INTERFACE_SUB(IArchiveUpdateCallback, IProgress, 0x80) -{ - INTERFACE_IArchiveUpdateCallback(PURE); -}; - -#define INTERFACE_IArchiveUpdateCallback2(x) \ - INTERFACE_IArchiveUpdateCallback(x) \ - STDMETHOD(GetVolumeSize)(UInt32 index, UInt64 *size) x; \ - STDMETHOD(GetVolumeStream)(UInt32 index, ISequentialOutStream **volumeStream) x; \ - -ARCHIVE_INTERFACE_SUB(IArchiveUpdateCallback2, IArchiveUpdateCallback, 0x82) -{ - INTERFACE_IArchiveUpdateCallback2(PURE); -}; - - -#ifndef EXTRACT_ONLY -#define INTERFACE_IOutArchive(x) \ - STDMETHOD(UpdateItems)(ISequentialOutStream *outStream, UInt32 numItems, IArchiveUpdateCallback *updateCallback) x; \ - STDMETHOD(GetFileTimeType)(UInt32 *type) x; -#else -#define INTERFACE_IOutArchive(x) -#endif - -ARCHIVE_INTERFACE(IOutArchive, 0xA0) -{ -#ifndef EXTRACT_ONLY - INTERFACE_IOutArchive(PURE) -#endif -}; - - -ARCHIVE_INTERFACE(ISetProperties, 0x03) -{ -#ifndef EXTRACT_ONLY - STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties) PURE; -#endif -}; - - -#define IMP_IInArchive_GetProp(k) \ - (UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) \ - { if(index >= sizeof(k) / sizeof(k[0])) return E_INVALIDARG; \ - const STATPROPSTG &srcItem = k[index]; \ - *propID = srcItem.propid; *varType = srcItem.vt; *name = 0; return S_OK; } \ - -#define IMP_IInArchive_GetProp_WITH_NAME(k) \ - (UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) \ - { if(index >= sizeof(k) / sizeof(k[0])) return E_INVALIDARG; \ - const STATPROPSTG &srcItem = k[index]; \ - *propID = srcItem.propid; *varType = srcItem.vt; \ - if (srcItem.lpwstrName == 0) *name = 0; else *name = ::SysAllocString(srcItem.lpwstrName); return S_OK; } \ - -#define IMP_IInArchive_Props \ - STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 *numProperties) \ - { *numProperties = sizeof(kProps) / sizeof(kProps[0]); return S_OK; } \ - STDMETHODIMP CHandler::GetPropertyInfo IMP_IInArchive_GetProp(kProps) - -#define IMP_IInArchive_Props_WITH_NAME \ - STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 *numProperties) \ - { *numProperties = sizeof(kProps) / sizeof(kProps[0]); return S_OK; } \ - STDMETHODIMP CHandler::GetPropertyInfo IMP_IInArchive_GetProp_WITH_NAME(kProps) - - -#define IMP_IInArchive_ArcProps \ - STDMETHODIMP CHandler::GetNumberOfArchiveProperties(UInt32 *numProperties) \ - { *numProperties = sizeof(kArcProps) / sizeof(kArcProps[0]); return S_OK; } \ - STDMETHODIMP CHandler::GetArchivePropertyInfo IMP_IInArchive_GetProp(kArcProps) - -#define IMP_IInArchive_ArcProps_WITH_NAME \ - STDMETHODIMP CHandler::GetNumberOfArchiveProperties(UInt32 *numProperties) \ - { *numProperties = sizeof(kArcProps) / sizeof(kArcProps[0]); return S_OK; } \ - STDMETHODIMP CHandler::GetArchivePropertyInfo IMP_IInArchive_GetProp_WITH_NAME(kArcProps) - -#define IMP_IInArchive_ArcProps_NO \ - STDMETHODIMP CHandler::GetNumberOfArchiveProperties(UInt32 *numProperties) \ - { *numProperties = 0; return S_OK; } \ - STDMETHODIMP CHandler::GetArchivePropertyInfo(UInt32, BSTR *, PROPID *, VARTYPE *) \ - { return E_NOTIMPL; } \ - STDMETHODIMP CHandler::GetArchiveProperty(PROPID, PROPVARIANT *value) \ - { value->vt = VT_EMPTY; return S_OK; } - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhCRC.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhCRC.cpp deleted file mode 100644 index 0afeb7102..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhCRC.cpp +++ /dev/null @@ -1,43 +0,0 @@ -// LzhCRC.cpp - -#include "StdAfx.h" - -#include "LzhCRC.h" - -namespace NArchive { -namespace NLzh { - -static const UInt16 kCRCPoly = 0xA001; - -UInt16 CCRC::Table[256]; - -void CCRC::InitTable() -{ - for (UInt32 i = 0; i < 256; i++) - { - UInt32 r = i; - for (int j = 0; j < 8; j++) - if (r & 1) - r = (r >> 1) ^ kCRCPoly; - else - r >>= 1; - CCRC::Table[i] = (UInt16)r; - } -} - -class CCRCTableInit -{ -public: - CCRCTableInit() { CCRC::InitTable(); } -} g_CRCTableInit; - -void CCRC::Update(const void *data, size_t size) -{ - UInt16 v = _value; - const Byte *p = (const Byte *)data; - for (; size > 0; size--, p++) - v = (UInt16)(Table[((Byte)(v)) ^ *p] ^ (v >> 8)); - _value = v; -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhCRC.h b/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhCRC.h deleted file mode 100644 index aaa647baf..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhCRC.h +++ /dev/null @@ -1,27 +0,0 @@ -// LzhCRC.h - -#ifndef __LZH_CRC_H -#define __LZH_CRC_H - -#include -#include "Common/Types.h" - -namespace NArchive { -namespace NLzh { - -class CCRC -{ - UInt16 _value; -public: - static UInt16 Table[256]; - static void InitTable(); - - CCRC(): _value(0){}; - void Init() { _value = 0; } - void Update(const void *data, size_t size); - UInt16 GetDigest() const { return _value; } -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhHandler.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhHandler.cpp deleted file mode 100644 index b15ffd1bc..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhHandler.cpp +++ /dev/null @@ -1,387 +0,0 @@ -// LzhHandler.cpp - -#include "StdAfx.h" - -#include "Common/ComTry.h" -#include "Common/Defs.h" -#include "Common/StringConvert.h" - -#include "Windows/PropVariant.h" -#include "Windows/Time.h" - -#include "LzhHandler.h" -#include "LzhOutStreamWithCRC.h" - -#include "../../ICoder.h" - -#include "../../Common/LimitedStreams.h" -#include "../../Common/ProgressUtils.h" - -#include "../../Compress/CopyCoder.h" -#include "../../Compress/LzhDecoder.h" - -#include "../Common/ItemNameUtils.h" - -using namespace NWindows; -using namespace NTime; - -namespace NArchive { -namespace NLzh{ - -struct COsPair -{ - Byte Id; - const wchar_t *Name; -}; - -COsPair g_OsPairs[] = -{ - { 'M', L"MS-DOS" }, - { '2', L"OS/2" }, - { '9', L"OS9" }, - { 'K', L"OS/68K" }, - { '3', L"OS/386" }, - { 'H', L"HUMAN" }, - { 'U', L"UNIX" }, - { 'C', L"CP/M" }, - { 'F', L"FLEX" }, - { 'm', L"Mac" }, - { 'R', L"Runser" }, - { 'T', L"TownsOS" }, - { 'X', L"XOSK" }, - { 'w', L"Windows95" }, - { 'W', L"WindowsNT" }, - { 0, L"MS-DOS" }, - { 'J', L"Java VM" } -}; - -const wchar_t *kUnknownOS = L"Unknown"; - -const int kNumHostOSes = sizeof(g_OsPairs) / sizeof(g_OsPairs[0]); - -static const wchar_t *GetOS(Byte osId) -{ - for (int i = 0; i < kNumHostOSes; i++) - if (g_OsPairs[i].Id == osId) - return g_OsPairs[i].Name; - return kUnknownOS; -}; - -STATPROPSTG kProps[] = -{ - { NULL, kpidPath, VT_BSTR}, - { NULL, kpidIsDir, VT_BOOL}, - { NULL, kpidSize, VT_UI8}, - { NULL, kpidPackSize, VT_UI8}, - { NULL, kpidMTime, VT_FILETIME}, - { NULL, kpidAttrib, VT_UI4}, - - // { NULL, kpidCommented, VT_BOOL}, - - { NULL, kpidCRC, VT_UI4}, - - { NULL, kpidMethod, VT_UI1}, - { NULL, kpidHostOS, VT_BSTR} - -}; - -IMP_IInArchive_Props -IMP_IInArchive_ArcProps_NO - -CHandler::CHandler() {} - -STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems) -{ - *numItems = _items.Size(); - return S_OK; -} - -STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value) -{ - COM_TRY_BEGIN - NWindows::NCOM::CPropVariant prop; - const CItemEx &item = _items[index]; - switch(propID) - { - case kpidPath: - { - UString s = NItemName::WinNameToOSName(MultiByteToUnicodeString(item.GetName(), CP_OEMCP)); - if (!s.IsEmpty()) - { - if (s[s.Length() - 1] == WCHAR_PATH_SEPARATOR) - s.Delete(s.Length() - 1); - prop = s; - } - break; - } - case kpidIsDir: prop = item.IsDir(); break; - case kpidSize: prop = item.Size; break; - case kpidPackSize: prop = item.PackSize; break; - case kpidCRC: prop = (UInt32)item.CRC; break; - case kpidHostOS: prop = GetOS(item.OsId); break; - case kpidMTime: - { - FILETIME utcFileTime; - UInt32 unixTime; - if (item.GetUnixTime(unixTime)) - NTime::UnixTimeToFileTime(unixTime, utcFileTime); - else - { - FILETIME localFileTime; - if (DosTimeToFileTime(item.ModifiedTime, localFileTime)) - { - if (!LocalFileTimeToFileTime(&localFileTime, &utcFileTime)) - utcFileTime.dwHighDateTime = utcFileTime.dwLowDateTime = 0; - } - else - utcFileTime.dwHighDateTime = utcFileTime.dwLowDateTime = 0; - } - prop = utcFileTime; - break; - } - /* - case kpidAttrib: prop = (UInt32)item.Attributes; break; - case kpidCommented: prop = item.IsCommented(); break; - */ - case kpidMethod: - { - wchar_t method2[kMethodIdSize + 1]; - method2[kMethodIdSize] = 0; - for (int i = 0; i < kMethodIdSize; i++) - method2[i] = item.Method[i]; - prop = method2; - break; - } - } - prop.Detach(value); - return S_OK; - COM_TRY_END -} - -/* -class CProgressImp: public CProgressVirt -{ -public: - CMyComPtr Callback; - STDMETHOD(SetCompleted)(const UInt64 *numFiles); -}; - -STDMETHODIMP CProgressImp::SetCompleted(const UInt64 *numFiles) -{ - if (Callback) - return Callback->SetCompleted(numFiles, NULL); - return S_OK; -} -*/ - -STDMETHODIMP CHandler::Open(IInStream *stream, - const UInt64 * /* maxCheckStartPosition */, IArchiveOpenCallback *callback) -{ - COM_TRY_BEGIN - try - { - _items.Clear(); - CInArchive archive; - - UInt64 endPos = 0; - bool needSetTotal = true; - - if (callback != NULL) - { - RINOK(stream->Seek(0, STREAM_SEEK_END, &endPos)); - RINOK(stream->Seek(0, STREAM_SEEK_SET, NULL)); - } - - RINOK(archive.Open(stream)); - for (;;) - { - CItemEx item; - bool filled; - HRESULT result = archive.GetNextItem(filled, item); - if (result == S_FALSE) - return S_FALSE; - if (result != S_OK) - return S_FALSE; - if (!filled) - break; - _items.Add(item); - archive.Skeep(item.PackSize); - if (callback != NULL) - { - if (needSetTotal) - { - RINOK(callback->SetTotal(NULL, &endPos)); - needSetTotal = false; - } - if (_items.Size() % 100 == 0) - { - UInt64 numFiles = _items.Size(); - UInt64 numBytes = item.DataPosition; - RINOK(callback->SetCompleted(&numFiles, &numBytes)); - } - } - } - if (_items.IsEmpty()) - return S_FALSE; - - _stream = stream; - } - catch(...) - { - return S_FALSE; - } - COM_TRY_END - return S_OK; -} - -STDMETHODIMP CHandler::Close() -{ - _items.Clear(); - _stream.Release(); - return S_OK; -} - - - -////////////////////////////////////// -// CHandler::DecompressItems - -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 testModeSpec, IArchiveExtractCallback *extractCallback) -{ - COM_TRY_BEGIN - bool testMode = (testModeSpec != 0); - UInt64 totalUnPacked = 0, totalPacked = 0; - bool allFilesMode = (numItems == UInt32(-1)); - if (allFilesMode) - numItems = _items.Size(); - if(numItems == 0) - return S_OK; - UInt32 i; - for(i = 0; i < numItems; i++) - { - const CItemEx &item = _items[allFilesMode ? i : indices[i]]; - totalUnPacked += item.Size; - totalPacked += item.PackSize; - } - extractCallback->SetTotal(totalUnPacked); - - UInt64 currentTotalUnPacked = 0, currentTotalPacked = 0; - UInt64 currentItemUnPacked, currentItemPacked; - - NCompress::NLzh::NDecoder::CCoder *lzhDecoderSpec = 0; - CMyComPtr lzhDecoder; - CMyComPtr lzh1Decoder; - CMyComPtr arj2Decoder; - - NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder(); - CMyComPtr copyCoder = copyCoderSpec; - - CLocalProgress *lps = new CLocalProgress; - CMyComPtr progress = lps; - lps->Init(extractCallback, false); - - CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream; - CMyComPtr inStream(streamSpec); - streamSpec->SetStream(_stream); - - for(i = 0; i < numItems; i++, currentTotalUnPacked += currentItemUnPacked, - currentTotalPacked += currentItemPacked) - { - currentItemUnPacked = 0; - currentItemPacked = 0; - - lps->InSize = currentTotalPacked; - lps->OutSize = currentTotalUnPacked; - RINOK(lps->SetCur()); - - CMyComPtr realOutStream; - Int32 askMode; - askMode = testMode ? NExtract::NAskMode::kTest : - NExtract::NAskMode::kExtract; - Int32 index = allFilesMode ? i : indices[i]; - const CItemEx &item = _items[index]; - RINOK(extractCallback->GetStream(index, &realOutStream, askMode)); - - if (item.IsDir()) - { - // if (!testMode) - { - RINOK(extractCallback->PrepareOperation(askMode)); - RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK)); - } - continue; - } - - if (!testMode && (!realOutStream)) - continue; - - RINOK(extractCallback->PrepareOperation(askMode)); - currentItemUnPacked = item.Size; - currentItemPacked = item.PackSize; - - { - COutStreamWithCRC *outStreamSpec = new COutStreamWithCRC; - CMyComPtr outStream(outStreamSpec); - outStreamSpec->Init(realOutStream); - realOutStream.Release(); - - UInt64 pos; - _stream->Seek(item.DataPosition, STREAM_SEEK_SET, &pos); - - streamSpec->Init(item.PackSize); - - HRESULT result = S_OK; - Int32 opRes = NExtract::NOperationResult::kOK; - - if (item.IsCopyMethod()) - { - result = copyCoder->Code(inStream, outStream, NULL, NULL, progress); - if (result == S_OK && copyCoderSpec->TotalSize != item.PackSize) - result = S_FALSE; - } - else if (item.IsLh4GroupMethod()) - { - if (!lzhDecoder) - { - lzhDecoderSpec = new NCompress::NLzh::NDecoder::CCoder; - lzhDecoder = lzhDecoderSpec; - } - lzhDecoderSpec->SetDictionary(item.GetNumDictBits()); - result = lzhDecoder->Code(inStream, outStream, NULL, ¤tItemUnPacked, progress); - } - /* - else if (item.IsLh1GroupMethod()) - { - if (!lzh1Decoder) - { - lzh1DecoderSpec = new NCompress::NLzh1::NDecoder::CCoder; - lzh1Decoder = lzh1DecoderSpec; - } - lzh1DecoderSpec->SetDictionary(item.GetNumDictBits()); - result = lzh1Decoder->Code(inStream, outStream, NULL, ¤tItemUnPacked, progress); - } - */ - else - opRes = NExtract::NOperationResult::kUnSupportedMethod; - - if (opRes == NExtract::NOperationResult::kOK) - { - if (result == S_FALSE) - opRes = NExtract::NOperationResult::kDataError; - else - { - RINOK(result); - if (outStreamSpec->GetCRC() != item.CRC) - opRes = NExtract::NOperationResult::kCRCError; - } - } - outStream.Release(); - RINOK(extractCallback->SetOperationResult(opRes)); - } - } - return S_OK; - COM_TRY_END -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhHandler.h b/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhHandler.h deleted file mode 100644 index 6d31df534..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhHandler.h +++ /dev/null @@ -1,30 +0,0 @@ -// LzhHandler.h - -#ifndef __LZH_HANDLER_H -#define __LZH_HANDLER_H - -#include "Common/MyCom.h" -#include "../IArchive.h" -#include "LzhIn.h" - -namespace NArchive { -namespace NLzh { - -class CHandler: - public IInArchive, - public CMyUnknownImp -{ -public: - MY_UNKNOWN_IMP1(IInArchive) - - INTERFACE_IInArchive(;) - - CHandler(); -private: - CObjectVector _items; - CMyComPtr _stream; -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhHeader.h b/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhHeader.h deleted file mode 100644 index 1c758a14b..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhHeader.h +++ /dev/null @@ -1,19 +0,0 @@ -// Archive/Lzh/Header.h - -#ifndef __ARCHIVE_LZH_HEADER_H -#define __ARCHIVE_LZH_HEADER_H - -#include "Common/Types.h" - -namespace NArchive { -namespace NLzh { - -const int kMethodIdSize = 5; - -const Byte kExtIdFileName = 0x01; -const Byte kExtIdDirName = 0x02; -const Byte kExtIdUnixTime = 0x54; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhIn.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhIn.cpp deleted file mode 100644 index 56b62a943..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhIn.cpp +++ /dev/null @@ -1,172 +0,0 @@ -// Archive/LzhIn.cpp - -#include "StdAfx.h" - -#include "Common/StringConvert.h" -#include "Common/Buffer.h" - -#include "../../Common/StreamUtils.h" - -#include "LzhIn.h" - -namespace NArchive { -namespace NLzh { - -HRESULT CInArchive::ReadBytes(void *data, UInt32 size, UInt32 &processedSize) -{ - size_t realProcessedSize = size; - RINOK(ReadStream(m_Stream, data, &realProcessedSize)); - processedSize = (UInt32)realProcessedSize; - m_Position += processedSize; - return S_OK; -} - -HRESULT CInArchive::CheckReadBytes(void *data, UInt32 size) -{ - UInt32 processedSize; - RINOK(ReadBytes(data, size, processedSize)); - return (processedSize == size) ? S_OK: S_FALSE; -} - -HRESULT CInArchive::Open(IInStream *inStream) -{ - RINOK(inStream->Seek(0, STREAM_SEEK_CUR, &m_Position)); - m_Stream = inStream; - return S_OK; -} - -static const Byte *ReadUInt32(const Byte *p, UInt32 &v) -{ - v = 0; - for (int i = 0; i < 4; i++) - v |= ((UInt32)(*p++) << (i * 8)); - return p; -} - -static const Byte *ReadUInt16(const Byte *p, UInt16 &v) -{ - v = 0; - for (int i = 0; i < 2; i++) - v |= ((UInt16)(*p++) << (i * 8)); - return p; -} - -static const Byte *ReadString(const Byte *p, size_t size, AString &s) -{ - s.Empty(); - for (size_t i = 0; i < size; i++) - { - char c = p[i]; - if (c == 0) - break; - s += c; - } - return p + size; -} - -static Byte CalcSum(const Byte *data, size_t size) -{ - Byte sum = 0; - for (size_t i = 0; i < size; i++) - sum = (Byte)(sum + data[i]); - return sum; -} - -HRESULT CInArchive::GetNextItem(bool &filled, CItemEx &item) -{ - filled = false; - - UInt32 processedSize; - Byte startHeader[2]; - RINOK(ReadBytes(startHeader, 2, processedSize)) - if (processedSize == 0) - return S_OK; - if (processedSize == 1) - return (startHeader[0] == 0) ? S_OK: S_FALSE; - if (startHeader[0] == 0 && startHeader[1] == 0) - return S_OK; - - Byte header[256]; - const UInt32 kBasicPartSize = 22; - RINOK(ReadBytes(header, kBasicPartSize, processedSize)); - if (processedSize != kBasicPartSize) - return (startHeader[0] == 0) ? S_OK: S_FALSE; - - const Byte *p = header; - memmove(item.Method, p, kMethodIdSize); - if (!item.IsValidMethod()) - return S_OK; - p += kMethodIdSize; - p = ReadUInt32(p, item.PackSize); - p = ReadUInt32(p, item.Size); - p = ReadUInt32(p, item.ModifiedTime); - item.Attributes = *p++; - item.Level = *p++; - if (item.Level > 2) - return S_FALSE; - UInt32 headerSize; - if (item.Level < 2) - { - headerSize = startHeader[0]; - if (headerSize < kBasicPartSize) - return S_FALSE; - UInt32 remain = headerSize - kBasicPartSize; - RINOK(CheckReadBytes(header + kBasicPartSize, remain)); - if (startHeader[1] != CalcSum(header, headerSize)) - return S_FALSE; - size_t nameLength = *p++; - if ((p - header) + nameLength + 2 > headerSize) - return S_FALSE; - p = ReadString(p, nameLength, item.Name); - } - else - headerSize = startHeader[0] | ((UInt32)startHeader[1] << 8); - p = ReadUInt16(p, item.CRC); - if (item.Level != 0) - { - if (item.Level == 2) - { - RINOK(CheckReadBytes(header + kBasicPartSize, 2)); - } - if ((size_t)(p - header) + 3 > headerSize) - return S_FALSE; - item.OsId = *p++; - UInt16 nextSize; - p = ReadUInt16(p, nextSize); - while (nextSize != 0) - { - if (nextSize < 3) - return S_FALSE; - if (item.Level == 1) - { - if (item.PackSize < nextSize) - return S_FALSE; - item.PackSize -= nextSize; - } - CExtension ext; - RINOK(CheckReadBytes(&ext.Type, 1)) - nextSize -= 3; - ext.Data.SetCapacity(nextSize); - RINOK(CheckReadBytes((Byte *)ext.Data, nextSize)) - item.Extensions.Add(ext); - Byte hdr2[2]; - RINOK(CheckReadBytes(hdr2, 2)); - ReadUInt16(hdr2, nextSize); - } - } - item.DataPosition = m_Position; - filled = true; - return S_OK; -} - -HRESULT CInArchive::Skeep(UInt64 numBytes) -{ - UInt64 newPostion; - RINOK(m_Stream->Seek(numBytes, STREAM_SEEK_CUR, &newPostion)); - m_Position += numBytes; - if (m_Position != newPostion) - return E_FAIL; - return S_OK; -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhIn.h b/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhIn.h deleted file mode 100644 index a8c639801..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhIn.h +++ /dev/null @@ -1,29 +0,0 @@ -// Archive/LzhIn.h - -#ifndef __ARCHIVE_LZHIN_H -#define __ARCHIVE_LZHIN_H - -#include "Common/MyCom.h" -#include "../../IStream.h" - -#include "LzhItem.h" - -namespace NArchive { -namespace NLzh { - -class CInArchive -{ - CMyComPtr m_Stream; - UInt64 m_Position; - - HRESULT ReadBytes(void *data, UInt32 size, UInt32 &processedSize); - HRESULT CheckReadBytes(void *data, UInt32 size); -public: - HRESULT Open(IInStream *inStream); - HRESULT GetNextItem(bool &filled, CItemEx &itemInfo); - HRESULT Skeep(UInt64 numBytes); -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhItem.h b/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhItem.h deleted file mode 100644 index ca85a5153..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhItem.h +++ /dev/null @@ -1,172 +0,0 @@ -// Archive/LzhItem.h - -#ifndef __ARCHIVE_LZH_ITEM_H -#define __ARCHIVE_LZH_ITEM_H - -#include "Common/Types.h" -#include "Common/MyString.h" -#include "Common/Buffer.h" -#include "LzhHeader.h" - -namespace NArchive { -namespace NLzh { - -struct CExtension -{ - Byte Type; - CByteBuffer Data; - AString GetString() const - { - AString s; - for (size_t i = 0; i < Data.GetCapacity(); i++) - { - char c = (char)Data[i]; - if (c == 0) - break; - s += c; - } - return s; - } -}; - -struct CItem -{ -public: - AString Name; - Byte Method[kMethodIdSize]; - UInt32 PackSize; - UInt32 Size; - UInt32 ModifiedTime; - Byte Attributes; - Byte Level; - UInt16 CRC; - Byte OsId; - CObjectVector Extensions; - - bool IsValidMethod() const { return (Method[0] == '-' && Method[1] == 'l' && Method[4] == '-'); } - bool IsLhMethod() const {return (IsValidMethod() && Method[2] == 'h'); } - bool IsDir() const {return (IsLhMethod() && Method[3] == 'd'); } - - bool IsCopyMethod() const - { - return (IsLhMethod() && Method[3] == '0') || - (IsValidMethod() && Method[2] == 'z' && Method[3] == '4'); - } - - bool IsLh1GroupMethod() const - { - if (!IsLhMethod()) - return false; - switch(Method[3]) - { - case '1': - return true; - } - return false; - } - - bool IsLh4GroupMethod() const - { - if (!IsLhMethod()) - return false; - switch(Method[3]) - { - case '4': - case '5': - case '6': - case '7': - return true; - } - return false; - } - - int GetNumDictBits() const - { - if (!IsLhMethod()) - return 0; - switch(Method[3]) - { - case '1': - return 12; - case '2': - return 13; - case '3': - return 13; - case '4': - return 12; - case '5': - return 13; - case '6': - return 15; - case '7': - return 16; - } - return 0; - } - - int FindExt(Byte type) const - { - for (int i = 0; i < Extensions.Size(); i++) - if (Extensions[i].Type == type) - return i; - return -1; - } - bool GetUnixTime(UInt32 &value) const - { - int index = FindExt(kExtIdUnixTime); - if (index < 0) - { - if (Level == 2) - { - value = ModifiedTime; - return true; - } - return false; - } - const Byte *data = (const Byte *)(Extensions[index].Data); - value = data[0] | - ((UInt32)data[1] << 8) | - ((UInt32)data[2] << 16) | - ((UInt32)data[3] << 24); - return true; - } - - AString GetDirName() const - { - int index = FindExt(kExtIdDirName); - if (index < 0) - return AString(); - return Extensions[index].GetString(); - } - - AString GetFileName() const - { - int index = FindExt(kExtIdFileName); - if (index < 0) - return Name; - return Extensions[index].GetString(); - } - - AString GetName() const - { - AString dirName = GetDirName(); - dirName.Replace((char)(unsigned char)0xFF, '\\'); - if (!dirName.IsEmpty()) - { - char c = dirName[dirName.Length() - 1]; - if (c != '\\') - dirName += '\\'; - } - return dirName + GetFileName(); - } -}; - -class CItemEx: public CItem -{ -public: - UInt64 DataPosition; -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhOutStreamWithCRC.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhOutStreamWithCRC.cpp deleted file mode 100644 index 3cd632aa7..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhOutStreamWithCRC.cpp +++ /dev/null @@ -1,27 +0,0 @@ -// LzhOutStreamWithCRC.cpp - -#include "StdAfx.h" - -#include "LzhOutStreamWithCRC.h" - -namespace NArchive { -namespace NLzh { - -STDMETHODIMP COutStreamWithCRC::Write(const void *data, UInt32 size, UInt32 *processedSize) -{ - UInt32 realProcessedSize; - HRESULT result; - if(!_stream) - { - realProcessedSize = size; - result = S_OK; - } - else - result = _stream->Write(data, size, &realProcessedSize); - _crc.Update(data, realProcessedSize); - if(processedSize != NULL) - *processedSize = realProcessedSize; - return result; -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhOutStreamWithCRC.h b/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhOutStreamWithCRC.h deleted file mode 100644 index eee15d0e2..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhOutStreamWithCRC.h +++ /dev/null @@ -1,38 +0,0 @@ -// LzhOutStreamWithCRC.h - -#ifndef __LZHOUTSTREAMWITHCRC_H -#define __LZHOUTSTREAMWITHCRC_H - -#include "LzhCRC.h" -#include "../../../Common/MyCom.h" -#include "../../IStream.h" - -namespace NArchive { -namespace NLzh { - -class COutStreamWithCRC: - public ISequentialOutStream, - public CMyUnknownImp -{ -public: - MY_UNKNOWN_IMP - - STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); -private: - CCRC _crc; - CMyComPtr _stream; -public: - void Init(ISequentialOutStream *stream) - { - _stream = stream; - _crc.Init(); - } - void ReleaseStream() { _stream.Release(); } - UInt32 GetCRC() const { return _crc.GetDigest(); } - void InitCRC() { _crc.Init(); } - -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhRegister.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhRegister.cpp deleted file mode 100644 index b83d2ee6c..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/LzhRegister.cpp +++ /dev/null @@ -1,13 +0,0 @@ -// LzhRegister.cpp - -#include "StdAfx.h" - -#include "../../Common/RegisterArc.h" - -#include "LzhHandler.h" -static IInArchive *CreateArc() { return new NArchive::NLzh::CHandler; } - -static CArcInfo g_ArcInfo = - { L"Lzh", L"lzh lha", 0, 6, { '-', 'l' }, 2, false, CreateArc, 0 }; - -REGISTER_ARC(Lzh) diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/StdAfx.h b/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/StdAfx.h deleted file mode 100644 index 83fdd22d5..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Lzh/StdAfx.h +++ /dev/null @@ -1,8 +0,0 @@ -// StdAfx.h - -#ifndef __STDAFX_H -#define __STDAFX_H - -#include "../../../Common/MyWindows.h" - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaArcRegister.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaArcRegister.cpp deleted file mode 100644 index 867bc78ff..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaArcRegister.cpp +++ /dev/null @@ -1,14 +0,0 @@ -// LzmaArcRegister.cpp - -#include "StdAfx.h" - -#include "../../Common/RegisterArc.h" - -#include "LzmaHandler.h" - -static IInArchive *CreateArc() { return new NArchive::NLzma::CHandler; } - -static CArcInfo g_ArcInfo = - { L"Lzma", L"lzma lzma86", 0, 0xA, {0 }, 0, true, CreateArc, NULL }; - -REGISTER_ARC(Lzma) diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaFiltersDecode.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaFiltersDecode.cpp deleted file mode 100644 index 2ab3dbf4b..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaFiltersDecode.cpp +++ /dev/null @@ -1,86 +0,0 @@ -// LzmaFiltersDecode.cpp - -#include "StdAfx.h" - -#include "LzmaFiltersDecode.h" - -namespace NArchive { -namespace NLzma { - -static const UInt64 k_LZMA = 0x030101; -static const UInt64 k_BCJ = 0x03030103; - -HRESULT CDecoder::Code( - DECL_EXTERNAL_CODECS_LOC_VARS - const CHeader &block, - ISequentialInStream *inStream, ISequentialOutStream *outStream, - UInt64 *inProcessedSize, ICompressProgressInfo *progress) -{ - *inProcessedSize = (UInt64)(Int64)-1; - - if (block.FilterMethod > 1) - return E_NOTIMPL; - - if (!_lzmaDecoder) - { - RINOK(CreateCoder(EXTERNAL_CODECS_LOC_VARS k_LZMA, _lzmaDecoder, false)); - if (_lzmaDecoder == 0) - return E_NOTIMPL; - } - - { - CMyComPtr setDecoderProperties; - _lzmaDecoder.QueryInterface(IID_ICompressSetDecoderProperties2, &setDecoderProperties); - if (!setDecoderProperties) - return E_NOTIMPL; - RINOK(setDecoderProperties->SetDecoderProperties2(block.LzmaProps, 5)); - } - - bool filteredMode = (block.FilterMethod == 1); - - CMyComPtr setOutStream; - - if (filteredMode) - { - if (!_bcjStream) - { - CMyComPtr coder; - RINOK(CreateCoder(EXTERNAL_CODECS_LOC_VARS k_BCJ, coder, false)); - if (!coder) - return E_NOTIMPL; - coder.QueryInterface(IID_ISequentialOutStream, &_bcjStream); - if (!_bcjStream) - return E_NOTIMPL; - } - - _bcjStream.QueryInterface(IID_ICompressSetOutStream, &setOutStream); - if (!setOutStream) - return E_NOTIMPL; - RINOK(setOutStream->SetOutStream(outStream)); - outStream = _bcjStream; - } - - const UInt64 *unpackSize = block.HasUnpackSize() ? &block.UnpackSize : NULL; - RINOK(_lzmaDecoder->Code(inStream, outStream, NULL, unpackSize, progress)); - - if (filteredMode) - { - CMyComPtr flush; - _bcjStream.QueryInterface(IID_IOutStreamFlush, &flush); - if (flush) - { - RINOK(flush->Flush()); - } - RINOK(setOutStream->ReleaseOutStream()); - } - - CMyComPtr getInStreamProcessedSize; - _lzmaDecoder.QueryInterface(IID_ICompressGetInStreamProcessedSize, &getInStreamProcessedSize); - if (getInStreamProcessedSize) - { - RINOK(getInStreamProcessedSize->GetInStreamProcessedSize(inProcessedSize)); - } - return S_OK; -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaFiltersDecode.h b/desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaFiltersDecode.h deleted file mode 100644 index b966b422a..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaFiltersDecode.h +++ /dev/null @@ -1,26 +0,0 @@ -// LzmaFiltersDecode.h - -#ifndef __LZMA_FILTERS_DECODE_H -#define __LZMA_FILTERS_DECODE_H - -#include "../../Common/CreateCoder.h" - -#include "LzmaItem.h" - -namespace NArchive { -namespace NLzma { - -class CDecoder -{ - CMyComPtr _lzmaDecoder; - CMyComPtr _bcjStream; -public: - HRESULT Code(DECL_EXTERNAL_CODECS_LOC_VARS - const CHeader &block, - ISequentialInStream *inStream, ISequentialOutStream *outStream, - UInt64 *inProcessedSize, ICompressProgressInfo *progress); -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaHandler.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaHandler.cpp deleted file mode 100644 index 249fd90fa..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaHandler.cpp +++ /dev/null @@ -1,243 +0,0 @@ -// LzmaHandler.cpp - -#include "StdAfx.h" - -#include "LzmaHandler.h" - -#include "Common/Defs.h" -#include "Common/StringConvert.h" -#include "Common/ComTry.h" -#include "Common/IntToString.h" - -#include "Windows/PropVariant.h" - -#include "../../Common/ProgressUtils.h" -#include "../../Common/StreamUtils.h" -#include "../Common/DummyOutStream.h" - -#include "LzmaFiltersDecode.h" - -namespace NArchive { -namespace NLzma { - -STATPROPSTG kProps[] = -{ - { NULL, kpidSize, VT_UI8}, - { NULL, kpidPackSize, VT_UI8}, - { NULL, kpidMethod, VT_UI1} -}; - -IMP_IInArchive_Props -IMP_IInArchive_ArcProps_NO - -STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems) -{ - *numItems = 1; - return S_OK; -} - -static void ConvertUInt32ToString(UInt32 value, wchar_t *s) -{ - ConvertUInt64ToString(value, s + MyStringLen(s)); -} - -static void DictSizeToString(UInt32 value, wchar_t *s) -{ - for (int i = 0; i <= 31; i++) - if ((UInt32(1) << i) == value) - { - ConvertUInt32ToString(i, s); - return; - } - wchar_t c = L'b'; - if ((value & ((1 << 20) - 1)) == 0) - { - value >>= 20; - c = L'm'; - } - else if ((value & ((1 << 10) - 1)) == 0) - { - value >>= 10; - c = L'k'; - } - ConvertUInt32ToString(value, s); - int p = MyStringLen(s); - s[p++] = c; - s[p++] = L'\0'; -} - -static void MyStrCat(wchar_t *d, const wchar_t *s) -{ - MyStringCopy(d + MyStringLen(d), s); -} - -STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value) -{ - if (index != 0) - return E_INVALIDARG; - NWindows::NCOM::CPropVariant propVariant; - switch(propID) - { - case kpidSize: - if (m_StreamInfo.HasUnpackSize()) - propVariant = (UInt64)m_StreamInfo.UnpackSize; - break; - case kpidPackSize: - propVariant = (UInt64)m_PackSize; - break; - case kpidMethod: - { - wchar_t s[64]; - s[0] = '\0'; - if (m_StreamInfo.IsThereFilter) - { - const wchar_t *f; - if (m_StreamInfo.FilterMethod == 0) - f = L"Copy"; - else if (m_StreamInfo.FilterMethod == 1) - f = L"BCJ"; - else - f = L"Unknown"; - MyStrCat(s, f); - MyStrCat(s, L" "); - } - MyStrCat(s, L"LZMA:"); - DictSizeToString(m_StreamInfo.GetDicSize(), s); - propVariant = s; - break; - } - } - propVariant.Detach(value); - return S_OK; -} - -STDMETHODIMP CHandler::Open(IInStream *inStream, - const UInt64 * /* maxCheckStartPosition */, - IArchiveOpenCallback * /* openArchiveCallback */) -{ - { - RINOK(inStream->Seek(0, STREAM_SEEK_CUR, &m_StreamStartPosition)); - - HRESULT res = ReadStreamHeader(inStream, m_StreamInfo); - if (res != S_OK) - return S_FALSE; - - Byte b; - RINOK(ReadStream_FALSE(inStream, &b, 1)); - if (b != 0) - return S_FALSE; - - UInt64 endPos; - RINOK(inStream->Seek(0, STREAM_SEEK_END, &endPos)); - m_PackSize = endPos - m_StreamStartPosition - m_StreamInfo.GetHeaderSize(); - - m_Stream = inStream; - } - return S_OK; -} - -STDMETHODIMP CHandler::Close() -{ - m_Stream.Release(); - return S_OK; -} - - -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) -{ - COM_TRY_BEGIN - bool allFilesMode = (numItems == UInt32(-1)); - if (!allFilesMode) - { - if (numItems == 0) - return S_OK; - if (numItems != 1) - return E_INVALIDARG; - if (indices[0] != 0) - return E_INVALIDARG; - } - - bool testMode = (_aTestMode != 0); - - RINOK(extractCallback->SetTotal(m_PackSize)); - - UInt64 currentTotalPacked = 0; - - CDummyOutStream *outStreamSpec = new CDummyOutStream; - CMyComPtr outStream(outStreamSpec); - - { - CMyComPtr realOutStream; - Int32 askMode = testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; - - RINOK(extractCallback->GetStream(0, &realOutStream, askMode)); - - outStreamSpec->SetStream(realOutStream); - outStreamSpec->Init(); - if(!testMode && !realOutStream) - return S_OK; - extractCallback->PrepareOperation(askMode); - } - - CLocalProgress *lps = new CLocalProgress; - CMyComPtr progress = lps; - lps->Init(extractCallback, true); - - CDecoder decoder; - RINOK(m_Stream->Seek(m_StreamStartPosition, STREAM_SEEK_SET, NULL)); - UInt64 streamPos = m_StreamStartPosition; - Int32 opRes = NArchive::NExtract::NOperationResult::kOK; - bool firstItem = true; - for (;;) - { - CHeader st; - HRESULT result = ReadStreamHeader(m_Stream, st); - if (result != S_OK) - { - if (firstItem) - return E_FAIL; - break; - } - firstItem = false; - - lps->OutSize = outStreamSpec->GetSize(); - lps->InSize = currentTotalPacked; - RINOK(lps->SetCur()); - - streamPos += st.GetHeaderSize(); - UInt64 packProcessed; - - { - result = decoder.Code( - EXTERNAL_CODECS_VARS - st, m_Stream, outStream, &packProcessed, progress); - if (result == E_NOTIMPL) - { - opRes = NArchive::NExtract::NOperationResult::kUnSupportedMethod; - break; - } - if (result == S_FALSE) - { - opRes = NArchive::NExtract::NOperationResult::kDataError; - break; - } - RINOK(result); - } - - if (packProcessed == (UInt64)(Int64)-1) - break; - RINOK(m_Stream->Seek(streamPos + packProcessed, STREAM_SEEK_SET, NULL)); - currentTotalPacked += packProcessed; - streamPos += packProcessed; - } - outStream.Release(); - return extractCallback->SetOperationResult(opRes); - COM_TRY_END -} - -IMPL_ISetCompressCodecsInfo - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaHandler.h b/desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaHandler.h deleted file mode 100644 index bbf11a46b..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaHandler.h +++ /dev/null @@ -1,69 +0,0 @@ -// Lzma/Handler.h - -#ifndef __GZIP_HANDLER_H -#define __GZIP_HANDLER_H - -#include "Common/MyCom.h" - -#include "../IArchive.h" -#include "../../Common/CreateCoder.h" - -#include "LzmaIn.h" - -namespace NArchive { -namespace NLzma { - -// const UInt64 k_LZMA = 0x030101; - -class CHandler: - public IInArchive, - PUBLIC_ISetCompressCodecsInfo - public CMyUnknownImp -{ -public: - MY_QUERYINTERFACE_BEGIN - MY_QUERYINTERFACE_ENTRY(IInArchive) - QUERY_ENTRY_ISetCompressCodecsInfo - MY_QUERYINTERFACE_END - MY_ADDREF_RELEASE - - STDMETHOD(Open)(IInStream *inStream, - const UInt64 *maxCheckStartPosition, - IArchiveOpenCallback *openArchiveCallback); - STDMETHOD(Close)(); - - STDMETHOD(GetNumberOfItems)(UInt32 *numItems); - STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value); - STDMETHOD(Extract)(const UInt32* indices, UInt32 numItems, - Int32 testMode, IArchiveExtractCallback *extractCallback); - - STDMETHOD(GetArchiveProperty)(PROPID propID, PROPVARIANT *value); - - STDMETHOD(GetNumberOfProperties)(UInt32 *numProperties); - STDMETHOD(GetPropertyInfo)(UInt32 index, - BSTR *name, PROPID *propID, VARTYPE *varType); - - STDMETHOD(GetNumberOfArchiveProperties)(UInt32 *numProperties); - STDMETHOD(GetArchivePropertyInfo)(UInt32 index, - BSTR *name, PROPID *propID, VARTYPE *varType); - - UString GetMethodString(); -public: - CHandler() { } - -private: - CHeader m_StreamInfo; - UInt64 m_StreamStartPosition; - UInt64 m_PackSize; - - CMyComPtr m_Stream; - - DECL_EXTERNAL_CODECS_VARS - - DECL_ISetCompressCodecsInfo - -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaIn.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaIn.cpp deleted file mode 100644 index 7d2475c75..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaIn.cpp +++ /dev/null @@ -1,56 +0,0 @@ -// Archive/LzmaIn.cpp - -#include "StdAfx.h" - -#include "LzmaIn.h" - -#include "../../Common/StreamUtils.h" - -namespace NArchive { -namespace NLzma { - -static bool CheckDictSize(const Byte *p) -{ - UInt32 dicSize = GetUi32(p); - int i; - for (i = 1; i <= 30; i++) - if (dicSize == ((UInt32)2 << i) || dicSize == ((UInt32)3 << i)) - return true; - return false; -} - -HRESULT ReadStreamHeader(ISequentialInStream *inStream, CHeader &block) -{ - Byte sig[5 + 9]; - RINOK(ReadStream_FALSE(inStream, sig, 5 + 8)); - - const Byte kMaxProp0Val = 5 * 5 * 9 - 1; - if (sig[0] > kMaxProp0Val) - return S_FALSE; - - for (int i = 0; i < 5; i++) - block.LzmaProps[i] = sig[i]; - - block.IsThereFilter = false; - block.FilterMethod = 0; - - if (!CheckDictSize(sig + 1)) - { - if (sig[0] > 1 || sig[1] > kMaxProp0Val) - return S_FALSE; - block.IsThereFilter = true; - block.FilterMethod = sig[0]; - for (int i = 0; i < 5; i++) - block.LzmaProps[i] = sig[i + 1]; - if (!CheckDictSize(block.LzmaProps + 1)) - return S_FALSE; - RINOK(ReadStream_FALSE(inStream, sig + 5 + 8, 1)); - } - UInt32 unpOffset = 5 + (block.IsThereFilter ? 1 : 0); - block.UnpackSize = GetUi64(sig + unpOffset); - if (block.HasUnpackSize() && block.UnpackSize >= ((UInt64)1 << 56)) - return S_FALSE; - return S_OK; -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaIn.h b/desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaIn.h deleted file mode 100644 index 6f5c24c0e..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaIn.h +++ /dev/null @@ -1,16 +0,0 @@ -// Archive/LzmaIn.h - -#ifndef __ARCHIVE_LZMA_IN_H -#define __ARCHIVE_LZMA_IN_H - -#include "LzmaItem.h" -#include "../../IStream.h" - -namespace NArchive { -namespace NLzma { - -HRESULT ReadStreamHeader(ISequentialInStream *inStream, CHeader &st); - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaItem.h b/desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaItem.h deleted file mode 100644 index 1bfadf727..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Lzma/LzmaItem.h +++ /dev/null @@ -1,27 +0,0 @@ -// Archive/LzmaItem.h - -#ifndef __ARCHIVE_LZMA_ITEM_H -#define __ARCHIVE_LZMA_ITEM_H - -#include "Common/Types.h" - -#include "../../../../C/CpuArch.h" - -namespace NArchive { -namespace NLzma { - -struct CHeader -{ - UInt64 UnpackSize; - bool IsThereFilter; - Byte FilterMethod; - Byte LzmaProps[5]; - - UInt32 GetDicSize() const { return GetUi32(LzmaProps + 1); } - bool HasUnpackSize() const { return (UnpackSize != (UInt64)(Int64)-1); } - unsigned GetHeaderSize() const { return 5 + 8 + (IsThereFilter ? 1 : 0); } -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Lzma/StdAfx.h b/desmume/src/windows/7z/CPP/7zip/Archive/Lzma/StdAfx.h deleted file mode 100644 index 83fdd22d5..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Lzma/StdAfx.h +++ /dev/null @@ -1,8 +0,0 @@ -// StdAfx.h - -#ifndef __STDAFX_H -#define __STDAFX_H - -#include "../../../Common/MyWindows.h" - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarHandler.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarHandler.cpp deleted file mode 100644 index 3bd17b6db..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarHandler.cpp +++ /dev/null @@ -1,835 +0,0 @@ -// RarHandler.cpp - -#include "StdAfx.h" - -#include "Common/ComTry.h" -#include "Common/IntToString.h" -#include "Common/StringConvert.h" - -#include "Windows/PropVariant.h" -#include "Windows/Time.h" - -#include "../../IPassword.h" - -#include "../../Common/CreateCoder.h" -#include "../../Common/FilterCoder.h" -#include "../../Common/MethodId.h" -#include "../../Common/ProgressUtils.h" - -#include "../../Compress/CopyCoder.h" - -#include "../../Crypto/Rar20Crypto.h" -#include "../../Crypto/RarAes.h" - -#include "../Common/ItemNameUtils.h" -#include "../Common/OutStreamWithCRC.h" - -#include "RarHandler.h" - -using namespace NWindows; -using namespace NTime; - -namespace NArchive { -namespace NRar { - -static const wchar_t *kHostOS[] = -{ - L"MS DOS", - L"OS/2", - L"Win32", - L"Unix", - L"Mac OS", - L"BeOS" -}; - -static const int kNumHostOSes = sizeof(kHostOS) / sizeof(kHostOS[0]); - -static const wchar_t *kUnknownOS = L"Unknown"; - -STATPROPSTG kProps[] = -{ - { NULL, kpidPath, VT_BSTR}, - { NULL, kpidIsDir, VT_BOOL}, - { NULL, kpidSize, VT_UI8}, - { NULL, kpidPackSize, VT_UI8}, - { NULL, kpidMTime, VT_FILETIME}, - { NULL, kpidCTime, VT_FILETIME}, - { NULL, kpidATime, VT_FILETIME}, - { NULL, kpidAttrib, VT_UI4}, - - { NULL, kpidEncrypted, VT_BOOL}, - { NULL, kpidSolid, VT_BOOL}, - { NULL, kpidCommented, VT_BOOL}, - { NULL, kpidSplitBefore, VT_BOOL}, - { NULL, kpidSplitAfter, VT_BOOL}, - { NULL, kpidCRC, VT_UI4}, - { NULL, kpidHostOS, VT_BSTR}, - { NULL, kpidMethod, VT_BSTR}, - { NULL, kpidUnpackVer, VT_UI1} -}; - -STATPROPSTG kArcProps[] = -{ - { NULL, kpidSolid, VT_BOOL}, - { NULL, kpidNumBlocks, VT_UI4}, - // { NULL, kpidEncrypted, VT_BOOL}, - { NULL, kpidIsVolume, VT_BOOL}, - { NULL, kpidNumVolumes, VT_UI4}, - { NULL, kpidPhySize, VT_UI8} - // { NULL, kpidCommented, VT_BOOL} -}; - -IMP_IInArchive_Props -IMP_IInArchive_ArcProps - -UInt64 CHandler::GetPackSize(int refIndex) const -{ - const CRefItem &refItem = _refItems[refIndex]; - UInt64 totalPackSize = 0; - for (int i = 0; i < refItem.NumItems; i++) - totalPackSize += _items[refItem.ItemIndex + i].PackSize; - return totalPackSize; -} - -STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value) -{ - // COM_TRY_BEGIN - NWindows::NCOM::CPropVariant prop; - switch(propID) - { - case kpidSolid: prop = _archiveInfo.IsSolid(); break; - // case kpidEncrypted: prop = _archiveInfo.IsEncrypted(); break; // it's for encrypted names. - case kpidIsVolume: prop = _archiveInfo.IsVolume(); break; - case kpidNumVolumes: prop = (UInt32)_archives.Size(); break; - case kpidOffset: if (_archiveInfo.StartPosition != 0) prop = _archiveInfo.StartPosition; break; - // case kpidCommented: prop = _archiveInfo.IsCommented(); break; - case kpidNumBlocks: - { - UInt32 numBlocks = 0; - for (int i = 0; i < _refItems.Size(); i++) - if (!IsSolid(i)) - numBlocks++; - prop = (UInt32)numBlocks; - break; - } - } - prop.Detach(value); - return S_OK; - // COM_TRY_END -} - -STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems) -{ - *numItems = _refItems.Size(); - return S_OK; -} - -static bool RarTimeToFileTime(const CRarTime &rarTime, FILETIME &result) -{ - if (!DosTimeToFileTime(rarTime.DosTime, result)) - return false; - UInt64 value = (((UInt64)result.dwHighDateTime) << 32) + result.dwLowDateTime; - value += (UInt64)rarTime.LowSecond * 10000000; - value += ((UInt64)rarTime.SubTime[2] << 16) + - ((UInt64)rarTime.SubTime[1] << 8) + - ((UInt64)rarTime.SubTime[0]); - result.dwLowDateTime = (DWORD)value; - result.dwHighDateTime = DWORD(value >> 32); - return true; -} - -static void RarTimeToProp(const CRarTime &rarTime, NWindows::NCOM::CPropVariant &prop) -{ - FILETIME localFileTime, utcFileTime; - if (RarTimeToFileTime(rarTime, localFileTime)) - { - if (!LocalFileTimeToFileTime(&localFileTime, &utcFileTime)) - utcFileTime.dwHighDateTime = utcFileTime.dwLowDateTime = 0; - } - else - utcFileTime.dwHighDateTime = utcFileTime.dwLowDateTime = 0; - prop = utcFileTime; -} - -STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value) -{ - COM_TRY_BEGIN - NWindows::NCOM::CPropVariant prop; - const CRefItem &refItem = _refItems[index]; - const CItemEx &item = _items[refItem.ItemIndex]; - switch(propID) - { - case kpidPath: - { - UString u; - if (item.HasUnicodeName() && !item.UnicodeName.IsEmpty()) - u = item.UnicodeName; - else - u = MultiByteToUnicodeString(item.Name, CP_OEMCP); - prop = (const wchar_t *)NItemName::WinNameToOSName(u); - break; - } - case kpidIsDir: prop = item.IsDir(); break; - case kpidSize: prop = item.Size; break; - case kpidPackSize: prop = GetPackSize(index); break; - case kpidMTime: RarTimeToProp(item.MTime, prop); break; - case kpidCTime: if (item.CTimeDefined) RarTimeToProp(item.CTime, prop); break; - case kpidATime: if (item.ATimeDefined) RarTimeToProp(item.ATime, prop); break; - case kpidAttrib: prop = item.GetWinAttributes(); break; - case kpidEncrypted: prop = item.IsEncrypted(); break; - case kpidSolid: prop = IsSolid(index); break; - case kpidCommented: prop = item.IsCommented(); break; - case kpidSplitBefore: prop = item.IsSplitBefore(); break; - case kpidSplitAfter: prop = _items[refItem.ItemIndex + refItem.NumItems - 1].IsSplitAfter(); break; - case kpidCRC: - { - const CItemEx &lastItem = _items[refItem.ItemIndex + refItem.NumItems - 1]; - prop = ((lastItem.IsSplitAfter()) ? item.FileCRC : lastItem.FileCRC); - break; - } - case kpidUnpackVer: prop = item.UnPackVersion; break; - case kpidMethod: - { - UString method; - if (item.Method >= Byte('0') && item.Method <= Byte('5')) - { - method = L"m"; - wchar_t temp[32]; - ConvertUInt64ToString(item.Method - Byte('0'), temp); - method += temp; - if (!item.IsDir()) - { - method += L":"; - ConvertUInt64ToString(16 + item.GetDictSize(), temp); - method += temp; - } - } - else - { - wchar_t temp[32]; - ConvertUInt64ToString(item.Method, temp); - method += temp; - } - prop = method; - break; - } - case kpidHostOS: prop = (item.HostOS < kNumHostOSes) ? (kHostOS[item.HostOS]) : kUnknownOS; break; - } - prop.Detach(value); - return S_OK; - COM_TRY_END -} - -class CVolumeName -{ - bool _first; - bool _newStyle; - UString _unchangedPart; - UString _changedPart; - UString _afterPart; -public: - CVolumeName(): _newStyle(true) {}; - - bool InitName(const UString &name, bool newStyle) - { - _first = true; - _newStyle = newStyle; - int dotPos = name.ReverseFind('.'); - UString basePart = name; - if (dotPos >= 0) - { - UString ext = name.Mid(dotPos + 1); - if (ext.CompareNoCase(L"rar") == 0) - { - _afterPart = name.Mid(dotPos); - basePart = name.Left(dotPos); - } - else if (ext.CompareNoCase(L"exe") == 0) - { - _afterPart = L".rar"; - basePart = name.Left(dotPos); - } - else if (!_newStyle) - { - if (ext.CompareNoCase(L"000") == 0 || ext.CompareNoCase(L"001") == 0) - { - _afterPart.Empty(); - _first = false; - _changedPart = ext; - _unchangedPart = name.Left(dotPos + 1); - return true; - } - } - } - - if (!_newStyle) - { - _afterPart.Empty(); - _unchangedPart = basePart + UString(L"."); - _changedPart = L"r00"; - return true; - } - - int numLetters = 1; - if (basePart.Right(numLetters) == L"1" || basePart.Right(numLetters) == L"0") - { - while (numLetters < basePart.Length()) - { - if (basePart[basePart.Length() - numLetters - 1] != '0') - break; - numLetters++; - } - } - else - return false; - _unchangedPart = basePart.Left(basePart.Length() - numLetters); - _changedPart = basePart.Right(numLetters); - return true; - } - - UString GetNextName() - { - UString newName; - if (_newStyle || !_first) - { - int i; - int numLetters = _changedPart.Length(); - for (i = numLetters - 1; i >= 0; i--) - { - wchar_t c = _changedPart[i]; - if (c == L'9') - { - c = L'0'; - newName = c + newName; - if (i == 0) - newName = UString(L'1') + newName; - continue; - } - c++; - newName = UString(c) + newName; - i--; - for (; i >= 0; i--) - newName = _changedPart[i] + newName; - break; - } - _changedPart = newName; - } - _first = false; - return _unchangedPart + _changedPart + _afterPart; - } -}; - -HRESULT CHandler::Open2(IInStream *stream, - const UInt64 *maxCheckStartPosition, - IArchiveOpenCallback *openArchiveCallback) -{ - { - CMyComPtr openVolumeCallback; - CMyComPtr getTextPassword; - CMyComPtr openArchiveCallbackWrap = openArchiveCallback; - - CVolumeName seqName; - - UInt64 totalBytes = 0; - UInt64 curBytes = 0; - - if (openArchiveCallback != NULL) - { - openArchiveCallbackWrap.QueryInterface(IID_IArchiveOpenVolumeCallback, &openVolumeCallback); - openArchiveCallbackWrap.QueryInterface(IID_ICryptoGetTextPassword, &getTextPassword); - } - - for (;;) - { - CMyComPtr inStream; - if (!_archives.IsEmpty()) - { - if (!openVolumeCallback) - break; - - if(_archives.Size() == 1) - { - if (!_archiveInfo.IsVolume()) - break; - UString baseName; - { - NCOM::CPropVariant prop; - RINOK(openVolumeCallback->GetProperty(kpidName, &prop)); - if (prop.vt != VT_BSTR) - break; - baseName = prop.bstrVal; - } - seqName.InitName(baseName, _archiveInfo.HaveNewVolumeName()); - } - - UString fullName = seqName.GetNextName(); - HRESULT result = openVolumeCallback->GetStream(fullName, &inStream); - if (result == S_FALSE) - break; - if (result != S_OK) - return result; - if (!stream) - break; - } - else - inStream = stream; - - UInt64 endPos = 0; - if (openArchiveCallback != NULL) - { - RINOK(stream->Seek(0, STREAM_SEEK_END, &endPos)); - RINOK(stream->Seek(0, STREAM_SEEK_SET, NULL)); - totalBytes += endPos; - RINOK(openArchiveCallback->SetTotal(NULL, &totalBytes)); - } - - NArchive::NRar::CInArchive archive; - RINOK(archive.Open(inStream, maxCheckStartPosition)); - - if (_archives.IsEmpty()) - archive.GetArchiveInfo(_archiveInfo); - - CItemEx item; - for (;;) - { - HRESULT result = archive.GetNextItem(item, getTextPassword); - if (result == S_FALSE) - break; - RINOK(result); - if (item.IgnoreItem()) - continue; - - bool needAdd = true; - if (item.IsSplitBefore()) - { - if (!_refItems.IsEmpty()) - { - CRefItem &refItem = _refItems.Back(); - refItem.NumItems++; - needAdd = false; - } - } - if (needAdd) - { - CRefItem refItem; - refItem.ItemIndex = _items.Size(); - refItem.NumItems = 1; - refItem.VolumeIndex = _archives.Size(); - _refItems.Add(refItem); - } - _items.Add(item); - if (openArchiveCallback != NULL && _items.Size() % 100 == 0) - { - UInt64 numFiles = _items.Size(); - UInt64 numBytes = curBytes + item.Position; - RINOK(openArchiveCallback->SetCompleted(&numFiles, &numBytes)); - } - } - curBytes += endPos; - _archives.Add(archive); - } - } - return S_OK; -} - -STDMETHODIMP CHandler::Open(IInStream *stream, - const UInt64 *maxCheckStartPosition, - IArchiveOpenCallback *openArchiveCallback) -{ - COM_TRY_BEGIN - Close(); - try - { - HRESULT res = Open2(stream, maxCheckStartPosition, openArchiveCallback); - if (res != S_OK) - Close(); - return res; - } - catch(const CInArchiveException &) { Close(); return S_FALSE; } - catch(...) { Close(); throw; } - COM_TRY_END -} - -STDMETHODIMP CHandler::Close() -{ - COM_TRY_BEGIN - _refItems.Clear(); - _items.Clear(); - _archives.Clear(); - return S_OK; - COM_TRY_END -} - -struct CMethodItem -{ - Byte RarUnPackVersion; - CMyComPtr Coder; -}; - - -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *_anExtractCallback) -{ - COM_TRY_BEGIN - CMyComPtr getTextPassword; - bool testMode = (_aTestMode != 0); - CMyComPtr extractCallback = _anExtractCallback; - UInt64 censoredTotalUnPacked = 0, - // censoredTotalPacked = 0, - importantTotalUnPacked = 0; - // importantTotalPacked = 0; - bool allFilesMode = (numItems == UInt32(-1)); - if (allFilesMode) - numItems = _refItems.Size(); - if(numItems == 0) - return S_OK; - int lastIndex = 0; - CRecordVector importantIndexes; - CRecordVector extractStatuses; - - for(UInt32 t = 0; t < numItems; t++) - { - int index = allFilesMode ? t : indices[t]; - const CRefItem &refItem = _refItems[index]; - const CItemEx &item = _items[refItem.ItemIndex]; - censoredTotalUnPacked += item.Size; - // censoredTotalPacked += item.PackSize; - int j; - for(j = lastIndex; j <= index; j++) - // if(!_items[_refItems[j].ItemIndex].IsSolid()) - if(!IsSolid(j)) - lastIndex = j; - for(j = lastIndex; j <= index; j++) - { - const CRefItem &refItem = _refItems[j]; - const CItemEx &item = _items[refItem.ItemIndex]; - - // const CItemEx &item = _items[j]; - - importantTotalUnPacked += item.Size; - // importantTotalPacked += item.PackSize; - importantIndexes.Add(j); - extractStatuses.Add(j == index); - } - lastIndex = index + 1; - } - - extractCallback->SetTotal(importantTotalUnPacked); - UInt64 currentImportantTotalUnPacked = 0; - UInt64 currentImportantTotalPacked = 0; - UInt64 currentUnPackSize, currentPackSize; - - CObjectVector methodItems; - - NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder; - CMyComPtr copyCoder = copyCoderSpec; - - CFilterCoder *filterStreamSpec = new CFilterCoder; - CMyComPtr filterStream = filterStreamSpec; - - NCrypto::NRar20::CDecoder *rar20CryptoDecoderSpec = NULL; - CMyComPtr rar20CryptoDecoder; - NCrypto::NRar29::CDecoder *rar29CryptoDecoderSpec = NULL; - CMyComPtr rar29CryptoDecoder; - - CFolderInStream *folderInStreamSpec = NULL; - CMyComPtr folderInStream; - - CLocalProgress *lps = new CLocalProgress; - CMyComPtr progress = lps; - lps->Init(extractCallback, false); - - bool solidStart = true; - for(int i = 0; i < importantIndexes.Size(); i++, - currentImportantTotalUnPacked += currentUnPackSize, - currentImportantTotalPacked += currentPackSize) - { - lps->InSize = currentImportantTotalPacked; - lps->OutSize = currentImportantTotalUnPacked; - RINOK(lps->SetCur()); - CMyComPtr realOutStream; - - Int32 askMode; - if(extractStatuses[i]) - askMode = testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; - else - askMode = NArchive::NExtract::NAskMode::kSkip; - - UInt32 index = importantIndexes[i]; - - const CRefItem &refItem = _refItems[index]; - const CItemEx &item = _items[refItem.ItemIndex]; - - currentUnPackSize = item.Size; - - currentPackSize = GetPackSize(index); - - if(item.IgnoreItem()) - continue; - - RINOK(extractCallback->GetStream(index, &realOutStream, askMode)); - - if (!IsSolid(index)) - solidStart = true; - if(item.IsDir()) - { - RINOK(extractCallback->PrepareOperation(askMode)); - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK)); - continue; - } - - bool mustBeProcessedAnywhere = false; - if(i < importantIndexes.Size() - 1) - { - // const CRefItem &nextRefItem = _refItems[importantIndexes[i + 1]]; - // const CItemEx &nextItemInfo = _items[nextRefItem.ItemIndex]; - // mustBeProcessedAnywhere = nextItemInfo.IsSolid(); - mustBeProcessedAnywhere = IsSolid(importantIndexes[i + 1]); - } - - if (!mustBeProcessedAnywhere && !testMode && !realOutStream) - continue; - - if (!realOutStream && !testMode) - askMode = NArchive::NExtract::NAskMode::kSkip; - - RINOK(extractCallback->PrepareOperation(askMode)); - - COutStreamWithCRC *outStreamSpec = new COutStreamWithCRC; - CMyComPtr outStream(outStreamSpec); - outStreamSpec->SetStream(realOutStream); - outStreamSpec->Init(); - realOutStream.Release(); - - /* - for (int partIndex = 0; partIndex < 1; partIndex++) - { - CMyComPtr inStream; - - // item redefinition - const CItemEx &item = _items[refItem.ItemIndex + partIndex]; - - NArchive::NRar::CInArchive &archive = _archives[refItem.VolumeIndex + partIndex]; - - inStream.Attach(archive.CreateLimitedStream(item.GetDataPosition(), - item.PackSize)); - */ - if (!folderInStream) - { - folderInStreamSpec = new CFolderInStream; - folderInStream = folderInStreamSpec; - } - - folderInStreamSpec->Init(&_archives, &_items, refItem); - - UInt64 packSize = currentPackSize; - - // packedPos += item.PackSize; - // unpackedPos += 0; - - CMyComPtr inStream; - if (item.IsEncrypted()) - { - CMyComPtr cryptoSetPassword; - if (item.UnPackVersion >= 29) - { - if (!rar29CryptoDecoder) - { - rar29CryptoDecoderSpec = new NCrypto::NRar29::CDecoder; - rar29CryptoDecoder = rar29CryptoDecoderSpec; - // RINOK(rar29CryptoDecoder.CoCreateInstance(CLSID_CCryptoRar29Decoder)); - } - rar29CryptoDecoderSpec->SetRar350Mode(item.UnPackVersion < 36); - CMyComPtr cryptoProperties; - RINOK(rar29CryptoDecoder.QueryInterface(IID_ICompressSetDecoderProperties2, - &cryptoProperties)); - RINOK(cryptoProperties->SetDecoderProperties2(item.Salt, item.HasSalt() ? sizeof(item.Salt) : 0)); - filterStreamSpec->Filter = rar29CryptoDecoder; - } - else if (item.UnPackVersion >= 20) - { - if (!rar20CryptoDecoder) - { - rar20CryptoDecoderSpec = new NCrypto::NRar20::CDecoder; - rar20CryptoDecoder = rar20CryptoDecoderSpec; - // RINOK(rar20CryptoDecoder.CoCreateInstance(CLSID_CCryptoRar20Decoder)); - } - filterStreamSpec->Filter = rar20CryptoDecoder; - } - else - { - outStream.Release(); - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kUnSupportedMethod)); - continue; - } - RINOK(filterStreamSpec->Filter.QueryInterface(IID_ICryptoSetPassword, - &cryptoSetPassword)); - - if (!getTextPassword) - extractCallback.QueryInterface(IID_ICryptoGetTextPassword, - &getTextPassword); - if (getTextPassword) - { - CMyComBSTR password; - RINOK(getTextPassword->CryptoGetTextPassword(&password)); - if (item.UnPackVersion >= 29) - { - CByteBuffer buffer; - UString unicodePassword(password); - const UInt32 sizeInBytes = unicodePassword.Length() * 2; - buffer.SetCapacity(sizeInBytes); - for (int i = 0; i < unicodePassword.Length(); i++) - { - wchar_t c = unicodePassword[i]; - ((Byte *)buffer)[i * 2] = (Byte)c; - ((Byte *)buffer)[i * 2 + 1] = (Byte)(c >> 8); - } - RINOK(cryptoSetPassword->CryptoSetPassword( - (const Byte *)buffer, sizeInBytes)); - } - else - { - AString oemPassword = UnicodeStringToMultiByte( - (const wchar_t *)password, CP_OEMCP); - RINOK(cryptoSetPassword->CryptoSetPassword( - (const Byte *)(const char *)oemPassword, oemPassword.Length())); - } - } - else - { - RINOK(cryptoSetPassword->CryptoSetPassword(0, 0)); - } - filterStreamSpec->SetInStream(folderInStream); - inStream = filterStream; - } - else - { - inStream = folderInStream; - } - CMyComPtr commonCoder; - switch(item.Method) - { - case '0': - { - commonCoder = copyCoder; - break; - } - case '1': - case '2': - case '3': - case '4': - case '5': - { - /* - if (item.UnPackVersion >= 29) - { - outStream.Release(); - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kUnSupportedMethod)); - continue; - } - */ - int m; - for (m = 0; m < methodItems.Size(); m++) - if (methodItems[m].RarUnPackVersion == item.UnPackVersion) - break; - if (m == methodItems.Size()) - { - CMethodItem mi; - mi.RarUnPackVersion = item.UnPackVersion; - - mi.Coder.Release(); - if (item.UnPackVersion <= 30) - { - UInt32 methodID = 0x040300; - if (item.UnPackVersion < 20) - methodID += 1; - else if (item.UnPackVersion < 29) - methodID += 2; - else - methodID += 3; - RINOK(CreateCoder(EXTERNAL_CODECS_VARS methodID, mi.Coder, false)); - } - - if (mi.Coder == 0) - { - outStream.Release(); - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kUnSupportedMethod)); - continue; - } - - m = methodItems.Add(mi); - } - CMyComPtr decoder = methodItems[m].Coder; - - CMyComPtr compressSetDecoderProperties; - RINOK(decoder.QueryInterface(IID_ICompressSetDecoderProperties2, - &compressSetDecoderProperties)); - - Byte isSolid = (Byte)((IsSolid(index) || item.IsSplitBefore()) ? 1: 0); - if (solidStart) - { - isSolid = false; - solidStart = false; - } - - - RINOK(compressSetDecoderProperties->SetDecoderProperties2(&isSolid, 1)); - - commonCoder = decoder; - break; - } - default: - outStream.Release(); - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kUnSupportedMethod)); - continue; - } - HRESULT result = commonCoder->Code(inStream, outStream, &packSize, &item.Size, progress); - if (item.IsEncrypted()) - filterStreamSpec->ReleaseInStream(); - if (result == S_FALSE) - { - outStream.Release(); - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kDataError)); - continue; - } - if (result != S_OK) - return result; - - /* - if (refItem.NumItems == 1 && - !item.IsSplitBefore() && !item.IsSplitAfter()) - */ - { - const CItemEx &lastItem = _items[refItem.ItemIndex + refItem.NumItems - 1]; - bool crcOK = outStreamSpec->GetCRC() == lastItem.FileCRC; - outStream.Release(); - RINOK(extractCallback->SetOperationResult(crcOK ? NArchive::NExtract::NOperationResult::kOK: - NArchive::NExtract::NOperationResult::kCRCError)); - } - /* - else - { - bool crcOK = true; - for (int partIndex = 0; partIndex < refItem.NumItems; partIndex++) - { - const CItemEx &item = _items[refItem.ItemIndex + partIndex]; - if (item.FileCRC != folderInStreamSpec->CRCs[partIndex]) - { - crcOK = false; - break; - } - } - RINOK(extractCallback->SetOperationResult(crcOK ? NArchive::NExtract::NOperationResult::kOK: - NArchive::NExtract::NOperationResult::kCRCError)); - } - */ - } - return S_OK; - COM_TRY_END -} - -IMPL_ISetCompressCodecsInfo - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarHandler.h b/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarHandler.h deleted file mode 100644 index dff8ed322..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarHandler.h +++ /dev/null @@ -1,60 +0,0 @@ -// Rar/Handler.h - -#ifndef __RAR_HANDLER_H -#define __RAR_HANDLER_H - -#include "../IArchive.h" -#include "RarIn.h" -#include "RarVolumeInStream.h" - -#include "../../Common/CreateCoder.h" - -namespace NArchive { -namespace NRar { - -class CHandler: - public IInArchive, - PUBLIC_ISetCompressCodecsInfo - public CMyUnknownImp -{ -public: - MY_QUERYINTERFACE_BEGIN2(IInArchive) - QUERY_ENTRY_ISetCompressCodecsInfo - MY_QUERYINTERFACE_END - MY_ADDREF_RELEASE - - INTERFACE_IInArchive(;) - - DECL_ISetCompressCodecsInfo - -private: - CRecordVector _refItems; - CObjectVector _items; - CObjectVector _archives; - NArchive::NRar::CInArchiveInfo _archiveInfo; - - DECL_EXTERNAL_CODECS_VARS - - UInt64 GetPackSize(int refIndex) const; - // NArchive::NRar::CInArchive _archive; - - bool IsSolid(int refIndex) - { - const CItemEx &item = _items[_refItems[refIndex].ItemIndex]; - if (item.UnPackVersion < 20) - { - if (_archiveInfo.IsSolid()) - return (refIndex > 0); - return false; - } - return item.IsSolid(); - } - - HRESULT Open2(IInStream *stream, - const UInt64 *maxCheckStartPosition, - IArchiveOpenCallback *openArchiveCallback); -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarHeader.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarHeader.cpp deleted file mode 100644 index 90dc8366f..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarHeader.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// Archive/Rar/Headers.cpp - -#include "StdAfx.h" - -#include "RarHeader.h" - -namespace NArchive{ -namespace NRar{ -namespace NHeader{ - -Byte kMarker[kMarkerSize] = {0x52 + 1, 0x61, 0x72, 0x21, 0x1a, 0x07, 0x00}; - -class CMarkerInitializer -{ -public: - CMarkerInitializer() { kMarker[0]--; }; -} g_MarkerInitializer; - -}}} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarHeader.h b/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarHeader.h deleted file mode 100644 index e5a3e1deb..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarHeader.h +++ /dev/null @@ -1,224 +0,0 @@ -// Archive/RarHeader.h - -#ifndef __ARCHIVE_RAR_HEADER_H -#define __ARCHIVE_RAR_HEADER_H - -#include "Common/Types.h" - -namespace NArchive{ -namespace NRar{ -namespace NHeader{ - -const int kMarkerSize = 7; -extern Byte kMarker[kMarkerSize]; - -const int kArchiveSolid = 0x1; - -namespace NBlockType -{ - enum EBlockType - { - kMarker = 0x72, - kArchiveHeader = 0x73, - kFileHeader = 0x74, - kCommentHeader = 0x75, - kOldAuthenticity = 0x76, - kSubBlock = 0x77, - kRecoveryRecord = 0x78, - kAuthenticity = 0x79, - - kEndOfArchive = 0x7B // Is not safe - }; -} - -namespace NArchive -{ - const UInt16 kVolume = 1; - const UInt16 kComment = 2; - const UInt16 kLock = 4; - const UInt16 kSolid = 8; - const UInt16 kNewVolName = 0x10; // ('volname.partN.rar') - const UInt16 kAuthenticity = 0x20; - const UInt16 kRecovery = 0x40; - const UInt16 kBlockEncryption = 0x80; - const UInt16 kFirstVolume = 0x100; // (set only by RAR 3.0 and later) - const UInt16 kEncryptVer = 0x200; // RAR 3.6 there is EncryptVer Byte in End of MainHeader - - const int kHeaderSizeMin = 7; - - struct CBlock - { - UInt16 CRC; - Byte Type; - UInt16 Flags; - UInt16 Size; - UInt16 Reserved1; - UInt32 Reserved2; - // UInt16 GetRealCRC() const; - }; - - const int kArchiveHeaderSize = 13; - - const int kBlockHeadersAreEncrypted = 0x80; - - struct CHeader360: public CBlock - { - Byte EncryptVersion; - bool IsEncrypted() const { return (Flags & NHeader::NArchive::kBlockEncryption) != 0; } - bool IsThereEncryptVer() const { return (Flags & NHeader::NArchive::kEncryptVer) != 0; } - bool IsEncryptOld() const { return (!IsThereEncryptVer() || EncryptVersion < 36); } - UInt32 GetBaseSize() const { return kArchiveHeaderSize + (IsEncryptOld() ? 0 : 1); } - }; -} - -namespace NFile -{ - const int kSplitBefore = 1 << 0; - const int kSplitAfter = 1 << 1; - const int kEncrypted = 1 << 2; - const int kComment = 1 << 3; - const int kSolid = 1 << 4; - - const int kDictBitStart = 5; - const int kNumDictBits = 3; - const int kDictMask = (1 << kNumDictBits) - 1; - const int kDictDirectoryValue = 0x7; - - const int kSize64Bits = 1 << 8; - const int kUnicodeName = 1 << 9; - const int kSalt = 1 << 10; - const int kOldVersion = 1 << 11; - const int kExtTime = 1 << 12; - // const int kExtFlags = 1 << 13; - // const int kSkipIfUnknown = 1 << 14; - - const int kLongBlock = 1 << 15; - - /* - struct CBlock - { - // UInt16 HeadCRC; - // Byte Type; - // UInt16 Flags; - // UInt16 HeadSize; - UInt32 PackSize; - UInt32 UnPackSize; - Byte HostOS; - UInt32 FileCRC; - UInt32 Time; - Byte UnPackVersion; - Byte Method; - UInt16 NameSize; - UInt32 Attributes; - }; - */ - - /* - struct CBlock32 - { - UInt16 HeadCRC; - Byte Type; - UInt16 Flags; - UInt16 HeadSize; - UInt32 PackSize; - UInt32 UnPackSize; - Byte HostOS; - UInt32 FileCRC; - UInt32 Time; - Byte UnPackVersion; - Byte Method; - UInt16 NameSize; - UInt32 Attributes; - UInt16 GetRealCRC(const void *aName, UInt32 aNameSize, - bool anExtraDataDefined = false, Byte *anExtraData = 0) const; - }; - struct CBlock64 - { - UInt16 HeadCRC; - Byte Type; - UInt16 Flags; - UInt16 HeadSize; - UInt32 PackSizeLow; - UInt32 UnPackSizeLow; - Byte HostOS; - UInt32 FileCRC; - UInt32 Time; - Byte UnPackVersion; - Byte Method; - UInt16 NameSize; - UInt32 Attributes; - UInt32 PackSizeHigh; - UInt32 UnPackSizeHigh; - UInt16 GetRealCRC(const void *aName, UInt32 aNameSize) const; - }; - */ - - const int kLabelFileAttribute = 0x08; - const int kWinFileDirectoryAttributeMask = 0x10; - - enum CHostOS - { - kHostMSDOS = 0, - kHostOS2 = 1, - kHostWin32 = 2, - kHostUnix = 3, - kHostMacOS = 4, - kHostBeOS = 5 - }; -} - -namespace NBlock -{ - const UInt16 kLongBlock = 1 << 15; - struct CBlock - { - UInt16 CRC; - Byte Type; - UInt16 Flags; - UInt16 HeadSize; - // UInt32 DataSize; - }; -} - -/* -struct CSubBlock -{ - UInt16 HeadCRC; - Byte HeadType; - UInt16 Flags; - UInt16 HeadSize; - UInt32 DataSize; - UInt16 SubType; - Byte Level; // Reserved : Must be 0 -}; - -struct CCommentBlock -{ - UInt16 HeadCRC; - Byte HeadType; - UInt16 Flags; - UInt16 HeadSize; - UInt16 UnpSize; - Byte UnpVer; - Byte Method; - UInt16 CommCRC; -}; - - -struct CProtectHeader -{ - UInt16 HeadCRC; - Byte HeadType; - UInt16 Flags; - UInt16 HeadSize; - UInt32 DataSize; - Byte Version; - UInt16 RecSectors; - UInt32 TotalBlocks; - Byte Mark[8]; -}; -*/ - -}}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarIn.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarIn.cpp deleted file mode 100644 index f434bce63..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarIn.cpp +++ /dev/null @@ -1,513 +0,0 @@ -// Archive/RarIn.cpp - -#include "StdAfx.h" - -#include "Common/StringConvert.h" -#include "Common/UTFConvert.h" - -#include "RarIn.h" -#include "../../Common/LimitedStreams.h" -#include "../../Common/StreamUtils.h" - -#include "../Common/FindSignature.h" - -extern "C" -{ - #include "../../../../C/7zCrc.h" -} - -namespace NArchive { -namespace NRar { - -void CInArchive::ThrowExceptionWithCode( - CInArchiveException::CCauseType cause) -{ - throw CInArchiveException(cause); -} - -HRESULT CInArchive::Open(IInStream *inStream, const UInt64 *searchHeaderSizeLimit) -{ - try - { - Close(); - HRESULT res = Open2(inStream, searchHeaderSizeLimit); - if (res == S_OK) - return res; - Close(); - return res; - } - catch(...) { Close(); throw; } -} - -void CInArchive::Close() -{ - m_Stream.Release(); -} - - -static inline bool TestMarkerCandidate(const void *aTestBytes) -{ - for (UInt32 i = 0; i < NHeader::kMarkerSize; i++) - if (((const Byte *)aTestBytes)[i] != NHeader::kMarker[i]) - return false; - return true; -} - -HRESULT CInArchive::FindAndReadMarker(IInStream *stream, const UInt64 *searchHeaderSizeLimit) -{ - RINOK(FindSignatureInStream(stream, - NHeader::kMarker, NHeader::kMarkerSize, - searchHeaderSizeLimit, m_ArchiveStartPosition)); - m_Stream = stream; - m_Position = m_ArchiveStartPosition + NHeader::kMarkerSize; - return m_Stream->Seek(m_Position, STREAM_SEEK_SET, NULL); -} - -void CInArchive::ThrowUnexpectedEndOfArchiveException() -{ - ThrowExceptionWithCode(CInArchiveException::kUnexpectedEndOfArchive); -} - -bool CInArchive::ReadBytesAndTestSize(void *data, UInt32 size) -{ - if (m_CryptoMode) - { - const Byte *bufData = (const Byte *)m_DecryptedData; - UInt32 bufSize = m_DecryptedDataSize; - UInt32 i; - for (i = 0; i < size && m_CryptoPos < bufSize; i++) - ((Byte *)data)[i] = bufData[m_CryptoPos++]; - return (i == size); - } - return (ReadStream_FALSE(m_Stream, data, size) == S_OK); -} - -void CInArchive::ReadBytesAndTestResult(void *data, UInt32 size) -{ - if(!ReadBytesAndTestSize(data,size)) - ThrowUnexpectedEndOfArchiveException(); -} - -HRESULT CInArchive::ReadBytes(void *data, UInt32 size, UInt32 *processedSize) -{ - size_t realProcessedSize = size; - HRESULT result = ReadStream(m_Stream, data, &realProcessedSize); - if (processedSize != NULL) - *processedSize = (UInt32)realProcessedSize; - AddToSeekValue(realProcessedSize); - return result; -} - -static UInt32 CrcUpdateUInt16(UInt32 crc, UInt16 v) -{ - crc = CRC_UPDATE_BYTE(crc, (Byte)(v & 0xFF)); - crc = CRC_UPDATE_BYTE(crc, (Byte)((v >> 8) & 0xFF)); - return crc; -} - -static UInt32 CrcUpdateUInt32(UInt32 crc, UInt32 v) -{ - crc = CRC_UPDATE_BYTE(crc, (Byte)(v & 0xFF)); - crc = CRC_UPDATE_BYTE(crc, (Byte)((v >> 8) & 0xFF)); - crc = CRC_UPDATE_BYTE(crc, (Byte)((v >> 16) & 0xFF)); - crc = CRC_UPDATE_BYTE(crc, (Byte)((v >> 24) & 0xFF)); - return crc; -} - - -HRESULT CInArchive::Open2(IInStream *stream, const UInt64 *searchHeaderSizeLimit) -{ - m_CryptoMode = false; - RINOK(stream->Seek(0, STREAM_SEEK_SET, &m_StreamStartPosition)); - m_Position = m_StreamStartPosition; - - RINOK(FindAndReadMarker(stream, searchHeaderSizeLimit)); - - Byte buf[NHeader::NArchive::kArchiveHeaderSize]; - UInt32 processedSize; - ReadBytes(buf, sizeof(buf), &processedSize); - if (processedSize != sizeof(buf)) - return S_FALSE; - m_CurData = buf; - m_CurPos = 0; - m_PosLimit = sizeof(buf); - - m_ArchiveHeader.CRC = ReadUInt16(); - m_ArchiveHeader.Type = ReadByte(); - m_ArchiveHeader.Flags = ReadUInt16(); - m_ArchiveHeader.Size = ReadUInt16(); - m_ArchiveHeader.Reserved1 = ReadUInt16(); - m_ArchiveHeader.Reserved2 = ReadUInt32(); - m_ArchiveHeader.EncryptVersion = 0; - - UInt32 crc = CRC_INIT_VAL; - crc = CRC_UPDATE_BYTE(crc, m_ArchiveHeader.Type); - crc = CrcUpdateUInt16(crc, m_ArchiveHeader.Flags); - crc = CrcUpdateUInt16(crc, m_ArchiveHeader.Size); - crc = CrcUpdateUInt16(crc, m_ArchiveHeader.Reserved1); - crc = CrcUpdateUInt32(crc, m_ArchiveHeader.Reserved2); - - if (m_ArchiveHeader.IsThereEncryptVer() && m_ArchiveHeader.Size > NHeader::NArchive::kArchiveHeaderSize) - { - ReadBytes(&m_ArchiveHeader.EncryptVersion, 1, &processedSize); - if (processedSize != 1) - return S_FALSE; - crc = CRC_UPDATE_BYTE(crc, m_ArchiveHeader.EncryptVersion); - } - - if(m_ArchiveHeader.CRC != (CRC_GET_DIGEST(crc) & 0xFFFF)) - ThrowExceptionWithCode(CInArchiveException::kArchiveHeaderCRCError); - if (m_ArchiveHeader.Type != NHeader::NBlockType::kArchiveHeader) - return S_FALSE; - m_ArchiveCommentPosition = m_Position; - m_SeekOnArchiveComment = true; - return S_OK; -} - -void CInArchive::SkipArchiveComment() -{ - if (!m_SeekOnArchiveComment) - return; - AddToSeekValue(m_ArchiveHeader.Size - m_ArchiveHeader.GetBaseSize()); - m_SeekOnArchiveComment = false; -} - -void CInArchive::GetArchiveInfo(CInArchiveInfo &archiveInfo) const -{ - archiveInfo.StartPosition = m_ArchiveStartPosition; - archiveInfo.Flags = m_ArchiveHeader.Flags; - archiveInfo.CommentPosition = m_ArchiveCommentPosition; - archiveInfo.CommentSize = (UInt16)(m_ArchiveHeader.Size - NHeader::NArchive::kArchiveHeaderSize); -} - -static void DecodeUnicodeFileName(const char *name, const Byte *encName, - int encSize, wchar_t *unicodeName, int maxDecSize) -{ - int encPos = 0; - int decPos = 0; - int flagBits = 0; - Byte flags = 0; - Byte highByte = encName[encPos++]; - while (encPos < encSize && decPos < maxDecSize) - { - if (flagBits == 0) - { - flags = encName[encPos++]; - flagBits = 8; - } - switch(flags >> 6) - { - case 0: - unicodeName[decPos++] = encName[encPos++]; - break; - case 1: - unicodeName[decPos++] = (wchar_t)(encName[encPos++] + (highByte << 8)); - break; - case 2: - unicodeName[decPos++] = (wchar_t)(encName[encPos] + (encName[encPos + 1] << 8)); - encPos += 2; - break; - case 3: - { - int length = encName[encPos++]; - if (length & 0x80) - { - Byte correction = encName[encPos++]; - for (length = (length & 0x7f) + 2; - length > 0 && decPos < maxDecSize; length--, decPos++) - unicodeName[decPos] = (wchar_t)(((name[decPos] + correction) & 0xff) + (highByte << 8)); - } - else - for (length += 2; length > 0 && decPos < maxDecSize; length--, decPos++) - unicodeName[decPos] = name[decPos]; - } - break; - } - flags <<= 2; - flagBits -= 2; - } - unicodeName[decPos < maxDecSize ? decPos : maxDecSize - 1] = 0; -} - -void CInArchive::ReadName(CItemEx &item, int nameSize) -{ - item.UnicodeName.Empty(); - if (nameSize > 0) - { - m_NameBuffer.EnsureCapacity(nameSize + 1); - char *buffer = (char *)m_NameBuffer; - - for (int i = 0; i < nameSize; i++) - buffer[i] = ReadByte(); - - int mainLen; - for (mainLen = 0; mainLen < nameSize; mainLen++) - if (buffer[mainLen] == '\0') - break; - buffer[mainLen] = '\0'; - item.Name = buffer; - - if(item.HasUnicodeName()) - { - if(mainLen < nameSize) - { - int unicodeNameSizeMax = MyMin(nameSize, (0x400)); - _unicodeNameBuffer.EnsureCapacity(unicodeNameSizeMax + 1); - DecodeUnicodeFileName(buffer, (const Byte *)buffer + mainLen + 1, - nameSize - (mainLen + 1), _unicodeNameBuffer, unicodeNameSizeMax); - item.UnicodeName = _unicodeNameBuffer; - } - else if (!ConvertUTF8ToUnicode(item.Name, item.UnicodeName)) - item.UnicodeName.Empty(); - } - } - else - item.Name.Empty(); -} - -Byte CInArchive::ReadByte() -{ - if (m_CurPos >= m_PosLimit) - throw CInArchiveException(CInArchiveException::kIncorrectArchive); - return m_CurData[m_CurPos++]; -} - -UInt16 CInArchive::ReadUInt16() -{ - UInt16 value = 0; - for (int i = 0; i < 2; i++) - { - Byte b = ReadByte(); - value |= (UInt16(b) << (8 * i)); - } - return value; -} - -UInt32 CInArchive::ReadUInt32() -{ - UInt32 value = 0; - for (int i = 0; i < 4; i++) - { - Byte b = ReadByte(); - value |= (UInt32(b) << (8 * i)); - } - return value; -} - -void CInArchive::ReadTime(Byte mask, CRarTime &rarTime) -{ - rarTime.LowSecond = (Byte)(((mask & 4) != 0) ? 1 : 0); - int numDigits = (mask & 3); - rarTime.SubTime[0] = rarTime.SubTime[1] = rarTime.SubTime[2] = 0; - for (int i = 0; i < numDigits; i++) - rarTime.SubTime[3 - numDigits + i] = ReadByte(); -} - -void CInArchive::ReadHeaderReal(CItemEx &item) -{ - item.Flags = m_BlockHeader.Flags; - item.PackSize = ReadUInt32(); - item.Size = ReadUInt32(); - item.HostOS = ReadByte(); - item.FileCRC = ReadUInt32(); - item.MTime.DosTime = ReadUInt32(); - item.UnPackVersion = ReadByte(); - item.Method = ReadByte(); - int nameSize = ReadUInt16(); - item.Attrib = ReadUInt32(); - - item.MTime.LowSecond = 0; - item.MTime.SubTime[0] = - item.MTime.SubTime[1] = - item.MTime.SubTime[2] = 0; - - if((item.Flags & NHeader::NFile::kSize64Bits) != 0) - { - item.PackSize |= ((UInt64)ReadUInt32() << 32); - item.Size |= ((UInt64)ReadUInt32() << 32); - } - - ReadName(item, nameSize); - - if (item.HasSalt()) - for (int i = 0; i < sizeof(item.Salt); i++) - item.Salt[i] = ReadByte(); - - // some rar archives have HasExtTime flag without field. - if (m_CurPos < m_PosLimit && item.HasExtTime()) - { - Byte accessMask = (Byte)(ReadByte() >> 4); - Byte b = ReadByte(); - Byte modifMask = (Byte)(b >> 4); - Byte createMask = (Byte)(b & 0xF); - if ((modifMask & 8) != 0) - ReadTime(modifMask, item.MTime); - item.CTimeDefined = ((createMask & 8) != 0); - if (item.CTimeDefined) - { - item.CTime.DosTime = ReadUInt32(); - ReadTime(createMask, item.CTime); - } - item.ATimeDefined = ((accessMask & 8) != 0); - if (item.ATimeDefined) - { - item.ATime.DosTime = ReadUInt32(); - ReadTime(accessMask, item.ATime); - } - } - - UInt16 fileHeaderWithNameSize = (UInt16)m_CurPos; - - item.Position = m_Position; - item.MainPartSize = fileHeaderWithNameSize; - item.CommentSize = (UInt16)(m_BlockHeader.HeadSize - fileHeaderWithNameSize); - - if (m_CryptoMode) - item.AlignSize = (UInt16)((16 - ((m_BlockHeader.HeadSize) & 0xF)) & 0xF); - else - item.AlignSize = 0; - AddToSeekValue(m_BlockHeader.HeadSize); -} - -void CInArchive::AddToSeekValue(UInt64 addValue) -{ - m_Position += addValue; -} - -HRESULT CInArchive::GetNextItem(CItemEx &item, ICryptoGetTextPassword *getTextPassword) -{ - if (m_SeekOnArchiveComment) - SkipArchiveComment(); - for (;;) - { - if(!SeekInArchive(m_Position)) - return S_FALSE; - if (!m_CryptoMode && (m_ArchiveHeader.Flags & - NHeader::NArchive::kBlockHeadersAreEncrypted) != 0) - { - m_CryptoMode = false; - if (getTextPassword == 0) - return S_FALSE; - if(!SeekInArchive(m_Position)) - return S_FALSE; - if (!m_RarAES) - { - m_RarAESSpec = new NCrypto::NRar29::CDecoder; - m_RarAES = m_RarAESSpec; - } - m_RarAESSpec->SetRar350Mode(m_ArchiveHeader.IsEncryptOld()); - - // Salt - const UInt32 kSaltSize = 8; - Byte salt[kSaltSize]; - if(!ReadBytesAndTestSize(salt, kSaltSize)) - return S_FALSE; - m_Position += kSaltSize; - RINOK(m_RarAESSpec->SetDecoderProperties2(salt, kSaltSize)) - // Password - CMyComBSTR password; - RINOK(getTextPassword->CryptoGetTextPassword(&password)) - UString unicodePassword(password); - - CByteBuffer buffer; - const UInt32 sizeInBytes = unicodePassword.Length() * 2; - buffer.SetCapacity(sizeInBytes); - for (int i = 0; i < unicodePassword.Length(); i++) - { - wchar_t c = unicodePassword[i]; - ((Byte *)buffer)[i * 2] = (Byte)c; - ((Byte *)buffer)[i * 2 + 1] = (Byte)(c >> 8); - } - - RINOK(m_RarAESSpec->CryptoSetPassword((const Byte *)buffer, sizeInBytes)); - - const UInt32 kDecryptedBufferSize = (1 << 12); - if (m_DecryptedData.GetCapacity() == 0) - { - m_DecryptedData.SetCapacity(kDecryptedBufferSize); - } - RINOK(m_RarAES->Init()); - size_t decryptedDataSizeT = kDecryptedBufferSize; - RINOK(ReadStream(m_Stream, (Byte *)m_DecryptedData, &decryptedDataSizeT)); - m_DecryptedDataSize = (UInt32)decryptedDataSizeT; - m_DecryptedDataSize = m_RarAES->Filter((Byte *)m_DecryptedData, m_DecryptedDataSize); - - m_CryptoMode = true; - m_CryptoPos = 0; - } - - m_FileHeaderData.EnsureCapacity(7); - if(!ReadBytesAndTestSize((Byte *)m_FileHeaderData, 7)) - return S_FALSE; - - m_CurData = (Byte *)m_FileHeaderData; - m_CurPos = 0; - m_PosLimit = 7; - m_BlockHeader.CRC = ReadUInt16(); - m_BlockHeader.Type = ReadByte(); - m_BlockHeader.Flags = ReadUInt16(); - m_BlockHeader.HeadSize = ReadUInt16(); - - if (m_BlockHeader.HeadSize < 7) - ThrowExceptionWithCode(CInArchiveException::kIncorrectArchive); - - if (m_BlockHeader.Type == NHeader::NBlockType::kEndOfArchive) - return S_FALSE; - - if (m_BlockHeader.Type == NHeader::NBlockType::kFileHeader) - { - m_FileHeaderData.EnsureCapacity(m_BlockHeader.HeadSize); - m_CurData = (Byte *)m_FileHeaderData; - m_PosLimit = m_BlockHeader.HeadSize; - ReadBytesAndTestResult(m_CurData + m_CurPos, m_BlockHeader.HeadSize - 7); - ReadHeaderReal(item); - if ((CrcCalc(m_CurData + 2, - m_BlockHeader.HeadSize - item.CommentSize - 2) & 0xFFFF) != m_BlockHeader.CRC) - ThrowExceptionWithCode(CInArchiveException::kFileHeaderCRCError); - - FinishCryptoBlock(); - m_CryptoMode = false; - SeekInArchive(m_Position); // Move Position to compressed Data; - AddToSeekValue(item.PackSize); // m_Position points to next header; - return S_OK; - } - if (m_CryptoMode && m_BlockHeader.HeadSize > (1 << 12)) - return E_FAIL; // it's for bad passwords - if ((m_BlockHeader.Flags & NHeader::NBlock::kLongBlock) != 0) - { - m_FileHeaderData.EnsureCapacity(7 + 4); - m_CurData = (Byte *)m_FileHeaderData; - ReadBytesAndTestResult(m_CurData + m_CurPos, 4); // test it - m_PosLimit = 7 + 4; - UInt32 dataSize = ReadUInt32(); - AddToSeekValue(dataSize); - if (m_CryptoMode && dataSize > (1 << 27)) - return E_FAIL; // it's for bad passwords - m_CryptoPos = m_BlockHeader.HeadSize; - } - else - m_CryptoPos = 0; - AddToSeekValue(m_BlockHeader.HeadSize); - FinishCryptoBlock(); - m_CryptoMode = false; - } -} - -bool CInArchive::SeekInArchive(UInt64 position) -{ - UInt64 newPosition; - m_Stream->Seek(position, STREAM_SEEK_SET, &newPosition); - return newPosition == position; -} - -ISequentialInStream* CInArchive::CreateLimitedStream(UInt64 position, UInt64 size) -{ - CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream; - CMyComPtr inStream(streamSpec); - SeekInArchive(position); - streamSpec->SetStream(m_Stream); - streamSpec->Init(size); - return inStream.Detach(); -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarIn.h b/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarIn.h deleted file mode 100644 index 500f1134e..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarIn.h +++ /dev/null @@ -1,126 +0,0 @@ -// RarIn.h - -#ifndef __ARCHIVE_RAR_IN_H -#define __ARCHIVE_RAR_IN_H - -#include "Common/DynamicBuffer.h" -#include "Common/MyCom.h" - -#include "../../ICoder.h" -#include "../../IStream.h" - -#include "../../Common/StreamObjects.h" - -#include "../../Crypto/RarAes.h" - -#include "RarHeader.h" -#include "RarItem.h" - -namespace NArchive { -namespace NRar { - -class CInArchiveException -{ -public: - enum CCauseType - { - kUnexpectedEndOfArchive = 0, - kArchiveHeaderCRCError, - kFileHeaderCRCError, - kIncorrectArchive - } - Cause; - CInArchiveException(CCauseType cause) : Cause(cause) {} -}; - -class CInArchiveInfo -{ -public: - UInt64 StartPosition; - UInt16 Flags; - UInt64 CommentPosition; - UInt16 CommentSize; - bool IsSolid() const { return (Flags & NHeader::NArchive::kSolid) != 0; } - bool IsCommented() const { return (Flags & NHeader::NArchive::kComment) != 0; } - bool IsVolume() const { return (Flags & NHeader::NArchive::kVolume) != 0; } - bool HaveNewVolumeName() const { return (Flags & NHeader::NArchive::kNewVolName) != 0; } - bool IsEncrypted() const { return (Flags & NHeader::NArchive::kBlockEncryption) != 0; } -}; - -class CInArchive -{ - CMyComPtr m_Stream; - - UInt64 m_StreamStartPosition; - UInt64 m_Position; - UInt64 m_ArchiveStartPosition; - - NHeader::NArchive::CHeader360 m_ArchiveHeader; - CDynamicBuffer m_NameBuffer; - CDynamicBuffer _unicodeNameBuffer; - bool m_SeekOnArchiveComment; - UInt64 m_ArchiveCommentPosition; - - void ReadName(CItemEx &item, int nameSize); - void ReadHeaderReal(CItemEx &item); - - HRESULT ReadBytes(void *data, UInt32 size, UInt32 *aProcessedSize); - bool ReadBytesAndTestSize(void *data, UInt32 size); - void ReadBytesAndTestResult(void *data, UInt32 size); - - HRESULT FindAndReadMarker(IInStream *stream, const UInt64 *searchHeaderSizeLimit); - HRESULT Open2(IInStream *stream, const UInt64 *searchHeaderSizeLimit); - - void ThrowExceptionWithCode(CInArchiveException::CCauseType cause); - void ThrowUnexpectedEndOfArchiveException(); - - void AddToSeekValue(UInt64 addValue); - -protected: - - CDynamicBuffer m_FileHeaderData; - - NHeader::NBlock::CBlock m_BlockHeader; - - NCrypto::NRar29::CDecoder *m_RarAESSpec; - CMyComPtr m_RarAES; - - Byte *m_CurData; // it must point to start of Rar::Block - UInt32 m_CurPos; - UInt32 m_PosLimit; - Byte ReadByte(); - UInt16 ReadUInt16(); - UInt32 ReadUInt32(); - void ReadTime(Byte mask, CRarTime &rarTime); - - CBuffer m_DecryptedData; - UInt32 m_DecryptedDataSize; - - bool m_CryptoMode; - UInt32 m_CryptoPos; - void FinishCryptoBlock() - { - if (m_CryptoMode) - while ((m_CryptoPos & 0xF) != 0) - { - m_CryptoPos++; - m_Position++; - } - } - -public: - HRESULT Open(IInStream *inStream, const UInt64 *searchHeaderSizeLimit); - void Close(); - HRESULT GetNextItem(CItemEx &item, ICryptoGetTextPassword *getTextPassword); - - void SkipArchiveComment(); - - void GetArchiveInfo(CInArchiveInfo &archiveInfo) const; - - bool SeekInArchive(UInt64 position); - ISequentialInStream *CreateLimitedStream(UInt64 position, UInt64 size); -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarItem.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarItem.cpp deleted file mode 100644 index b0963778b..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarItem.cpp +++ /dev/null @@ -1,55 +0,0 @@ -// RarItem.cpp - -#include "StdAfx.h" - -#include "RarItem.h" - -namespace NArchive{ -namespace NRar{ - -bool CItem::IgnoreItem() const -{ - switch(HostOS) - { - case NHeader::NFile::kHostMSDOS: - case NHeader::NFile::kHostOS2: - case NHeader::NFile::kHostWin32: - return ((Attrib & NHeader::NFile::kLabelFileAttribute) != 0); - } - return false; -} - -bool CItem::IsDir() const -{ - if (GetDictSize() == NHeader::NFile::kDictDirectoryValue) - return true; - switch(HostOS) - { - case NHeader::NFile::kHostMSDOS: - case NHeader::NFile::kHostOS2: - case NHeader::NFile::kHostWin32: - if ((Attrib & FILE_ATTRIBUTE_DIRECTORY) != 0) - return true; - } - return false; -} - -UInt32 CItem::GetWinAttributes() const -{ - UInt32 winAttributes; - switch(HostOS) - { - case NHeader::NFile::kHostMSDOS: - case NHeader::NFile::kHostOS2: - case NHeader::NFile::kHostWin32: - winAttributes = Attrib; - break; - default: - winAttributes = 0; // must be converted from unix value; - } - if (IsDir()) - winAttributes |= NHeader::NFile::kWinFileDirectoryAttributeMask; - return winAttributes; -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarItem.h b/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarItem.h deleted file mode 100644 index 515ecd4be..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarItem.h +++ /dev/null @@ -1,79 +0,0 @@ -// RarItem.h - -#ifndef __ARCHIVE_RAR_ITEM_H -#define __ARCHIVE_RAR_ITEM_H - -#include "Common/Types.h" -#include "Common/MyString.h" - -#include "RarHeader.h" - -namespace NArchive{ -namespace NRar{ - -struct CRarTime -{ - UInt32 DosTime; - Byte LowSecond; - Byte SubTime[3]; -}; - -struct CItem -{ - UInt64 Size; - UInt64 PackSize; - - CRarTime CTime; - CRarTime ATime; - CRarTime MTime; - - UInt32 FileCRC; - UInt32 Attrib; - - UInt16 Flags; - Byte HostOS; - Byte UnPackVersion; - Byte Method; - - bool CTimeDefined; - bool ATimeDefined; - - AString Name; - UString UnicodeName; - - Byte Salt[8]; - - bool IsEncrypted() const { return (Flags & NHeader::NFile::kEncrypted) != 0; } - bool IsSolid() const { return (Flags & NHeader::NFile::kSolid) != 0; } - bool IsCommented() const { return (Flags & NHeader::NFile::kComment) != 0; } - bool IsSplitBefore() const { return (Flags & NHeader::NFile::kSplitBefore) != 0; } - bool IsSplitAfter() const { return (Flags & NHeader::NFile::kSplitAfter) != 0; } - bool HasSalt() const { return (Flags & NHeader::NFile::kSalt) != 0; } - bool HasExtTime() const { return (Flags & NHeader::NFile::kExtTime) != 0; } - bool HasUnicodeName()const { return (Flags & NHeader::NFile::kUnicodeName) != 0; } - bool IsOldVersion() const { return (Flags & NHeader::NFile::kOldVersion) != 0; } - - UInt32 GetDictSize() const { return (Flags >> NHeader::NFile::kDictBitStart) & NHeader::NFile::kDictMask; } - bool IsDir() const; - bool IgnoreItem() const; - UInt32 GetWinAttributes() const; - - CItem(): CTimeDefined(false), ATimeDefined(false) {} -}; - -class CItemEx: public CItem -{ -public: - UInt64 Position; - UInt16 MainPartSize; - UInt16 CommentSize; - UInt16 AlignSize; - UInt64 GetFullSize() const { return MainPartSize + CommentSize + AlignSize + PackSize; }; - // DWORD GetHeaderWithCommentSize() const { return MainPartSize + CommentSize; }; - UInt64 GetCommentPosition() const { return Position + MainPartSize; }; - UInt64 GetDataPosition() const { return GetCommentPosition() + CommentSize + AlignSize; }; -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarRegister.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarRegister.cpp deleted file mode 100644 index f7897a607..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarRegister.cpp +++ /dev/null @@ -1,13 +0,0 @@ -// RarRegister.cpp - -#include "StdAfx.h" - -#include "../../Common/RegisterArc.h" - -#include "RarHandler.h" -static IInArchive *CreateArc() { return new NArchive::NRar::CHandler; } - -static CArcInfo g_ArcInfo = - { L"Rar", L"rar r00", 0, 3, {0x52 , 0x61, 0x72, 0x21, 0x1a, 0x07, 0x00}, 7, false, CreateArc, 0, }; - -REGISTER_ARC(Rar) diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarVolumeInStream.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarVolumeInStream.cpp deleted file mode 100644 index 8b62d9fd9..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarVolumeInStream.cpp +++ /dev/null @@ -1,84 +0,0 @@ -// RarVolumeInStream.cpp - -#include "StdAfx.h" - -#include "RarVolumeInStream.h" - -#include "Windows/Defs.h" -#include "Common/Defs.h" - -extern "C" -{ - #include "../../../../C/7zCrc.h" -} - -namespace NArchive { -namespace NRar { - -void CFolderInStream::Init( - CObjectVector *archives, - const CObjectVector *items, - const CRefItem &refItem) -{ - _archives = archives; - _items = items; - _refItem = refItem; - _curIndex = 0; - CRCs.Clear(); - _fileIsOpen = false; -} - -HRESULT CFolderInStream::OpenStream() -{ - while (_curIndex < _refItem.NumItems) - { - const CItemEx &item = (*_items)[_refItem.ItemIndex + _curIndex]; - _stream.Attach((*_archives)[_refItem.VolumeIndex + _curIndex]. - CreateLimitedStream(item.GetDataPosition(), item.PackSize)); - _curIndex++; - _fileIsOpen = true; - _crc = CRC_INIT_VAL; - return S_OK; - } - return S_OK; -} - -HRESULT CFolderInStream::CloseStream() -{ - CRCs.Add(CRC_GET_DIGEST(_crc)); - _stream.Release(); - _fileIsOpen = false; - return S_OK; -} - -STDMETHODIMP CFolderInStream::Read(void *data, UInt32 size, UInt32 *processedSize) -{ - UInt32 realProcessedSize = 0; - while ((_curIndex < _refItem.NumItems || _fileIsOpen) && size > 0) - { - if (_fileIsOpen) - { - UInt32 localProcessedSize; - RINOK(_stream->Read( - ((Byte *)data) + realProcessedSize, size, &localProcessedSize)); - _crc = CrcUpdate(_crc, ((Byte *)data) + realProcessedSize, localProcessedSize); - if (localProcessedSize == 0) - { - RINOK(CloseStream()); - continue; - } - realProcessedSize += localProcessedSize; - size -= localProcessedSize; - break; - } - else - { - RINOK(OpenStream()); - } - } - if (processedSize != 0) - *processedSize = realProcessedSize; - return S_OK; -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarVolumeInStream.h b/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarVolumeInStream.h deleted file mode 100644 index d175a2c0c..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Rar/RarVolumeInStream.h +++ /dev/null @@ -1,49 +0,0 @@ -// RarVolumeInStream.h - -#ifndef __RAR_VOLUME_IN_STREAM_H -#define __RAR_VOLUME_IN_STREAM_H - -#include "../../IStream.h" -#include "RarIn.h" - -namespace NArchive { -namespace NRar { - -struct CRefItem -{ - int VolumeIndex; - int ItemIndex; - int NumItems; -}; - -class CFolderInStream: - public ISequentialInStream, - public CMyUnknownImp -{ -public: - MY_UNKNOWN_IMP - - STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); - -private: - CObjectVector *_archives; - const CObjectVector *_items; - CRefItem _refItem; - int _curIndex; - UInt32 _crc; - bool _fileIsOpen; - CMyComPtr _stream; - - HRESULT OpenStream(); - HRESULT CloseStream(); -public: - void Init(CObjectVector *archives, - const CObjectVector *items, - const CRefItem &refItem); - - CRecordVector CRCs; -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Rar/StdAfx.h b/desmume/src/windows/7z/CPP/7zip/Archive/Rar/StdAfx.h deleted file mode 100644 index 83fdd22d5..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Rar/StdAfx.h +++ /dev/null @@ -1,8 +0,0 @@ -// StdAfx.h - -#ifndef __STDAFX_H -#define __STDAFX_H - -#include "../../../Common/MyWindows.h" - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Split/SplitHandler.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Split/SplitHandler.cpp deleted file mode 100644 index 36be6cc3b..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Split/SplitHandler.cpp +++ /dev/null @@ -1,357 +0,0 @@ -// SplitHandler.cpp - -#include "StdAfx.h" - -#include "Common/ComTry.h" -#include "Common/Defs.h" -#include "Common/NewHandler.h" -#include "Common/StringConvert.h" - -#include "Windows/PropVariant.h" -#include "Windows/Time.h" - -#include "../../Common/ProgressUtils.h" - -#include "../../Compress/CopyCoder.h" - -#include "../Common/ItemNameUtils.h" -#include "../Common/MultiStream.h" - -#include "SplitHandler.h" - -using namespace NWindows; -using namespace NTime; - -namespace NArchive { -namespace NSplit { - -STATPROPSTG kProps[] = -{ - { NULL, kpidPath, VT_BSTR}, - { NULL, kpidSize, VT_UI8}, - { NULL, kpidPackSize, VT_UI8}, -}; - -IMP_IInArchive_Props -IMP_IInArchive_ArcProps_NO - -class CSeqName -{ -public: - UString _unchangedPart; - UString _changedPart; - bool _splitStyle; - UString GetNextName() - { - UString newName; - if (_splitStyle) - { - int i; - int numLetters = _changedPart.Length(); - for (i = numLetters - 1; i >= 0; i--) - { - wchar_t c = _changedPart[i]; - if (c == 'z') - { - c = 'a'; - newName = c + newName; - continue; - } - else if (c == 'Z') - { - c = 'A'; - newName = c + newName; - continue; - } - c++; - if ((c == 'z' || c == 'Z') && i == 0) - { - _unchangedPart += c; - wchar_t newChar = (c == 'z') ? L'a' : L'A'; - newName.Empty(); - numLetters++; - for (int k = 0; k < numLetters; k++) - newName += newChar; - break; - } - newName = c + newName; - i--; - for (; i >= 0; i--) - newName = _changedPart[i] + newName; - break; - } - } - else - { - int i; - int numLetters = _changedPart.Length(); - for (i = numLetters - 1; i >= 0; i--) - { - wchar_t c = _changedPart[i]; - if (c == L'9') - { - c = L'0'; - newName = c + newName; - if (i == 0) - newName = UString(L'1') + newName; - continue; - } - c++; - newName = c + newName; - i--; - for (; i >= 0; i--) - newName = _changedPart[i] + newName; - break; - } - } - _changedPart = newName; - return _unchangedPart + _changedPart; - } -}; - -STDMETHODIMP CHandler::Open(IInStream *stream, - const UInt64 * /* maxCheckStartPosition */, - IArchiveOpenCallback *openArchiveCallback) -{ - COM_TRY_BEGIN - Close(); - if (openArchiveCallback == 0) - return S_FALSE; - // try - { - CMyComPtr openVolumeCallback; - CMyComPtr openArchiveCallbackWrap = openArchiveCallback; - if (openArchiveCallbackWrap.QueryInterface(IID_IArchiveOpenVolumeCallback, - &openVolumeCallback) != S_OK) - return S_FALSE; - - { - NCOM::CPropVariant prop; - RINOK(openVolumeCallback->GetProperty(kpidName, &prop)); - if (prop.vt != VT_BSTR) - return S_FALSE; - _name = prop.bstrVal; - } - - int dotPos = _name.ReverseFind('.'); - UString prefix, ext; - if (dotPos >= 0) - { - prefix = _name.Left(dotPos + 1); - ext = _name.Mid(dotPos + 1); - } - else - ext = _name; - UString extBig = ext; - extBig.MakeUpper(); - - CSeqName seqName; - - int numLetters = 2; - bool splitStyle = false; - if (extBig.Right(2) == L"AA") - { - splitStyle = true; - while (numLetters < extBig.Length()) - { - if (extBig[extBig.Length() - numLetters - 1] != 'A') - break; - numLetters++; - } - } - else if (ext.Right(2) == L"01") - { - while (numLetters < extBig.Length()) - { - if (extBig[extBig.Length() - numLetters - 1] != '0') - break; - numLetters++; - } - if (numLetters != ext.Length()) - return S_FALSE; - } - else - return S_FALSE; - - _streams.Add(stream); - - seqName._unchangedPart = prefix + ext.Left(extBig.Length() - numLetters); - seqName._changedPart = ext.Right(numLetters); - seqName._splitStyle = splitStyle; - - if (prefix.Length() < 1) - _subName = L"file"; - else - _subName = prefix.Left(prefix.Length() - 1); - - _totalSize = 0; - UInt64 size; - { - NCOM::CPropVariant prop; - RINOK(openVolumeCallback->GetProperty(kpidSize, &prop)); - if (prop.vt != VT_UI8) - return E_INVALIDARG; - size = prop.uhVal.QuadPart; - } - _totalSize += size; - _sizes.Add(size); - - if (openArchiveCallback != NULL) - { - UInt64 numFiles = _streams.Size(); - RINOK(openArchiveCallback->SetCompleted(&numFiles, NULL)); - } - - for (;;) - { - UString fullName = seqName.GetNextName(); - CMyComPtr nextStream; - HRESULT result = openVolumeCallback->GetStream(fullName, &nextStream); - if (result == S_FALSE) - break; - if (result != S_OK) - return result; - if (!stream) - break; - { - NCOM::CPropVariant prop; - RINOK(openVolumeCallback->GetProperty(kpidSize, &prop)); - if (prop.vt != VT_UI8) - return E_INVALIDARG; - size = prop.uhVal.QuadPart; - } - _totalSize += size; - _sizes.Add(size); - _streams.Add(nextStream); - if (openArchiveCallback != NULL) - { - UInt64 numFiles = _streams.Size(); - RINOK(openArchiveCallback->SetCompleted(&numFiles, NULL)); - } - } - } - /* - catch(...) - { - return S_FALSE; - } - */ - return S_OK; - COM_TRY_END -} - -STDMETHODIMP CHandler::Close() -{ - _sizes.Clear(); - _streams.Clear(); - return S_OK; -} - -STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems) -{ - *numItems = _streams.IsEmpty() ? 0 : 1; - return S_OK; -} - -STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIANT *value) -{ - NWindows::NCOM::CPropVariant prop; - switch(propID) - { - case kpidPath: - prop = _subName; - break; - case kpidSize: - case kpidPackSize: - prop = _totalSize; - break; - } - prop.Detach(value); - return S_OK; -} - -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *_anExtractCallback) -{ - COM_TRY_BEGIN - - if (numItems != UInt32(-1)) - { - if (numItems != 1) - return E_INVALIDARG; - if (indices[0] != 0) - return E_INVALIDARG; - } - bool testMode = (_aTestMode != 0); - CMyComPtr extractCallback = _anExtractCallback; - extractCallback->SetTotal(_totalSize); - - /* - CMyComPtr volumeExtractCallback; - if (extractCallback.QueryInterface(&volumeExtractCallback) != S_OK) - return E_FAIL; - */ - - UInt64 currentTotalSize = 0; - UInt64 currentItemSize; - - RINOK(extractCallback->SetCompleted(¤tTotalSize)); - CMyComPtr realOutStream; - Int32 askMode; - askMode = testMode ? NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; - Int32 index = 0; - RINOK(extractCallback->GetStream(index, &realOutStream, askMode)); - - RINOK(extractCallback->PrepareOperation(askMode)); - if (testMode) - { - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK)); - return S_OK; - } - - if (!testMode && (!realOutStream)) - return S_OK; - - NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder; - CMyComPtr copyCoder = copyCoderSpec; - - CLocalProgress *lps = new CLocalProgress; - CMyComPtr progress = lps; - lps->Init(extractCallback, false); - - for (int i = 0; i < _streams.Size(); i++, currentTotalSize += currentItemSize) - { - lps->InSize = lps->OutSize = currentTotalSize; - RINOK(lps->SetCur()); - IInStream *inStream = _streams[i]; - RINOK(inStream->Seek(0, STREAM_SEEK_SET, NULL)); - RINOK(copyCoder->Code(inStream, realOutStream, NULL, NULL, progress)); - currentItemSize = copyCoderSpec->TotalSize; - } - realOutStream.Release(); - return extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK); - COM_TRY_END -} - -STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream) -{ - if (index != 0) - return E_INVALIDARG; - *stream = 0; - CMultiStream *streamSpec = new CMultiStream; - CMyComPtr streamTemp = streamSpec; - for (int i = 0; i < _streams.Size(); i++) - { - CMultiStream::CSubStreamInfo subStreamInfo; - subStreamInfo.Stream = _streams[i]; - subStreamInfo.Pos = 0; - subStreamInfo.Size = _sizes[i]; - streamSpec->Streams.Add(subStreamInfo); - } - streamSpec->Init(); - *stream = streamTemp.Detach(); - return S_OK; -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Split/SplitHandler.h b/desmume/src/windows/7z/CPP/7zip/Archive/Split/SplitHandler.h deleted file mode 100644 index c323490ae..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Split/SplitHandler.h +++ /dev/null @@ -1,37 +0,0 @@ -// Split/Handler.h - -#ifndef __SPLIT_HANDLER_H -#define __SPLIT_HANDLER_H - -#include "Common/MyCom.h" -#include "Common/MyString.h" -#include "../IArchive.h" - -namespace NArchive { -namespace NSplit { - -class CHandler: - public IInArchive, - public IInArchiveGetStream, - // public IOutArchive, - public CMyUnknownImp -{ -public: - MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream) - - INTERFACE_IInArchive(;) - - STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream); - -private: - UString _subName; - UString _name; - CObjectVector > _streams; - CRecordVector _sizes; - - UInt64 _totalSize; -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Split/SplitRegister.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Split/SplitRegister.cpp deleted file mode 100644 index 691a3829c..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Split/SplitRegister.cpp +++ /dev/null @@ -1,20 +0,0 @@ -// SplitRegister.cpp - -#include "StdAfx.h" - -#include "../../Common/RegisterArc.h" - -#include "SplitHandler.h" -static IInArchive *CreateArc() { return new NArchive::NSplit::CHandler; } -/* -#ifndef EXTRACT_ONLY -static IOutArchive *CreateArcOut() { return new NArchive::NSplit::CHandler; } -#else -#define CreateArcOut 0 -#endif -*/ - -static CArcInfo g_ArcInfo = -{ L"Split", L"001", 0, 0xEA, { 0 }, 0, false, CreateArc, 0 }; - -REGISTER_ARC(Split) diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Split/StdAfx.h b/desmume/src/windows/7z/CPP/7zip/Archive/Split/StdAfx.h deleted file mode 100644 index 83fdd22d5..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Split/StdAfx.h +++ /dev/null @@ -1,8 +0,0 @@ -// StdAfx.h - -#ifndef __STDAFX_H -#define __STDAFX_H - -#include "../../../Common/MyWindows.h" - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/StdAfx.h b/desmume/src/windows/7z/CPP/7zip/Archive/StdAfx.h deleted file mode 100644 index f56e92fd8..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/StdAfx.h +++ /dev/null @@ -1,9 +0,0 @@ -// StdAfx.h - -#ifndef __STDAFX_H -#define __STDAFX_H - -#include "../../Common/MyWindows.h" -#include "../../Common/NewHandler.h" - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Tar/StdAfx.h b/desmume/src/windows/7z/CPP/7zip/Archive/Tar/StdAfx.h deleted file mode 100644 index a4e617312..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Tar/StdAfx.h +++ /dev/null @@ -1,9 +0,0 @@ -// StdAfx.h - -#ifndef __STDAFX_H -#define __STDAFX_H - -#include "../../../Common/MyWindows.h" -#include "../../../Common/NewHandler.h" - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarHandler.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarHandler.cpp deleted file mode 100644 index b1e34fff7..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarHandler.cpp +++ /dev/null @@ -1,229 +0,0 @@ -// TarHandler.cpp - -#include "StdAfx.h" - -#include "Common/ComTry.h" -#include "Common/Defs.h" -#include "Common/NewHandler.h" -#include "Common/StringConvert.h" - -#include "Windows/PropVariant.h" -#include "Windows/Time.h" - -#include "../../Common/LimitedStreams.h" -#include "../../Common/ProgressUtils.h" - -#include "../../Compress/CopyCoder.h" - -#include "../Common/DummyOutStream.h" -#include "../Common/ItemNameUtils.h" - -#include "TarHandler.h" -#include "TarIn.h" - -using namespace NWindows; - -namespace NArchive { -namespace NTar { - -STATPROPSTG kProps[] = -{ - { NULL, kpidPath, VT_BSTR}, - { NULL, kpidIsDir, VT_BOOL}, - { NULL, kpidSize, VT_UI8}, - { NULL, kpidPackSize, VT_UI8}, - { NULL, kpidMTime, VT_FILETIME}, - { NULL, kpidUser, VT_BSTR}, - { NULL, kpidGroup, VT_BSTR} -}; - -IMP_IInArchive_Props -IMP_IInArchive_ArcProps_NO - -HRESULT CHandler::Open2(IInStream *stream, IArchiveOpenCallback *callback) -{ - UInt64 endPos = 0; - if (callback != NULL) - { - RINOK(stream->Seek(0, STREAM_SEEK_END, &endPos)); - RINOK(stream->Seek(0, STREAM_SEEK_SET, NULL)); - } - - UInt64 pos = 0; - for (;;) - { - CItemEx item; - bool filled; - item.HeaderPosition = pos; - RINOK(ReadItem(stream, filled, item)); - if (!filled) - break; - _items.Add(item); - - RINOK(stream->Seek(item.GetPackSize(), STREAM_SEEK_CUR, &pos)); - if (pos >= endPos) - return S_FALSE; - if (callback != NULL) - { - if (_items.Size() == 1) - { - RINOK(callback->SetTotal(NULL, &endPos)); - } - if (_items.Size() % 100 == 0) - { - UInt64 numFiles = _items.Size(); - RINOK(callback->SetCompleted(&numFiles, &pos)); - } - } - } - - if (_items.Size() == 0) - { - CMyComPtr openVolumeCallback; - if (!callback) - return S_FALSE; - callback->QueryInterface(IID_IArchiveOpenVolumeCallback, (void **)&openVolumeCallback); - if (!openVolumeCallback) - return S_FALSE; - NCOM::CPropVariant prop; - if (openVolumeCallback->GetProperty(kpidName, &prop) != S_OK) - return S_FALSE; - if (prop.vt != VT_BSTR) - return S_FALSE; - UString baseName = prop.bstrVal; - baseName = baseName.Right(4); - if (baseName.CompareNoCase(L".tar") != 0) - return S_FALSE; - } - return S_OK; -} - -STDMETHODIMP CHandler::Open(IInStream *stream, - const UInt64 * /* maxCheckStartPosition */, - IArchiveOpenCallback *openArchiveCallback) -{ - COM_TRY_BEGIN - { - Close(); - RINOK(Open2(stream, openArchiveCallback)); - _inStream = stream; - } - return S_OK; - COM_TRY_END -} - -STDMETHODIMP CHandler::Close() -{ - _items.Clear(); - _inStream.Release(); - return S_OK; -} - -STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems) -{ - *numItems = _items.Size(); - return S_OK; -} - -STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value) -{ - COM_TRY_BEGIN - NWindows::NCOM::CPropVariant prop; - const CItemEx &item = _items[index]; - - switch(propID) - { - case kpidPath: prop = NItemName::GetOSName2(MultiByteToUnicodeString(item.Name, CP_OEMCP)); break; - case kpidIsDir: prop = item.IsDir(); break; - case kpidSize: prop = item.Size; break; - case kpidPackSize: prop = item.GetPackSize(); break; - case kpidMTime: - if (item.MTime != 0) - { - FILETIME ft; - NTime::UnixTimeToFileTime(item.MTime, ft); - prop = ft; - } - break; - case kpidUser: prop = MultiByteToUnicodeString(item.UserName, CP_OEMCP); break; - case kpidGroup: prop = MultiByteToUnicodeString(item.GroupName, CP_OEMCP); break; - } - prop.Detach(value); - return S_OK; - COM_TRY_END -} - -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) -{ - COM_TRY_BEGIN - bool testMode = (_aTestMode != 0); - bool allFilesMode = (numItems == UInt32(-1)); - if (allFilesMode) - numItems = _items.Size(); - if (numItems == 0) - return S_OK; - UInt64 totalSize = 0; - UInt32 i; - for (i = 0; i < numItems; i++) - totalSize += _items[allFilesMode ? i : indices[i]].Size; - extractCallback->SetTotal(totalSize); - - UInt64 totalPackSize, curPackSize, curSize; - totalSize = totalPackSize = 0; - - NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder(); - CMyComPtr copyCoder = copyCoderSpec; - - CLocalProgress *lps = new CLocalProgress; - CMyComPtr progress = lps; - lps->Init(extractCallback, false); - - CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream; - CMyComPtr inStream(streamSpec); - streamSpec->SetStream(_inStream); - - CDummyOutStream *outStreamSpec = new CDummyOutStream; - CMyComPtr outStream(outStreamSpec); - - for (i = 0; i < numItems; i++, totalSize += curSize, totalPackSize += curPackSize) - { - lps->InSize = totalPackSize; - lps->OutSize = totalSize; - RINOK(lps->SetCur()); - CMyComPtr realOutStream; - Int32 askMode = testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; - Int32 index = allFilesMode ? i : indices[i]; - const CItemEx &item = _items[index]; - RINOK(extractCallback->GetStream(index, &realOutStream, askMode)); - curSize = item.Size; - curPackSize = item.GetPackSize(); - if (item.IsDir()) - { - RINOK(extractCallback->PrepareOperation(askMode)); - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK)); - continue; - } - if (!testMode && (!realOutStream)) - continue; - RINOK(extractCallback->PrepareOperation(askMode)); - - outStreamSpec->SetStream(realOutStream); - realOutStream.Release(); - outStreamSpec->Init(); - - RINOK(_inStream->Seek(item.GetDataPosition(), STREAM_SEEK_SET, NULL)); - streamSpec->Init(item.Size); - RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress)); - outStreamSpec->ReleaseStream(); - RINOK(extractCallback->SetOperationResult(copyCoderSpec->TotalSize == item.Size ? - NArchive::NExtract::NOperationResult::kOK: - NArchive::NExtract::NOperationResult::kDataError)); - } - return S_OK; - COM_TRY_END -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarHandler.h b/desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarHandler.h deleted file mode 100644 index 38792b25a..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarHandler.h +++ /dev/null @@ -1,37 +0,0 @@ -// Tar/Handler.h - -#ifndef __TAR_HANDLER_H -#define __TAR_HANDLER_H - -#include "Common/MyCom.h" -#include "../IArchive.h" - -#include "TarItem.h" - -namespace NArchive { -namespace NTar { - -class CHandler: - public IInArchive, - public IOutArchive, - public CMyUnknownImp -{ -public: - MY_UNKNOWN_IMP2( - IInArchive, - IOutArchive - ) - - INTERFACE_IInArchive(;) - INTERFACE_IOutArchive(;) - - HRESULT Open2(IInStream *stream, IArchiveOpenCallback *callback); - -private: - CObjectVector _items; - CMyComPtr _inStream; -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarHeader.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarHeader.cpp deleted file mode 100644 index 9304388bc..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarHeader.cpp +++ /dev/null @@ -1,25 +0,0 @@ -// Archive/Tar/Header.h - -#include "StdAfx.h" - -#include "TarHeader.h" - -namespace NArchive { -namespace NTar { -namespace NFileHeader { - - // The checksum field is filled with this while the checksum is computed. - const char *kCheckSumBlanks = " "; // 8 blanks, no null - - const char *kLongLink = "././@LongLink"; - const char *kLongLink2 = "@LongLink"; - - // The magic field is filled with this if uname and gname are valid. - namespace NMagic - { - const char *kUsTar = "ustar"; // 5 chars - const char *kGNUTar = "GNUtar "; // 7 chars and a null - const char *kEmpty = "\0\0\0\0\0\0\0\0"; // 7 chars and a null - } - -}}} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarHeader.h b/desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarHeader.h deleted file mode 100644 index dece1f7f4..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarHeader.h +++ /dev/null @@ -1,108 +0,0 @@ -// Archive/Tar/Header.h - -#ifndef __ARCHIVE_TAR_HEADER_H -#define __ARCHIVE_TAR_HEADER_H - -#include "Common/Types.h" - -namespace NArchive { -namespace NTar { - -namespace NFileHeader -{ - const int kRecordSize = 512; - const int kNameSize = 100; - const int kUserNameSize = 32; - const int kGroupNameSize = 32; - const int kPrefixSize = 155; - - /* - struct CHeader - { - char Name[kNameSize]; - char Mode[8]; - char UID[8]; - char GID[8]; - char Size[12]; - char ModificationTime[12]; - char CheckSum[8]; - char LinkFlag; - char LinkName[kNameSize]; - char Magic[8]; - char UserName[kUserNameSize]; - char GroupName[kGroupNameSize]; - char DeviceMajor[8]; - char DeviceMinor[8]; - char Prefix[155]; - }; - union CRecord - { - CHeader Header; - Byte Padding[kRecordSize]; - }; - */ - - namespace NMode - { - const int kSetUID = 04000; // Set UID on execution - const int kSetGID = 02000; // Set GID on execution - const int kSaveText = 01000; // Save text (sticky bit) - } - - namespace NFilePermissions - { - const int kUserRead = 00400; // read by owner - const int kUserWrite = 00200; // write by owner - const int kUserExecute = 00100; // execute/search by owner - const int kGroupRead = 00040; // read by group - const int kGroupWrite = 00020; // write by group - const int kGroupExecute = 00010; // execute/search by group - const int kOtherRead = 00004; // read by other - const int kOtherWrite = 00002; // write by other - const int kOtherExecute = 00001; // execute/search by other - } - - - // The linkflag defines the type of file - namespace NLinkFlag - { - const char kOldNormal = '\0'; // Normal disk file, Unix compatible - const char kNormal = '0'; // Normal disk file - const char kLink = '1'; // Link to previously dumped file - const char kSymbolicLink = '2'; // Symbolic link - const char kCharacter = '3'; // Character special file - const char kBlock = '4'; // Block special file - const char kDirectory = '5'; // Directory - const char kFIFO = '6'; // FIFO special file - const char kContiguous = '7'; // Contiguous file - - const char kDumpDir = 'D'; /* GNUTYPE_DUMPDIR. - data: list of files created by the --incremental (-G) option - Each file name is preceded by either - - 'Y' (file should be in this archive) - - 'N' (file is a directory, or is not stored in the archive.) - Each file name is terminated by a null + an additional null after - the last file name. */ - - } - // Further link types may be defined later. - - // The checksum field is filled with this while the checksum is computed. - extern const char *kCheckSumBlanks;// = " "; // 8 blanks, no null - - extern const char *kLongLink; // = "././@LongLink"; - extern const char *kLongLink2; // = "@LongLink"; - - // The magic field is filled with this if uname and gname are valid. - namespace NMagic - { - extern const char *kUsTar; // = "ustar"; // 5 chars - extern const char *kGNUTar; // = "GNUtar "; // 7 chars and a null - extern const char *kEmpty; // = "GNUtar "; // 7 chars and a null - } - -} - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarIn.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarIn.cpp deleted file mode 100644 index 85702eb2b..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarIn.cpp +++ /dev/null @@ -1,176 +0,0 @@ -// Archive/TarIn.cpp - -#include "StdAfx.h" - -#include "TarIn.h" -#include "TarHeader.h" - -#include "Common/StringToInt.h" -#include "Windows/Defs.h" - -#include "../../Common/StreamUtils.h" - -namespace NArchive { -namespace NTar { - -static void MyStrNCpy(char *dest, const char *src, int size) -{ - for (int i = 0; i < size; i++) - { - char c = src[i]; - dest[i] = c; - if (c == 0) - break; - } -} - -static bool OctalToNumber(const char *srcString, int size, UInt64 &res) -{ - char sz[32]; - MyStrNCpy(sz, srcString, size); - sz[size] = 0; - const char *end; - int i; - for (i = 0; sz[i] == ' '; i++); - res = ConvertOctStringToUInt64(sz + i, &end); - return (*end == ' ' || *end == 0); -} - -static bool OctalToNumber32(const char *srcString, int size, UInt32 &res) -{ - UInt64 res64; - if (!OctalToNumber(srcString, size, res64)) - return false; - res = (UInt32)res64; - return (res64 <= 0xFFFFFFFF); -} - -#define RIF(x) { if (!(x)) return S_FALSE; } - -static bool IsRecordLast(const char *buf) -{ - for (int i = 0; i < NFileHeader::kRecordSize; i++) - if (buf[i] != 0) - return false; - return true; -} - -static void ReadString(const char *s, int size, AString &result) -{ - char temp[NFileHeader::kRecordSize + 1]; - MyStrNCpy(temp, s, size); - temp[size] = '\0'; - result = temp; -} - -static HRESULT GetNextItemReal(ISequentialInStream *stream, bool &filled, CItemEx &item, size_t &processedSize) -{ - item.LongLinkSize = 0; - char buf[NFileHeader::kRecordSize]; - char *p = buf; - - filled = false; - - processedSize = NFileHeader::kRecordSize; - RINOK(ReadStream(stream, buf, &processedSize)); - if (processedSize == 0 || (processedSize == NFileHeader::kRecordSize && IsRecordLast(buf))) - return S_OK; - if (processedSize < NFileHeader::kRecordSize) - return S_FALSE; - - ReadString(p, NFileHeader::kNameSize, item.Name); p += NFileHeader::kNameSize; - - RIF(OctalToNumber32(p, 8, item.Mode)); p += 8; - - if (!OctalToNumber32(p, 8, item.UID)) item.UID = 0; p += 8; - if (!OctalToNumber32(p, 8, item.GID)) item.GID = 0; p += 8; - - RIF(OctalToNumber(p, 12, item.Size)); p += 12; - RIF(OctalToNumber32(p, 12, item.MTime)); p += 12; - - UInt32 checkSum; - RIF(OctalToNumber32(p, 8, checkSum)); - memcpy(p, NFileHeader::kCheckSumBlanks, 8); p += 8; - - item.LinkFlag = *p++; - - ReadString(p, NFileHeader::kNameSize, item.LinkName); p += NFileHeader::kNameSize; - - memcpy(item.Magic, p, 8); p += 8; - - ReadString(p, NFileHeader::kUserNameSize, item.UserName); p += NFileHeader::kUserNameSize; - ReadString(p, NFileHeader::kUserNameSize, item.GroupName); p += NFileHeader::kUserNameSize; - - item.DeviceMajorDefined = (p[0] != 0); RIF(OctalToNumber32(p, 8, item.DeviceMajor)); p += 8; - item.DeviceMinorDefined = (p[0] != 0); RIF(OctalToNumber32(p, 8, item.DeviceMinor)); p += 8; - - AString prefix; - ReadString(p, NFileHeader::kPrefixSize, prefix); - p += NFileHeader::kPrefixSize; - if (!prefix.IsEmpty() && item.IsMagic() && - (item.LinkFlag != 'L' /* || prefix != "00000000000" */ )) - item.Name = prefix + AString('/') + item.Name; - - if (item.LinkFlag == NFileHeader::NLinkFlag::kLink) - item.Size = 0; - - UInt32 checkSumReal = 0; - for (int i = 0; i < NFileHeader::kRecordSize; i++) - checkSumReal += (Byte)buf[i]; - - if (checkSumReal != checkSum) - return S_FALSE; - - filled = true; - return S_OK; -} - -HRESULT ReadItem(ISequentialInStream *stream, bool &filled, CItemEx &item) -{ - size_t processedSize; - RINOK(GetNextItemReal(stream, filled, item, processedSize)); - if (!filled) - return S_OK; - // GNUtar extension - if (item.LinkFlag == 'L') - { - if (item.Name.Compare(NFileHeader::kLongLink) != 0) - if (item.Name.Compare(NFileHeader::kLongLink2) != 0) - return S_FALSE; - - AString fullName; - if (item.Size > (1 << 15)) - return S_FALSE; - int packSize = (int)item.GetPackSize(); - char *buffer = fullName.GetBuffer(packSize + 1); - - RINOK(ReadStream_FALSE(stream, buffer, packSize)); - processedSize += packSize; - buffer[item.Size] = '\0'; - fullName.ReleaseBuffer(); - - UInt64 headerPosition = item.HeaderPosition; - { - size_t processedSize2; - RINOK(GetNextItemReal(stream, filled, item, processedSize2)); - } - item.LongLinkSize = (unsigned)processedSize; - item.Name = fullName; - item.HeaderPosition = headerPosition; - } - else if (item.LinkFlag == 'g' || item.LinkFlag == 'x' || item.LinkFlag == 'X') - { - // pax Extended Header - return S_OK; - } - else if (item.LinkFlag == NFileHeader::NLinkFlag::kDumpDir) - { - // GNU Extensions to the Archive Format - return S_OK; - } - else if (item.LinkFlag > '7' || (item.LinkFlag < '0' && item.LinkFlag != 0)) - return S_FALSE; - return S_OK; -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarIn.h b/desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarIn.h deleted file mode 100644 index 546ad1966..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarIn.h +++ /dev/null @@ -1,18 +0,0 @@ -// Archive/TarIn.h - -#ifndef __ARCHIVE_TAR_IN_H -#define __ARCHIVE_TAR_IN_H - -#include "Common/MyCom.h" -#include "../../IStream.h" - -#include "TarItem.h" - -namespace NArchive { -namespace NTar { - -HRESULT ReadItem(ISequentialInStream *stream, bool &filled, CItemEx &itemInfo); - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarItem.h b/desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarItem.h deleted file mode 100644 index 54beefcc4..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarItem.h +++ /dev/null @@ -1,71 +0,0 @@ -// Archive/Tar/Item.h - -#ifndef __ARCHIVE_TAR_ITEM_H -#define __ARCHIVE_TAR_ITEM_H - -#include "Common/Types.h" -#include "Common/MyString.h" - -#include "../Common/ItemNameUtils.h" -#include "TarHeader.h" - -namespace NArchive { -namespace NTar { - -struct CItem -{ - AString Name; - UInt64 Size; - - UInt32 Mode; - UInt32 UID; - UInt32 GID; - UInt32 MTime; - UInt32 DeviceMajor; - UInt32 DeviceMinor; - - AString LinkName; - AString UserName; - AString GroupName; - - char Magic[8]; - char LinkFlag; - bool DeviceMajorDefined; - bool DeviceMinorDefined; - - bool IsDir() const - { - switch(LinkFlag) - { - case NFileHeader::NLinkFlag::kDirectory: - case NFileHeader::NLinkFlag::kDumpDir: - return true; - case NFileHeader::NLinkFlag::kOldNormal: - case NFileHeader::NLinkFlag::kNormal: - return NItemName::HasTailSlash(Name, CP_OEMCP); - } - return false; - } - - bool IsMagic() const - { - for (int i = 0; i < 5; i++) - if (Magic[i] != NFileHeader::NMagic::kUsTar[i]) - return false; - return true; - } - - UInt64 GetPackSize() const { return (Size + 0x1FF) & (~((UInt64)0x1FF)); } -}; - -struct CItemEx: public CItem -{ - UInt64 HeaderPosition; - unsigned LongLinkSize; - UInt64 GetDataPosition() const { return HeaderPosition + LongLinkSize + NFileHeader::kRecordSize; } - UInt64 GetFullSize() const { return LongLinkSize + NFileHeader::kRecordSize + Size; } -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarRegister.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarRegister.cpp deleted file mode 100644 index 17eccb7b3..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Tar/TarRegister.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// TarRegister.cpp - -#include "StdAfx.h" - -#include "../../Common/RegisterArc.h" - -#include "TarHandler.h" -static IInArchive *CreateArc() { return new NArchive::NTar::CHandler; } -#ifndef EXTRACT_ONLY -static IOutArchive *CreateArcOut() { return new NArchive::NTar::CHandler; } -#else -#define CreateArcOut 0 -#endif - -static CArcInfo g_ArcInfo = -{ L"Tar", L"tar", 0, 0xEE, { 'u', 's', 't', 'a', 'r' }, 5, false, CreateArc, CreateArcOut }; - -REGISTER_ARC(Tar) diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Zip/StdAfx.h b/desmume/src/windows/7z/CPP/7zip/Archive/Zip/StdAfx.h deleted file mode 100644 index 83fdd22d5..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Zip/StdAfx.h +++ /dev/null @@ -1,8 +0,0 @@ -// StdAfx.h - -#ifndef __STDAFX_H -#define __STDAFX_H - -#include "../../../Common/MyWindows.h" - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipCompressionMode.h b/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipCompressionMode.h deleted file mode 100644 index f3c105e81..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipCompressionMode.h +++ /dev/null @@ -1,39 +0,0 @@ -// CompressionMode.h - -#ifndef __ZIP_COMPRESSIONMETHOD_H -#define __ZIP_COMPRESSIONMETHOD_H - -#include "../../../Common/MyString.h" - -namespace NArchive { -namespace NZip { - -struct CCompressionMethodMode -{ - CRecordVector MethodSequence; - UString MatchFinder; - UInt32 Algo; - UInt32 NumPasses; - UInt32 NumFastBytes; - bool NumMatchFinderCyclesDefined; - UInt32 NumMatchFinderCycles; - UInt32 DicSize; - #ifdef COMPRESS_MT - UInt32 NumThreads; - #endif - bool PasswordIsDefined; - AString Password; - bool IsAesMode; - Byte AesKeyMode; - - CCompressionMethodMode(): - NumMatchFinderCyclesDefined(false), - PasswordIsDefined(false), - IsAesMode(false), - AesKeyMode(3) - {} -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipHandler.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipHandler.cpp deleted file mode 100644 index 43f1cf996..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipHandler.cpp +++ /dev/null @@ -1,831 +0,0 @@ -// ZipHandler.cpp - -#include "StdAfx.h" - -#include "Common/ComTry.h" -#include "Common/Defs.h" -#include "Common/IntToString.h" -#include "Common/StringConvert.h" - -#include "Windows/PropVariant.h" -#include "Windows/Time.h" - -#include "../../IPassword.h" - -#include "../../Common/CreateCoder.h" -#include "../../Common/FilterCoder.h" -#include "../../Common/ProgressUtils.h" -#include "../../Common/StreamObjects.h" -#include "../../Common/StreamUtils.h" - -#include "../../Compress/CopyCoder.h" -#include "../../Compress/LzmaDecoder.h" -#include "../../Compress/ImplodeDecoder.h" -#include "../../Compress/ShrinkDecoder.h" - -#include "../../Crypto/WzAes.h" -#include "../../Crypto/ZipCrypto.h" -#include "../../Crypto/ZipStrong.h" - -#include "../Common/ItemNameUtils.h" -#include "../Common/OutStreamWithCRC.h" - -#include "ZipHandler.h" - -using namespace NWindows; - -namespace NArchive { -namespace NZip { - -// static const CMethodId kMethodId_Store = 0; -static const CMethodId kMethodId_ZipBase = 0x040100; -static const CMethodId kMethodId_BZip2 = 0x040202; - -const wchar_t *kHostOS[] = -{ - L"FAT", - L"AMIGA", - L"VMS", - L"Unix", - L"VM/CMS", - L"Atari", - L"HPFS", - L"Macintosh", - L"Z-System", - L"CP/M", - L"TOPS-20", - L"NTFS", - L"SMS/QDOS", - L"Acorn", - L"VFAT", - L"MVS", - L"BeOS", - L"Tandem", - L"OS/400", - L"OS/X" -}; - - -static const int kNumHostOSes = sizeof(kHostOS) / sizeof(kHostOS[0]); - -static const wchar_t *kUnknownOS = L"Unknown"; - -STATPROPSTG kProps[] = -{ - { NULL, kpidPath, VT_BSTR}, - { NULL, kpidIsDir, VT_BOOL}, - { NULL, kpidSize, VT_UI8}, - { NULL, kpidPackSize, VT_UI8}, - { NULL, kpidMTime, VT_FILETIME}, - { NULL, kpidCTime, VT_FILETIME}, - { NULL, kpidATime, VT_FILETIME}, - - { NULL, kpidAttrib, VT_UI4}, - - { NULL, kpidEncrypted, VT_BOOL}, - { NULL, kpidComment, VT_BSTR}, - - { NULL, kpidCRC, VT_UI4}, - - { NULL, kpidMethod, VT_BSTR}, - { NULL, kpidHostOS, VT_BSTR} - - // { NULL, kpidUnpackVer, VT_UI1}, -}; - -const wchar_t *kMethods[] = -{ - L"Store", - L"Shrink", - L"Reduced1", - L"Reduced2", - L"Reduced2", - L"Reduced3", - L"Implode", - L"Tokenizing", - L"Deflate", - L"Deflate64", - L"PKImploding" -}; - -const int kNumMethods = sizeof(kMethods) / sizeof(kMethods[0]); -const wchar_t *kBZip2Method = L"BZip2"; -const wchar_t *kLZMAMethod = L"LZMA"; -const wchar_t *kJpegMethod = L"Jpeg"; -const wchar_t *kWavPackMethod = L"WavPack"; -const wchar_t *kPPMdMethod = L"PPMd"; -const wchar_t *kAESMethod = L"AES"; -const wchar_t *kZipCryptoMethod = L"ZipCrypto"; -const wchar_t *kStrongCryptoMethod = L"StrongCrypto"; - -struct CStrongCryptoPair -{ - UInt16 Id; - const wchar_t *Name; -}; - -CStrongCryptoPair g_StrongCryptoPairs[] = -{ - { NStrongCryptoFlags::kDES, L"DES" }, - { NStrongCryptoFlags::kRC2old, L"RC2a" }, - { NStrongCryptoFlags::k3DES168, L"3DES-168" }, - { NStrongCryptoFlags::k3DES112, L"3DES-112" }, - { NStrongCryptoFlags::kAES128, L"pkAES-128" }, - { NStrongCryptoFlags::kAES192, L"pkAES-192" }, - { NStrongCryptoFlags::kAES256, L"pkAES-256" }, - { NStrongCryptoFlags::kRC2, L"RC2" }, - { NStrongCryptoFlags::kBlowfish, L"Blowfish" }, - { NStrongCryptoFlags::kTwofish, L"Twofish" }, - { NStrongCryptoFlags::kRC4, L"RC4" } -}; - -STATPROPSTG kArcProps[] = -{ - { NULL, kpidBit64, VT_BOOL}, - { NULL, kpidComment, VT_BSTR} -}; - -CHandler::CHandler() -{ - InitMethodProperties(); -} - -static AString BytesToString(const CByteBuffer &data) -{ - AString s; - int size = (int)data.GetCapacity(); - if (size > 0) - { - char *p = s.GetBuffer(size + 1); - memcpy(p, (const Byte *)data, size); - p[size] = '\0'; - s.ReleaseBuffer(); - } - return s; -} - -IMP_IInArchive_Props -IMP_IInArchive_ArcProps - -STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value) -{ - COM_TRY_BEGIN - NWindows::NCOM::CPropVariant prop; - switch(propID) - { - case kpidBit64: if (m_Archive.IsZip64) prop = m_Archive.IsZip64; break; - case kpidComment: - prop = MultiByteToUnicodeString(BytesToString(m_Archive.m_ArchiveInfo.Comment), CP_ACP); - break; - } - prop.Detach(value); - COM_TRY_END - return S_OK; -} - -STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems) -{ - *numItems = m_Items.Size(); - return S_OK; -} - -STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value) -{ - COM_TRY_BEGIN - NWindows::NCOM::CPropVariant prop; - const CItemEx &item = m_Items[index]; - switch(propID) - { - case kpidPath: prop = NItemName::GetOSName2(item.GetUnicodeString(item.Name)); break; - case kpidIsDir: prop = item.IsDir(); break; - case kpidSize: prop = item.UnPackSize; break; - case kpidPackSize: prop = item.PackSize; break; - case kpidTimeType: - { - FILETIME utcFileTime; - if (item.CentralExtra.GetNtfsTime(NFileHeader::NNtfsExtra::kTagTime, utcFileTime)) - prop = (UInt32)NFileTimeType::kWindows; - break; - } - case kpidCTime: - { - FILETIME ft; - if (item.CentralExtra.GetNtfsTime(NFileHeader::NNtfsExtra::kCTime, ft)) - prop = ft; - break; - } - case kpidATime: - { - FILETIME ft; - if (item.CentralExtra.GetNtfsTime(NFileHeader::NNtfsExtra::kATime, ft)) - prop = ft; - break; - } - case kpidMTime: - { - FILETIME utcFileTime; - if (!item.CentralExtra.GetNtfsTime(NFileHeader::NNtfsExtra::kMTime, utcFileTime)) - { - FILETIME localFileTime; - if (NTime::DosTimeToFileTime(item.Time, localFileTime)) - { - if (!LocalFileTimeToFileTime(&localFileTime, &utcFileTime)) - utcFileTime.dwHighDateTime = utcFileTime.dwLowDateTime = 0; - } - else - utcFileTime.dwHighDateTime = utcFileTime.dwLowDateTime = 0; - } - prop = utcFileTime; - break; - } - case kpidAttrib: prop = item.GetWinAttributes(); break; - case kpidEncrypted: prop = item.IsEncrypted(); break; - case kpidComment: prop = item.GetUnicodeString(BytesToString(item.Comment)); break; - case kpidCRC: if (item.IsThereCrc()) prop = item.FileCRC; break; - case kpidMethod: - { - UInt16 methodId = item.CompressionMethod; - UString method; - if (item.IsEncrypted()) - { - if (methodId == NFileHeader::NCompressionMethod::kWzAES) - { - method = kAESMethod; - CWzAesExtraField aesField; - if (item.CentralExtra.GetWzAesField(aesField)) - { - method += L"-"; - wchar_t s[32]; - ConvertUInt64ToString((aesField.Strength + 1) * 64 , s); - method += s; - method += L" "; - methodId = aesField.Method; - } - } - else - { - if (item.IsStrongEncrypted()) - { - CStrongCryptoField f; - bool finded = false; - if (item.CentralExtra.GetStrongCryptoField(f)) - { - for (int i = 0; i < sizeof(g_StrongCryptoPairs) / sizeof(g_StrongCryptoPairs[0]); i++) - { - const CStrongCryptoPair &pair = g_StrongCryptoPairs[i]; - if (f.AlgId == pair.Id) - { - method += pair.Name; - finded = true; - break; - } - } - } - if (!finded) - method += kStrongCryptoMethod; - } - else - method += kZipCryptoMethod; - method += L" "; - } - } - if (methodId < kNumMethods) - method += kMethods[methodId]; - else switch (methodId) - { - case NFileHeader::NCompressionMethod::kLZMA: - method += kLZMAMethod; - if (item.IsLzmaEOS()) - method += L":EOS"; - break; - case NFileHeader::NCompressionMethod::kBZip2: method += kBZip2Method; break; - case NFileHeader::NCompressionMethod::kJpeg: method += kJpegMethod; break; - case NFileHeader::NCompressionMethod::kWavPack: method += kWavPackMethod; break; - case NFileHeader::NCompressionMethod::kPPMd: method += kPPMdMethod; break; - default: - { - wchar_t s[32]; - ConvertUInt64ToString(methodId, s); - method += s; - } - } - prop = method; - break; - } - case kpidHostOS: - prop = (item.MadeByVersion.HostOS < kNumHostOSes) ? - (kHostOS[item.MadeByVersion.HostOS]) : kUnknownOS; - break; - } - prop.Detach(value); - return S_OK; - COM_TRY_END -} - -class CProgressImp: public CProgressVirt -{ - CMyComPtr _callback; -public: - STDMETHOD(SetTotal)(UInt64 numFiles); - STDMETHOD(SetCompleted)(UInt64 numFiles); - CProgressImp(IArchiveOpenCallback *callback): _callback(callback) {} -}; - -STDMETHODIMP CProgressImp::SetTotal(UInt64 numFiles) -{ - if (_callback) - return _callback->SetTotal(&numFiles, NULL); - return S_OK; -} - -STDMETHODIMP CProgressImp::SetCompleted(UInt64 numFiles) -{ - if (_callback) - return _callback->SetCompleted(&numFiles, NULL); - return S_OK; -} - -STDMETHODIMP CHandler::Open(IInStream *inStream, - const UInt64 *maxCheckStartPosition, IArchiveOpenCallback *callback) -{ - COM_TRY_BEGIN - try - { - Close(); - RINOK(inStream->Seek(0, STREAM_SEEK_SET, NULL)); - RINOK(m_Archive.Open(inStream, maxCheckStartPosition)); - CProgressImp progressImp(callback); - return m_Archive.ReadHeaders(m_Items, &progressImp); - } - catch(const CInArchiveException &) { Close(); return S_FALSE; } - catch(...) { Close(); throw; } - COM_TRY_END -} - -STDMETHODIMP CHandler::Close() -{ - m_Items.Clear(); - m_Archive.Close(); - return S_OK; -} - -////////////////////////////////////// -// CHandler::DecompressItems - -class CLzmaDecoder: - public ICompressCoder, - public CMyUnknownImp -{ - NCompress::NLzma::CDecoder *DecoderSpec; - CMyComPtr Decoder; -public: - CLzmaDecoder(); - STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); - - MY_UNKNOWN_IMP -}; - -CLzmaDecoder::CLzmaDecoder() -{ - DecoderSpec = new NCompress::NLzma::CDecoder; - Decoder = DecoderSpec; -} - -HRESULT CLzmaDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress) -{ - Byte buf[9]; - RINOK(ReadStream_FALSE(inStream, buf, 9)); - if (buf[2] != 5 || buf[3] != 0) - return E_NOTIMPL; - RINOK(DecoderSpec->SetDecoderProperties2(buf + 4, 5)); - return Decoder->Code(inStream, outStream, NULL, outSize, progress); -} - -struct CMethodItem -{ - UInt16 ZipMethod; - CMyComPtr Coder; -}; - -class CZipDecoder -{ - NCrypto::NZip::CDecoder *_zipCryptoDecoderSpec; - NCrypto::NZipStrong::CDecoder *_pkAesDecoderSpec; - NCrypto::NWzAes::CDecoder *_wzAesDecoderSpec; - - CMyComPtr _zipCryptoDecoder; - CMyComPtr _pkAesDecoder; - CMyComPtr _wzAesDecoder; - - CFilterCoder *filterStreamSpec; - CMyComPtr filterStream; - CMyComPtr getTextPassword; - CObjectVector methodItems; - -public: - CZipDecoder(): - _zipCryptoDecoderSpec(0), - _pkAesDecoderSpec(0), - _wzAesDecoderSpec(0), - filterStreamSpec(0) {} - - HRESULT Decode( - DECL_EXTERNAL_CODECS_LOC_VARS - CInArchive &archive, const CItemEx &item, - ISequentialOutStream *realOutStream, - IArchiveExtractCallback *extractCallback, - ICompressProgressInfo *compressProgress, - UInt32 numThreads, Int32 &res); -}; - -HRESULT CZipDecoder::Decode( - DECL_EXTERNAL_CODECS_LOC_VARS - CInArchive &archive, const CItemEx &item, - ISequentialOutStream *realOutStream, - IArchiveExtractCallback *extractCallback, - ICompressProgressInfo *compressProgress, - UInt32 numThreads, Int32 &res) -{ - res = NArchive::NExtract::NOperationResult::kDataError; - CInStreamReleaser inStreamReleaser; - - bool needCRC = true; - bool wzAesMode = false; - bool pkAesMode = false; - UInt16 methodId = item.CompressionMethod; - if (item.IsEncrypted()) - { - if (item.IsStrongEncrypted()) - { - CStrongCryptoField f; - if (item.CentralExtra.GetStrongCryptoField(f)) - { - pkAesMode = true; - } - if (!pkAesMode) - { - res = NArchive::NExtract::NOperationResult::kUnSupportedMethod; - return S_OK; - } - } - if (methodId == NFileHeader::NCompressionMethod::kWzAES) - { - CWzAesExtraField aesField; - if (item.CentralExtra.GetWzAesField(aesField)) - { - wzAesMode = true; - needCRC = aesField.NeedCrc(); - } - } - } - - COutStreamWithCRC *outStreamSpec = new COutStreamWithCRC; - CMyComPtr outStream = outStreamSpec; - outStreamSpec->SetStream(realOutStream); - outStreamSpec->Init(needCRC); - - UInt64 authenticationPos; - - CMyComPtr inStream; - { - UInt64 packSize = item.PackSize; - if (wzAesMode) - { - if (packSize < NCrypto::NWzAes::kMacSize) - return S_OK; - packSize -= NCrypto::NWzAes::kMacSize; - } - UInt64 dataPos = item.GetDataPosition(); - inStream.Attach(archive.CreateLimitedStream(dataPos, packSize)); - authenticationPos = dataPos + packSize; - } - - CMyComPtr cryptoFilter; - if (item.IsEncrypted()) - { - if (wzAesMode) - { - CWzAesExtraField aesField; - if (!item.CentralExtra.GetWzAesField(aesField)) - return S_OK; - methodId = aesField.Method; - if (!_wzAesDecoder) - { - _wzAesDecoderSpec = new NCrypto::NWzAes::CDecoder; - _wzAesDecoder = _wzAesDecoderSpec; - } - cryptoFilter = _wzAesDecoder; - Byte properties = aesField.Strength; - RINOK(_wzAesDecoderSpec->SetDecoderProperties2(&properties, 1)); - } - else if (pkAesMode) - { - if (!_pkAesDecoder) - { - _pkAesDecoderSpec = new NCrypto::NZipStrong::CDecoder; - _pkAesDecoder = _pkAesDecoderSpec; - } - cryptoFilter = _pkAesDecoder; - } - else - { - if (!_zipCryptoDecoder) - { - _zipCryptoDecoderSpec = new NCrypto::NZip::CDecoder; - _zipCryptoDecoder = _zipCryptoDecoderSpec; - } - cryptoFilter = _zipCryptoDecoder; - } - CMyComPtr cryptoSetPassword; - RINOK(cryptoFilter.QueryInterface(IID_ICryptoSetPassword, &cryptoSetPassword)); - - if (!getTextPassword) - extractCallback->QueryInterface(IID_ICryptoGetTextPassword, (void **)&getTextPassword); - - if (getTextPassword) - { - CMyComBSTR password; - RINOK(getTextPassword->CryptoGetTextPassword(&password)); - AString charPassword; - if (wzAesMode || pkAesMode) - { - charPassword = UnicodeStringToMultiByte((const wchar_t *)password, CP_ACP); - /* - for (int i = 0;; i++) - { - wchar_t c = password[i]; - if (c == 0) - break; - if (c >= 0x80) - { - res = NArchive::NExtract::NOperationResult::kDataError; - return S_OK; - } - charPassword += (char)c; - } - */ - } - else - { - // we use OEM. WinZip/Windows probably use ANSI for some files - charPassword = UnicodeStringToMultiByte((const wchar_t *)password, CP_OEMCP); - } - HRESULT result = cryptoSetPassword->CryptoSetPassword( - (const Byte *)(const char *)charPassword, charPassword.Length()); - if (result != S_OK) - return S_OK; - } - else - { - RINOK(cryptoSetPassword->CryptoSetPassword(0, 0)); - } - } - - int m; - for (m = 0; m < methodItems.Size(); m++) - if (methodItems[m].ZipMethod == methodId) - break; - - if (m == methodItems.Size()) - { - CMethodItem mi; - mi.ZipMethod = methodId; - if (methodId == NFileHeader::NCompressionMethod::kStored) - mi.Coder = new NCompress::CCopyCoder; - else if (methodId == NFileHeader::NCompressionMethod::kShrunk) - mi.Coder = new NCompress::NShrink::CDecoder; - else if (methodId == NFileHeader::NCompressionMethod::kImploded) - mi.Coder = new NCompress::NImplode::NDecoder::CCoder; - else if (methodId == NFileHeader::NCompressionMethod::kLZMA) - mi.Coder = new CLzmaDecoder; - else - { - CMethodId szMethodID; - if (methodId == NFileHeader::NCompressionMethod::kBZip2) - szMethodID = kMethodId_BZip2; - else - { - if (methodId > 0xFF) - { - res = NArchive::NExtract::NOperationResult::kUnSupportedMethod; - return S_OK; - } - szMethodID = kMethodId_ZipBase + (Byte)methodId; - } - - RINOK(CreateCoder(EXTERNAL_CODECS_LOC_VARS szMethodID, mi.Coder, false)); - - if (mi.Coder == 0) - { - res = NArchive::NExtract::NOperationResult::kUnSupportedMethod; - return S_OK; - } - } - m = methodItems.Add(mi); - } - ICompressCoder *coder = methodItems[m].Coder; - - { - CMyComPtr setDecoderProperties; - coder->QueryInterface(IID_ICompressSetDecoderProperties2, (void **)&setDecoderProperties); - if (setDecoderProperties) - { - Byte properties = (Byte)item.Flags; - RINOK(setDecoderProperties->SetDecoderProperties2(&properties, 1)); - } - } - - #ifdef COMPRESS_MT - { - CMyComPtr setCoderMt; - coder->QueryInterface(IID_ICompressSetCoderMt, (void **)&setCoderMt); - if (setCoderMt) - { - RINOK(setCoderMt->SetNumberOfThreads(numThreads)); - } - } - #endif - - { - HRESULT result = S_OK; - CMyComPtr inStreamNew; - if (item.IsEncrypted()) - { - if (!filterStream) - { - filterStreamSpec = new CFilterCoder; - filterStream = filterStreamSpec; - } - filterStreamSpec->Filter = cryptoFilter; - if (wzAesMode) - { - result = _wzAesDecoderSpec->ReadHeader(inStream); - } - else if (pkAesMode) - { - result =_pkAesDecoderSpec->ReadHeader(inStream, item.FileCRC, item.UnPackSize); - if (result == S_OK) - { - bool passwOK; - result = _pkAesDecoderSpec->CheckPassword(passwOK); - if (result == S_OK && !passwOK) - result = S_FALSE; - } - } - else - { - result = _zipCryptoDecoderSpec->ReadHeader(inStream); - } - - if (result == S_OK) - { - RINOK(filterStreamSpec->SetInStream(inStream)); - inStreamReleaser.FilterCoder = filterStreamSpec; - inStreamNew = filterStream; - if (wzAesMode) - { - if (!_wzAesDecoderSpec->CheckPasswordVerifyCode()) - result = S_FALSE; - } - } - } - else - inStreamNew = inStream; - if (result == S_OK) - result = coder->Code(inStreamNew, outStream, NULL, &item.UnPackSize, compressProgress); - if (result == S_FALSE) - return S_OK; - if (result == E_NOTIMPL) - { - res = NArchive::NExtract::NOperationResult::kUnSupportedMethod; - return S_OK; - } - - RINOK(result); - } - bool crcOK = true; - bool authOk = true; - if (needCRC) - crcOK = (outStreamSpec->GetCRC() == item.FileCRC); - if (wzAesMode) - { - inStream.Attach(archive.CreateLimitedStream(authenticationPos, NCrypto::NWzAes::kMacSize)); - if (_wzAesDecoderSpec->CheckMac(inStream, authOk) != S_OK) - authOk = false; - } - - res = ((crcOK && authOk) ? - NArchive::NExtract::NOperationResult::kOK : - NArchive::NExtract::NOperationResult::kCRCError); - return S_OK; -} - - -STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, - Int32 _aTestMode, IArchiveExtractCallback *extractCallback) -{ - COM_TRY_BEGIN - CZipDecoder myDecoder; - bool testMode = (_aTestMode != 0); - UInt64 totalUnPacked = 0, totalPacked = 0; - bool allFilesMode = (numItems == UInt32(-1)); - if (allFilesMode) - numItems = m_Items.Size(); - if(numItems == 0) - return S_OK; - UInt32 i; - for(i = 0; i < numItems; i++) - { - const CItemEx &item = m_Items[allFilesMode ? i : indices[i]]; - totalUnPacked += item.UnPackSize; - totalPacked += item.PackSize; - } - RINOK(extractCallback->SetTotal(totalUnPacked)); - - UInt64 currentTotalUnPacked = 0, currentTotalPacked = 0; - UInt64 currentItemUnPacked, currentItemPacked; - - CLocalProgress *lps = new CLocalProgress; - CMyComPtr progress = lps; - lps->Init(extractCallback, false); - - for (i = 0; i < numItems; i++, currentTotalUnPacked += currentItemUnPacked, - currentTotalPacked += currentItemPacked) - { - currentItemUnPacked = 0; - currentItemPacked = 0; - - lps->InSize = currentTotalPacked; - lps->OutSize = currentTotalUnPacked; - RINOK(lps->SetCur()); - - CMyComPtr realOutStream; - Int32 askMode = testMode ? - NArchive::NExtract::NAskMode::kTest : - NArchive::NExtract::NAskMode::kExtract; - Int32 index = allFilesMode ? i : indices[i]; - - RINOK(extractCallback->GetStream(index, &realOutStream, askMode)); - - CItemEx item = m_Items[index]; - if (!item.FromLocal) - { - HRESULT res = m_Archive.ReadLocalItemAfterCdItem(item); - if (res == S_FALSE) - { - if (item.IsDir() || realOutStream || testMode) - { - RINOK(extractCallback->PrepareOperation(askMode)); - realOutStream.Release(); - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kUnSupportedMethod)); - } - continue; - } - RINOK(res); - } - - if (item.IsDir() || item.IgnoreItem()) - { - // if (!testMode) - { - RINOK(extractCallback->PrepareOperation(askMode)); - realOutStream.Release(); - RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK)); - } - continue; - } - - currentItemUnPacked = item.UnPackSize; - currentItemPacked = item.PackSize; - - if (!testMode && (!realOutStream)) - continue; - - RINOK(extractCallback->PrepareOperation(askMode)); - -#ifndef COMPRESS_MT -#define _numThreads 1 -#endif - - Int32 res; - RINOK(myDecoder.Decode( - EXTERNAL_CODECS_VARS - m_Archive, item, realOutStream, extractCallback, - progress, - _numThreads, - res)); - realOutStream.Release(); - - RINOK(extractCallback->SetOperationResult(res)) - } - return S_OK; - COM_TRY_END -} - -#ifndef EXTRACT_ONLY -IMPL_ISetCompressCodecsInfo -#endif - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipHandler.h b/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipHandler.h deleted file mode 100644 index fc0cfa250..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipHandler.h +++ /dev/null @@ -1,100 +0,0 @@ -// Zip/Handler.h - -#ifndef __ZIP_HANDLER_H -#define __ZIP_HANDLER_H - -#include "../../../Common/DynamicBuffer.h" -#include "../../ICoder.h" -#include "../IArchive.h" - -#include "../../Common/CreateCoder.h" - -#include "ZipIn.h" -#include "ZipCompressionMode.h" - -#ifdef COMPRESS_MT -#include "../../../Windows/System.h" -#endif - -namespace NArchive { -namespace NZip { - -class CHandler: - public IInArchive, -#ifndef EXTRACT_ONLY - public IOutArchive, - public ISetProperties, - PUBLIC_ISetCompressCodecsInfo -#endif - public CMyUnknownImp -{ -public: - MY_QUERYINTERFACE_BEGIN2(IInArchive) -#ifndef EXTRACT_ONLY - MY_QUERYINTERFACE_ENTRY(IOutArchive) - MY_QUERYINTERFACE_ENTRY(ISetProperties) - QUERY_ENTRY_ISetCompressCodecsInfo -#endif - MY_QUERYINTERFACE_END - MY_ADDREF_RELEASE - - INTERFACE_IInArchive(;) -#ifndef EXTRACT_ONLY - INTERFACE_IOutArchive(;) - - STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties); - - DECL_ISetCompressCodecsInfo -#endif - - CHandler(); -private: - CObjectVector m_Items; - CInArchive m_Archive; - - int m_Level; - int m_MainMethod; - UInt32 m_DicSize; - UInt32 m_Algo; - UInt32 m_NumPasses; - UInt32 m_NumFastBytes; - UInt32 m_NumMatchFinderCycles; - bool m_NumMatchFinderCyclesDefined; - - bool m_IsAesMode; - Byte m_AesKeyMode; - - bool m_WriteNtfsTimeExtra; - bool m_ForseLocal; - bool m_ForseUtf8; - - #ifdef COMPRESS_MT - UInt32 _numThreads; - #endif - - DECL_EXTERNAL_CODECS_VARS - - void InitMethodProperties() - { - m_Level = -1; - m_MainMethod = -1; - m_Algo = - m_DicSize = - m_NumPasses = - m_NumFastBytes = - m_NumMatchFinderCycles = 0xFFFFFFFF; - m_NumMatchFinderCyclesDefined = false; - m_IsAesMode = false; - m_AesKeyMode = 3; // aes-256 - m_WriteNtfsTimeExtra = false; - m_ForseLocal = false; - m_ForseUtf8 = false; - #ifdef COMPRESS_MT - _numThreads = NWindows::NSystem::GetNumberOfProcessors();; - #endif - } -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipHeader.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipHeader.cpp deleted file mode 100644 index 331aed2be..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipHeader.cpp +++ /dev/null @@ -1,35 +0,0 @@ -// Archive/Zip/Header.h - -#include "StdAfx.h" - -#include "ZipHeader.h" - -namespace NArchive { -namespace NZip { - -namespace NSignature -{ - UInt32 kLocalFileHeader = 0x04034B50 + 1; - UInt32 kDataDescriptor = 0x08074B50 + 1; - UInt32 kCentralFileHeader = 0x02014B50 + 1; - UInt32 kEndOfCentralDir = 0x06054B50 + 1; - UInt32 kZip64EndOfCentralDir = 0x06064B50 + 1; - UInt32 kZip64EndOfCentralDirLocator = 0x07064B50 + 1; - - class CMarkersInitializer - { - public: - CMarkersInitializer() - { - kLocalFileHeader--; - kDataDescriptor--; - kCentralFileHeader--; - kEndOfCentralDir--; - kZip64EndOfCentralDir--; - kZip64EndOfCentralDirLocator--; - } - } g_MarkerInitializer; -} - -}} - diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipHeader.h b/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipHeader.h deleted file mode 100644 index b595e65e8..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipHeader.h +++ /dev/null @@ -1,265 +0,0 @@ -// Archive/Zip/Header.h - -#ifndef __ARCHIVE_ZIP_HEADER_H -#define __ARCHIVE_ZIP_HEADER_H - -#include "../../../Common/Types.h" - -namespace NArchive { -namespace NZip { - -namespace NSignature -{ - extern UInt32 kLocalFileHeader; - extern UInt32 kDataDescriptor; - extern UInt32 kCentralFileHeader; - extern UInt32 kEndOfCentralDir; - extern UInt32 kZip64EndOfCentralDir; - extern UInt32 kZip64EndOfCentralDirLocator; - - static const UInt32 kMarkerSize = 4; -} - -const UInt32 kEcdSize = 22; -const UInt32 kZip64EcdSize = 44; -const UInt32 kZip64EcdLocatorSize = 20; -/* -struct CEndOfCentralDirectoryRecord -{ - UInt16 ThisDiskNumber; - UInt16 StartCentralDirectoryDiskNumber; - UInt16 NumEntriesInCentaralDirectoryOnThisDisk; - UInt16 NumEntriesInCentaralDirectory; - UInt32 CentralDirectorySize; - UInt32 CentralDirectoryStartOffset; - UInt16 CommentSize; -}; - -struct CEndOfCentralDirectoryRecordFull -{ - UInt32 Signature; - CEndOfCentralDirectoryRecord Header; -}; -*/ - -namespace NFileHeader -{ - /* - struct CVersion - { - Byte Version; - Byte HostOS; - }; - */ - - namespace NCompressionMethod - { - enum EType - { - kStored = 0, - kShrunk = 1, - kReduced1 = 2, - kReduced2 = 3, - kReduced3 = 4, - kReduced4 = 5, - kImploded = 6, - kReservedTokenizing = 7, // reserved for tokenizing - kDeflated = 8, - kDeflated64 = 9, - kPKImploding = 10, - - kBZip2 = 12, - kLZMA = 14, - kTerse = 18, - kLz77 = 19, - kJpeg = 0x60, - kWavPack = 0x61, - kPPMd = 0x62, - kWzAES = 0x63 - }; - const int kNumCompressionMethods = 11; - const Byte kMadeByProgramVersion = 20; - - const Byte kDeflateExtractVersion = 20; - const Byte kStoreExtractVersion = 10; - - const Byte kSupportedVersion = 20; - } - - namespace NExtraID - { - enum - { - kZip64 = 0x01, - kNTFS = 0x0A, - kStrongEncrypt = 0x17, - kWzAES = 0x9901 - }; - } - - namespace NNtfsExtra - { - const UInt16 kTagTime = 1; - enum - { - kMTime = 0, - kATime = 1, - kCTime = 2 - }; - } - - const UInt32 kLocalBlockSize = 26; - /* - struct CLocalBlock - { - CVersion ExtractVersion; - - UInt16 Flags; - UInt16 CompressionMethod; - UInt32 Time; - UInt32 FileCRC; - UInt32 PackSize; - UInt32 UnPackSize; - UInt16 NameSize; - UInt16 ExtraSize; - }; - */ - - const UInt32 kDataDescriptorSize = 16; - // const UInt32 kDataDescriptor64Size = 16 + 8; - /* - struct CDataDescriptor - { - UInt32 Signature; - UInt32 FileCRC; - UInt32 PackSize; - UInt32 UnPackSize; - }; - - struct CLocalBlockFull - { - UInt32 Signature; - CLocalBlock Header; - }; - */ - - const UInt32 kCentralBlockSize = 42; - /* - struct CBlock - { - CVersion MadeByVersion; - CVersion ExtractVersion; - UInt16 Flags; - UInt16 CompressionMethod; - UInt32 Time; - UInt32 FileCRC; - UInt32 PackSize; - UInt32 UnPackSize; - UInt16 NameSize; - UInt16 ExtraSize; - UInt16 CommentSize; - UInt16 DiskNumberStart; - UInt16 InternalAttributes; - UInt32 ExternalAttributes; - UInt32 LocalHeaderOffset; - }; - - struct CBlockFull - { - UInt32 Signature; - CBlock Header; - }; - */ - - namespace NFlags - { - const int kEncrypted = 1 << 0; - const int kLzmaEOS = 1 << 1; - const int kDescriptorUsedMask = 1 << 3; - const int kStrongEncrypted = 1 << 6; - const int kUtf8 = 1 << 11; - - const int kImplodeDictionarySizeMask = 1 << 1; - const int kImplodeLiteralsOnMask = 1 << 2; - - const int kDeflateTypeBitStart = 1; - const int kNumDeflateTypeBits = 2; - const int kNumDeflateTypes = (1 << kNumDeflateTypeBits); - const int kDeflateTypeMask = (1 << kNumDeflateTypeBits) - 1; - } - - namespace NHostOS - { - enum EEnum - { - kFAT = 0, - kAMIGA = 1, - kVMS = 2, // VAX/VMS - kUnix = 3, - kVM_CMS = 4, - kAtari = 5, // what if it's a minix filesystem? [cjh] - kHPFS = 6, // filesystem used by OS/2 (and NT 3.x) - kMac = 7, - kZ_System = 8, - kCPM = 9, - kTOPS20 = 10, // pkzip 2.50 NTFS - kNTFS = 11, // filesystem used by Windows NT - kQDOS = 12, // SMS/QDOS - kAcorn = 13, // Archimedes Acorn RISC OS - kVFAT = 14, // filesystem used by Windows 95, NT - kMVS = 15, - kBeOS = 16, // hybrid POSIX/database filesystem - kTandem = 17, - kOS400 = 18, - kOSX = 19 - }; - } - namespace NUnixAttribute - { - const UInt32 kIFMT = 0170000; /* Unix file type mask */ - - const UInt32 kIFDIR = 0040000; /* Unix directory */ - const UInt32 kIFREG = 0100000; /* Unix regular file */ - const UInt32 kIFSOCK = 0140000; /* Unix socket (BSD, not SysV or Amiga) */ - const UInt32 kIFLNK = 0120000; /* Unix symbolic link (not SysV, Amiga) */ - const UInt32 kIFBLK = 0060000; /* Unix block special (not Amiga) */ - const UInt32 kIFCHR = 0020000; /* Unix character special (not Amiga) */ - const UInt32 kIFIFO = 0010000; /* Unix fifo (BCC, not MSC or Amiga) */ - - const UInt32 kISUID = 04000; /* Unix set user id on execution */ - const UInt32 kISGID = 02000; /* Unix set group id on execution */ - const UInt32 kISVTX = 01000; /* Unix directory permissions control */ - const UInt32 kENFMT = kISGID; /* Unix record locking enforcement flag */ - const UInt32 kIRWXU = 00700; /* Unix read, write, execute: owner */ - const UInt32 kIRUSR = 00400; /* Unix read permission: owner */ - const UInt32 kIWUSR = 00200; /* Unix write permission: owner */ - const UInt32 kIXUSR = 00100; /* Unix execute permission: owner */ - const UInt32 kIRWXG = 00070; /* Unix read, write, execute: group */ - const UInt32 kIRGRP = 00040; /* Unix read permission: group */ - const UInt32 kIWGRP = 00020; /* Unix write permission: group */ - const UInt32 kIXGRP = 00010; /* Unix execute permission: group */ - const UInt32 kIRWXO = 00007; /* Unix read, write, execute: other */ - const UInt32 kIROTH = 00004; /* Unix read permission: other */ - const UInt32 kIWOTH = 00002; /* Unix write permission: other */ - const UInt32 kIXOTH = 00001; /* Unix execute permission: other */ - } - - namespace NAmigaAttribute - { - const UInt32 kIFMT = 06000; /* Amiga file type mask */ - const UInt32 kIFDIR = 04000; /* Amiga directory */ - const UInt32 kIFREG = 02000; /* Amiga regular file */ - const UInt32 kIHIDDEN = 00200; /* to be supported in AmigaDOS 3.x */ - const UInt32 kISCRIPT = 00100; /* executable script (text command file) */ - const UInt32 kIPURE = 00040; /* allow loading into resident memory */ - const UInt32 kIARCHIVE = 00020; /* not modified since bit was last set */ - const UInt32 kIREAD = 00010; /* can be opened for reading */ - const UInt32 kIWRITE = 00004; /* can be opened for writing */ - const UInt32 kIEXECUTE = 00002; /* executable image, a loadable runfile */ - const UInt32 kIDELETE = 00001; /* can be deleted */ - } -} - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipIn.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipIn.cpp deleted file mode 100644 index 7c43bd911..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipIn.cpp +++ /dev/null @@ -1,868 +0,0 @@ -// Archive/ZipIn.cpp - -#include "StdAfx.h" - -#include "ZipIn.h" -#include "Windows/Defs.h" -#include "Common/StringConvert.h" -#include "Common/DynamicBuffer.h" -#include "../../Common/LimitedStreams.h" -#include "../../Common/StreamUtils.h" - -extern "C" -{ - #include "../../../../C/CpuArch.h" -} - -#define Get16(p) GetUi16(p) -#define Get32(p) GetUi32(p) -#define Get64(p) GetUi64(p) - -namespace NArchive { -namespace NZip { - -// static const char kEndOfString = '\0'; - -HRESULT CInArchive::Open(IInStream *stream, const UInt64 *searchHeaderSizeLimit) -{ - Close(); - RINOK(stream->Seek(0, STREAM_SEEK_CUR, &m_StreamStartPosition)); - m_Position = m_StreamStartPosition; - RINOK(FindAndReadMarker(stream, searchHeaderSizeLimit)); - RINOK(stream->Seek(m_Position, STREAM_SEEK_SET, NULL)); - m_Stream = stream; - return S_OK; -} - -void CInArchive::Close() -{ - m_Stream.Release(); -} - -HRESULT CInArchive::Seek(UInt64 offset) -{ - return m_Stream->Seek(offset, STREAM_SEEK_SET, NULL); -} - -////////////////////////////////////// -// Markers - -static inline bool TestMarkerCandidate(const Byte *p, UInt32 &value) -{ - value = Get32(p); - return - (value == NSignature::kLocalFileHeader) || - (value == NSignature::kEndOfCentralDir); -} - -static const UInt32 kNumMarkerAddtionalBytes = 2; -static inline bool TestMarkerCandidate2(const Byte *p, UInt32 &value) -{ - value = Get32(p); - if (value == NSignature::kEndOfCentralDir) - return (Get16(p + 4) == 0); - return (value == NSignature::kLocalFileHeader && p[4] < 128); -} - -HRESULT CInArchive::FindAndReadMarker(IInStream *stream, const UInt64 *searchHeaderSizeLimit) -{ - m_ArchiveInfo.Clear(); - m_Position = m_StreamStartPosition; - - Byte marker[NSignature::kMarkerSize]; - RINOK(ReadStream_FALSE(stream, marker, NSignature::kMarkerSize)); - m_Position += NSignature::kMarkerSize; - if (TestMarkerCandidate(marker, m_Signature)) - return S_OK; - - CByteDynamicBuffer dynamicBuffer; - const UInt32 kSearchMarkerBufferSize = 0x10000; - dynamicBuffer.EnsureCapacity(kSearchMarkerBufferSize); - Byte *buffer = dynamicBuffer; - UInt32 numBytesPrev = NSignature::kMarkerSize - 1; - memcpy(buffer, marker + 1, numBytesPrev); - UInt64 curTestPos = m_StreamStartPosition + 1; - for (;;) - { - if (searchHeaderSizeLimit != NULL) - if (curTestPos - m_StreamStartPosition > *searchHeaderSizeLimit) - break; - size_t numReadBytes = kSearchMarkerBufferSize - numBytesPrev; - RINOK(ReadStream(stream, buffer + numBytesPrev, &numReadBytes)); - m_Position += numReadBytes; - UInt32 numBytesInBuffer = numBytesPrev + (UInt32)numReadBytes; - const UInt32 kMarker2Size = NSignature::kMarkerSize + kNumMarkerAddtionalBytes; - if (numBytesInBuffer < kMarker2Size) - break; - UInt32 numTests = numBytesInBuffer - kMarker2Size + 1; - for (UInt32 pos = 0; pos < numTests; pos++) - { - if (buffer[pos] != 0x50) - continue; - if (TestMarkerCandidate2(buffer + pos, m_Signature)) - { - curTestPos += pos; - m_ArchiveInfo.StartPosition = curTestPos; - m_Position = curTestPos + NSignature::kMarkerSize; - return S_OK; - } - } - curTestPos += numTests; - numBytesPrev = numBytesInBuffer - numTests; - memmove(buffer, buffer + numTests, numBytesPrev); - } - return S_FALSE; -} - -HRESULT CInArchive::ReadBytes(void *data, UInt32 size, UInt32 *processedSize) -{ - size_t realProcessedSize = size; - HRESULT result = ReadStream(m_Stream, data, &realProcessedSize); - if (processedSize != NULL) - *processedSize = (UInt32)realProcessedSize; - m_Position += realProcessedSize; - return result; -} - -void CInArchive::IncreaseRealPosition(UInt64 addValue) -{ - if (m_Stream->Seek(addValue, STREAM_SEEK_CUR, &m_Position) != S_OK) - throw CInArchiveException(CInArchiveException::kSeekStreamError); -} - -bool CInArchive::ReadBytesAndTestSize(void *data, UInt32 size) -{ - UInt32 realProcessedSize; - if (ReadBytes(data, size, &realProcessedSize) != S_OK) - throw CInArchiveException(CInArchiveException::kReadStreamError); - return (realProcessedSize == size); -} - -void CInArchive::SafeReadBytes(void *data, UInt32 size) -{ - if (!ReadBytesAndTestSize(data, size)) - throw CInArchiveException(CInArchiveException::kUnexpectedEndOfArchive); -} - -void CInArchive::ReadBuffer(CByteBuffer &buffer, UInt32 size) -{ - buffer.SetCapacity(size); - if (size > 0) - SafeReadBytes(buffer, size); -} - -Byte CInArchive::ReadByte() -{ - Byte b; - SafeReadBytes(&b, 1); - return b; -} - -UInt16 CInArchive::ReadUInt16() -{ - UInt16 value = 0; - for (int i = 0; i < 2; i++) - value |= (((UInt16)ReadByte()) << (8 * i)); - return value; -} - -UInt32 CInArchive::ReadUInt32() -{ - UInt32 value = 0; - for (int i = 0; i < 4; i++) - value |= (((UInt32)ReadByte()) << (8 * i)); - return value; -} - -UInt64 CInArchive::ReadUInt64() -{ - UInt64 value = 0; - for (int i = 0; i < 8; i++) - value |= (((UInt64)ReadByte()) << (8 * i)); - return value; -} - -bool CInArchive::ReadUInt32(UInt32 &value) -{ - value = 0; - for (int i = 0; i < 4; i++) - { - Byte b; - if (!ReadBytesAndTestSize(&b, 1)) - return false; - value |= (UInt32(b) << (8 * i)); - } - return true; -} - - -AString CInArchive::ReadFileName(UInt32 nameSize) -{ - if (nameSize == 0) - return AString(); - char *p = m_NameBuffer.GetBuffer(nameSize); - SafeReadBytes(p, nameSize); - p[nameSize] = 0; - m_NameBuffer.ReleaseBuffer(); - return m_NameBuffer; -} - -void CInArchive::GetArchiveInfo(CInArchiveInfo &archiveInfo) const -{ - archiveInfo = m_ArchiveInfo; -} - -/* -void CInArchive::ThrowIncorrectArchiveException() -{ - throw CInArchiveException(CInArchiveException::kIncorrectArchive); -} -*/ - -static UInt32 GetUInt32(const Byte *data) -{ - return - ((UInt32)(Byte)data[0]) | - (((UInt32)(Byte)data[1]) << 8) | - (((UInt32)(Byte)data[2]) << 16) | - (((UInt32)(Byte)data[3]) << 24); -} - -/* -static UInt16 GetUInt16(const Byte *data) -{ - return - ((UInt16)(Byte)data[0]) | - (((UInt16)(Byte)data[1]) << 8); -} -*/ - -static UInt64 GetUInt64(const Byte *data) -{ - return GetUInt32(data) | ((UInt64)GetUInt32(data + 4) << 32); -} - - - -void CInArchive::ReadExtra(UInt32 extraSize, CExtraBlock &extraBlock, - UInt64 &unpackSize, UInt64 &packSize, UInt64 &localHeaderOffset, UInt32 &diskStartNumber) -{ - extraBlock.Clear(); - UInt32 remain = extraSize; - while(remain >= 4) - { - CExtraSubBlock subBlock; - subBlock.ID = ReadUInt16(); - UInt32 dataSize = ReadUInt16(); - remain -= 4; - if (dataSize > remain) // it's bug - dataSize = remain; - if (subBlock.ID == NFileHeader::NExtraID::kZip64) - { - if (unpackSize == 0xFFFFFFFF) - { - if (dataSize < 8) - break; - unpackSize = ReadUInt64(); - remain -= 8; - dataSize -= 8; - } - if (packSize == 0xFFFFFFFF) - { - if (dataSize < 8) - break; - packSize = ReadUInt64(); - remain -= 8; - dataSize -= 8; - } - if (localHeaderOffset == 0xFFFFFFFF) - { - if (dataSize < 8) - break; - localHeaderOffset = ReadUInt64(); - remain -= 8; - dataSize -= 8; - } - if (diskStartNumber == 0xFFFF) - { - if (dataSize < 4) - break; - diskStartNumber = ReadUInt32(); - remain -= 4; - dataSize -= 4; - } - for (UInt32 i = 0; i < dataSize; i++) - ReadByte(); - } - else - { - ReadBuffer(subBlock.Data, dataSize); - extraBlock.SubBlocks.Add(subBlock); - } - remain -= dataSize; - } - IncreaseRealPosition(remain); -} - -HRESULT CInArchive::ReadLocalItem(CItemEx &item) -{ - item.ExtractVersion.Version = ReadByte(); - item.ExtractVersion.HostOS = ReadByte(); - item.Flags = ReadUInt16(); - item.CompressionMethod = ReadUInt16(); - item.Time = ReadUInt32(); - item.FileCRC = ReadUInt32(); - item.PackSize = ReadUInt32(); - item.UnPackSize = ReadUInt32(); - UInt32 fileNameSize = ReadUInt16(); - item.LocalExtraSize = ReadUInt16(); - item.Name = ReadFileName(fileNameSize); - item.FileHeaderWithNameSize = 4 + NFileHeader::kLocalBlockSize + fileNameSize; - if (item.LocalExtraSize > 0) - { - UInt64 localHeaderOffset = 0; - UInt32 diskStartNumber = 0; - ReadExtra(item.LocalExtraSize, item.LocalExtra, item.UnPackSize, item.PackSize, - localHeaderOffset, diskStartNumber); - } - /* - if (item.IsDir()) - item.UnPackSize = 0; // check It - */ - return S_OK; -} - -HRESULT CInArchive::ReadLocalItemAfterCdItem(CItemEx &item) -{ - if (item.FromLocal) - return S_OK; - try - { - RINOK(Seek(m_ArchiveInfo.Base + item.LocalHeaderPosition)); - CItemEx localItem; - if (ReadUInt32() != NSignature::kLocalFileHeader) - return S_FALSE; - RINOK(ReadLocalItem(localItem)); - if (item.Flags != localItem.Flags) - { - if ( - (item.CompressionMethod != NFileHeader::NCompressionMethod::kDeflated || - (item.Flags & 0x7FF9) != (localItem.Flags & 0x7FF9)) && - (item.CompressionMethod != NFileHeader::NCompressionMethod::kStored || - (item.Flags & 0x7FFF) != (localItem.Flags & 0x7FFF)) && - (item.CompressionMethod != NFileHeader::NCompressionMethod::kImploded || - (item.Flags & 0x7FFF) != (localItem.Flags & 0x7FFF)) - ) - return S_FALSE; - } - - if (item.CompressionMethod != localItem.CompressionMethod || - // item.Time != localItem.Time || - (!localItem.HasDescriptor() && - ( - item.FileCRC != localItem.FileCRC || - item.PackSize != localItem.PackSize || - item.UnPackSize != localItem.UnPackSize - ) - ) || - item.Name.Length() != localItem.Name.Length() - ) - return S_FALSE; - item.FileHeaderWithNameSize = localItem.FileHeaderWithNameSize; - item.LocalExtraSize = localItem.LocalExtraSize; - item.LocalExtra = localItem.LocalExtra; - item.FromLocal = true; - } - catch(...) { return S_FALSE; } - return S_OK; -} - -HRESULT CInArchive::ReadLocalItemDescriptor(CItemEx &item) -{ - if (item.HasDescriptor()) - { - const int kBufferSize = (1 << 12); - Byte buffer[kBufferSize]; - - UInt32 numBytesInBuffer = 0; - UInt32 packedSize = 0; - - bool descriptorWasFound = false; - for (;;) - { - UInt32 processedSize; - RINOK(ReadBytes(buffer + numBytesInBuffer, kBufferSize - numBytesInBuffer, &processedSize)); - numBytesInBuffer += processedSize; - if (numBytesInBuffer < NFileHeader::kDataDescriptorSize) - return S_FALSE; - UInt32 i; - for (i = 0; i <= numBytesInBuffer - NFileHeader::kDataDescriptorSize; i++) - { - // descriptorSignature field is Info-ZIP's extension - // to Zip specification. - UInt32 descriptorSignature = GetUInt32(buffer + i); - - // !!!! It must be fixed for Zip64 archives - UInt32 descriptorPackSize = GetUInt32(buffer + i + 8); - if (descriptorSignature== NSignature::kDataDescriptor && descriptorPackSize == packedSize + i) - { - descriptorWasFound = true; - item.FileCRC = GetUInt32(buffer + i + 4); - item.PackSize = descriptorPackSize; - item.UnPackSize = GetUInt32(buffer + i + 12); - IncreaseRealPosition(Int64(Int32(0 - (numBytesInBuffer - i - NFileHeader::kDataDescriptorSize)))); - break; - } - } - if (descriptorWasFound) - break; - packedSize += i; - int j; - for (j = 0; i < numBytesInBuffer; i++, j++) - buffer[j] = buffer[i]; - numBytesInBuffer = j; - } - } - else - IncreaseRealPosition(item.PackSize); - return S_OK; -} - -HRESULT CInArchive::ReadLocalItemAfterCdItemFull(CItemEx &item) -{ - if (item.FromLocal) - return S_OK; - try - { - RINOK(ReadLocalItemAfterCdItem(item)); - if (item.HasDescriptor()) - { - RINOK(Seek(m_ArchiveInfo.Base + item.GetDataPosition() + item.PackSize)); - if (ReadUInt32() != NSignature::kDataDescriptor) - return S_FALSE; - UInt32 crc = ReadUInt32(); - UInt64 packSize, unpackSize; - - /* - if (IsZip64) - { - packSize = ReadUInt64(); - unpackSize = ReadUInt64(); - } - else - */ - { - packSize = ReadUInt32(); - unpackSize = ReadUInt32(); - } - - if (crc != item.FileCRC || item.PackSize != packSize || item.UnPackSize != unpackSize) - return S_FALSE; - } - } - catch(...) { return S_FALSE; } - return S_OK; -} - -HRESULT CInArchive::ReadCdItem(CItemEx &item) -{ - item.FromCentral = true; - const int kBufSize = 42; - Byte p[kBufSize]; - SafeReadBytes(p, kBufSize); - item.MadeByVersion.Version = p[0]; - item.MadeByVersion.HostOS = p[1]; - item.ExtractVersion.Version = p[2]; - item.ExtractVersion.HostOS = p[3]; - item.Flags = Get16(p + 4); - item.CompressionMethod = Get16(p + 6); - item.Time = Get32(p + 8); - item.FileCRC = Get32(p + 12); - item.PackSize = Get32(p + 16); - item.UnPackSize = Get32(p + 20); - UInt16 headerNameSize = Get16(p + 24); - UInt16 headerExtraSize = Get16(p + 26); - UInt16 headerCommentSize = Get16(p + 28); - UInt32 headerDiskNumberStart = Get16(p + 30); - item.InternalAttributes = Get16(p + 32); - item.ExternalAttributes = Get32(p + 34); - item.LocalHeaderPosition = Get32(p + 38); - item.Name = ReadFileName(headerNameSize); - - if (headerExtraSize > 0) - { - ReadExtra(headerExtraSize, item.CentralExtra, item.UnPackSize, item.PackSize, - item.LocalHeaderPosition, headerDiskNumberStart); - } - - if (headerDiskNumberStart != 0) - throw CInArchiveException(CInArchiveException::kMultiVolumeArchiveAreNotSupported); - - // May be these strings must be deleted - /* - if (item.IsDir()) - item.UnPackSize = 0; - */ - - ReadBuffer(item.Comment, headerCommentSize); - return S_OK; -} - -HRESULT CInArchive::TryEcd64(UInt64 offset, CCdInfo &cdInfo) -{ - RINOK(Seek(offset)); - const UInt32 kEcd64Size = 56; - Byte buf[kEcd64Size]; - if (!ReadBytesAndTestSize(buf, kEcd64Size)) - return S_FALSE; - if (GetUInt32(buf) != NSignature::kZip64EndOfCentralDir) - return S_FALSE; - // cdInfo.NumEntries = GetUInt64(buf + 24); - cdInfo.Size = GetUInt64(buf + 40); - cdInfo.Offset = GetUInt64(buf + 48); - return S_OK; -} - -HRESULT CInArchive::FindCd(CCdInfo &cdInfo) -{ - UInt64 endPosition; - RINOK(m_Stream->Seek(0, STREAM_SEEK_END, &endPosition)); - const UInt32 kBufSizeMax = (1 << 16) + kEcdSize + kZip64EcdLocatorSize; - Byte buf[kBufSizeMax]; - UInt32 bufSize = (endPosition < kBufSizeMax) ? (UInt32)endPosition : kBufSizeMax; - if (bufSize < kEcdSize) - return S_FALSE; - UInt64 startPosition = endPosition - bufSize; - RINOK(m_Stream->Seek(startPosition, STREAM_SEEK_SET, &m_Position)); - if (m_Position != startPosition) - return S_FALSE; - if (!ReadBytesAndTestSize(buf, bufSize)) - return S_FALSE; - for (int i = (int)(bufSize - kEcdSize); i >= 0; i--) - { - if (GetUInt32(buf + i) == NSignature::kEndOfCentralDir) - { - if (i >= kZip64EcdLocatorSize) - { - const Byte *locator = buf + i - kZip64EcdLocatorSize; - if (GetUInt32(locator) == NSignature::kZip64EndOfCentralDirLocator) - { - UInt64 ecd64Offset = GetUInt64(locator + 8); - if (TryEcd64(ecd64Offset, cdInfo) == S_OK) - return S_OK; - if (TryEcd64(m_ArchiveInfo.StartPosition + ecd64Offset, cdInfo) == S_OK) - { - m_ArchiveInfo.Base = m_ArchiveInfo.StartPosition; - return S_OK; - } - } - } - if (GetUInt32(buf + i + 4) == 0) - { - // cdInfo.NumEntries = GetUInt16(buf + i + 10); - cdInfo.Size = GetUInt32(buf + i + 12); - cdInfo.Offset = GetUInt32(buf + i + 16); - UInt64 curPos = endPosition - bufSize + i; - UInt64 cdEnd = cdInfo.Size + cdInfo.Offset; - if (curPos > cdEnd) - m_ArchiveInfo.Base = curPos - cdEnd; - return S_OK; - } - } - } - return S_FALSE; -} - -HRESULT CInArchive::TryReadCd(CObjectVector &items, UInt64 cdOffset, UInt64 cdSize, CProgressVirt *progress) -{ - items.Clear(); - RINOK(m_Stream->Seek(cdOffset, STREAM_SEEK_SET, &m_Position)); - if (m_Position != cdOffset) - return S_FALSE; - while(m_Position - cdOffset < cdSize) - { - if (ReadUInt32() != NSignature::kCentralFileHeader) - return S_FALSE; - CItemEx cdItem; - RINOK(ReadCdItem(cdItem)); - items.Add(cdItem); - if (progress && items.Size() % 1000 == 0) - RINOK(progress->SetCompleted(items.Size())); - } - return (m_Position - cdOffset == cdSize) ? S_OK : S_FALSE; -} - -HRESULT CInArchive::ReadCd(CObjectVector &items, UInt64 &cdOffset, UInt64 &cdSize, CProgressVirt *progress) -{ - m_ArchiveInfo.Base = 0; - CCdInfo cdInfo; - RINOK(FindCd(cdInfo)); - HRESULT res = S_FALSE; - cdSize = cdInfo.Size; - cdOffset = cdInfo.Offset; - res = TryReadCd(items, m_ArchiveInfo.Base + cdOffset, cdSize, progress); - if (res == S_FALSE && m_ArchiveInfo.Base == 0) - { - res = TryReadCd(items, cdInfo.Offset + m_ArchiveInfo.StartPosition, cdSize, progress); - if (res == S_OK) - m_ArchiveInfo.Base = m_ArchiveInfo.StartPosition; - } - if (!ReadUInt32(m_Signature)) - return S_FALSE; - return res; -} - -HRESULT CInArchive::ReadLocalsAndCd(CObjectVector &items, CProgressVirt *progress, UInt64 &cdOffset) -{ - items.Clear(); - while (m_Signature == NSignature::kLocalFileHeader) - { - // FSeek points to next byte after signature - // NFileHeader::CLocalBlock localHeader; - CItemEx item; - item.LocalHeaderPosition = m_Position - m_StreamStartPosition - 4; // points to signature; - RINOK(ReadLocalItem(item)); - item.FromLocal = true; - ReadLocalItemDescriptor(item); - items.Add(item); - if (progress && items.Size() % 100 == 0) - RINOK(progress->SetCompleted(items.Size())); - if (!ReadUInt32(m_Signature)) - break; - } - cdOffset = m_Position - 4; - for (int i = 0; i < items.Size(); i++) - { - if (progress && i % 1000 == 0) - RINOK(progress->SetCompleted(items.Size())); - if (m_Signature != NSignature::kCentralFileHeader) - return S_FALSE; - - CItemEx cdItem; - RINOK(ReadCdItem(cdItem)); - - if (i == 0) - { - if (cdItem.LocalHeaderPosition == 0) - m_ArchiveInfo.Base = m_ArchiveInfo.StartPosition; - } - - int index; - int left = 0, right = items.Size(); - for (;;) - { - if (left >= right) - return S_FALSE; - index = (left + right) / 2; - UInt64 position = items[index].LocalHeaderPosition - m_ArchiveInfo.Base; - if (cdItem.LocalHeaderPosition == position) - break; - if (cdItem.LocalHeaderPosition < position) - right = index; - else - left = index + 1; - } - CItemEx &item = items[index]; - item.LocalHeaderPosition = cdItem.LocalHeaderPosition; - item.MadeByVersion = cdItem.MadeByVersion; - item.CentralExtra = cdItem.CentralExtra; - - if ( - // item.ExtractVersion != cdItem.ExtractVersion || - item.Flags != cdItem.Flags || - item.CompressionMethod != cdItem.CompressionMethod || - // item.Time != cdItem.Time || - item.FileCRC != cdItem.FileCRC) - return S_FALSE; - - if (item.Name.Length() != cdItem.Name.Length() || - item.PackSize != cdItem.PackSize || - item.UnPackSize != cdItem.UnPackSize - ) - return S_FALSE; - item.Name = cdItem.Name; - item.InternalAttributes = cdItem.InternalAttributes; - item.ExternalAttributes = cdItem.ExternalAttributes; - item.Comment = cdItem.Comment; - item.FromCentral = cdItem.FromCentral; - if (!ReadUInt32(m_Signature)) - return S_FALSE; - } - return S_OK; -} - -struct CEcd -{ - UInt16 thisDiskNumber; - UInt16 startCDDiskNumber; - UInt16 numEntriesInCDOnThisDisk; - UInt16 numEntriesInCD; - UInt32 cdSize; - UInt32 cdStartOffset; - UInt16 commentSize; - void Parse(const Byte *p); -}; - -void CEcd::Parse(const Byte *p) -{ - thisDiskNumber = Get16(p); - startCDDiskNumber = Get16(p + 2); - numEntriesInCDOnThisDisk = Get16(p + 4); - numEntriesInCD = Get16(p + 6); - cdSize = Get32(p + 8); - cdStartOffset = Get32(p + 12); - commentSize = Get16(p + 16); -} - -struct CEcd64 -{ - UInt16 versionMade; - UInt16 versionNeedExtract; - UInt32 thisDiskNumber; - UInt32 startCDDiskNumber; - UInt64 numEntriesInCDOnThisDisk; - UInt64 numEntriesInCD; - UInt64 cdSize; - UInt64 cdStartOffset; - void Parse(const Byte *p); - CEcd64() { memset(this, 0, sizeof(*this)); } -}; - -void CEcd64::Parse(const Byte *p) -{ - versionMade = Get16(p); - versionNeedExtract = Get16(p + 2); - thisDiskNumber = Get32(p + 4); - startCDDiskNumber = Get32(p + 8); - numEntriesInCDOnThisDisk = Get64(p + 12); - numEntriesInCD = Get64(p + 20); - cdSize = Get64(p + 28); - cdStartOffset = Get64(p + 36); -} - -#define COPY_ECD_ITEM_16(n) if (!isZip64 || ecd. n != 0xFFFF) ecd64. n = ecd. n; -#define COPY_ECD_ITEM_32(n) if (!isZip64 || ecd. n != 0xFFFFFFFF) ecd64. n = ecd. n; - -HRESULT CInArchive::ReadHeaders(CObjectVector &items, CProgressVirt *progress) -{ - // m_Signature must be kLocalFileHeaderSignature or - // kEndOfCentralDirSignature - // m_Position points to next byte after signature - - IsZip64 = false; - items.Clear(); - - UInt64 cdSize, cdStartOffset; - HRESULT res = ReadCd(items, cdStartOffset, cdSize, progress); - if (res != S_FALSE && res != S_OK) - return res; - - /* - if (res != S_OK) - return res; - res = S_FALSE; - */ - - if (res == S_FALSE) - { - m_ArchiveInfo.Base = 0; - RINOK(m_Stream->Seek(m_ArchiveInfo.StartPosition, STREAM_SEEK_SET, &m_Position)); - if (m_Position != m_ArchiveInfo.StartPosition) - return S_FALSE; - if (!ReadUInt32(m_Signature)) - return S_FALSE; - RINOK(ReadLocalsAndCd(items, progress, cdStartOffset)); - cdSize = (m_Position - 4) - cdStartOffset; - cdStartOffset -= m_ArchiveInfo.Base; - } - - CEcd64 ecd64; - bool isZip64 = false; - UInt64 zip64EcdStartOffset = m_Position - 4 - m_ArchiveInfo.Base; - if (m_Signature == NSignature::kZip64EndOfCentralDir) - { - IsZip64 = isZip64 = true; - UInt64 recordSize = ReadUInt64(); - - const int kBufSize = kZip64EcdSize; - Byte buf[kBufSize]; - SafeReadBytes(buf, kBufSize); - ecd64.Parse(buf); - - IncreaseRealPosition(recordSize - kZip64EcdSize); - if (!ReadUInt32(m_Signature)) - return S_FALSE; - if (ecd64.thisDiskNumber != 0 || ecd64.startCDDiskNumber != 0) - throw CInArchiveException(CInArchiveException::kMultiVolumeArchiveAreNotSupported); - if (ecd64.numEntriesInCDOnThisDisk != items.Size() || - ecd64.numEntriesInCD != items.Size() || - ecd64.cdSize != cdSize || - (ecd64.cdStartOffset != cdStartOffset && - (!items.IsEmpty()))) - return S_FALSE; - } - if (m_Signature == NSignature::kZip64EndOfCentralDirLocator) - { - /* UInt32 startEndCDDiskNumber = */ ReadUInt32(); - UInt64 endCDStartOffset = ReadUInt64(); - /* UInt32 numberOfDisks = */ ReadUInt32(); - if (zip64EcdStartOffset != endCDStartOffset) - return S_FALSE; - if (!ReadUInt32(m_Signature)) - return S_FALSE; - } - if (m_Signature != NSignature::kEndOfCentralDir) - return S_FALSE; - - const int kBufSize = kEcdSize - 4; - Byte buf[kBufSize]; - SafeReadBytes(buf, kBufSize); - CEcd ecd; - ecd.Parse(buf); - - COPY_ECD_ITEM_16(thisDiskNumber); - COPY_ECD_ITEM_16(startCDDiskNumber); - COPY_ECD_ITEM_16(numEntriesInCDOnThisDisk); - COPY_ECD_ITEM_16(numEntriesInCD); - COPY_ECD_ITEM_32(cdSize); - COPY_ECD_ITEM_32(cdStartOffset); - - ReadBuffer(m_ArchiveInfo.Comment, ecd.commentSize); - - if (ecd64.thisDiskNumber != 0 || ecd64.startCDDiskNumber != 0) - throw CInArchiveException(CInArchiveException::kMultiVolumeArchiveAreNotSupported); - if ((UInt16)ecd64.numEntriesInCDOnThisDisk != ((UInt16)items.Size()) || - (UInt16)ecd64.numEntriesInCD != ((UInt16)items.Size()) || - (UInt32)ecd64.cdSize != (UInt32)cdSize || - ((UInt32)(ecd64.cdStartOffset) != (UInt32)cdStartOffset && - (!items.IsEmpty()))) - return S_FALSE; - - return S_OK; -} - -ISequentialInStream* CInArchive::CreateLimitedStream(UInt64 position, UInt64 size) -{ - CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream; - CMyComPtr stream(streamSpec); - SeekInArchive(m_ArchiveInfo.Base + position); - streamSpec->SetStream(m_Stream); - streamSpec->Init(size); - return stream.Detach(); -} - -IInStream* CInArchive::CreateStream() -{ - CMyComPtr stream = m_Stream; - return stream.Detach(); -} - -bool CInArchive::SeekInArchive(UInt64 position) -{ - UInt64 newPosition; - if (m_Stream->Seek(position, STREAM_SEEK_SET, &newPosition) != S_OK) - return false; - return (newPosition == position); -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipIn.h b/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipIn.h deleted file mode 100644 index dd8114c3d..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipIn.h +++ /dev/null @@ -1,116 +0,0 @@ -// Archive/ZipIn.h - -#ifndef __ZIP_IN_H -#define __ZIP_IN_H - -#include "../../../Common/MyCom.h" -#include "../../IStream.h" - -#include "ZipHeader.h" -#include "ZipItemEx.h" - -namespace NArchive { -namespace NZip { - -class CInArchiveException -{ -public: - enum ECauseType - { - kUnexpectedEndOfArchive = 0, - kArchiceHeaderCRCError, - kFileHeaderCRCError, - kIncorrectArchive, - kDataDescroptorsAreNotSupported, - kMultiVolumeArchiveAreNotSupported, - kReadStreamError, - kSeekStreamError - } - Cause; - CInArchiveException(ECauseType cause): Cause(cause) {} -}; - -class CInArchiveInfo -{ -public: - UInt64 Base; - UInt64 StartPosition; - CByteBuffer Comment; - CInArchiveInfo(): Base(0), StartPosition(0) {} - void Clear() - { - Base = 0; - StartPosition = 0; - Comment.SetCapacity(0); - } -}; - -class CProgressVirt -{ -public: - STDMETHOD(SetTotal)(UInt64 numFiles) PURE; - STDMETHOD(SetCompleted)(UInt64 numFiles) PURE; -}; - -struct CCdInfo -{ - // UInt64 NumEntries; - UInt64 Size; - UInt64 Offset; -}; - -class CInArchive -{ - CMyComPtr m_Stream; - UInt32 m_Signature; - UInt64 m_StreamStartPosition; - UInt64 m_Position; - AString m_NameBuffer; - - HRESULT Seek(UInt64 offset); - - HRESULT FindAndReadMarker(IInStream *stream, const UInt64 *searchHeaderSizeLimit); - bool ReadUInt32(UInt32 &signature); - AString ReadFileName(UInt32 nameSize); - - HRESULT ReadBytes(void *data, UInt32 size, UInt32 *processedSize); - bool ReadBytesAndTestSize(void *data, UInt32 size); - void SafeReadBytes(void *data, UInt32 size); - void ReadBuffer(CByteBuffer &buffer, UInt32 size); - Byte ReadByte(); - UInt16 ReadUInt16(); - UInt32 ReadUInt32(); - UInt64 ReadUInt64(); - - void IncreaseRealPosition(UInt64 addValue); - - void ReadExtra(UInt32 extraSize, CExtraBlock &extraBlock, - UInt64 &unpackSize, UInt64 &packSize, UInt64 &localHeaderOffset, UInt32 &diskStartNumber); - HRESULT ReadLocalItem(CItemEx &item); - HRESULT ReadLocalItemDescriptor(CItemEx &item); - HRESULT ReadCdItem(CItemEx &item); - HRESULT TryEcd64(UInt64 offset, CCdInfo &cdInfo); - HRESULT FindCd(CCdInfo &cdInfo); - HRESULT TryReadCd(CObjectVector &items, UInt64 cdOffset, UInt64 cdSize, CProgressVirt *progress); - HRESULT ReadCd(CObjectVector &items, UInt64 &cdOffset, UInt64 &cdSize, CProgressVirt *progress); - HRESULT ReadLocalsAndCd(CObjectVector &items, CProgressVirt *progress, UInt64 &cdOffset); -public: - CInArchiveInfo m_ArchiveInfo; - bool IsZip64; - - HRESULT ReadHeaders(CObjectVector &items, CProgressVirt *progress); - HRESULT ReadLocalItemAfterCdItem(CItemEx &item); - HRESULT ReadLocalItemAfterCdItemFull(CItemEx &item); - HRESULT Open(IInStream *stream, const UInt64 *searchHeaderSizeLimit); - void Close(); - void GetArchiveInfo(CInArchiveInfo &archiveInfo) const; - bool SeekInArchive(UInt64 position); - ISequentialInStream *CreateLimitedStream(UInt64 position, UInt64 size); - IInStream* CreateStream(); - - bool IsOpen() const { return m_Stream != NULL; } -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipItem.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipItem.cpp deleted file mode 100644 index 6756e4b44..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipItem.cpp +++ /dev/null @@ -1,147 +0,0 @@ -// Archive/ZipItem.cpp - -#include "StdAfx.h" - -#include "ZipHeader.h" -#include "ZipItem.h" -#include "../Common/ItemNameUtils.h" -#include "../../../../C/CpuArch.h" - -namespace NArchive { -namespace NZip { - -bool operator==(const CVersion &v1, const CVersion &v2) -{ - return (v1.Version == v2.Version) && (v1.HostOS == v2.HostOS); -} - -bool operator!=(const CVersion &v1, const CVersion &v2) -{ - return !(v1 == v2); -} - -bool CExtraSubBlock::ExtractNtfsTime(int index, FILETIME &ft) const -{ - ft.dwHighDateTime = ft.dwLowDateTime = 0; - UInt32 size = (UInt32)Data.GetCapacity(); - if (ID != NFileHeader::NExtraID::kNTFS || size < 32) - return false; - const Byte *p = (const Byte *)Data; - p += 4; // for reserved - size -= 4; - while (size > 4) - { - UInt16 tag = GetUi16(p); - UInt32 attrSize = GetUi16(p + 2); - p += 4; - size -= 4; - if (attrSize > size) - attrSize = size; - - if (tag == NFileHeader::NNtfsExtra::kTagTime && attrSize >= 24) - { - p += 8 * index; - ft.dwLowDateTime = GetUi32(p); - ft.dwHighDateTime = GetUi32(p + 4); - return true; - } - p += attrSize; - size -= attrSize; - } - return false; -} - -bool CLocalItem::IsDir() const -{ - return NItemName::HasTailSlash(Name, GetCodePage()); -} - -bool CItem::IsDir() const -{ - if (NItemName::HasTailSlash(Name, GetCodePage())) - return true; - if (!FromCentral) - return false; - WORD highAttributes = WORD((ExternalAttributes >> 16 ) & 0xFFFF); - switch(MadeByVersion.HostOS) - { - case NFileHeader::NHostOS::kAMIGA: - switch (highAttributes & NFileHeader::NAmigaAttribute::kIFMT) - { - case NFileHeader::NAmigaAttribute::kIFDIR: return true; - case NFileHeader::NAmigaAttribute::kIFREG: return false; - default: return false; // change it throw kUnknownAttributes; - } - case NFileHeader::NHostOS::kFAT: - case NFileHeader::NHostOS::kNTFS: - case NFileHeader::NHostOS::kHPFS: - case NFileHeader::NHostOS::kVFAT: - return ((ExternalAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0); - case NFileHeader::NHostOS::kAtari: - case NFileHeader::NHostOS::kMac: - case NFileHeader::NHostOS::kVMS: - case NFileHeader::NHostOS::kVM_CMS: - case NFileHeader::NHostOS::kAcorn: - case NFileHeader::NHostOS::kMVS: - return false; // change it throw kUnknownAttributes; - default: - /* - switch (highAttributes & NFileHeader::NUnixAttribute::kIFMT) - { - case NFileHeader::NUnixAttribute::kIFDIR: - return true; - default: - return false; - } - */ - return false; - } -} - -UInt32 CLocalItem::GetWinAttributes() const -{ - DWORD winAttributes = 0; - if (IsDir()) - winAttributes |= FILE_ATTRIBUTE_DIRECTORY; - return winAttributes; -} - -UInt32 CItem::GetWinAttributes() const -{ - DWORD winAttributes = 0; - switch(MadeByVersion.HostOS) - { - case NFileHeader::NHostOS::kFAT: - case NFileHeader::NHostOS::kNTFS: - if (FromCentral) - winAttributes = ExternalAttributes; - break; - default: - winAttributes = 0; // must be converted from unix value; - } - if (IsDir()) // test it; - winAttributes |= FILE_ATTRIBUTE_DIRECTORY; - return winAttributes; -} - -void CLocalItem::SetFlagBits(int startBitNumber, int numBits, int value) -{ - UInt16 mask = (UInt16)(((1 << numBits) - 1) << startBitNumber); - Flags &= ~mask; - Flags |= value << startBitNumber; -} - -void CLocalItem::SetBitMask(int bitMask, bool enable) -{ - if(enable) - Flags |= bitMask; - else - Flags &= ~bitMask; -} - -void CLocalItem::SetEncrypted(bool encrypted) - { SetBitMask(NFileHeader::NFlags::kEncrypted, encrypted); } -void CLocalItem::SetUtf8(bool isUtf8) - { SetBitMask(NFileHeader::NFlags::kUtf8, isUtf8); } - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipItem.h b/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipItem.h deleted file mode 100644 index e7e0c47bf..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipItem.h +++ /dev/null @@ -1,268 +0,0 @@ -// Archive/ZipItem.h - -#ifndef __ARCHIVE_ZIP_ITEM_H -#define __ARCHIVE_ZIP_ITEM_H - -#include "../../../Common/Types.h" -#include "../../../Common/MyString.h" -#include "../../../Common/Buffer.h" -#include "../../../Common/UTFConvert.h" -#include "../../../Common/StringConvert.h" - -#include "ZipHeader.h" - -namespace NArchive { -namespace NZip { - -struct CVersion -{ - Byte Version; - Byte HostOS; -}; - -bool operator==(const CVersion &v1, const CVersion &v2); -bool operator!=(const CVersion &v1, const CVersion &v2); - -struct CExtraSubBlock -{ - UInt16 ID; - CByteBuffer Data; - bool ExtractNtfsTime(int index, FILETIME &ft) const; -}; - -struct CWzAesExtraField -{ - UInt16 VendorVersion; // 0x0001 - AE-1, 0x0002 - AE-2, - // UInt16 VendorId; // "AE" - Byte Strength; // 1 - 128-bit , 2 - 192-bit , 3 - 256-bit - UInt16 Method; - - CWzAesExtraField(): VendorVersion(2), Strength(3), Method(0) {} - - bool NeedCrc() const { return (VendorVersion == 1); } - - bool ParseFromSubBlock(const CExtraSubBlock &sb) - { - if (sb.ID != NFileHeader::NExtraID::kWzAES) - return false; - if (sb.Data.GetCapacity() < 7) - return false; - const Byte *p = (const Byte *)sb.Data; - VendorVersion = (((UInt16)p[1]) << 8) | p[0]; - if (p[2] != 'A' || p[3] != 'E') - return false; - Strength = p[4]; - Method = (((UInt16)p[6]) << 16) | p[5]; - return true; - } - void SetSubBlock(CExtraSubBlock &sb) const - { - sb.Data.SetCapacity(7); - sb.ID = NFileHeader::NExtraID::kWzAES; - Byte *p = (Byte *)sb.Data; - p[0] = (Byte)VendorVersion; - p[1] = (Byte)(VendorVersion >> 8); - p[2] = 'A'; - p[3] = 'E'; - p[4] = Strength; - p[5] = (Byte)Method; - p[6] = (Byte)(Method >> 8); - } -}; - -namespace NStrongCryptoFlags -{ - const UInt16 kDES = 0x6601; - const UInt16 kRC2old = 0x6602; - const UInt16 k3DES168 = 0x6603; - const UInt16 k3DES112 = 0x6609; - const UInt16 kAES128 = 0x660E; - const UInt16 kAES192 = 0x660F; - const UInt16 kAES256 = 0x6610; - const UInt16 kRC2 = 0x6702; - const UInt16 kBlowfish = 0x6720; - const UInt16 kTwofish = 0x6721; - const UInt16 kRC4 = 0x6801; -} - -struct CStrongCryptoField -{ - UInt16 Format; - UInt16 AlgId; - UInt16 BitLen; - UInt16 Flags; - - bool ParseFromSubBlock(const CExtraSubBlock &sb) - { - if (sb.ID != NFileHeader::NExtraID::kStrongEncrypt) - return false; - const Byte *p = (const Byte *)sb.Data; - if (sb.Data.GetCapacity() < 8) - return false; - Format = (((UInt16)p[1]) << 8) | p[0]; - AlgId = (((UInt16)p[3]) << 8) | p[2]; - BitLen = (((UInt16)p[5]) << 8) | p[4]; - Flags = (((UInt16)p[7]) << 8) | p[6]; - return (Format == 2); - } -}; - -struct CExtraBlock -{ - CObjectVector SubBlocks; - void Clear() { SubBlocks.Clear(); } - size_t GetSize() const - { - size_t res = 0; - for (int i = 0; i < SubBlocks.Size(); i++) - res += SubBlocks[i].Data.GetCapacity() + 2 + 2; - return res; - } - bool GetWzAesField(CWzAesExtraField &aesField) const - { - for (int i = 0; i < SubBlocks.Size(); i++) - if (aesField.ParseFromSubBlock(SubBlocks[i])) - return true; - return false; - } - - bool GetStrongCryptoField(CStrongCryptoField &f) const - { - for (int i = 0; i < SubBlocks.Size(); i++) - if (f.ParseFromSubBlock(SubBlocks[i])) - return true; - return false; - } - - bool HasWzAesField() const - { - CWzAesExtraField aesField; - return GetWzAesField(aesField); - } - - bool GetNtfsTime(int index, FILETIME &ft) const - { - for (int i = 0; i < SubBlocks.Size(); i++) - { - const CExtraSubBlock &sb = SubBlocks[i]; - if (sb.ID == NFileHeader::NExtraID::kNTFS) - return sb.ExtractNtfsTime(index, ft); - } - return false; - } - - /* - bool HasStrongCryptoField() const - { - CStrongCryptoField f; - return GetStrongCryptoField(f); - } - */ - - void RemoveUnknownSubBlocks() - { - for (int i = SubBlocks.Size() - 1; i >= 0; i--) - if (SubBlocks[i].ID != NFileHeader::NExtraID::kWzAES) - SubBlocks.Delete(i); - } -}; - - -class CLocalItem -{ -public: - CVersion ExtractVersion; - UInt16 Flags; - UInt16 CompressionMethod; - UInt32 Time; - UInt32 FileCRC; - UInt64 PackSize; - UInt64 UnPackSize; - - AString Name; - - CExtraBlock LocalExtra; - - bool IsUtf8() const { return (Flags & NFileHeader::NFlags::kUtf8) != 0; } - - bool IsEncrypted() const { return (Flags & NFileHeader::NFlags::kEncrypted) != 0; } - bool IsStrongEncrypted() const { return IsEncrypted() && (Flags & NFileHeader::NFlags::kStrongEncrypted) != 0; }; - - bool IsLzmaEOS() const { return (Flags & NFileHeader::NFlags::kLzmaEOS) != 0; } - - bool IsDir() const; - bool IgnoreItem() const { return false; } - UInt32 GetWinAttributes() const; - - bool HasDescriptor() const { return (Flags & NFileHeader::NFlags::kDescriptorUsedMask) != 0; } - - UString GetUnicodeString(const AString &s) const - { - UString res; - if (IsUtf8()) - if (!ConvertUTF8ToUnicode(s, res)) - res.Empty(); - if (res.IsEmpty()) - res = MultiByteToUnicodeString(s, GetCodePage()); - return res; - } - -private: - void SetFlagBits(int startBitNumber, int numBits, int value); - void SetBitMask(int bitMask, bool enable); -public: - void ClearFlags() { Flags = 0; } - void SetEncrypted(bool encrypted); - void SetUtf8(bool isUtf8); - - WORD GetCodePage() const { return CP_OEMCP; } -}; - -class CItem: public CLocalItem -{ -public: - CVersion MadeByVersion; - UInt16 InternalAttributes; - UInt32 ExternalAttributes; - - UInt64 LocalHeaderPosition; - - FILETIME NtfsMTime; - FILETIME NtfsATime; - FILETIME NtfsCTime; - - CExtraBlock CentralExtra; - CByteBuffer Comment; - - bool FromLocal; - bool FromCentral; - bool NtfsTimeIsDefined; - - bool IsDir() const; - UInt32 GetWinAttributes() const; - - bool IsThereCrc() const - { - if (CompressionMethod == NFileHeader::NCompressionMethod::kWzAES) - { - CWzAesExtraField aesField; - if (CentralExtra.GetWzAesField(aesField)) - return aesField.NeedCrc(); - } - return (FileCRC != 0 || !IsDir()); - } - - WORD GetCodePage() const - { - return (WORD)((MadeByVersion.HostOS == NFileHeader::NHostOS::kFAT - || MadeByVersion.HostOS == NFileHeader::NHostOS::kNTFS - ) ? CP_OEMCP : CP_ACP); - } - CItem() : FromLocal(false), FromCentral(false), NtfsTimeIsDefined(false) {} -}; - -}} - -#endif - - diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipItemEx.h b/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipItemEx.h deleted file mode 100644 index 0d74edd80..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipItemEx.h +++ /dev/null @@ -1,34 +0,0 @@ -// Archive/ZipItemEx.h - -#ifndef __ARCHIVE_ZIP_ITEMEX_H -#define __ARCHIVE_ZIP_ITEMEX_H - -#include "ZipHeader.h" -#include "ZipItem.h" - -namespace NArchive { -namespace NZip { - -class CItemEx: public CItem -{ -public: - UInt32 FileHeaderWithNameSize; - UInt16 LocalExtraSize; - - UInt64 GetLocalFullSize() const - { return FileHeaderWithNameSize + LocalExtraSize + PackSize + - (HasDescriptor() ? NFileHeader::kDataDescriptorSize : 0); }; - /* - UInt64 GetLocalFullSize(bool isZip64) const - { return FileHeaderWithNameSize + LocalExtraSize + PackSize + - (HasDescriptor() ? (isZip64 ? NFileHeader::kDataDescriptor64Size : NFileHeader::kDataDescriptorSize) : 0); }; - */ - UInt64 GetLocalExtraPosition() const - { return LocalHeaderPosition + FileHeaderWithNameSize; }; - UInt64 GetDataPosition() const - { return GetLocalExtraPosition() + LocalExtraSize; }; -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipRegister.cpp b/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipRegister.cpp deleted file mode 100644 index 0e90e4ec3..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Archive/Zip/ZipRegister.cpp +++ /dev/null @@ -1,21 +0,0 @@ -// ZipRegister.cpp - -#include "StdAfx.h" - -#include "../../Common/RegisterArc.h" - -#include "ZipHandler.h" -static IInArchive *CreateArc() { return new NArchive::NZip::CHandler; } -#ifndef EXTRACT_ONLY -static IOutArchive *CreateArcOut() { return new NArchive::NZip::CHandler; } -#else -#define CreateArcOut 0 -#endif - -static CArcInfo g_ArcInfo = { L"Zip", L"zip jar xpi zsg", 0, 1, { 0x50, 0x4B, 0x03, 0x04 }, 4, false, CreateArc, CreateArcOut }; -static CArcInfo g_ArcInfo2 = { L"Zip", L"zip jar xpi zsg", 0, 1, { 0x50, 0x4B, 0x01, 0x02 }, 4, false, CreateArc, CreateArcOut }; -static CArcInfo g_ArcInfo3 = { L"Zip", L"zip jar xpi zsg", 0, 1, { 0x50, 0x4B, 0x05, 0x06 }, 4, false, CreateArc, CreateArcOut }; - -REGISTER_ARC(Zip) -REGISTER_ARCN(Zip,2) -REGISTER_ARCN(Zip,3) diff --git a/desmume/src/windows/7z/CPP/7zip/Common/CreateCoder.cpp b/desmume/src/windows/7z/CPP/7zip/Common/CreateCoder.cpp deleted file mode 100644 index 10c9f9600..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/CreateCoder.cpp +++ /dev/null @@ -1,292 +0,0 @@ -// CreateCoder.cpp - -#include "StdAfx.h" - -#include "CreateCoder.h" - -#include "../../Windows/PropVariant.h" -#include "../../Windows/Defs.h" -#include "FilterCoder.h" -#include "RegisterCodec.h" - -static const unsigned int kNumCodecsMax = 64; -unsigned int g_NumCodecs = 0; -const CCodecInfo *g_Codecs[kNumCodecsMax]; -void RegisterCodec(const CCodecInfo *codecInfo) -{ - if (g_NumCodecs < kNumCodecsMax) - g_Codecs[g_NumCodecs++] = codecInfo; -} - -#ifdef EXTERNAL_CODECS -static HRESULT ReadNumberOfStreams(ICompressCodecsInfo *codecsInfo, UInt32 index, PROPID propID, UInt32 &res) -{ - NWindows::NCOM::CPropVariant prop; - RINOK(codecsInfo->GetProperty(index, propID, &prop)); - if (prop.vt == VT_EMPTY) - res = 1; - else if (prop.vt == VT_UI4) - res = prop.ulVal; - else - return E_INVALIDARG; - return S_OK; -} - -static HRESULT ReadIsAssignedProp(ICompressCodecsInfo *codecsInfo, UInt32 index, PROPID propID, bool &res) -{ - NWindows::NCOM::CPropVariant prop; - RINOK(codecsInfo->GetProperty(index, propID, &prop)); - if (prop.vt == VT_EMPTY) - res = true; - else if (prop.vt == VT_BOOL) - res = VARIANT_BOOLToBool(prop.boolVal); - else - return E_INVALIDARG; - return S_OK; -} - -HRESULT LoadExternalCodecs(ICompressCodecsInfo *codecsInfo, CObjectVector &externalCodecs) -{ - UInt32 num; - RINOK(codecsInfo->GetNumberOfMethods(&num)); - for (UInt32 i = 0; i < num; i++) - { - CCodecInfoEx info; - NWindows::NCOM::CPropVariant prop; - RINOK(codecsInfo->GetProperty(i, NMethodPropID::kID, &prop)); - // if (prop.vt != VT_BSTR) - // info.Id.IDSize = (Byte)SysStringByteLen(prop.bstrVal); - // memmove(info.Id.ID, prop.bstrVal, info.Id.IDSize); - if (prop.vt != VT_UI8) - { - continue; // old Interface - // return E_INVALIDARG; - } - info.Id = prop.uhVal.QuadPart; - prop.Clear(); - - RINOK(codecsInfo->GetProperty(i, NMethodPropID::kName, &prop)); - if (prop.vt == VT_BSTR) - info.Name = prop.bstrVal; - else if (prop.vt != VT_EMPTY) - return E_INVALIDARG;; - - RINOK(ReadNumberOfStreams(codecsInfo, i, NMethodPropID::kInStreams, info.NumInStreams)); - RINOK(ReadNumberOfStreams(codecsInfo, i, NMethodPropID::kOutStreams, info.NumOutStreams)); - RINOK(ReadIsAssignedProp(codecsInfo, i, NMethodPropID::kEncoderIsAssigned, info.EncoderIsAssigned)); - RINOK(ReadIsAssignedProp(codecsInfo, i, NMethodPropID::kDecoderIsAssigned, info.DecoderIsAssigned)); - - externalCodecs.Add(info); - } - return S_OK; -} - -#endif - -bool FindMethod( - #ifdef EXTERNAL_CODECS - ICompressCodecsInfo * /* codecsInfo */, const CObjectVector *externalCodecs, - #endif - const UString &name, - CMethodId &methodId, UInt32 &numInStreams, UInt32 &numOutStreams) -{ - UInt32 i; - for (i = 0; i < g_NumCodecs; i++) - { - const CCodecInfo &codec = *g_Codecs[i]; - if (name.CompareNoCase(codec.Name) == 0) - { - methodId = codec.Id; - numInStreams = codec.NumInStreams; - numOutStreams = 1; - return true; - } - } - #ifdef EXTERNAL_CODECS - if (externalCodecs) - for (i = 0; i < (UInt32)externalCodecs->Size(); i++) - { - const CCodecInfoEx &codec = (*externalCodecs)[i]; - if (codec.Name.CompareNoCase(name) == 0) - { - methodId = codec.Id; - numInStreams = codec.NumInStreams; - numOutStreams = codec.NumOutStreams; - return true; - } - } - #endif - return false; -} - -bool FindMethod( - #ifdef EXTERNAL_CODECS - ICompressCodecsInfo * /* codecsInfo */, const CObjectVector *externalCodecs, - #endif - CMethodId methodId, UString &name) -{ - UInt32 i; - for (i = 0; i < g_NumCodecs; i++) - { - const CCodecInfo &codec = *g_Codecs[i]; - if (methodId == codec.Id) - { - name = codec.Name; - return true; - } - } - #ifdef EXTERNAL_CODECS - if (externalCodecs) - for (i = 0; i < (UInt32)externalCodecs->Size(); i++) - { - const CCodecInfoEx &codec = (*externalCodecs)[i]; - if (methodId == codec.Id) - { - name = codec.Name; - return true; - } - } - #endif - return false; -} - -HRESULT CreateCoder( - DECL_EXTERNAL_CODECS_LOC_VARS - CMethodId methodId, - CMyComPtr &filter, - CMyComPtr &coder, - CMyComPtr &coder2, - bool encode, bool onlyCoder) -{ - bool created = false; - UInt32 i; - for (i = 0; i < g_NumCodecs; i++) - { - const CCodecInfo &codec = *g_Codecs[i]; - if (codec.Id == methodId) - { - if (encode) - { - if (codec.CreateEncoder) - { - void *p = codec.CreateEncoder(); - if (codec.IsFilter) filter = (ICompressFilter *)p; - else if (codec.NumInStreams == 1) coder = (ICompressCoder *)p; - else coder2 = (ICompressCoder2 *)p; - created = (p != 0); - break; - } - } - else - if (codec.CreateDecoder) - { - void *p = codec.CreateDecoder(); - if (codec.IsFilter) filter = (ICompressFilter *)p; - else if (codec.NumInStreams == 1) coder = (ICompressCoder *)p; - else coder2 = (ICompressCoder2 *)p; - created = (p != 0); - break; - } - } - } - - #ifdef EXTERNAL_CODECS - if (!created && externalCodecs) - for (i = 0; i < (UInt32)externalCodecs->Size(); i++) - { - const CCodecInfoEx &codec = (*externalCodecs)[i]; - if (codec.Id == methodId) - { - if (encode) - { - if (codec.EncoderIsAssigned) - { - if (codec.IsSimpleCodec()) - { - HRESULT result = codecsInfo->CreateEncoder(i, &IID_ICompressCoder, (void **)&coder); - if (result != S_OK && result != E_NOINTERFACE && result != CLASS_E_CLASSNOTAVAILABLE) - return result; - if (!coder) - { - RINOK(codecsInfo->CreateEncoder(i, &IID_ICompressFilter, (void **)&filter)); - } - } - else - { - RINOK(codecsInfo->CreateEncoder(i, &IID_ICompressCoder2, (void **)&coder2)); - } - break; - } - } - else - if (codec.DecoderIsAssigned) - { - if (codec.IsSimpleCodec()) - { - HRESULT result = codecsInfo->CreateDecoder(i, &IID_ICompressCoder, (void **)&coder); - if (result != S_OK && result != E_NOINTERFACE && result != CLASS_E_CLASSNOTAVAILABLE) - return result; - if (!coder) - { - RINOK(codecsInfo->CreateDecoder(i, &IID_ICompressFilter, (void **)&filter)); - } - } - else - { - RINOK(codecsInfo->CreateDecoder(i, &IID_ICompressCoder2, (void **)&coder2)); - } - break; - } - } - } - #endif - - if (onlyCoder && filter) - { - CFilterCoder *coderSpec = new CFilterCoder; - coder = coderSpec; - coderSpec->Filter = filter; - } - return S_OK; -} - -HRESULT CreateCoder( - DECL_EXTERNAL_CODECS_LOC_VARS - CMethodId methodId, - CMyComPtr &coder, - CMyComPtr &coder2, - bool encode) -{ - CMyComPtr filter; - return CreateCoder( - EXTERNAL_CODECS_LOC_VARS - methodId, - filter, coder, coder2, encode, true); -} - -HRESULT CreateCoder( - DECL_EXTERNAL_CODECS_LOC_VARS - CMethodId methodId, - CMyComPtr &coder, bool encode) -{ - CMyComPtr filter; - CMyComPtr coder2; - return CreateCoder( - EXTERNAL_CODECS_LOC_VARS - methodId, - coder, coder2, encode); -} - -HRESULT CreateFilter( - DECL_EXTERNAL_CODECS_LOC_VARS - CMethodId methodId, - CMyComPtr &filter, - bool encode) -{ - CMyComPtr coder; - CMyComPtr coder2; - return CreateCoder( - EXTERNAL_CODECS_LOC_VARS - methodId, - filter, coder, coder2, encode, false); -} diff --git a/desmume/src/windows/7z/CPP/7zip/Common/CreateCoder.h b/desmume/src/windows/7z/CPP/7zip/Common/CreateCoder.h deleted file mode 100644 index 2f83f5ec5..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/CreateCoder.h +++ /dev/null @@ -1,98 +0,0 @@ -// CreateCoder.h - -#ifndef __CREATECODER_H -#define __CREATECODER_H - -#include "../../Common/MyCom.h" -#include "../../Common/MyString.h" -#include "../ICoder.h" - -#include "MethodId.h" - -#ifdef EXTERNAL_CODECS - -struct CCodecInfoEx -{ - UString Name; - CMethodId Id; - UInt32 NumInStreams; - UInt32 NumOutStreams; - bool EncoderIsAssigned; - bool DecoderIsAssigned; - bool IsSimpleCodec() const { return NumOutStreams == 1 && NumInStreams == 1; } - CCodecInfoEx(): EncoderIsAssigned(false), DecoderIsAssigned(false) {} -}; - -HRESULT LoadExternalCodecs(ICompressCodecsInfo *codecsInfo, CObjectVector &externalCodecs); - -#define PUBLIC_ISetCompressCodecsInfo public ISetCompressCodecsInfo, -#define QUERY_ENTRY_ISetCompressCodecsInfo MY_QUERYINTERFACE_ENTRY(ISetCompressCodecsInfo) -#define DECL_ISetCompressCodecsInfo STDMETHOD(SetCompressCodecsInfo)(ICompressCodecsInfo *compressCodecsInfo); -#define IMPL_ISetCompressCodecsInfo2(x) \ -STDMETHODIMP x::SetCompressCodecsInfo(ICompressCodecsInfo *compressCodecsInfo) { \ - COM_TRY_BEGIN _codecsInfo = compressCodecsInfo; return LoadExternalCodecs(_codecsInfo, _externalCodecs); COM_TRY_END } -#define IMPL_ISetCompressCodecsInfo IMPL_ISetCompressCodecsInfo2(CHandler) - -#define EXTERNAL_CODECS_VARS2 _codecsInfo, &_externalCodecs - -#define DECL_EXTERNAL_CODECS_VARS CMyComPtr _codecsInfo; CObjectVector _externalCodecs; -#define EXTERNAL_CODECS_VARS EXTERNAL_CODECS_VARS2, - -#define DECL_EXTERNAL_CODECS_LOC_VARS2 ICompressCodecsInfo *codecsInfo, const CObjectVector *externalCodecs -#define EXTERNAL_CODECS_LOC_VARS2 codecsInfo, externalCodecs - -#define DECL_EXTERNAL_CODECS_LOC_VARS DECL_EXTERNAL_CODECS_LOC_VARS2, -#define EXTERNAL_CODECS_LOC_VARS EXTERNAL_CODECS_LOC_VARS2, - -#else - -#define PUBLIC_ISetCompressCodecsInfo -#define QUERY_ENTRY_ISetCompressCodecsInfo -#define DECL_ISetCompressCodecsInfo -#define IMPL_ISetCompressCodecsInfo -#define EXTERNAL_CODECS_VARS2 -#define DECL_EXTERNAL_CODECS_VARS -#define EXTERNAL_CODECS_VARS EXTERNAL_CODECS_VARS2 -#define DECL_EXTERNAL_CODECS_LOC_VARS2 -#define EXTERNAL_CODECS_LOC_VARS2 -#define DECL_EXTERNAL_CODECS_LOC_VARS -#define EXTERNAL_CODECS_LOC_VARS - -#endif - -bool FindMethod( - DECL_EXTERNAL_CODECS_LOC_VARS - const UString &name, CMethodId &methodId, UInt32 &numInStreams, UInt32 &numOutStreams); - -bool FindMethod( - DECL_EXTERNAL_CODECS_LOC_VARS - CMethodId methodId, UString &name); - - -HRESULT CreateCoder( - DECL_EXTERNAL_CODECS_LOC_VARS - CMethodId methodId, - CMyComPtr &filter, - CMyComPtr &coder, - CMyComPtr &coder2, - bool encode, bool onlyCoder); - -HRESULT CreateCoder( - DECL_EXTERNAL_CODECS_LOC_VARS - CMethodId methodId, - CMyComPtr &coder, - CMyComPtr &coder2, - bool encode); - -HRESULT CreateCoder( - DECL_EXTERNAL_CODECS_LOC_VARS - CMethodId methodId, - CMyComPtr &coder, bool encode); - -HRESULT CreateFilter( - DECL_EXTERNAL_CODECS_LOC_VARS - CMethodId methodId, - CMyComPtr &filter, - bool encode); - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Common/DeclareArcs.h b/desmume/src/windows/7z/CPP/7zip/Common/DeclareArcs.h deleted file mode 100644 index 22443a779..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/DeclareArcs.h +++ /dev/null @@ -1,28 +0,0 @@ -// DeclareArcs.h - -#ifndef __DECLAREARCS_H -#define __DECLAREARCS_H - -#define DECLARE_ARC(x) struct CRegister##x { CRegister##x(); }; \ - FORCE_REF(CRegister##x, g_RegisterArc##x) - -#define DECLARE_ARCN(x,n) struct CRegister##x##n { CRegister##x##n(); }; \ - FORCE_REF(CRegister##x##n, g_RegisterArc##n##x) - -#ifndef FORCE_REF - #define FORCE_REF(...) -#endif - -DECLARE_ARC(7z) -DECLARE_ARC(BZip2) -DECLARE_ARC(GZip) -DECLARE_ARC(Lzh) -DECLARE_ARC(Lzma) -DECLARE_ARC(Rar) -DECLARE_ARC(Split) -DECLARE_ARC(Tar) -DECLARE_ARC(Zip) -DECLARE_ARCN(Zip,2) -DECLARE_ARCN(Zip,3) - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Common/DeclareCodecs.h b/desmume/src/windows/7z/CPP/7zip/Common/DeclareCodecs.h deleted file mode 100644 index 6b933cac6..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/DeclareCodecs.h +++ /dev/null @@ -1,31 +0,0 @@ -// DeclareCodecs.h - -#ifndef __DECLARECODECS_H -#define __DECLARECODECS_H - -#define DECLARE_CODEC(x) struct CRegisterCodec##x { CRegisterCodec##x(); }; \ - FORCE_REF(CRegisterCodec##x, g_RegisterCodec##x) - -#define DECLARE_CODECS(x) struct CRegisterCodecs##x { CRegisterCodecs##x(); }; \ - FORCE_REF(CRegisterCodecs##x, g_RegisterCodecs##x) - -#ifndef FORCE_REF - #define FORCE_REF(...) -#endif - -DECLARE_CODEC(7zAES) -DECLARE_CODEC(BCJ2) -DECLARE_CODEC(BCJ) -DECLARE_CODEC(BZip2) -DECLARE_CODEC(Copy) -DECLARE_CODEC(Deflate64) -DECLARE_CODEC(DeflateNsis) -DECLARE_CODEC(Deflate) -DECLARE_CODEC(LZMA) -DECLARE_CODEC(PPMD) - -DECLARE_CODECS(Branch) -DECLARE_CODECS(ByteSwap) -DECLARE_CODECS(Rar) - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Common/FilterCoder.cpp b/desmume/src/windows/7z/CPP/7zip/Common/FilterCoder.cpp deleted file mode 100644 index 1985d383a..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/FilterCoder.cpp +++ /dev/null @@ -1,262 +0,0 @@ -// FilterCoder.cpp - -#include "StdAfx.h" - -#include "FilterCoder.h" -extern "C" -{ -#include "../../../C/Alloc.h" -} -#include "../../Common/Defs.h" -#include "StreamUtils.h" - -static const UInt32 kBufferSize = 1 << 17; - -CFilterCoder::CFilterCoder() -{ - _buffer = (Byte *)::MidAlloc(kBufferSize); -} - -CFilterCoder::~CFilterCoder() -{ - ::MidFree(_buffer); -} - -HRESULT CFilterCoder::WriteWithLimit(ISequentialOutStream *outStream, UInt32 size) -{ - if (_outSizeIsDefined) - { - UInt64 remSize = _outSize - _nowPos64; - if (size > remSize) - size = (UInt32)remSize; - } - RINOK(WriteStream(outStream, _buffer, size)); - _nowPos64 += size; - return S_OK; -} - - -STDMETHODIMP CFilterCoder::Code(ISequentialInStream *inStream, - ISequentialOutStream *outStream, const UInt64 * /* inSize */, const UInt64 *outSize, - ICompressProgressInfo *progress) -{ - RINOK(Init()); - UInt32 bufferPos = 0; - _outSizeIsDefined = (outSize != 0); - if (_outSizeIsDefined) - _outSize = *outSize; - - while(NeedMore()) - { - size_t processedSize = kBufferSize - bufferPos; - - // Change it: It can be optimized using ReadPart - RINOK(ReadStream(inStream, _buffer + bufferPos, &processedSize)); - - UInt32 endPos = bufferPos + (UInt32)processedSize; - - bufferPos = Filter->Filter(_buffer, endPos); - if (bufferPos > endPos) - { - for (; endPos< bufferPos; endPos++) - _buffer[endPos] = 0; - bufferPos = Filter->Filter(_buffer, endPos); - } - - if (bufferPos == 0) - { - if (endPos > 0) - return WriteWithLimit(outStream, endPos); - return S_OK; - } - RINOK(WriteWithLimit(outStream, bufferPos)); - if (progress != NULL) - { - RINOK(progress->SetRatioInfo(&_nowPos64, &_nowPos64)); - } - UInt32 i = 0; - while(bufferPos < endPos) - _buffer[i++] = _buffer[bufferPos++]; - bufferPos = i; - } - return S_OK; -} - -// #ifdef _ST_MODE -STDMETHODIMP CFilterCoder::SetOutStream(ISequentialOutStream *outStream) -{ - _bufferPos = 0; - _outStream = outStream; - return Init(); -} - -STDMETHODIMP CFilterCoder::ReleaseOutStream() -{ - _outStream.Release(); - return S_OK; -}; - - -STDMETHODIMP CFilterCoder::Write(const void *data, UInt32 size, UInt32 *processedSize) -{ - UInt32 processedSizeTotal = 0; - while(size > 0) - { - UInt32 sizeMax = kBufferSize - _bufferPos; - UInt32 sizeTemp = size; - if (sizeTemp > sizeMax) - sizeTemp = sizeMax; - memmove(_buffer + _bufferPos, data, sizeTemp); - size -= sizeTemp; - processedSizeTotal += sizeTemp; - data = (const Byte *)data + sizeTemp; - UInt32 endPos = _bufferPos + sizeTemp; - _bufferPos = Filter->Filter(_buffer, endPos); - if (_bufferPos == 0) - { - _bufferPos = endPos; - break; - } - if (_bufferPos > endPos) - { - if (size != 0) - return E_FAIL; - break; - } - RINOK(WriteWithLimit(_outStream, _bufferPos)); - UInt32 i = 0; - while(_bufferPos < endPos) - _buffer[i++] = _buffer[_bufferPos++]; - _bufferPos = i; - } - if (processedSize != NULL) - *processedSize = processedSizeTotal; - return S_OK; -} - -STDMETHODIMP CFilterCoder::Flush() -{ - if (_bufferPos != 0) - { - UInt32 endPos = Filter->Filter(_buffer, _bufferPos); - if (endPos > _bufferPos) - { - for (; _bufferPos < endPos; _bufferPos++) - _buffer[_bufferPos] = 0; - if (Filter->Filter(_buffer, endPos) != endPos) - return E_FAIL; - } - RINOK(WriteStream(_outStream, _buffer, _bufferPos)); - _bufferPos = 0; - } - CMyComPtr flush; - _outStream.QueryInterface(IID_IOutStreamFlush, &flush); - if (flush) - return flush->Flush(); - return S_OK; -} - - -STDMETHODIMP CFilterCoder::SetInStream(ISequentialInStream *inStream) -{ - _convertedPosBegin = _convertedPosEnd = _bufferPos = 0; - _inStream = inStream; - return Init(); -} - -STDMETHODIMP CFilterCoder::ReleaseInStream() -{ - _inStream.Release(); - return S_OK; -}; - -STDMETHODIMP CFilterCoder::Read(void *data, UInt32 size, UInt32 *processedSize) -{ - UInt32 processedSizeTotal = 0; - while(size > 0) - { - if (_convertedPosBegin != _convertedPosEnd) - { - UInt32 sizeTemp = MyMin(size, _convertedPosEnd - _convertedPosBegin); - memmove(data, _buffer + _convertedPosBegin, sizeTemp); - _convertedPosBegin += sizeTemp; - data = (void *)((Byte *)data + sizeTemp); - size -= sizeTemp; - processedSizeTotal += sizeTemp; - break; - } - int i; - for (i = 0; _convertedPosEnd + i < _bufferPos; i++) - _buffer[i] = _buffer[i + _convertedPosEnd]; - _bufferPos = i; - _convertedPosBegin = _convertedPosEnd = 0; - size_t processedSizeTemp = kBufferSize - _bufferPos; - RINOK(ReadStream(_inStream, _buffer + _bufferPos, &processedSizeTemp)); - _bufferPos = _bufferPos + (UInt32)processedSizeTemp; - _convertedPosEnd = Filter->Filter(_buffer, _bufferPos); - if (_convertedPosEnd == 0) - { - if (_bufferPos == 0) - break; - else - { - _convertedPosEnd = _bufferPos; // check it - continue; - } - } - if (_convertedPosEnd > _bufferPos) - { - for (; _bufferPos < _convertedPosEnd; _bufferPos++) - _buffer[_bufferPos] = 0; - _convertedPosEnd = Filter->Filter(_buffer, _bufferPos); - } - } - if (processedSize != NULL) - *processedSize = processedSizeTotal; - return S_OK; -} - -// #endif // _ST_MODE - -#ifndef _NO_CRYPTO -STDMETHODIMP CFilterCoder::CryptoSetPassword(const Byte *data, UInt32 size) -{ - return _setPassword->CryptoSetPassword(data, size); -} -#endif - -#ifndef EXTRACT_ONLY -STDMETHODIMP CFilterCoder::SetCoderProperties(const PROPID *propIDs, - const PROPVARIANT *properties, UInt32 numProperties) -{ - return _SetCoderProperties->SetCoderProperties(propIDs, properties, numProperties); -} - -STDMETHODIMP CFilterCoder::WriteCoderProperties(ISequentialOutStream *outStream) -{ - return _writeCoderProperties->WriteCoderProperties(outStream); -} - -/* -STDMETHODIMP CFilterCoder::ResetSalt() -{ - return _CryptoResetSalt->ResetSalt(); -} -*/ - -STDMETHODIMP CFilterCoder::ResetInitVector() -{ - return _CryptoResetInitVector->ResetInitVector(); -} -#endif - -STDMETHODIMP CFilterCoder::SetDecoderProperties2(const Byte *data, UInt32 size) -{ - return _setDecoderProperties->SetDecoderProperties2(data, size); -} - - - -void foo() -{ -} diff --git a/desmume/src/windows/7z/CPP/7zip/Common/FilterCoder.h b/desmume/src/windows/7z/CPP/7zip/Common/FilterCoder.h deleted file mode 100644 index 496eb5e04..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/FilterCoder.h +++ /dev/null @@ -1,143 +0,0 @@ -// FilterCoder.h - -#ifndef __FILTERCODER_H -#define __FILTERCODER_H - -#include "../../Common/MyCom.h" -#include "../ICoder.h" -#include "../IPassword.h" - -#define MY_QUERYINTERFACE_ENTRY_AG(i, sub0, sub) if (iid == IID_ ## i) \ -{ if (!sub) RINOK(sub0->QueryInterface(IID_ ## i, (void **)&sub)) \ -*outObject = (void *)(i *)this; AddRef(); return S_OK; } - -class CFilterCoder: - public ICompressCoder, - // #ifdef _ST_MODE - public ICompressSetInStream, - public ISequentialInStream, - public ICompressSetOutStream, - public ISequentialOutStream, - public IOutStreamFlush, - // #endif - - #ifndef _NO_CRYPTO - public ICryptoSetPassword, - #endif - #ifndef EXTRACT_ONLY - public ICompressSetCoderProperties, - public ICompressWriteCoderProperties, - // public ICryptoResetSalt, - public ICryptoResetInitVector, - #endif - public ICompressSetDecoderProperties2, - public CMyUnknownImp -{ -protected: - Byte *_buffer; - // #ifdef _ST_MODE - CMyComPtr _inStream; - CMyComPtr _outStream; - UInt32 _bufferPos; - UInt32 _convertedPosBegin; - UInt32 _convertedPosEnd; - // #endif - bool _outSizeIsDefined; - UInt64 _outSize; - UInt64 _nowPos64; - - HRESULT Init() - { - _nowPos64 = 0; - _outSizeIsDefined = false; - return Filter->Init(); - } - - CMyComPtr _setPassword; - #ifndef EXTRACT_ONLY - CMyComPtr _SetCoderProperties; - CMyComPtr _writeCoderProperties; - // CMyComPtr _CryptoResetSalt; - CMyComPtr _CryptoResetInitVector; - #endif - CMyComPtr _setDecoderProperties; -public: - CMyComPtr Filter; - - CFilterCoder(); - ~CFilterCoder(); - HRESULT WriteWithLimit(ISequentialOutStream *outStream, UInt32 size); - bool NeedMore() const - { return (!_outSizeIsDefined || (_nowPos64 < _outSize)); } - -public: - MY_QUERYINTERFACE_BEGIN - MY_QUERYINTERFACE_ENTRY(ICompressCoder) - // #ifdef _ST_MODE - MY_QUERYINTERFACE_ENTRY(ICompressSetInStream) - MY_QUERYINTERFACE_ENTRY(ISequentialInStream) - - MY_QUERYINTERFACE_ENTRY(ICompressSetOutStream) - MY_QUERYINTERFACE_ENTRY(ISequentialOutStream) - MY_QUERYINTERFACE_ENTRY(IOutStreamFlush) - // #endif - - #ifndef _NO_CRYPTO - MY_QUERYINTERFACE_ENTRY_AG(ICryptoSetPassword, Filter, _setPassword) - #endif - - #ifndef EXTRACT_ONLY - MY_QUERYINTERFACE_ENTRY_AG(ICompressSetCoderProperties, Filter, _SetCoderProperties) - MY_QUERYINTERFACE_ENTRY_AG(ICompressWriteCoderProperties, Filter, _writeCoderProperties) - // MY_QUERYINTERFACE_ENTRY_AG(ICryptoResetSalt, Filter, _CryptoResetSalt) - MY_QUERYINTERFACE_ENTRY_AG(ICryptoResetInitVector, Filter, _CryptoResetInitVector) - #endif - - MY_QUERYINTERFACE_ENTRY_AG(ICompressSetDecoderProperties2, Filter, _setDecoderProperties) - MY_QUERYINTERFACE_END - MY_ADDREF_RELEASE - STDMETHOD(Code)(ISequentialInStream *inStream, - ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize, - ICompressProgressInfo *progress); - // #ifdef _ST_MODE - STDMETHOD(ReleaseInStream)(); - STDMETHOD(SetInStream)(ISequentialInStream *inStream); - STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); \ - STDMETHOD(SetOutStream)(ISequentialOutStream *outStream); - STDMETHOD(ReleaseOutStream)(); - STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); - STDMETHOD(Flush)(); - // #endif - - #ifndef _NO_CRYPTO - STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size); - #endif - #ifndef EXTRACT_ONLY - STDMETHOD(SetCoderProperties)(const PROPID *propIDs, - const PROPVARIANT *properties, UInt32 numProperties); - STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream); - // STDMETHOD(ResetSalt)(); - STDMETHOD(ResetInitVector)(); - #endif - STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size); -}; - -// #ifdef _ST_MODE -class CInStreamReleaser -{ -public: - CFilterCoder *FilterCoder; - CInStreamReleaser(): FilterCoder(0) {} - ~CInStreamReleaser() { if (FilterCoder) FilterCoder->ReleaseInStream(); } -}; - -class COutStreamReleaser -{ -public: - CFilterCoder *FilterCoder; - COutStreamReleaser(): FilterCoder(0) {} - ~COutStreamReleaser() { if (FilterCoder) FilterCoder->ReleaseOutStream(); } -}; -// #endif - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Common/InBuffer.cpp b/desmume/src/windows/7z/CPP/7zip/Common/InBuffer.cpp deleted file mode 100644 index 7e061156a..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/InBuffer.cpp +++ /dev/null @@ -1,83 +0,0 @@ -// InBuffer.cpp - -#include "StdAfx.h" - -#include "InBuffer.h" - -extern "C" -{ - #include "../../../C/Alloc.h" -} - -CInBuffer::CInBuffer(): - _buffer(0), - _bufferLimit(0), - _bufferBase(0), - _stream(0), - _bufferSize(0) -{} - -bool CInBuffer::Create(UInt32 bufferSize) -{ - const UInt32 kMinBlockSize = 1; - if (bufferSize < kMinBlockSize) - bufferSize = kMinBlockSize; - if (_bufferBase != 0 && _bufferSize == bufferSize) - return true; - Free(); - _bufferSize = bufferSize; - _bufferBase = (Byte *)::MidAlloc(bufferSize); - return (_bufferBase != 0); -} - -void CInBuffer::Free() -{ - ::MidFree(_bufferBase); - _bufferBase = 0; -} - -void CInBuffer::SetStream(ISequentialInStream *stream) -{ - _stream = stream; -} - -void CInBuffer::Init() -{ - _processedSize = 0; - _buffer = _bufferBase; - _bufferLimit = _buffer; - _wasFinished = false; - #ifdef _NO_EXCEPTIONS - ErrorCode = S_OK; - #endif -} - -bool CInBuffer::ReadBlock() -{ - #ifdef _NO_EXCEPTIONS - if (ErrorCode != S_OK) - return false; - #endif - if (_wasFinished) - return false; - _processedSize += (_buffer - _bufferBase); - UInt32 numProcessedBytes; - HRESULT result = _stream->Read(_bufferBase, _bufferSize, &numProcessedBytes); - #ifdef _NO_EXCEPTIONS - ErrorCode = result; - #else - if (result != S_OK) - throw CInBufferException(result); - #endif - _buffer = _bufferBase; - _bufferLimit = _buffer + numProcessedBytes; - _wasFinished = (numProcessedBytes == 0); - return (!_wasFinished); -} - -Byte CInBuffer::ReadBlock2() -{ - if(!ReadBlock()) - return 0xFF; - return *_buffer++; -} diff --git a/desmume/src/windows/7z/CPP/7zip/Common/InBuffer.h b/desmume/src/windows/7z/CPP/7zip/Common/InBuffer.h deleted file mode 100644 index cdd50f1b2..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/InBuffer.h +++ /dev/null @@ -1,81 +0,0 @@ -// InBuffer.h - -#ifndef __INBUFFER_H -#define __INBUFFER_H - -#include "../IStream.h" -#include "../../Common/MyCom.h" -#include "../../Common/MyException.h" - -#ifndef _NO_EXCEPTIONS -struct CInBufferException: public CSystemException -{ - CInBufferException(HRESULT errorCode): CSystemException(errorCode) {} -}; -#endif - -class CInBuffer -{ - Byte *_buffer; - Byte *_bufferLimit; - Byte *_bufferBase; - CMyComPtr _stream; - UInt64 _processedSize; - UInt32 _bufferSize; - bool _wasFinished; - - bool ReadBlock(); - Byte ReadBlock2(); - -public: - #ifdef _NO_EXCEPTIONS - HRESULT ErrorCode; - #endif - - CInBuffer(); - ~CInBuffer() { Free(); } - - bool Create(UInt32 bufferSize); - void Free(); - - void SetStream(ISequentialInStream *stream); - void Init(); - void ReleaseStream() { _stream.Release(); } - - bool ReadByte(Byte &b) - { - if (_buffer >= _bufferLimit) - if (!ReadBlock()) - return false; - b = *_buffer++; - return true; - } - Byte ReadByte() - { - if (_buffer >= _bufferLimit) - return ReadBlock2(); - return *_buffer++; - } - UInt32 ReadBytes(Byte *buf, UInt32 size) - { - if ((UInt32)(_bufferLimit - _buffer) >= size) - { - for (UInt32 i = 0; i < size; i++) - buf[i] = _buffer[i]; - _buffer += size; - return size; - } - for (UInt32 i = 0; i < size; i++) - { - if (_buffer >= _bufferLimit) - if (!ReadBlock()) - return i; - buf[i] = *_buffer++; - } - return size; - } - UInt64 GetProcessedSize() const { return _processedSize + (_buffer - _bufferBase); } - bool WasFinished() const { return _wasFinished; } -}; - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Common/InOutTempBuffer.cpp b/desmume/src/windows/7z/CPP/7zip/Common/InOutTempBuffer.cpp deleted file mode 100644 index 79c04c109..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/InOutTempBuffer.cpp +++ /dev/null @@ -1,122 +0,0 @@ -// InOutTempBuffer.cpp - -#include "StdAfx.h" - -#include "InOutTempBuffer.h" -#include "../../Common/Defs.h" -// #include "Windows/Defs.h" - -#include "StreamUtils.h" - -using namespace NWindows; -using namespace NFile; -using namespace NDirectory; - -static UInt32 kTmpBufferMemorySize = (1 << 20); - -static LPCTSTR kTempFilePrefixString = TEXT("iot"); - -CInOutTempBuffer::CInOutTempBuffer(): - _buffer(NULL) -{ -} - -void CInOutTempBuffer::Create() -{ - _buffer = new Byte[kTmpBufferMemorySize]; -} - -CInOutTempBuffer::~CInOutTempBuffer() -{ - delete []_buffer; -} -void CInOutTempBuffer::InitWriting() -{ - _bufferPosition = 0; - _tmpFileCreated = false; - _fileSize = 0; -} - -bool CInOutTempBuffer::WriteToFile(const void *data, UInt32 size) -{ - if (size == 0) - return true; - if(!_tmpFileCreated) - { - CSysString tempDirPath; - if(!MyGetTempPath(tempDirPath)) - return false; - if (_tempFile.Create(tempDirPath, kTempFilePrefixString, _tmpFileName) == 0) - return false; - // _outFile.SetOpenCreationDispositionCreateAlways(); - if(!_outFile.Create(_tmpFileName, true)) - return false; - _tmpFileCreated = true; - } - UInt32 processedSize; - if(!_outFile.Write(data, size, processedSize)) - return false; - _fileSize += processedSize; - return (processedSize == size); -} - -bool CInOutTempBuffer::FlushWrite() -{ - return _outFile.Close(); -} - -bool CInOutTempBuffer::Write(const void *data, UInt32 size) -{ - if(_bufferPosition < kTmpBufferMemorySize) - { - UInt32 curSize = MyMin(kTmpBufferMemorySize - _bufferPosition, size); - memmove(_buffer + _bufferPosition, (const Byte *)data, curSize); - _bufferPosition += curSize; - size -= curSize; - data = ((const Byte *)data) + curSize; - _fileSize += curSize; - } - return WriteToFile(data, size); -} - -bool CInOutTempBuffer::InitReading() -{ - _currentPositionInBuffer = 0; - if(_tmpFileCreated) - return _inFile.Open(_tmpFileName); - return true; -} - -HRESULT CInOutTempBuffer::WriteToStream(ISequentialOutStream *stream) -{ - if (_currentPositionInBuffer < _bufferPosition) - { - UInt32 sizeToWrite = _bufferPosition - _currentPositionInBuffer; - RINOK(WriteStream(stream, _buffer + _currentPositionInBuffer, sizeToWrite)); - _currentPositionInBuffer += sizeToWrite; - } - if (!_tmpFileCreated) - return true; - for (;;) - { - UInt32 localProcessedSize; - if (!_inFile.ReadPart(_buffer, kTmpBufferMemorySize, localProcessedSize)) - return E_FAIL; - if (localProcessedSize == 0) - return S_OK; - RINOK(WriteStream(stream, _buffer, localProcessedSize)); - } -} - -STDMETHODIMP CSequentialOutTempBufferImp::Write(const void *data, UInt32 size, UInt32 *processedSize) -{ - if (!_buffer->Write(data, size)) - { - if (processedSize != NULL) - *processedSize = 0; - return E_FAIL; - } - if (processedSize != NULL) - *processedSize = size; - return S_OK; -} diff --git a/desmume/src/windows/7z/CPP/7zip/Common/InOutTempBuffer.h b/desmume/src/windows/7z/CPP/7zip/Common/InOutTempBuffer.h deleted file mode 100644 index 1ccf1153f..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/InOutTempBuffer.h +++ /dev/null @@ -1,55 +0,0 @@ -// Util/InOutTempBuffer.h - -#ifndef __IN_OUT_TEMP_BUFFER_H -#define __IN_OUT_TEMP_BUFFER_H - -#include "../../Windows/FileIO.h" -#include "../../Windows/FileDir.h" -#include "../../Common/MyCom.h" - -#include "../IStream.h" - -class CInOutTempBuffer -{ - NWindows::NFile::NDirectory::CTempFile _tempFile; - NWindows::NFile::NIO::COutFile _outFile; - NWindows::NFile::NIO::CInFile _inFile; - Byte *_buffer; - UInt32 _bufferPosition; - UInt32 _currentPositionInBuffer; - CSysString _tmpFileName; - bool _tmpFileCreated; - - UInt64 _fileSize; - - bool WriteToFile(const void *data, UInt32 size); -public: - CInOutTempBuffer(); - ~CInOutTempBuffer(); - void Create(); - - void InitWriting(); - bool Write(const void *data, UInt32 size); - UInt64 GetDataSize() const { return _fileSize; } - bool FlushWrite(); - bool InitReading(); - HRESULT WriteToStream(ISequentialOutStream *stream); -}; - -class CSequentialOutTempBufferImp: - public ISequentialOutStream, - public CMyUnknownImp -{ - CInOutTempBuffer *_buffer; -public: - // CSequentialOutStreamImp(): _size(0) {} - // UInt32 _size; - void Init(CInOutTempBuffer *buffer) { _buffer = buffer; } - // UInt32 GetSize() const { return _size; } - - MY_UNKNOWN_IMP - - STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); -}; - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Common/LimitedStreams.cpp b/desmume/src/windows/7z/CPP/7zip/Common/LimitedStreams.cpp deleted file mode 100644 index 0a1bfa38e..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/LimitedStreams.cpp +++ /dev/null @@ -1,45 +0,0 @@ -// LimitedStreams.cpp - -#include "StdAfx.h" - -#include "LimitedStreams.h" -#include "../../Common/Defs.h" - -STDMETHODIMP CLimitedSequentialInStream::Read(void *data, UInt32 size, UInt32 *processedSize) -{ - UInt32 realProcessedSize = 0; - UInt32 sizeToRead = (UInt32)MyMin((_size - _pos), (UInt64)size); - HRESULT result = S_OK; - if (sizeToRead > 0) - { - result = _stream->Read(data, sizeToRead, &realProcessedSize); - _pos += realProcessedSize; - if (realProcessedSize == 0) - _wasFinished = true; - } - if(processedSize != NULL) - *processedSize = realProcessedSize; - return result; -} - -STDMETHODIMP CLimitedSequentialOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize) -{ - HRESULT result = S_OK; - if (processedSize != NULL) - *processedSize = 0; - if (size > _size) - { - size = (UInt32)_size; - if (size == 0) - { - _overflow = true; - return E_FAIL; - } - } - if (_stream) - result = _stream->Write(data, size, &size); - _size -= size; - if (processedSize != NULL) - *processedSize = size; - return result; -} diff --git a/desmume/src/windows/7z/CPP/7zip/Common/LimitedStreams.h b/desmume/src/windows/7z/CPP/7zip/Common/LimitedStreams.h deleted file mode 100644 index 7e0e1c126..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/LimitedStreams.h +++ /dev/null @@ -1,54 +0,0 @@ -// LimitedStreams.h - -#ifndef __LIMITEDSTREAMS_H -#define __LIMITEDSTREAMS_H - -#include "../../Common/MyCom.h" -#include "../IStream.h" - -class CLimitedSequentialInStream: - public ISequentialInStream, - public CMyUnknownImp -{ - CMyComPtr _stream; - UInt64 _size; - UInt64 _pos; - bool _wasFinished; -public: - void SetStream(ISequentialInStream *stream) { _stream = stream; } - void Init(UInt64 streamSize) - { - _size = streamSize; - _pos = 0; - _wasFinished = false; - } - - MY_UNKNOWN_IMP - - STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); - UInt64 GetSize() const { return _pos; } - bool WasFinished() const { return _wasFinished; } -}; - -class CLimitedSequentialOutStream: - public ISequentialOutStream, - public CMyUnknownImp -{ - CMyComPtr _stream; - UInt64 _size; - bool _overflow; -public: - MY_UNKNOWN_IMP - STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); - void SetStream(ISequentialOutStream *stream) { _stream = stream; } - void ReleaseStream() { _stream.Release(); } - void Init(UInt64 size) - { - _size = size; - _overflow = false; - } - bool IsFinishedOK() const { return (_size == 0 && !_overflow); } - UInt64 GetRem() const { return _size; } -}; - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Common/LockedStream.cpp b/desmume/src/windows/7z/CPP/7zip/Common/LockedStream.cpp deleted file mode 100644 index d1bbf6dba..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/LockedStream.cpp +++ /dev/null @@ -1,23 +0,0 @@ -// LockedStream.cpp - -#include "StdAfx.h" - -#include "LockedStream.h" - -HRESULT CLockedInStream::Read(UInt64 startPos, void *data, UInt32 size, - UInt32 *processedSize) -{ - NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection); - RINOK(_stream->Seek(startPos, STREAM_SEEK_SET, NULL)); - return _stream->Read(data, size, processedSize); -} - -STDMETHODIMP CLockedSequentialInStreamImp::Read(void *data, UInt32 size, UInt32 *processedSize) -{ - UInt32 realProcessedSize = 0; - HRESULT result = _lockedInStream->Read(_pos, data, size, &realProcessedSize); - _pos += realProcessedSize; - if (processedSize != NULL) - *processedSize = realProcessedSize; - return result; -} diff --git a/desmume/src/windows/7z/CPP/7zip/Common/LockedStream.h b/desmume/src/windows/7z/CPP/7zip/Common/LockedStream.h deleted file mode 100644 index e12e22a4a..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/LockedStream.h +++ /dev/null @@ -1,38 +0,0 @@ -// LockedStream.h - -#ifndef __LOCKEDSTREAM_H -#define __LOCKEDSTREAM_H - -#include "../../Windows/Synchronization.h" -#include "../../Common/MyCom.h" -#include "../IStream.h" - -class CLockedInStream -{ - CMyComPtr _stream; - NWindows::NSynchronization::CCriticalSection _criticalSection; -public: - void Init(IInStream *stream) - { _stream = stream; } - HRESULT Read(UInt64 startPos, void *data, UInt32 size, UInt32 *processedSize); -}; - -class CLockedSequentialInStreamImp: - public ISequentialInStream, - public CMyUnknownImp -{ - CLockedInStream *_lockedInStream; - UInt64 _pos; -public: - void Init(CLockedInStream *lockedInStream, UInt64 startPos) - { - _lockedInStream = lockedInStream; - _pos = startPos; - } - - MY_UNKNOWN_IMP - - STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); -}; - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Common/MemBlocks.cpp b/desmume/src/windows/7z/CPP/7zip/Common/MemBlocks.cpp deleted file mode 100644 index 923c2e775..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/MemBlocks.cpp +++ /dev/null @@ -1,183 +0,0 @@ -// MemBlocks.cpp - -#include "StdAfx.h" - -#include "Common/MyCom.h" - -#include "StreamUtils.h" -#include "MemBlocks.h" - -bool CMemBlockManager::AllocateSpace(size_t numBlocks) -{ - FreeSpace(); - if (_blockSize < sizeof(void *) || numBlocks < 1) - return false; - size_t totalSize = numBlocks * _blockSize; - if (totalSize / _blockSize != numBlocks) - return false; - _data = ::MidAlloc(totalSize); - if (_data == 0) - return false; - Byte *p = (Byte *)_data; - for (size_t i = 0; i + 1 < numBlocks; i++, p += _blockSize) - *(Byte **)p = (p + _blockSize); - *(Byte **)p = 0; - _headFree = _data; - return true; -} - -void CMemBlockManager::FreeSpace() -{ - ::MidFree(_data); - _data = 0; - _headFree= 0; -} - -void *CMemBlockManager::AllocateBlock() -{ - if (_headFree == 0) - return 0; - void *p = _headFree; - _headFree = *(void **)_headFree; - return p; -} - -void CMemBlockManager::FreeBlock(void *p) -{ - if (p == 0) - return; - *(void **)p = _headFree; - _headFree = p; -} - - -HRes CMemBlockManagerMt::AllocateSpace(size_t numBlocks, size_t numNoLockBlocks) -{ - if (numNoLockBlocks > numBlocks) - return E_INVALIDARG; - if (!CMemBlockManager::AllocateSpace(numBlocks)) - return E_OUTOFMEMORY; - size_t numLockBlocks = numBlocks - numNoLockBlocks; - Semaphore.Close(); - return Semaphore.Create((LONG)numLockBlocks, (LONG)numLockBlocks); -} - -HRes CMemBlockManagerMt::AllocateSpaceAlways(size_t desiredNumberOfBlocks, size_t numNoLockBlocks) -{ - if (numNoLockBlocks > desiredNumberOfBlocks) - return E_INVALIDARG; - for (;;) - { - if (AllocateSpace(desiredNumberOfBlocks, numNoLockBlocks) == 0) - return 0; - if (desiredNumberOfBlocks == numNoLockBlocks) - return E_OUTOFMEMORY; - desiredNumberOfBlocks = numNoLockBlocks + ((desiredNumberOfBlocks - numNoLockBlocks) >> 1); - } -} - -void CMemBlockManagerMt::FreeSpace() -{ - Semaphore.Close(); - CMemBlockManager::FreeSpace(); -} - -void *CMemBlockManagerMt::AllocateBlock() -{ - // Semaphore.Lock(); - NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection); - return CMemBlockManager::AllocateBlock(); -} - -void CMemBlockManagerMt::FreeBlock(void *p, bool lockMode) -{ - if (p == 0) - return; - { - NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection); - CMemBlockManager::FreeBlock(p); - } - if (lockMode) - Semaphore.Release(); -} - -void CMemBlocks::Free(CMemBlockManagerMt *manager) -{ - while(Blocks.Size() > 0) - { - manager->FreeBlock(Blocks.Back()); - Blocks.DeleteBack(); - } - TotalSize = 0; -} - -void CMemBlocks::FreeOpt(CMemBlockManagerMt *manager) -{ - Free(manager); - Blocks.ClearAndFree(); -} - -HRESULT CMemBlocks::WriteToStream(size_t blockSize, ISequentialOutStream *outStream) const -{ - UInt64 totalSize = TotalSize; - for (int blockIndex = 0; totalSize > 0; blockIndex++) - { - UInt32 curSize = (UInt32)blockSize; - if (totalSize < curSize) - curSize = (UInt32)totalSize; - if (blockIndex >= Blocks.Size()) - return E_FAIL; - RINOK(WriteStream(outStream, Blocks[blockIndex], curSize)); - totalSize -= curSize; - } - return S_OK; -} - - -void CMemLockBlocks::FreeBlock(int index, CMemBlockManagerMt *memManager) -{ - memManager->FreeBlock(Blocks[index], LockMode); - Blocks[index] = 0; -} - -void CMemLockBlocks::Free(CMemBlockManagerMt *memManager) -{ - while (Blocks.Size() > 0) - { - FreeBlock(Blocks.Size() - 1, memManager); - Blocks.DeleteBack(); - } - TotalSize = 0; -} - -HRes CMemLockBlocks::SwitchToNoLockMode(CMemBlockManagerMt *memManager) -{ - if (LockMode) - { - if (Blocks.Size() > 0) - { - RINOK(memManager->ReleaseLockedBlocks(Blocks.Size())); - } - LockMode = false; - } - return 0; -} - -void CMemLockBlocks::Detach(CMemLockBlocks &blocks, CMemBlockManagerMt *memManager) -{ - blocks.Free(memManager); - blocks.LockMode = LockMode; - UInt64 totalSize = 0; - size_t blockSize = memManager->GetBlockSize(); - for (int i = 0; i < Blocks.Size(); i++) - { - if (totalSize < TotalSize) - blocks.Blocks.Add(Blocks[i]); - else - FreeBlock(i, memManager); - Blocks[i] = 0; - totalSize += blockSize; - } - blocks.TotalSize = TotalSize; - Free(memManager); -} diff --git a/desmume/src/windows/7z/CPP/7zip/Common/MemBlocks.h b/desmume/src/windows/7z/CPP/7zip/Common/MemBlocks.h deleted file mode 100644 index 4b20a1c4a..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/MemBlocks.h +++ /dev/null @@ -1,77 +0,0 @@ -// MemBlocks.h - -#ifndef __MEMBLOCKS_H -#define __MEMBLOCKS_H - -extern "C" -{ -#include "../../../C/Alloc.h" -} - -#include "Common/Types.h" -#include "Common/MyVector.h" - -#include "Windows/Synchronization.h" - -#include "../IStream.h" - -class CMemBlockManager -{ - void *_data; - size_t _blockSize; - void *_headFree; -public: - CMemBlockManager(size_t blockSize = (1 << 20)): _data(0), _blockSize(blockSize), _headFree(0) {} - ~CMemBlockManager() { FreeSpace(); } - - bool AllocateSpace(size_t numBlocks); - void FreeSpace(); - size_t GetBlockSize() const { return _blockSize; } - void *AllocateBlock(); - void FreeBlock(void *p); -}; - - -class CMemBlockManagerMt: public CMemBlockManager -{ - NWindows::NSynchronization::CCriticalSection _criticalSection; -public: - NWindows::NSynchronization::CSemaphore Semaphore; - - CMemBlockManagerMt(size_t blockSize = (1 << 20)): CMemBlockManager(blockSize) {} - ~CMemBlockManagerMt() { FreeSpace(); } - - HRes AllocateSpace(size_t numBlocks, size_t numNoLockBlocks = 0); - HRes AllocateSpaceAlways(size_t desiredNumberOfBlocks, size_t numNoLockBlocks = 0); - void FreeSpace(); - void *AllocateBlock(); - void FreeBlock(void *p, bool lockMode = true); - HRes ReleaseLockedBlocks(int number) { return Semaphore.Release(number); } -}; - - -class CMemBlocks -{ - void Free(CMemBlockManagerMt *manager); -public: - CRecordVector Blocks; - UInt64 TotalSize; - - CMemBlocks(): TotalSize(0) {} - - void FreeOpt(CMemBlockManagerMt *manager); - HRESULT WriteToStream(size_t blockSize, ISequentialOutStream *outStream) const; -}; - -struct CMemLockBlocks: public CMemBlocks -{ - bool LockMode; - - CMemLockBlocks(): LockMode(true) {}; - void Free(CMemBlockManagerMt *memManager); - void FreeBlock(int index, CMemBlockManagerMt *memManager); - HRes SwitchToNoLockMode(CMemBlockManagerMt *memManager); - void Detach(CMemLockBlocks &blocks, CMemBlockManagerMt *memManager); -}; - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Common/MethodId.cpp b/desmume/src/windows/7z/CPP/7zip/Common/MethodId.cpp deleted file mode 100644 index 705cc4d9b..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/MethodId.cpp +++ /dev/null @@ -1,27 +0,0 @@ -// MethodId.cpp - -#include "StdAfx.h" - -#include "MethodId.h" -#include "../../Common/MyString.h" - -static inline wchar_t GetHex(Byte value) -{ - return (wchar_t)((value < 10) ? ('0' + value) : ('A' + (value - 10))); -} - -UString ConvertMethodIdToString(UInt64 id) -{ - wchar_t s[32]; - int len = 32; - s[--len] = 0; - do - { - s[--len] = GetHex((Byte)id & 0xF); - id >>= 4; - s[--len] = GetHex((Byte)id & 0xF); - id >>= 4; - } - while (id != 0); - return s + len; -} diff --git a/desmume/src/windows/7z/CPP/7zip/Common/MethodId.h b/desmume/src/windows/7z/CPP/7zip/Common/MethodId.h deleted file mode 100644 index 955172354..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/MethodId.h +++ /dev/null @@ -1,10 +0,0 @@ -// MethodId.h - -#ifndef __7Z_METHOD_ID_H -#define __7Z_METHOD_ID_H - -#include "../../Common/Types.h" - -typedef UInt64 CMethodId; - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Common/MethodProps.cpp b/desmume/src/windows/7z/CPP/7zip/Common/MethodProps.cpp deleted file mode 100644 index d917a2c23..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/MethodProps.cpp +++ /dev/null @@ -1,99 +0,0 @@ -// MethodProps.cpp - -#include "StdAfx.h" - -#include "../../Common/MyCom.h" - -#include "../ICoder.h" - -#include "MethodProps.h" - -static UInt64 k_LZMA = 0x030101; -// static UInt64 k_LZMA2 = 0x030102; - -HRESULT SetMethodProperties(const CMethod &method, const UInt64 *inSizeForReduce, IUnknown *coder) -{ - bool tryReduce = false; - UInt32 reducedDictionarySize = 1 << 10; - if (inSizeForReduce != 0 && (method.Id == k_LZMA /* || methodFull.MethodID == k_LZMA2 */)) - { - for (;;) - { - const UInt32 step = (reducedDictionarySize >> 1); - if (reducedDictionarySize >= *inSizeForReduce) - { - tryReduce = true; - break; - } - reducedDictionarySize += step; - if (reducedDictionarySize >= *inSizeForReduce) - { - tryReduce = true; - break; - } - if (reducedDictionarySize >= ((UInt32)3 << 30)) - break; - reducedDictionarySize += step; - } - } - - { - int numProps = method.Props.Size(); - CMyComPtr setCoderProperties; - coder->QueryInterface(IID_ICompressSetCoderProperties, (void **)&setCoderProperties); - if (setCoderProperties == NULL) - { - if (numProps != 0) - return E_INVALIDARG; - } - else - { - CRecordVector propIDs; - NWindows::NCOM::CPropVariant *values = new NWindows::NCOM::CPropVariant[numProps]; - HRESULT res = S_OK; - try - { - for (int i = 0; i < numProps; i++) - { - const CProp &prop = method.Props[i]; - propIDs.Add(prop.Id); - NWindows::NCOM::CPropVariant &value = values[i]; - value = prop.Value; - // if (tryReduce && prop.Id == NCoderPropID::kDictionarySize && value.vt == VT_UI4 && reducedDictionarySize < value.ulVal) - if (tryReduce) - if (prop.Id == NCoderPropID::kDictionarySize) - if (value.vt == VT_UI4) - if (reducedDictionarySize < value.ulVal) - value.ulVal = reducedDictionarySize; - } - CMyComPtr setCoderProperties; - coder->QueryInterface(IID_ICompressSetCoderProperties, (void **)&setCoderProperties); - res = setCoderProperties->SetCoderProperties(&propIDs.Front(), values, numProps); - } - catch(...) - { - delete []values; - throw; - } - delete []values; - RINOK(res); - } - } - - /* - CMyComPtr writeCoderProperties; - coder->QueryInterface(IID_ICompressWriteCoderProperties, (void **)&writeCoderProperties); - if (writeCoderProperties != NULL) - { - CSequentialOutStreamImp *outStreamSpec = new CSequentialOutStreamImp; - CMyComPtr outStream(outStreamSpec); - outStreamSpec->Init(); - RINOK(writeCoderProperties->WriteCoderProperties(outStream)); - size_t size = outStreamSpec->GetSize(); - filterProps.SetCapacity(size); - memmove(filterProps, outStreamSpec->GetBuffer(), size); - } - */ - return S_OK; -} - diff --git a/desmume/src/windows/7z/CPP/7zip/Common/MethodProps.h b/desmume/src/windows/7z/CPP/7zip/Common/MethodProps.h deleted file mode 100644 index e27f09574..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/MethodProps.h +++ /dev/null @@ -1,41 +0,0 @@ -// MethodProps.h - -#ifndef __7Z_METHOD_PROPS_H -#define __7Z_METHOD_PROPS_H - -#include "../../Common/MyVector.h" - -#include "../../Windows/PropVariant.h" - -#include "MethodId.h" - -struct CProp -{ - PROPID Id; - NWindows::NCOM::CPropVariant Value; -}; - -struct CMethod -{ - CMethodId Id; - CObjectVector Props; -}; - -struct CMethodsMode -{ - CObjectVector Methods; - #ifdef COMPRESS_MT - UInt32 NumThreads; - #endif - - CMethodsMode() - #ifdef COMPRESS_MT - : NumThreads(1) - #endif - {} - bool IsEmpty() const { return Methods.IsEmpty() ; } -}; - -HRESULT SetMethodProperties(const CMethod &method, const UInt64 *inSizeForReduce, IUnknown *coder); - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Common/OffsetStream.cpp b/desmume/src/windows/7z/CPP/7zip/Common/OffsetStream.cpp deleted file mode 100644 index d37657949..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/OffsetStream.cpp +++ /dev/null @@ -1,35 +0,0 @@ -// OffsetStream.cpp - -#include "StdAfx.h" - -#include "Common/Defs.h" -#include "OffsetStream.h" - -HRESULT COffsetOutStream::Init(IOutStream *stream, UInt64 offset) -{ - _offset = offset; - _stream = stream; - return _stream->Seek(offset, STREAM_SEEK_SET, NULL); -} - -STDMETHODIMP COffsetOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize) -{ - return _stream->Write(data, size, processedSize); -} - -STDMETHODIMP COffsetOutStream::Seek(Int64 offset, UInt32 seekOrigin, - UInt64 *newPosition) -{ - UInt64 absoluteNewPosition; - if (seekOrigin == STREAM_SEEK_SET) - offset += _offset; - HRESULT result = _stream->Seek(offset, seekOrigin, &absoluteNewPosition); - if (newPosition != NULL) - *newPosition = absoluteNewPosition - _offset; - return result; -} - -STDMETHODIMP COffsetOutStream::SetSize(Int64 newSize) -{ - return _stream->SetSize(_offset + newSize); -} diff --git a/desmume/src/windows/7z/CPP/7zip/Common/OffsetStream.h b/desmume/src/windows/7z/CPP/7zip/Common/OffsetStream.h deleted file mode 100644 index 15846b24a..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/OffsetStream.h +++ /dev/null @@ -1,25 +0,0 @@ -// OffsetStream.h - -#ifndef __OFFSETSTREAM_H -#define __OFFSETSTREAM_H - -#include "Common/MyCom.h" -#include "../IStream.h" - -class COffsetOutStream: - public IOutStream, - public CMyUnknownImp -{ - UInt64 _offset; - CMyComPtr _stream; -public: - HRESULT Init(IOutStream *stream, UInt64 offset); - - MY_UNKNOWN_IMP - - STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); - STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); - STDMETHOD(SetSize)(Int64 newSize); -}; - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Common/OutBuffer.cpp b/desmume/src/windows/7z/CPP/7zip/Common/OutBuffer.cpp deleted file mode 100644 index 238320fe4..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/OutBuffer.cpp +++ /dev/null @@ -1,119 +0,0 @@ -// OutByte.cpp - -#include "StdAfx.h" - -#include "OutBuffer.h" - -extern "C" -{ - #include "../../../C/Alloc.h" -} - -bool COutBuffer::Create(UInt32 bufferSize) -{ - const UInt32 kMinBlockSize = 1; - if (bufferSize < kMinBlockSize) - bufferSize = kMinBlockSize; - if (_buffer != 0 && _bufferSize == bufferSize) - return true; - Free(); - _bufferSize = bufferSize; - _buffer = (Byte *)::MidAlloc(bufferSize); - return (_buffer != 0); -} - -void COutBuffer::Free() -{ - ::MidFree(_buffer); - _buffer = 0; -} - -void COutBuffer::SetStream(ISequentialOutStream *stream) -{ - _stream = stream; -} - -void COutBuffer::Init() -{ - _streamPos = 0; - _limitPos = _bufferSize; - _pos = 0; - _processedSize = 0; - _overDict = false; - #ifdef _NO_EXCEPTIONS - ErrorCode = S_OK; - #endif -} - -UInt64 COutBuffer::GetProcessedSize() const -{ - UInt64 res = _processedSize + _pos - _streamPos; - if (_streamPos > _pos) - res += _bufferSize; - return res; -} - - -HRESULT COutBuffer::FlushPart() -{ - // _streamPos < _bufferSize - UInt32 size = (_streamPos >= _pos) ? (_bufferSize - _streamPos) : (_pos - _streamPos); - HRESULT result = S_OK; - #ifdef _NO_EXCEPTIONS - result = ErrorCode; - #endif - if (_buffer2 != 0) - { - memmove(_buffer2, _buffer + _streamPos, size); - _buffer2 += size; - } - - if (_stream != 0 - #ifdef _NO_EXCEPTIONS - && (ErrorCode == S_OK) - #endif - ) - { - UInt32 processedSize = 0; - result = _stream->Write(_buffer + _streamPos, size, &processedSize); - size = processedSize; - } - _streamPos += size; - if (_streamPos == _bufferSize) - _streamPos = 0; - if (_pos == _bufferSize) - { - _overDict = true; - _pos = 0; - } - _limitPos = (_streamPos > _pos) ? _streamPos : _bufferSize; - _processedSize += size; - return result; -} - -HRESULT COutBuffer::Flush() -{ - #ifdef _NO_EXCEPTIONS - if (ErrorCode != S_OK) - return ErrorCode; - #endif - - while(_streamPos != _pos) - { - HRESULT result = FlushPart(); - if (result != S_OK) - return result; - } - return S_OK; -} - -void COutBuffer::FlushWithCheck() -{ - HRESULT result = Flush(); - #ifdef _NO_EXCEPTIONS - ErrorCode = result; - #else - if (result != S_OK) - throw COutBufferException(result); - #endif -} diff --git a/desmume/src/windows/7z/CPP/7zip/Common/OutBuffer.h b/desmume/src/windows/7z/CPP/7zip/Common/OutBuffer.h deleted file mode 100644 index e2e76ad58..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/OutBuffer.h +++ /dev/null @@ -1,64 +0,0 @@ -// OutBuffer.h - -#ifndef __OUTBUFFER_H -#define __OUTBUFFER_H - -#include "../IStream.h" -#include "../../Common/MyCom.h" -#include "../../Common/MyException.h" - -#ifndef _NO_EXCEPTIONS -struct COutBufferException: public CSystemException -{ - COutBufferException(HRESULT errorCode): CSystemException(errorCode) {} -}; -#endif - -class COutBuffer -{ -protected: - Byte *_buffer; - UInt32 _pos; - UInt32 _limitPos; - UInt32 _streamPos; - UInt32 _bufferSize; - CMyComPtr _stream; - UInt64 _processedSize; - Byte *_buffer2; - bool _overDict; - - HRESULT FlushPart(); -public: - #ifdef _NO_EXCEPTIONS - HRESULT ErrorCode; - #endif - - COutBuffer(): _buffer(0), _pos(0), _stream(0), _buffer2(0) {} - ~COutBuffer() { Free(); } - - bool Create(UInt32 bufferSize); - void Free(); - - void SetMemStream(Byte *buffer) { _buffer2 = buffer; } - void SetStream(ISequentialOutStream *stream); - void Init(); - HRESULT Flush(); - void FlushWithCheck(); - void ReleaseStream() { _stream.Release(); } - - void WriteByte(Byte b) - { - _buffer[_pos++] = b; - if(_pos == _limitPos) - FlushWithCheck(); - } - void WriteBytes(const void *data, size_t size) - { - for (size_t i = 0; i < size; i++) - WriteByte(((const Byte *)data)[i]); - } - - UInt64 GetProcessedSize() const; -}; - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Common/OutMemStream.cpp b/desmume/src/windows/7z/CPP/7zip/Common/OutMemStream.cpp deleted file mode 100644 index f0208eaaf..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/OutMemStream.cpp +++ /dev/null @@ -1,142 +0,0 @@ -// OutMemStream.cpp - -#include "StdAfx.h" - -#include "OutMemStream.h" - -void COutMemStream::Free() -{ - Blocks.Free(_memManager); - Blocks.LockMode = true; -} - -void COutMemStream::Init() -{ - WriteToRealStreamEvent.Reset(); - _unlockEventWasSent = false; - _realStreamMode = false; - Free(); - _curBlockPos = 0; - _curBlockIndex = 0; -} - -void COutMemStream::DetachData(CMemLockBlocks &blocks) -{ - Blocks.Detach(blocks, _memManager); - Free(); -} - - -HRESULT COutMemStream::WriteToRealStream() -{ - RINOK(Blocks.WriteToStream(_memManager->GetBlockSize(), OutSeqStream)); - Blocks.Free(_memManager); - return S_OK; -} - -STDMETHODIMP COutMemStream::Write(const void *data, UInt32 size, UInt32 *processedSize) -{ - if (_realStreamMode) - return OutSeqStream->Write(data, size, processedSize); - if (processedSize != 0) - *processedSize = 0; - while(size != 0) - { - if ((int)_curBlockIndex < Blocks.Blocks.Size()) - { - Byte *p = (Byte *)Blocks.Blocks[(int)_curBlockIndex] + _curBlockPos; - size_t curSize = _memManager->GetBlockSize() - _curBlockPos; - if (size < curSize) - curSize = size; - memmove(p, data, curSize); - if (processedSize != 0) - *processedSize += (UInt32)curSize; - data = (const void *)((const Byte *)data + curSize); - size -= (UInt32)curSize; - _curBlockPos += curSize; - - UInt64 pos64 = GetPos(); - if (pos64 > Blocks.TotalSize) - Blocks.TotalSize = pos64; - if (_curBlockPos == _memManager->GetBlockSize()) - { - _curBlockIndex++; - _curBlockPos = 0; - } - continue; - } - HANDLE events[3] = { StopWritingEvent, WriteToRealStreamEvent, /* NoLockEvent, */ _memManager->Semaphore }; - DWORD waitResult = ::WaitForMultipleObjects((Blocks.LockMode ? 3 : 2), events, FALSE, INFINITE); - switch (waitResult) - { - case (WAIT_OBJECT_0 + 0): - return StopWriteResult; - case (WAIT_OBJECT_0 + 1): - { - _realStreamMode = true; - RINOK(WriteToRealStream()); - UInt32 processedSize2; - HRESULT res = OutSeqStream->Write(data, size, &processedSize2); - if (processedSize != 0) - *processedSize += processedSize2; - return res; - } - /* - case (WAIT_OBJECT_0 + 2): - { - // it has bug: no write. - if (!Blocks.SwitchToNoLockMode(_memManager)) - return E_FAIL; - break; - } - */ - case (WAIT_OBJECT_0 + 2): - break; - default: - return E_FAIL; - } - Blocks.Blocks.Add(_memManager->AllocateBlock()); - if (Blocks.Blocks.Back() == 0) - return E_FAIL; - } - return S_OK; -} - -STDMETHODIMP COutMemStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) -{ - if (_realStreamMode) - { - if (!OutStream) - return E_FAIL; - return OutStream->Seek(offset, seekOrigin, newPosition); - } - if (seekOrigin == STREAM_SEEK_CUR) - { - if (offset != 0) - return E_NOTIMPL; - } - else if (seekOrigin == STREAM_SEEK_SET) - { - if (offset != 0) - return E_NOTIMPL; - _curBlockIndex = 0; - _curBlockPos = 0; - } - else - return E_NOTIMPL; - if (newPosition != 0) - *newPosition = GetPos(); - return S_OK; -} - -STDMETHODIMP COutMemStream::SetSize(Int64 newSize) -{ - if (_realStreamMode) - { - if (!OutStream) - return E_FAIL; - return OutStream->SetSize(newSize); - } - Blocks.TotalSize = newSize; - return S_OK; -} diff --git a/desmume/src/windows/7z/CPP/7zip/Common/OutMemStream.h b/desmume/src/windows/7z/CPP/7zip/Common/OutMemStream.h deleted file mode 100644 index 9a8cac431..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/OutMemStream.h +++ /dev/null @@ -1,96 +0,0 @@ -// OutMemStream.h - -#ifndef __OUTMEMSTREAM_H -#define __OUTMEMSTREAM_H - -#include "Common/MyCom.h" -#include "MemBlocks.h" - -class COutMemStream: - public IOutStream, - public CMyUnknownImp -{ - CMemBlockManagerMt *_memManager; - size_t _curBlockIndex; - size_t _curBlockPos; - bool _realStreamMode; - - bool _unlockEventWasSent; - NWindows::NSynchronization::CAutoResetEvent StopWritingEvent; - NWindows::NSynchronization::CAutoResetEvent WriteToRealStreamEvent; - // NWindows::NSynchronization::CAutoResetEvent NoLockEvent; - - HRESULT StopWriteResult; - CMemLockBlocks Blocks; - - UInt64 GetPos() const { return (UInt64)_curBlockIndex * _memManager->GetBlockSize() + _curBlockPos; } - - CMyComPtr OutSeqStream; - CMyComPtr OutStream; - -public: - - HRes CreateEvents() - { - RINOK(StopWritingEvent.CreateIfNotCreated()); - return WriteToRealStreamEvent.CreateIfNotCreated(); - } - - void SetOutStream(IOutStream *outStream) - { - OutStream = outStream; - OutSeqStream = outStream; - } - - void SetSeqOutStream(ISequentialOutStream *outStream) - { - OutStream = NULL; - OutSeqStream = outStream; - } - - void ReleaseOutStream() - { - OutStream.Release(); - OutSeqStream.Release(); - } - - COutMemStream(CMemBlockManagerMt *memManager): _memManager(memManager) { } - - ~COutMemStream() { Free(); } - void Free(); - - void Init(); - HRESULT WriteToRealStream(); - - void DetachData(CMemLockBlocks &blocks); - - bool WasUnlockEventSent() const { return _unlockEventWasSent; } - - void SetRealStreamMode() - { - _unlockEventWasSent = true; - WriteToRealStreamEvent.Set(); - } - - /* - void SetNoLockMode() - { - _unlockEventWasSent = true; - NoLockEvent.Set(); - } - */ - - void StopWriting(HRESULT res) - { - StopWriteResult = res; - StopWritingEvent.Set(); - } - - MY_UNKNOWN_IMP - - STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); - STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); - STDMETHOD(SetSize)(Int64 newSize); -}; - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Common/ProgressMt.cpp b/desmume/src/windows/7z/CPP/7zip/Common/ProgressMt.cpp deleted file mode 100644 index e1e7f38e0..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/ProgressMt.cpp +++ /dev/null @@ -1,53 +0,0 @@ -// ProgressMt.h - -#include "StdAfx.h" - -#include "ProgressMt.h" - -void CMtCompressProgressMixer::Init(int numItems, ICompressProgressInfo *progress) -{ - NWindows::NSynchronization::CCriticalSectionLock lock(CriticalSection); - InSizes.Clear(); - OutSizes.Clear(); - for (int i = 0; i < numItems; i++) - { - InSizes.Add(0); - OutSizes.Add(0); - } - TotalInSize = 0; - TotalOutSize = 0; - _progress = progress; -} - -void CMtCompressProgressMixer::Reinit(int index) -{ - NWindows::NSynchronization::CCriticalSectionLock lock(CriticalSection); - InSizes[index] = 0; - OutSizes[index] = 0; -} - -HRESULT CMtCompressProgressMixer::SetRatioInfo(int index, const UInt64 *inSize, const UInt64 *outSize) -{ - NWindows::NSynchronization::CCriticalSectionLock lock(CriticalSection); - if (inSize != 0) - { - UInt64 diff = *inSize - InSizes[index]; - InSizes[index] = *inSize; - TotalInSize += diff; - } - if (outSize != 0) - { - UInt64 diff = *outSize - OutSizes[index]; - OutSizes[index] = *outSize; - TotalOutSize += diff; - } - if (_progress) - return _progress->SetRatioInfo(&TotalInSize, &TotalOutSize); - return S_OK; -} - - -STDMETHODIMP CMtCompressProgress::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize) -{ - return _progress->SetRatioInfo(_index, inSize, outSize); -} diff --git a/desmume/src/windows/7z/CPP/7zip/Common/ProgressMt.h b/desmume/src/windows/7z/CPP/7zip/Common/ProgressMt.h deleted file mode 100644 index 4eeb02aa0..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/ProgressMt.h +++ /dev/null @@ -1,46 +0,0 @@ -// ProgressMt.h - -#ifndef __PROGRESSMT_H -#define __PROGRESSMT_H - -#include "../../Common/MyCom.h" -#include "../../Common/MyVector.h" -#include "../../Windows/Synchronization.h" - -#include "../ICoder.h" -#include "../IProgress.h" - -class CMtCompressProgressMixer -{ - CMyComPtr _progress; - CRecordVector InSizes; - CRecordVector OutSizes; - UInt64 TotalInSize; - UInt64 TotalOutSize; -public: - NWindows::NSynchronization::CCriticalSection CriticalSection; - void Init(int numItems, ICompressProgressInfo *progress); - void Reinit(int index); - HRESULT SetRatioInfo(int index, const UInt64 *inSize, const UInt64 *outSize); -}; - -class CMtCompressProgress: - public ICompressProgressInfo, - public CMyUnknownImp -{ - CMtCompressProgressMixer *_progress; - int _index; -public: - void Init(CMtCompressProgressMixer *progress, int index) - { - _progress = progress; - _index = index; - } - void Reinit() { _progress->Reinit(_index); } - - MY_UNKNOWN_IMP - - STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize); -}; - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Common/ProgressUtils.cpp b/desmume/src/windows/7z/CPP/7zip/Common/ProgressUtils.cpp deleted file mode 100644 index 84a3eaf65..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/ProgressUtils.cpp +++ /dev/null @@ -1,42 +0,0 @@ -// ProgressUtils.h - -#include "StdAfx.h" - -#include "ProgressUtils.h" - -CLocalProgress::CLocalProgress() -{ - ProgressOffset = InSize = OutSize = 0; - SendRatio = SendProgress = true; -} - -void CLocalProgress::Init(IProgress *progress, bool inSizeIsMain) -{ - _ratioProgress.Release(); - _progress = progress; - _progress.QueryInterface(IID_ICompressProgressInfo, &_ratioProgress); - _inSizeIsMain = inSizeIsMain; -} - -STDMETHODIMP CLocalProgress::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize) -{ - UInt64 inSizeNew = InSize, outSizeNew = OutSize; - if (inSize) - inSizeNew += (*inSize); - if (outSize) - outSizeNew += (*outSize); - if (SendRatio && _ratioProgress) - { - RINOK(_ratioProgress->SetRatioInfo(&inSizeNew, &outSizeNew)); - } - inSizeNew += ProgressOffset; - outSizeNew += ProgressOffset; - if (SendProgress) - return _progress->SetCompleted(_inSizeIsMain ? &inSizeNew : &outSizeNew); - return S_OK; -} - -HRESULT CLocalProgress::SetCur() -{ - return SetRatioInfo(NULL, NULL); -} diff --git a/desmume/src/windows/7z/CPP/7zip/Common/ProgressUtils.h b/desmume/src/windows/7z/CPP/7zip/Common/ProgressUtils.h deleted file mode 100644 index c6204844a..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/ProgressUtils.h +++ /dev/null @@ -1,34 +0,0 @@ -// ProgressUtils.h - -#ifndef __PROGRESSUTILS_H -#define __PROGRESSUTILS_H - -#include "../../Common/MyCom.h" - -#include "../ICoder.h" -#include "../IProgress.h" - -class CLocalProgress: - public ICompressProgressInfo, - public CMyUnknownImp -{ - CMyComPtr _progress; - CMyComPtr _ratioProgress; - bool _inSizeIsMain; -public: - UInt64 ProgressOffset; - UInt64 InSize; - UInt64 OutSize; - bool SendRatio; - bool SendProgress; - - CLocalProgress(); - void Init(IProgress *progress, bool inSizeIsMain); - HRESULT SetCur(); - - MY_UNKNOWN_IMP - - STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize); -}; - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Common/RegisterArc.h b/desmume/src/windows/7z/CPP/7zip/Common/RegisterArc.h deleted file mode 100644 index e377c4095..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/RegisterArc.h +++ /dev/null @@ -1,33 +0,0 @@ -// RegisterArc.h - -#ifndef __REGISTERARC_H -#define __REGISTERARC_H - -#include "../Archive/IArchive.h" -#include "DeclareArcs.h" - -typedef IInArchive * (*CreateInArchiveP)(); -typedef IOutArchive * (*CreateOutArchiveP)(); - -struct CArcInfo -{ - const wchar_t *Name; - const wchar_t *Ext; - const wchar_t *AddExt; - Byte ClassId; - Byte Signature[16]; - int SignatureSize; - bool KeepName; - CreateInArchiveP CreateInArchive; - CreateOutArchiveP CreateOutArchive; -}; - -void RegisterArc(const CArcInfo *arcInfo); - -#define REGISTER_ARC(x) CRegister##x::CRegister##x() { RegisterArc(&g_ArcInfo); } \ - CRegister##x g_RegisterArc##x; - -#define REGISTER_ARCN(x,n) CRegister##x##n::CRegister##x##n() { RegisterArc(&g_ArcInfo##n); } \ - CRegister##x##n g_RegisterArc##n##x; - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Common/RegisterCodec.h b/desmume/src/windows/7z/CPP/7zip/Common/RegisterCodec.h deleted file mode 100644 index f51e6317e..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/RegisterCodec.h +++ /dev/null @@ -1,30 +0,0 @@ -// RegisterCodec.h - -#ifndef __REGISTERCODEC_H -#define __REGISTERCODEC_H - -#include "../Common/MethodId.h" -#include "DeclareCodecs.h" - -typedef void * (*CreateCodecP)(); -struct CCodecInfo -{ - CreateCodecP CreateDecoder; - CreateCodecP CreateEncoder; - CMethodId Id; - const wchar_t *Name; - UInt32 NumInStreams; - bool IsFilter; -}; - -void RegisterCodec(const CCodecInfo *codecInfo); - -#define REGISTER_CODEC(x) CRegisterCodec##x::CRegisterCodec##x() { RegisterCodec(&g_CodecInfo); } \ - CRegisterCodec##x g_RegisterCodec##x; - -#define REGISTER_CODECS(x) CRegisterCodecs##x::CRegisterCodecs##x() { \ - for(int i=0;iCloseRead(); } - void SetBinder(CStreamBinder *streamBinder) { m_StreamBinder = streamBinder; } -}; - -STDMETHODIMP CSequentialInStreamForBinder::Read(void *data, UInt32 size, UInt32 *processedSize) - { return m_StreamBinder->Read(data, size, processedSize); } - -class CSequentialOutStreamForBinder: - public ISequentialOutStream, - public CMyUnknownImp -{ -public: - MY_UNKNOWN_IMP - - STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); - -private: - CStreamBinder *m_StreamBinder; -public: - ~CSequentialOutStreamForBinder() { m_StreamBinder->CloseWrite(); } - void SetBinder(CStreamBinder *streamBinder) { m_StreamBinder = streamBinder; } -}; - -STDMETHODIMP CSequentialOutStreamForBinder::Write(const void *data, UInt32 size, UInt32 *processedSize) - { return m_StreamBinder->Write(data, size, processedSize); } - - -////////////////////////// -// CStreamBinder -// (_thereAreBytesToReadEvent && _bufferSize == 0) means that stream is finished. - -HRes CStreamBinder::CreateEvents() -{ - RINOK(_allBytesAreWritenEvent.Create(true)); - RINOK(_thereAreBytesToReadEvent.Create()); - return _readStreamIsClosedEvent.Create(); -} - -void CStreamBinder::ReInit() -{ - _thereAreBytesToReadEvent.Reset(); - _readStreamIsClosedEvent.Reset(); - ProcessedSize = 0; -} - - - -void CStreamBinder::CreateStreams(ISequentialInStream **inStream, - ISequentialOutStream **outStream) -{ - CSequentialInStreamForBinder *inStreamSpec = new - CSequentialInStreamForBinder; - CMyComPtr inStreamLoc(inStreamSpec); - inStreamSpec->SetBinder(this); - *inStream = inStreamLoc.Detach(); - - CSequentialOutStreamForBinder *outStreamSpec = new - CSequentialOutStreamForBinder; - CMyComPtr outStreamLoc(outStreamSpec); - outStreamSpec->SetBinder(this); - *outStream = outStreamLoc.Detach(); - - _buffer = NULL; - _bufferSize= 0; - ProcessedSize = 0; -} - -HRESULT CStreamBinder::Read(void *data, UInt32 size, UInt32 *processedSize) -{ - UInt32 sizeToRead = size; - if (size > 0) - { - RINOK(_thereAreBytesToReadEvent.Lock()); - sizeToRead = MyMin(_bufferSize, size); - if (_bufferSize > 0) - { - memcpy(data, _buffer, sizeToRead); - _buffer = ((const Byte *)_buffer) + sizeToRead; - _bufferSize -= sizeToRead; - if (_bufferSize == 0) - { - _thereAreBytesToReadEvent.Reset(); - _allBytesAreWritenEvent.Set(); - } - } - } - if (processedSize != NULL) - *processedSize = sizeToRead; - ProcessedSize += sizeToRead; - return S_OK; -} - -void CStreamBinder::CloseRead() -{ - _readStreamIsClosedEvent.Set(); -} - -HRESULT CStreamBinder::Write(const void *data, UInt32 size, UInt32 *processedSize) -{ - if (size > 0) - { - _buffer = data; - _bufferSize = size; - _allBytesAreWritenEvent.Reset(); - _thereAreBytesToReadEvent.Set(); - - HANDLE events[2]; - events[0] = _allBytesAreWritenEvent; - events[1] = _readStreamIsClosedEvent; - DWORD waitResult = ::WaitForMultipleObjects(2, events, FALSE, INFINITE); - if (waitResult != WAIT_OBJECT_0 + 0) - { - // ReadingWasClosed = true; - return S_FALSE; - } - // if(!_allBytesAreWritenEvent.Lock()) - // return E_FAIL; - } - if (processedSize != NULL) - *processedSize = size; - return S_OK; -} - -void CStreamBinder::CloseWrite() -{ - // _bufferSize must be = 0 - _thereAreBytesToReadEvent.Set(); -} diff --git a/desmume/src/windows/7z/CPP/7zip/Common/StreamBinder.h b/desmume/src/windows/7z/CPP/7zip/Common/StreamBinder.h deleted file mode 100644 index b5d6c0d1c..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/StreamBinder.h +++ /dev/null @@ -1,32 +0,0 @@ -// StreamBinder.h - -#ifndef __STREAMBINDER_H -#define __STREAMBINDER_H - -#include "../IStream.h" -#include "../../Windows/Synchronization.h" - -class CStreamBinder -{ - NWindows::NSynchronization::CManualResetEvent _allBytesAreWritenEvent; - NWindows::NSynchronization::CManualResetEvent _thereAreBytesToReadEvent; - NWindows::NSynchronization::CManualResetEvent _readStreamIsClosedEvent; - UInt32 _bufferSize; - const void *_buffer; -public: - // bool ReadingWasClosed; - UInt64 ProcessedSize; - CStreamBinder() {} - HRes CreateEvents(); - - void CreateStreams(ISequentialInStream **inStream, - ISequentialOutStream **outStream); - HRESULT Read(void *data, UInt32 size, UInt32 *processedSize); - void CloseRead(); - - HRESULT Write(const void *data, UInt32 size, UInt32 *processedSize); - void CloseWrite(); - void ReInit(); -}; - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Common/StreamObjects.cpp b/desmume/src/windows/7z/CPP/7zip/Common/StreamObjects.cpp deleted file mode 100644 index f42b56bfa..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/StreamObjects.cpp +++ /dev/null @@ -1,68 +0,0 @@ -// StreamObjects.cpp - -#include "StdAfx.h" - -#include "StreamObjects.h" -#include "../../Common/Defs.h" - - -STDMETHODIMP CSequentialInStreamImp::Read(void *data, UInt32 size, UInt32 *processedSize) -{ - size_t rem = _size - _pos; - if (size < rem) - rem = (size_t)size; - memcpy(data, _dataPointer + _pos, rem); - _pos += rem; - if (processedSize != NULL) - *processedSize = (UInt32)rem; - return S_OK; -} - - -void CWriteBuffer::Write(const void *data, size_t size) -{ - size_t newCapacity = _size + size; - _buffer.EnsureCapacity(newCapacity); - memcpy(_buffer + _size, data, size); - _size += size; -} - -STDMETHODIMP CSequentialOutStreamImp::Write(const void *data, UInt32 size, UInt32 *processedSize) -{ - _writeBuffer.Write(data, (size_t)size); - if(processedSize != NULL) - *processedSize = size; - return S_OK; -} - -STDMETHODIMP CSequentialOutStreamImp2::Write(const void *data, UInt32 size, UInt32 *processedSize) -{ - size_t rem = _size - _pos; - if (size < rem) - rem = (size_t)size; - memcpy(_buffer + _pos, data, rem); - _pos += rem; - if (processedSize != NULL) - *processedSize = (UInt32)rem; - return (rem == size ? S_OK : E_FAIL); -} - -STDMETHODIMP CSequentialInStreamSizeCount::Read(void *data, UInt32 size, UInt32 *processedSize) -{ - UInt32 realProcessedSize; - HRESULT result = _stream->Read(data, size, &realProcessedSize); - _size += realProcessedSize; - if (processedSize != 0) - *processedSize = realProcessedSize; - return result; -} - -STDMETHODIMP CSequentialOutStreamSizeCount::Write(const void *data, UInt32 size, UInt32 *processedSize) -{ - UInt32 realProcessedSize; - HRESULT result = _stream->Write(data, size, &realProcessedSize); - _size += realProcessedSize; - if (processedSize != 0) - *processedSize = realProcessedSize; - return result; -} diff --git a/desmume/src/windows/7z/CPP/7zip/Common/StreamObjects.h b/desmume/src/windows/7z/CPP/7zip/Common/StreamObjects.h deleted file mode 100644 index 7f19fd479..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/StreamObjects.h +++ /dev/null @@ -1,117 +0,0 @@ -// StreamObjects.h - -#ifndef __STREAMOBJECTS_H -#define __STREAMOBJECTS_H - -#include "../../Common/DynamicBuffer.h" -#include "../../Common/MyCom.h" -#include "../IStream.h" - -class CSequentialInStreamImp: - public ISequentialInStream, - public CMyUnknownImp -{ - const Byte *_dataPointer; - size_t _size; - size_t _pos; - -public: - void Init(const Byte *dataPointer, size_t size) - { - _dataPointer = dataPointer; - _size = size; - _pos = 0; - } - - MY_UNKNOWN_IMP - - STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); -}; - - -class CWriteBuffer -{ - CByteDynamicBuffer _buffer; - size_t _size; -public: - CWriteBuffer(): _size(0) {} - void Init() { _size = 0; } - void Write(const void *data, size_t size); - size_t GetSize() const { return _size; } - const CByteDynamicBuffer& GetBuffer() const { return _buffer; } -}; - -class CSequentialOutStreamImp: - public ISequentialOutStream, - public CMyUnknownImp -{ - CWriteBuffer _writeBuffer; -public: - void Init() { _writeBuffer.Init(); } - size_t GetSize() const { return _writeBuffer.GetSize(); } - const CByteDynamicBuffer& GetBuffer() const { return _writeBuffer.GetBuffer(); } - - MY_UNKNOWN_IMP - - STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); -}; - -class CSequentialOutStreamImp2: - public ISequentialOutStream, - public CMyUnknownImp -{ - Byte *_buffer; - size_t _size; - size_t _pos; -public: - - void Init(Byte *buffer, size_t size) - { - _buffer = buffer; - _pos = 0; - _size = size; - } - - size_t GetPos() const { return _pos; } - - MY_UNKNOWN_IMP - - STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); -}; - -class CSequentialInStreamSizeCount: - public ISequentialInStream, - public CMyUnknownImp -{ - CMyComPtr _stream; - UInt64 _size; -public: - void Init(ISequentialInStream *stream) - { - _stream = stream; - _size = 0; - } - UInt64 GetSize() const { return _size; } - - MY_UNKNOWN_IMP - - STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); -}; - -class CSequentialOutStreamSizeCount: - public ISequentialOutStream, - public CMyUnknownImp -{ - CMyComPtr _stream; - UInt64 _size; -public: - void SetStream(ISequentialOutStream *stream) { _stream = stream; } - void Init() { _size = 0; } - UInt64 GetSize() const { return _size; } - - MY_UNKNOWN_IMP - - STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); -}; - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Common/StreamUtils.cpp b/desmume/src/windows/7z/CPP/7zip/Common/StreamUtils.cpp deleted file mode 100644 index 57ff4ee38..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/StreamUtils.cpp +++ /dev/null @@ -1,56 +0,0 @@ -// StreamUtils.cpp - -#include "StdAfx.h" - -#include "StreamUtils.h" - -static const UInt32 kBlockSize = ((UInt32)1 << 31); - -HRESULT ReadStream(ISequentialInStream *stream, void *data, size_t *processedSize) -{ - size_t size = *processedSize; - *processedSize = 0; - while (size != 0) - { - UInt32 curSize = (size < kBlockSize) ? (UInt32)size : kBlockSize; - UInt32 processedSizeLoc; - HRESULT res = stream->Read(data, curSize, &processedSizeLoc); - *processedSize += processedSizeLoc; - data = (void *)((Byte *)data + processedSizeLoc); - size -= processedSizeLoc; - RINOK(res); - if (processedSizeLoc == 0) - return S_OK; - } - return S_OK; -} - -HRESULT ReadStream_FALSE(ISequentialInStream *stream, void *data, size_t size) -{ - size_t processedSize = size; - RINOK(ReadStream(stream, data, &processedSize)); - return (size == processedSize) ? S_OK : S_FALSE; -} - -HRESULT ReadStream_FAIL(ISequentialInStream *stream, void *data, size_t size) -{ - size_t processedSize = size; - RINOK(ReadStream(stream, data, &processedSize)); - return (size == processedSize) ? S_OK : E_FAIL; -} - -HRESULT WriteStream(ISequentialOutStream *stream, const void *data, size_t size) -{ - while (size != 0) - { - UInt32 curSize = (size < kBlockSize) ? (UInt32)size : kBlockSize; - UInt32 processedSizeLoc; - HRESULT res = stream->Write(data, curSize, &processedSizeLoc); - data = (const void *)((const Byte *)data + processedSizeLoc); - size -= processedSizeLoc; - RINOK(res); - if (processedSizeLoc == 0) - return E_FAIL; - } - return S_OK; -} diff --git a/desmume/src/windows/7z/CPP/7zip/Common/StreamUtils.h b/desmume/src/windows/7z/CPP/7zip/Common/StreamUtils.h deleted file mode 100644 index 30535ab1b..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/StreamUtils.h +++ /dev/null @@ -1,13 +0,0 @@ -// StreamUtils.h - -#ifndef __STREAMUTILS_H -#define __STREAMUTILS_H - -#include "../IStream.h" - -HRESULT ReadStream(ISequentialInStream *stream, void *data, size_t *size); -HRESULT ReadStream_FALSE(ISequentialInStream *stream, void *data, size_t size); -HRESULT ReadStream_FAIL(ISequentialInStream *stream, void *data, size_t size); -HRESULT WriteStream(ISequentialOutStream *stream, const void *data, size_t size); - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Common/VirtThread.cpp b/desmume/src/windows/7z/CPP/7zip/Common/VirtThread.cpp deleted file mode 100644 index 75dc24c35..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/VirtThread.cpp +++ /dev/null @@ -1,45 +0,0 @@ -// VirtThread.cpp - -#include "StdAfx.h" - -#include "VirtThread.h" - -static THREAD_FUNC_DECL CoderThread(void *p) -{ - for (;;) - { - CVirtThread *t = (CVirtThread *)p; - t->StartEvent.Lock(); - if (t->ExitEvent) - return 0; - t->Execute(); - t->FinishedEvent.Set(); - } -} - -WRes CVirtThread::Create() -{ - RINOK(StartEvent.CreateIfNotCreated()); - RINOK(FinishedEvent.CreateIfNotCreated()); - StartEvent.Reset(); - FinishedEvent.Reset(); - ExitEvent = false; - if (Thread.IsCreated()) - return S_OK; - return Thread.Create(CoderThread, this); -} - -void CVirtThread::Start() -{ - ExitEvent = false; - StartEvent.Set(); -} - -CVirtThread::~CVirtThread() -{ - ExitEvent = true; - if (StartEvent.IsCreated()) - StartEvent.Set(); - Thread.Wait(); -} - diff --git a/desmume/src/windows/7z/CPP/7zip/Common/VirtThread.h b/desmume/src/windows/7z/CPP/7zip/Common/VirtThread.h deleted file mode 100644 index bfc10dc4a..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Common/VirtThread.h +++ /dev/null @@ -1,23 +0,0 @@ -// VirtThread.h - -#ifndef __VIRTTHREAD_H -#define __VIRTTHREAD_H - -#include "../../Windows/Synchronization.h" -#include "../../Windows/Thread.h" - -struct CVirtThread -{ - NWindows::NSynchronization::CAutoResetEvent StartEvent; - NWindows::NSynchronization::CAutoResetEvent FinishedEvent; - NWindows::CThread Thread; - bool ExitEvent; - - ~CVirtThread(); - WRes Create(); - void Start(); - void WaitFinish() { FinishedEvent.Lock(); } - virtual void Execute() = 0; -}; - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/BZip2Const.h b/desmume/src/windows/7z/CPP/7zip/Compress/BZip2Const.h deleted file mode 100644 index fe0c53ff2..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/BZip2Const.h +++ /dev/null @@ -1,54 +0,0 @@ -// Compress/BZip2Const.h - -#ifndef __COMPRESS_BZIP2_CONST_H -#define __COMPRESS_BZIP2_CONST_H - -namespace NCompress { -namespace NBZip2 { - -const Byte kArSig0 = 'B'; -const Byte kArSig1 = 'Z'; -const Byte kArSig2 = 'h'; -const Byte kArSig3 = '0'; - -const Byte kFinSig0 = 0x17; -const Byte kFinSig1 = 0x72; -const Byte kFinSig2 = 0x45; -const Byte kFinSig3 = 0x38; -const Byte kFinSig4 = 0x50; -const Byte kFinSig5 = 0x90; - -const Byte kBlockSig0 = 0x31; -const Byte kBlockSig1 = 0x41; -const Byte kBlockSig2 = 0x59; -const Byte kBlockSig3 = 0x26; -const Byte kBlockSig4 = 0x53; -const Byte kBlockSig5 = 0x59; - -const int kNumOrigBits = 24; - -const int kNumTablesBits = 3; -const int kNumTablesMin = 2; -const int kNumTablesMax = 6; - -const int kNumLevelsBits = 5; - -const int kMaxHuffmanLen = 20; // Check it - -const int kMaxAlphaSize = 258; - -const int kGroupSize = 50; - -const int kBlockSizeMultMin = 1; -const int kBlockSizeMultMax = 9; -const UInt32 kBlockSizeStep = 100000; -const UInt32 kBlockSizeMax = kBlockSizeMultMax * kBlockSizeStep; - -const int kNumSelectorsBits = 15; -const UInt32 kNumSelectorsMax = (2 + (kBlockSizeMax / kGroupSize)); - -const int kRleModeRepSize = 4; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/BZip2Crc.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/BZip2Crc.cpp deleted file mode 100644 index 2a8277ca4..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/BZip2Crc.cpp +++ /dev/null @@ -1,26 +0,0 @@ -// BZip2Crc.cpp - -#include "StdAfx.h" - -#include "BZip2Crc.h" - -UInt32 CBZip2Crc::Table[256]; - -static const UInt32 kBZip2CrcPoly = 0x04c11db7; /* AUTODIN II, Ethernet, & FDDI */ - -void CBZip2Crc::InitTable() -{ - for (UInt32 i = 0; i < 256; i++) - { - UInt32 r = (i << 24); - for (int j = 8; j > 0; j--) - r = (r & 0x80000000) ? ((r << 1) ^ kBZip2CrcPoly) : (r << 1); - Table[i] = r; - } -} - -class CBZip2CrcTableInit -{ -public: - CBZip2CrcTableInit() { CBZip2Crc::InitTable(); } -} g_BZip2CrcTableInit; diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/BZip2Crc.h b/desmume/src/windows/7z/CPP/7zip/Compress/BZip2Crc.h deleted file mode 100644 index ad1322fdd..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/BZip2Crc.h +++ /dev/null @@ -1,31 +0,0 @@ -// BZip2Crc.h - -#ifndef __BZIP2_CRC_H -#define __BZIP2_CRC_H - -#include "Common/Types.h" - -class CBZip2Crc -{ - UInt32 _value; - static UInt32 Table[256]; -public: - static void InitTable(); - CBZip2Crc(): _value(0xFFFFFFFF) {}; - void Init() { _value = 0xFFFFFFFF; } - void UpdateByte(Byte b) { _value = Table[(_value >> 24) ^ b] ^ (_value << 8); } - void UpdateByte(unsigned int b) { _value = Table[(_value >> 24) ^ b] ^ (_value << 8); } - UInt32 GetDigest() const { return _value ^ 0xFFFFFFFF; } -}; - -class CBZip2CombinedCrc -{ - UInt32 _value; -public: - CBZip2CombinedCrc(): _value(0){}; - void Init() { _value = 0; } - void Update(UInt32 v) { _value = ((_value << 1) | (_value >> 31)) ^ v; } - UInt32 GetDigest() const { return _value ; } -}; - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/BZip2Decoder.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/BZip2Decoder.cpp deleted file mode 100644 index b291be6f1..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/BZip2Decoder.cpp +++ /dev/null @@ -1,791 +0,0 @@ -// BZip2Decoder.cpp - -#include "StdAfx.h" - -extern "C" -{ -#include "../../../C/Alloc.h" -} - -#include "../../Common/Defs.h" - -#include "BZip2Crc.h" -#include "BZip2Decoder.h" -#include "Mtf8.h" - -namespace NCompress { -namespace NBZip2 { - -#define NO_INLINE MY_FAST_CALL - -const UInt32 kNumThreadsMax = 4; - -static const UInt32 kBufferSize = (1 << 17); - -static Int16 kRandNums[512] = { - 619, 720, 127, 481, 931, 816, 813, 233, 566, 247, - 985, 724, 205, 454, 863, 491, 741, 242, 949, 214, - 733, 859, 335, 708, 621, 574, 73, 654, 730, 472, - 419, 436, 278, 496, 867, 210, 399, 680, 480, 51, - 878, 465, 811, 169, 869, 675, 611, 697, 867, 561, - 862, 687, 507, 283, 482, 129, 807, 591, 733, 623, - 150, 238, 59, 379, 684, 877, 625, 169, 643, 105, - 170, 607, 520, 932, 727, 476, 693, 425, 174, 647, - 73, 122, 335, 530, 442, 853, 695, 249, 445, 515, - 909, 545, 703, 919, 874, 474, 882, 500, 594, 612, - 641, 801, 220, 162, 819, 984, 589, 513, 495, 799, - 161, 604, 958, 533, 221, 400, 386, 867, 600, 782, - 382, 596, 414, 171, 516, 375, 682, 485, 911, 276, - 98, 553, 163, 354, 666, 933, 424, 341, 533, 870, - 227, 730, 475, 186, 263, 647, 537, 686, 600, 224, - 469, 68, 770, 919, 190, 373, 294, 822, 808, 206, - 184, 943, 795, 384, 383, 461, 404, 758, 839, 887, - 715, 67, 618, 276, 204, 918, 873, 777, 604, 560, - 951, 160, 578, 722, 79, 804, 96, 409, 713, 940, - 652, 934, 970, 447, 318, 353, 859, 672, 112, 785, - 645, 863, 803, 350, 139, 93, 354, 99, 820, 908, - 609, 772, 154, 274, 580, 184, 79, 626, 630, 742, - 653, 282, 762, 623, 680, 81, 927, 626, 789, 125, - 411, 521, 938, 300, 821, 78, 343, 175, 128, 250, - 170, 774, 972, 275, 999, 639, 495, 78, 352, 126, - 857, 956, 358, 619, 580, 124, 737, 594, 701, 612, - 669, 112, 134, 694, 363, 992, 809, 743, 168, 974, - 944, 375, 748, 52, 600, 747, 642, 182, 862, 81, - 344, 805, 988, 739, 511, 655, 814, 334, 249, 515, - 897, 955, 664, 981, 649, 113, 974, 459, 893, 228, - 433, 837, 553, 268, 926, 240, 102, 654, 459, 51, - 686, 754, 806, 760, 493, 403, 415, 394, 687, 700, - 946, 670, 656, 610, 738, 392, 760, 799, 887, 653, - 978, 321, 576, 617, 626, 502, 894, 679, 243, 440, - 680, 879, 194, 572, 640, 724, 926, 56, 204, 700, - 707, 151, 457, 449, 797, 195, 791, 558, 945, 679, - 297, 59, 87, 824, 713, 663, 412, 693, 342, 606, - 134, 108, 571, 364, 631, 212, 174, 643, 304, 329, - 343, 97, 430, 751, 497, 314, 983, 374, 822, 928, - 140, 206, 73, 263, 980, 736, 876, 478, 430, 305, - 170, 514, 364, 692, 829, 82, 855, 953, 676, 246, - 369, 970, 294, 750, 807, 827, 150, 790, 288, 923, - 804, 378, 215, 828, 592, 281, 565, 555, 710, 82, - 896, 831, 547, 261, 524, 462, 293, 465, 502, 56, - 661, 821, 976, 991, 658, 869, 905, 758, 745, 193, - 768, 550, 608, 933, 378, 286, 215, 979, 792, 961, - 61, 688, 793, 644, 986, 403, 106, 366, 905, 644, - 372, 567, 466, 434, 645, 210, 389, 550, 919, 135, - 780, 773, 635, 389, 707, 100, 626, 958, 165, 504, - 920, 176, 193, 713, 857, 265, 203, 50, 668, 108, - 645, 990, 626, 197, 510, 357, 358, 850, 858, 364, - 936, 638 -}; - -bool CState::Alloc() -{ - if (Counters == 0) - Counters = (UInt32 *)BigAlloc((256 + kBlockSizeMax) * sizeof(UInt32)); - return (Counters != 0); -} - -void CState::Free() -{ - ::BigFree(Counters); - Counters = 0; -} - -UInt32 CDecoder::ReadBits(int numBits) { return m_InStream.ReadBits(numBits); } -Byte CDecoder::ReadByte() {return (Byte)ReadBits(8); } -bool CDecoder::ReadBit() { return ReadBits(1) != 0; } - -UInt32 CDecoder::ReadCrc() -{ - UInt32 crc = 0; - for (int i = 0; i < 4; i++) - { - crc <<= 8; - crc |= ReadByte(); - } - return crc; -} - -UInt32 NO_INLINE ReadBits(NBitm::CDecoder *m_InStream, int num) -{ - return m_InStream->ReadBits(num); -} - -UInt32 NO_INLINE ReadBit(NBitm::CDecoder *m_InStream) -{ - return m_InStream->ReadBits(1); -} - -static HRESULT NO_INLINE ReadBlock(NBitm::CDecoder *m_InStream, - UInt32 *CharCounters, UInt32 blockSizeMax, Byte *m_Selectors, CHuffmanDecoder *m_HuffmanDecoders, - UInt32 *blockSizeRes, UInt32 *origPtrRes, bool *randRes) -{ - *randRes = ReadBit(m_InStream) ? true : false; - *origPtrRes = ReadBits(m_InStream, kNumOrigBits); - - // in original code it compares OrigPtr to (UInt32)(10 + blockSizeMax)) : why ? - if (*origPtrRes >= blockSizeMax) - return S_FALSE; - - CMtf8Decoder mtf; - mtf.StartInit(); - - int numInUse = 0; - { - Byte inUse16[16]; - int i; - for (i = 0; i < 16; i++) - inUse16[i] = (Byte)ReadBit(m_InStream); - for (i = 0; i < 256; i++) - if (inUse16[i >> 4]) - { - if (ReadBit(m_InStream)) - mtf.Add(numInUse++, (Byte)i); - } - if (numInUse == 0) - return S_FALSE; - // mtf.Init(numInUse); - } - int alphaSize = numInUse + 2; - - int numTables = ReadBits(m_InStream, kNumTablesBits); - if (numTables < kNumTablesMin || numTables > kNumTablesMax) - return S_FALSE; - - UInt32 numSelectors = ReadBits(m_InStream, kNumSelectorsBits); - if (numSelectors < 1 || numSelectors > kNumSelectorsMax) - return S_FALSE; - - { - Byte mtfPos[kNumTablesMax]; - int t = 0; - do - mtfPos[t] = (Byte)t; - while(++t < numTables); - UInt32 i = 0; - do - { - int j = 0; - while (ReadBit(m_InStream)) - if (++j >= numTables) - return S_FALSE; - Byte tmp = mtfPos[j]; - for (;j > 0; j--) - mtfPos[j] = mtfPos[j - 1]; - m_Selectors[i] = mtfPos[0] = tmp; - } - while(++i < numSelectors); - } - - int t = 0; - do - { - Byte lens[kMaxAlphaSize]; - int len = (int)ReadBits(m_InStream, kNumLevelsBits); - int i; - for (i = 0; i < alphaSize; i++) - { - for (;;) - { - if (len < 1 || len > kMaxHuffmanLen) - return S_FALSE; - if (!ReadBit(m_InStream)) - break; - len += 1 - (int)(ReadBit(m_InStream) << 1); - } - lens[i] = (Byte)len; - } - for (; i < kMaxAlphaSize; i++) - lens[i] = 0; - if(!m_HuffmanDecoders[t].SetCodeLengths(lens)) - return S_FALSE; - } - while(++t < numTables); - - { - for (int i = 0; i < 256; i++) - CharCounters[i] = 0; - } - - UInt32 blockSize = 0; - { - UInt32 groupIndex = 0; - UInt32 groupSize = 0; - CHuffmanDecoder *huffmanDecoder = 0; - int runPower = 0; - UInt32 runCounter = 0; - - for (;;) - { - if (groupSize == 0) - { - if (groupIndex >= numSelectors) - return S_FALSE; - groupSize = kGroupSize; - huffmanDecoder = &m_HuffmanDecoders[m_Selectors[groupIndex++]]; - } - groupSize--; - - UInt32 nextSym = huffmanDecoder->DecodeSymbol(m_InStream); - - if (nextSym < 2) - { - runCounter += ((UInt32)(nextSym + 1) << runPower++); - if (blockSizeMax - blockSize < runCounter) - return S_FALSE; - continue; - } - if (runCounter != 0) - { - UInt32 b = (UInt32)mtf.GetHead(); - CharCounters[b] += runCounter; - do - CharCounters[256 + blockSize++] = b; - while(--runCounter != 0); - runPower = 0; - } - if (nextSym <= (UInt32)numInUse) - { - UInt32 b = (UInt32)mtf.GetAndMove((int)nextSym - 1); - if (blockSize >= blockSizeMax) - return S_FALSE; - CharCounters[b]++; - CharCounters[256 + blockSize++] = b; - } - else if (nextSym == (UInt32)numInUse + 1) - break; - else - return S_FALSE; - } - } - *blockSizeRes = blockSize; - return (*origPtrRes < blockSize) ? S_OK : S_FALSE; -} - -void NO_INLINE DecodeBlock1(UInt32 *charCounters, UInt32 blockSize) -{ - { - UInt32 sum = 0; - for (UInt32 i = 0; i < 256; i++) - { - sum += charCounters[i]; - charCounters[i] = sum - charCounters[i]; - } - } - - UInt32 *tt = charCounters + 256; - // Compute the T^(-1) vector - UInt32 i = 0; - do - tt[charCounters[tt[i] & 0xFF]++] |= (i << 8); - while(++i < blockSize); -} - -static UInt32 NO_INLINE DecodeBlock2(const UInt32 *tt, UInt32 blockSize, UInt32 OrigPtr, COutBuffer &m_OutStream) -{ - CBZip2Crc crc; - - // it's for speed optimization: prefetch & prevByte_init; - UInt32 tPos = tt[tt[OrigPtr] >> 8]; - unsigned int prevByte = (unsigned int)(tPos & 0xFF); - - int numReps = 0; - - do - { - unsigned int b = (unsigned int)(tPos & 0xFF); - tPos = tt[tPos >> 8]; - - if (numReps == kRleModeRepSize) - { - for (; b > 0; b--) - { - crc.UpdateByte(prevByte); - m_OutStream.WriteByte((Byte)prevByte); - } - numReps = 0; - continue; - } - if (b != prevByte) - numReps = 0; - numReps++; - prevByte = b; - crc.UpdateByte(b); - m_OutStream.WriteByte((Byte)b); - - /* - prevByte = b; - crc.UpdateByte(b); - m_OutStream.WriteByte((Byte)b); - for (; --blockSize != 0;) - { - b = (unsigned int)(tPos & 0xFF); - tPos = tt[tPos >> 8]; - crc.UpdateByte(b); - m_OutStream.WriteByte((Byte)b); - if (b != prevByte) - { - prevByte = b; - continue; - } - if (--blockSize == 0) - break; - - b = (unsigned int)(tPos & 0xFF); - tPos = tt[tPos >> 8]; - crc.UpdateByte(b); - m_OutStream.WriteByte((Byte)b); - if (b != prevByte) - { - prevByte = b; - continue; - } - if (--blockSize == 0) - break; - - b = (unsigned int)(tPos & 0xFF); - tPos = tt[tPos >> 8]; - crc.UpdateByte(b); - m_OutStream.WriteByte((Byte)b); - if (b != prevByte) - { - prevByte = b; - continue; - } - --blockSize; - break; - } - if (blockSize == 0) - break; - - b = (unsigned int)(tPos & 0xFF); - tPos = tt[tPos >> 8]; - - for (; b > 0; b--) - { - crc.UpdateByte(prevByte); - m_OutStream.WriteByte((Byte)prevByte); - } - */ - } - while(--blockSize != 0); - return crc.GetDigest(); -} - -static UInt32 NO_INLINE DecodeBlock2Rand(const UInt32 *tt, UInt32 blockSize, UInt32 OrigPtr, COutBuffer &m_OutStream) -{ - CBZip2Crc crc; - - UInt32 randIndex = 1; - UInt32 randToGo = kRandNums[0] - 2; - - int numReps = 0; - - // it's for speed optimization: prefetch & prevByte_init; - UInt32 tPos = tt[tt[OrigPtr] >> 8]; - unsigned int prevByte = (unsigned int)(tPos & 0xFF); - - do - { - unsigned int b = (unsigned int)(tPos & 0xFF); - tPos = tt[tPos >> 8]; - - { - if (randToGo == 0) - { - b ^= 1; - randToGo = kRandNums[randIndex++]; - randIndex &= 0x1FF; - } - randToGo--; - } - - if (numReps == kRleModeRepSize) - { - for (; b > 0; b--) - { - crc.UpdateByte(prevByte); - m_OutStream.WriteByte((Byte)prevByte); - } - numReps = 0; - continue; - } - if (b != prevByte) - numReps = 0; - numReps++; - prevByte = b; - crc.UpdateByte(b); - m_OutStream.WriteByte((Byte)b); - } - while(--blockSize != 0); - return crc.GetDigest(); -} - -#ifdef COMPRESS_BZIP2_MT - -CDecoder::CDecoder(): - m_States(0) -{ - m_NumThreadsPrev = 0; - NumThreads = 1; -} - -CDecoder::~CDecoder() -{ - Free(); -} - -#define RINOK_THREAD(x) { WRes __result_ = (x); if(__result_ != 0) return __result_; } - -HRESULT CDecoder::Create() -{ - RINOK_THREAD(CanProcessEvent.CreateIfNotCreated()); - RINOK_THREAD(CanStartWaitingEvent.CreateIfNotCreated()); - if (m_States != 0 && m_NumThreadsPrev == NumThreads) - return S_OK; - Free(); - MtMode = (NumThreads > 1); - m_NumThreadsPrev = NumThreads; - try - { - m_States = new CState[NumThreads]; - if (m_States == 0) - return E_OUTOFMEMORY; - } - catch(...) { return E_OUTOFMEMORY; } - for (UInt32 t = 0; t < NumThreads; t++) - { - CState &ti = m_States[t]; - ti.Decoder = this; - if (MtMode) - { - HRESULT res = ti.Create(); - if (res != S_OK) - { - NumThreads = t; - Free(); - return res; - } - } - } - return S_OK; -} - -void CDecoder::Free() -{ - if (!m_States) - return; - CloseThreads = true; - CanProcessEvent.Set(); - for (UInt32 t = 0; t < NumThreads; t++) - { - CState &s = m_States[t]; - if (MtMode) - s.Thread.Wait(); - s.Free(); - } - delete []m_States; - m_States = 0; -} -#endif - -HRESULT CDecoder::ReadSignatures(bool &wasFinished, UInt32 &crc) -{ - wasFinished = false; - Byte s[6]; - for (int i = 0; i < 6; i++) - s[i] = ReadByte(); - crc = ReadCrc(); - if (s[0] == kFinSig0) - { - if (s[1] != kFinSig1 || - s[2] != kFinSig2 || - s[3] != kFinSig3 || - s[4] != kFinSig4 || - s[5] != kFinSig5) - return S_FALSE; - - wasFinished = true; - return (crc == CombinedCrc.GetDigest()) ? S_OK : S_FALSE; - } - if (s[0] != kBlockSig0 || - s[1] != kBlockSig1 || - s[2] != kBlockSig2 || - s[3] != kBlockSig3 || - s[4] != kBlockSig4 || - s[5] != kBlockSig5) - return S_FALSE; - CombinedCrc.Update(crc); - return S_OK; -} - -HRESULT CDecoder::DecodeFile(bool &isBZ, ICompressProgressInfo *progress) -{ - #ifdef COMPRESS_BZIP2_MT - Progress = progress; - RINOK(Create()); - for (UInt32 t = 0; t < NumThreads; t++) - { - CState &s = m_States[t]; - if (!s.Alloc()) - return E_OUTOFMEMORY; - if (MtMode) - { - RINOK(s.StreamWasFinishedEvent.Reset()); - RINOK(s.WaitingWasStartedEvent.Reset()); - RINOK(s.CanWriteEvent.Reset()); - } - } - #else - if (!m_States[0].Alloc()) - return E_OUTOFMEMORY; - #endif - - isBZ = false; - Byte s[6]; - int i; - for (i = 0; i < 4; i++) - s[i] = ReadByte(); - if (s[0] != kArSig0 || - s[1] != kArSig1 || - s[2] != kArSig2 || - s[3] <= kArSig3 || - s[3] > kArSig3 + kBlockSizeMultMax) - return S_OK; - isBZ = true; - UInt32 dicSize = (UInt32)(s[3] - kArSig3) * kBlockSizeStep; - - CombinedCrc.Init(); - #ifdef COMPRESS_BZIP2_MT - if (MtMode) - { - NextBlockIndex = 0; - StreamWasFinished1 = StreamWasFinished2 = false; - CloseThreads = false; - CanStartWaitingEvent.Reset(); - m_States[0].CanWriteEvent.Set(); - BlockSizeMax = dicSize; - Result1 = Result2 = S_OK; - CanProcessEvent.Set(); - UInt32 t; - for (t = 0; t < NumThreads; t++) - m_States[t].StreamWasFinishedEvent.Lock(); - CanProcessEvent.Reset(); - CanStartWaitingEvent.Set(); - for (t = 0; t < NumThreads; t++) - m_States[t].WaitingWasStartedEvent.Lock(); - CanStartWaitingEvent.Reset(); - RINOK(Result2); - RINOK(Result1); - } - else - #endif - { - CState &state = m_States[0]; - for (;;) - { - if (progress) - { - UInt64 packSize = m_InStream.GetProcessedSize(); - UInt64 unpackSize = m_OutStream.GetProcessedSize(); - RINOK(progress->SetRatioInfo(&packSize, &unpackSize)); - } - bool wasFinished; - UInt32 crc; - RINOK(ReadSignatures(wasFinished, crc)); - if (wasFinished) - return S_OK; - - UInt32 blockSize, origPtr; - bool randMode; - RINOK(ReadBlock(&m_InStream, state.Counters, dicSize, - m_Selectors, m_HuffmanDecoders, - &blockSize, &origPtr, &randMode)); - DecodeBlock1(state.Counters, blockSize); - if ((randMode ? - DecodeBlock2Rand(state.Counters + 256, blockSize, origPtr, m_OutStream) : - DecodeBlock2(state.Counters + 256, blockSize, origPtr, m_OutStream)) != crc) - return S_FALSE; - } - } - return S_OK; -} - -HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress) -{ - if (!m_InStream.Create(kBufferSize)) - return E_OUTOFMEMORY; - if (!m_OutStream.Create(kBufferSize)) - return E_OUTOFMEMORY; - - m_InStream.SetStream(inStream); - m_InStream.Init(); - - m_OutStream.SetStream(outStream); - m_OutStream.Init(); - - CDecoderFlusher flusher(this); - - bool isBZ; - RINOK(DecodeFile(isBZ, progress)); - return isBZ ? S_OK: S_FALSE; -} - -STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress) -{ - try { return CodeReal(inStream, outStream, inSize, outSize, progress); } - catch(const CInBufferException &e) { return e.ErrorCode; } - catch(const COutBufferException &e) { return e.ErrorCode; } - catch(...) { return E_FAIL; } -} - -STDMETHODIMP CDecoder::GetInStreamProcessedSize(UInt64 *value) -{ - if (value == NULL) - return E_INVALIDARG; - *value = m_InStream.GetProcessedSize(); - return S_OK; -} - -#ifdef COMPRESS_BZIP2_MT - -static THREAD_FUNC_DECL MFThread(void *p) { ((CState *)p)->ThreadFunc(); return 0; } - -HRESULT CState::Create() -{ - RINOK_THREAD(StreamWasFinishedEvent.CreateIfNotCreated()); - RINOK_THREAD(WaitingWasStartedEvent.CreateIfNotCreated()); - RINOK_THREAD(CanWriteEvent.CreateIfNotCreated()); - RINOK_THREAD(Thread.Create(MFThread, this)); - return S_OK; -} - -void CState::FinishStream() -{ - Decoder->StreamWasFinished1 = true; - StreamWasFinishedEvent.Set(); - Decoder->CS.Leave(); - Decoder->CanStartWaitingEvent.Lock(); - WaitingWasStartedEvent.Set(); -} - -void CState::ThreadFunc() -{ - for (;;) - { - Decoder->CanProcessEvent.Lock(); - Decoder->CS.Enter(); - if (Decoder->CloseThreads) - { - Decoder->CS.Leave(); - return; - } - if (Decoder->StreamWasFinished1) - { - FinishStream(); - continue; - } - HRESULT res = S_OK; - - UInt32 blockIndex = Decoder->NextBlockIndex; - UInt32 nextBlockIndex = blockIndex + 1; - if (nextBlockIndex == Decoder->NumThreads) - nextBlockIndex = 0; - Decoder->NextBlockIndex = nextBlockIndex; - UInt32 crc; - UInt64 packSize; - UInt32 blockSize = 0, origPtr = 0; - bool randMode = false; - - try - { - bool wasFinished; - res = Decoder->ReadSignatures(wasFinished, crc); - if (res != S_OK) - { - Decoder->Result1 = res; - FinishStream(); - continue; - } - if (wasFinished) - { - Decoder->Result1 = res; - FinishStream(); - continue; - } - - res = ReadBlock(&Decoder->m_InStream, Counters, Decoder->BlockSizeMax, - Decoder->m_Selectors, Decoder->m_HuffmanDecoders, - &blockSize, &origPtr, &randMode); - if (res != S_OK) - { - Decoder->Result1 = res; - FinishStream(); - continue; - } - packSize = Decoder->m_InStream.GetProcessedSize(); - } - catch(const CInBufferException &e) { res = e.ErrorCode; if (res != S_OK) res = E_FAIL; } - catch(...) { res = E_FAIL; } - if (res != S_OK) - { - Decoder->Result1 = res; - FinishStream(); - continue; - } - - Decoder->CS.Leave(); - - DecodeBlock1(Counters, blockSize); - - bool needFinish = true; - try - { - Decoder->m_States[blockIndex].CanWriteEvent.Lock(); - needFinish = Decoder->StreamWasFinished2; - if (!needFinish) - { - if ((randMode ? - DecodeBlock2Rand(Counters + 256, blockSize, origPtr, Decoder->m_OutStream) : - DecodeBlock2(Counters + 256, blockSize, origPtr, Decoder->m_OutStream)) == crc) - { - if (Decoder->Progress) - { - UInt64 unpackSize = Decoder->m_OutStream.GetProcessedSize(); - res = Decoder->Progress->SetRatioInfo(&packSize, &unpackSize); - } - } - else - res = S_FALSE; - } - } - catch(const COutBufferException &e) { res = e.ErrorCode; if (res != S_OK) res = E_FAIL; } - catch(...) { res = E_FAIL; } - if (res != S_OK) - { - Decoder->Result2 = res; - Decoder->StreamWasFinished2 = true; - } - Decoder->m_States[nextBlockIndex].CanWriteEvent.Set(); - if (res != S_OK || needFinish) - { - StreamWasFinishedEvent.Set(); - Decoder->CanStartWaitingEvent.Lock(); - WaitingWasStartedEvent.Set(); - } - } -} - -STDMETHODIMP CDecoder::SetNumberOfThreads(UInt32 numThreads) -{ - NumThreads = numThreads; - if (NumThreads < 1) - NumThreads = 1; - if (NumThreads > kNumThreadsMax) - NumThreads = kNumThreadsMax; - return S_OK; -} -#endif - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/BZip2Decoder.h b/desmume/src/windows/7z/CPP/7zip/Compress/BZip2Decoder.h deleted file mode 100644 index 394860071..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/BZip2Decoder.h +++ /dev/null @@ -1,159 +0,0 @@ -// Compress/BZip2Decoder.h - -#ifndef __COMPRESS_BZIP2_DECODER_H -#define __COMPRESS_BZIP2_DECODER_H - -#include "../../Common/MyCom.h" - -#ifdef COMPRESS_BZIP2_MT -#include "../../Windows/Synchronization.h" -#include "../../Windows/Thread.h" -#endif - -#include "../ICoder.h" - -#include "../Common/InBuffer.h" -#include "../Common/OutBuffer.h" - -#include "BitmDecoder.h" -#include "BZip2Const.h" -#include "BZip2Crc.h" -#include "HuffmanDecoder.h" - -namespace NCompress { -namespace NBZip2 { - -typedef NCompress::NHuffman::CDecoder CHuffmanDecoder; - -class CDecoder; - -struct CState -{ - UInt32 *Counters; - - #ifdef COMPRESS_BZIP2_MT - - CDecoder *Decoder; - NWindows::CThread Thread; - bool m_OptimizeNumTables; - - NWindows::NSynchronization::CAutoResetEvent StreamWasFinishedEvent; - NWindows::NSynchronization::CAutoResetEvent WaitingWasStartedEvent; - - // it's not member of this thread. We just need one event per thread - NWindows::NSynchronization::CAutoResetEvent CanWriteEvent; - - Byte MtPad[1 << 8]; // It's pad for Multi-Threading. Must be >= Cache_Line_Size. - - HRESULT Create(); - void FinishStream(); - void ThreadFunc(); - - #endif - - CState(): Counters(0) {} - ~CState() { Free(); } - bool Alloc(); - void Free(); -}; - -class CDecoder : - public ICompressCoder, - #ifdef COMPRESS_BZIP2_MT - public ICompressSetCoderMt, - #endif - public ICompressGetInStreamProcessedSize, - public CMyUnknownImp -{ -public: - COutBuffer m_OutStream; - Byte MtPad[1 << 8]; // It's pad for Multi-Threading. Must be >= Cache_Line_Size. - NBitm::CDecoder m_InStream; - Byte m_Selectors[kNumSelectorsMax]; - CHuffmanDecoder m_HuffmanDecoders[kNumTablesMax]; -private: - - UInt32 m_NumThreadsPrev; - - UInt32 ReadBits(int numBits); - Byte ReadByte(); - bool ReadBit(); - UInt32 ReadCrc(); - HRESULT PrepareBlock(CState &state); - HRESULT DecodeFile(bool &isBZ, ICompressProgressInfo *progress); - HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); - class CDecoderFlusher - { - CDecoder *_decoder; - public: - bool NeedFlush; - CDecoderFlusher(CDecoder *decoder): _decoder(decoder), NeedFlush(true) {} - ~CDecoderFlusher() - { - if (NeedFlush) - _decoder->Flush(); - _decoder->ReleaseStreams(); - } - }; - -public: - CBZip2CombinedCrc CombinedCrc; - - #ifdef COMPRESS_BZIP2_MT - ICompressProgressInfo *Progress; - CState *m_States; - - NWindows::NSynchronization::CManualResetEvent CanProcessEvent; - NWindows::NSynchronization::CCriticalSection CS; - UInt32 NumThreads; - bool MtMode; - UInt32 NextBlockIndex; - bool CloseThreads; - bool StreamWasFinished1; - bool StreamWasFinished2; - NWindows::NSynchronization::CManualResetEvent CanStartWaitingEvent; - - HRESULT Result1; - HRESULT Result2; - - UInt32 BlockSizeMax; - CDecoder(); - ~CDecoder(); - HRESULT Create(); - void Free(); - - #else - CState m_States[1]; - #endif - - HRESULT ReadSignatures(bool &wasFinished, UInt32 &crc); - - - HRESULT Flush() { return m_OutStream.Flush(); } - void ReleaseStreams() - { - m_InStream.ReleaseStream(); - m_OutStream.ReleaseStream(); - } - - #ifdef COMPRESS_BZIP2_MT - MY_UNKNOWN_IMP2(ICompressSetCoderMt, ICompressGetInStreamProcessedSize) - #else - MY_UNKNOWN_IMP1(ICompressGetInStreamProcessedSize) - #endif - - - STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); - - STDMETHOD(GetInStreamProcessedSize)(UInt64 *value); - - #ifdef COMPRESS_BZIP2_MT - STDMETHOD(SetNumberOfThreads)(UInt32 numThreads); - #endif -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/BZip2Register.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/BZip2Register.cpp deleted file mode 100644 index f10e594c6..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/BZip2Register.cpp +++ /dev/null @@ -1,20 +0,0 @@ -// BZip2Register.cpp - -#include "StdAfx.h" - -#include "../Common/RegisterCodec.h" - -#include "BZip2Decoder.h" - -static void *CreateCodec() { return (void *)(ICompressCoder *)(new NCompress::NBZip2::CDecoder); } -#if !defined(EXTRACT_ONLY) && !defined(BZIP2_EXTRACT_ONLY) -#include "BZip2Encoder.h" -static void *CreateCodecOut() { return (void *)(ICompressCoder *)(new NCompress::NBZip2::CEncoder); } -#else -#define CreateCodecOut 0 -#endif - -static CCodecInfo g_CodecInfo = - { CreateCodec, CreateCodecOut, 0x040202, L"BZip2", 1, false }; - -REGISTER_CODEC(BZip2) diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/Bcj2Coder.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/Bcj2Coder.cpp deleted file mode 100644 index e52095a77..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/Bcj2Coder.cpp +++ /dev/null @@ -1,393 +0,0 @@ -// Bcj2Coder.cpp - -#include "StdAfx.h" - -extern "C" -{ -#include "../../../C/Alloc.h" -} - -#include "Bcj2Coder.h" - -namespace NCompress { -namespace NBcj2 { - -inline bool IsJcc(Byte b0, Byte b1) { return (b0 == 0x0F && (b1 & 0xF0) == 0x80); } -inline bool IsJ(Byte b0, Byte b1) { return ((b1 & 0xFE) == 0xE8 || IsJcc(b0, b1)); } -inline unsigned GetIndex(Byte b0, Byte b1) { return ((b1 == 0xE8) ? b0 : ((b1 == 0xE9) ? 256 : 257)); } - -#ifndef EXTRACT_ONLY - -static const int kBufferSize = 1 << 17; - -static bool inline Test86MSByte(Byte b) -{ - return (b == 0 || b == 0xFF); -} - -bool CEncoder::Create() -{ - if (!_mainStream.Create(1 << 16)) - return false; - if (!_callStream.Create(1 << 20)) - return false; - if (!_jumpStream.Create(1 << 20)) - return false; - if (!_rangeEncoder.Create(1 << 20)) - return false; - if (_buffer == 0) - { - _buffer = (Byte *)MidAlloc(kBufferSize); - if (_buffer == 0) - return false; - } - return true; -} - -CEncoder::~CEncoder() -{ - ::MidFree(_buffer); -} - -HRESULT CEncoder::Flush() -{ - RINOK(_mainStream.Flush()); - RINOK(_callStream.Flush()); - RINOK(_jumpStream.Flush()); - _rangeEncoder.FlushData(); - return _rangeEncoder.FlushStream(); -} - -const UInt32 kDefaultLimit = (1 << 24); - -HRESULT CEncoder::CodeReal(ISequentialInStream **inStreams, - const UInt64 **inSizes, - UInt32 numInStreams, - ISequentialOutStream **outStreams, - const UInt64 ** /* outSizes */, - UInt32 numOutStreams, - ICompressProgressInfo *progress) -{ - if (numInStreams != 1 || numOutStreams != 4) - return E_INVALIDARG; - - if (!Create()) - return E_OUTOFMEMORY; - - bool sizeIsDefined = false; - UInt64 inSize = 0; - if (inSizes != NULL) - if (inSizes[0] != NULL) - { - inSize = *inSizes[0]; - if (inSize <= kDefaultLimit) - sizeIsDefined = true; - } - - ISequentialInStream *inStream = inStreams[0]; - - _mainStream.SetStream(outStreams[0]); - _mainStream.Init(); - _callStream.SetStream(outStreams[1]); - _callStream.Init(); - _jumpStream.SetStream(outStreams[2]); - _jumpStream.Init(); - _rangeEncoder.SetStream(outStreams[3]); - _rangeEncoder.Init(); - for (int i = 0; i < 256 + 2; i++) - _statusEncoder[i].Init(); - CCoderReleaser releaser(this); - - CMyComPtr getSubStreamSize; - { - inStream->QueryInterface(IID_ICompressGetSubStreamSize, (void **)&getSubStreamSize); - } - - UInt32 nowPos = 0; - UInt64 nowPos64 = 0; - UInt32 bufferPos = 0; - - Byte prevByte = 0; - - UInt64 subStreamIndex = 0; - UInt64 subStreamStartPos = 0; - UInt64 subStreamEndPos = 0; - - for (;;) - { - UInt32 processedSize = 0; - for (;;) - { - UInt32 size = kBufferSize - (bufferPos + processedSize); - UInt32 processedSizeLoc; - if (size == 0) - break; - RINOK(inStream->Read(_buffer + bufferPos + processedSize, size, &processedSizeLoc)); - if (processedSizeLoc == 0) - break; - processedSize += processedSizeLoc; - } - UInt32 endPos = bufferPos + processedSize; - - if (endPos < 5) - { - // change it - for (bufferPos = 0; bufferPos < endPos; bufferPos++) - { - Byte b = _buffer[bufferPos]; - _mainStream.WriteByte(b); - UInt32 index; - if (b == 0xE8) - index = prevByte; - else if (b == 0xE9) - index = 256; - else if (IsJcc(prevByte, b)) - index = 257; - else - { - prevByte = b; - continue; - } - _statusEncoder[index].Encode(&_rangeEncoder, 0); - prevByte = b; - } - return Flush(); - } - - bufferPos = 0; - - UInt32 limit = endPos - 5; - while(bufferPos <= limit) - { - Byte b = _buffer[bufferPos]; - _mainStream.WriteByte(b); - if (!IsJ(prevByte, b)) - { - bufferPos++; - prevByte = b; - continue; - } - Byte nextByte = _buffer[bufferPos + 4]; - UInt32 src = - (UInt32(nextByte) << 24) | - (UInt32(_buffer[bufferPos + 3]) << 16) | - (UInt32(_buffer[bufferPos + 2]) << 8) | - (_buffer[bufferPos + 1]); - UInt32 dest = (nowPos + bufferPos + 5) + src; - // if (Test86MSByte(nextByte)) - bool convert; - if (getSubStreamSize != NULL) - { - UInt64 currentPos = (nowPos64 + bufferPos); - while (subStreamEndPos < currentPos) - { - UInt64 subStreamSize; - HRESULT result = getSubStreamSize->GetSubStreamSize(subStreamIndex, &subStreamSize); - if (result == S_OK) - { - subStreamStartPos = subStreamEndPos; - subStreamEndPos += subStreamSize; - subStreamIndex++; - } - else if (result == S_FALSE || result == E_NOTIMPL) - { - getSubStreamSize.Release(); - subStreamStartPos = 0; - subStreamEndPos = subStreamStartPos - 1; - } - else - return result; - } - if (getSubStreamSize == NULL) - { - if (sizeIsDefined) - convert = (dest < inSize); - else - convert = Test86MSByte(nextByte); - } - else if (subStreamEndPos - subStreamStartPos > kDefaultLimit) - convert = Test86MSByte(nextByte); - else - { - UInt64 dest64 = (currentPos + 5) + Int64(Int32(src)); - convert = (dest64 >= subStreamStartPos && dest64 < subStreamEndPos); - } - } - else if (sizeIsDefined) - convert = (dest < inSize); - else - convert = Test86MSByte(nextByte); - unsigned index = GetIndex(prevByte, b); - if (convert) - { - _statusEncoder[index].Encode(&_rangeEncoder, 1); - bufferPos += 5; - COutBuffer &s = (b == 0xE8) ? _callStream : _jumpStream; - for (int i = 24; i >= 0; i -= 8) - s.WriteByte((Byte)(dest >> i)); - prevByte = nextByte; - } - else - { - _statusEncoder[index].Encode(&_rangeEncoder, 0); - bufferPos++; - prevByte = b; - } - } - nowPos += bufferPos; - nowPos64 += bufferPos; - - if (progress != NULL) - { - /* - const UInt64 compressedSize = - _mainStream.GetProcessedSize() + - _callStream.GetProcessedSize() + - _jumpStream.GetProcessedSize() + - _rangeEncoder.GetProcessedSize(); - */ - RINOK(progress->SetRatioInfo(&nowPos64, NULL)); - } - - UInt32 i = 0; - while(bufferPos < endPos) - _buffer[i++] = _buffer[bufferPos++]; - bufferPos = i; - } -} - -STDMETHODIMP CEncoder::Code(ISequentialInStream **inStreams, - const UInt64 **inSizes, - UInt32 numInStreams, - ISequentialOutStream **outStreams, - const UInt64 **outSizes, - UInt32 numOutStreams, - ICompressProgressInfo *progress) -{ - try - { - return CodeReal(inStreams, inSizes, numInStreams, - outStreams, outSizes,numOutStreams, progress); - } - catch(const COutBufferException &e) { return e.ErrorCode; } - catch(...) { return S_FALSE; } -} - -#endif - -HRESULT CDecoder::CodeReal(ISequentialInStream **inStreams, - const UInt64 ** /* inSizes */, - UInt32 numInStreams, - ISequentialOutStream **outStreams, - const UInt64 ** /* outSizes */, - UInt32 numOutStreams, - ICompressProgressInfo *progress) -{ - if (numInStreams != 4 || numOutStreams != 1) - return E_INVALIDARG; - - if (!_mainInStream.Create(1 << 16)) - return E_OUTOFMEMORY; - if (!_callStream.Create(1 << 20)) - return E_OUTOFMEMORY; - if (!_jumpStream.Create(1 << 16)) - return E_OUTOFMEMORY; - if (!_rangeDecoder.Create(1 << 20)) - return E_OUTOFMEMORY; - if (!_outStream.Create(1 << 16)) - return E_OUTOFMEMORY; - - _mainInStream.SetStream(inStreams[0]); - _callStream.SetStream(inStreams[1]); - _jumpStream.SetStream(inStreams[2]); - _rangeDecoder.SetStream(inStreams[3]); - _outStream.SetStream(outStreams[0]); - - _mainInStream.Init(); - _callStream.Init(); - _jumpStream.Init(); - _rangeDecoder.Init(); - _outStream.Init(); - - for (int i = 0; i < 256 + 2; i++) - _statusDecoder[i].Init(); - - CCoderReleaser releaser(this); - - Byte prevByte = 0; - UInt32 processedBytes = 0; - for (;;) - { - if (processedBytes >= (1 << 20) && progress != NULL) - { - /* - const UInt64 compressedSize = - _mainInStream.GetProcessedSize() + - _callStream.GetProcessedSize() + - _jumpStream.GetProcessedSize() + - _rangeDecoder.GetProcessedSize(); - */ - const UInt64 nowPos64 = _outStream.GetProcessedSize(); - RINOK(progress->SetRatioInfo(NULL, &nowPos64)); - processedBytes = 0; - } - UInt32 i; - Byte b = 0; - const UInt32 kBurstSize = (1 << 18); - for (i = 0; i < kBurstSize; i++) - { - if (!_mainInStream.ReadByte(b)) - return Flush(); - _outStream.WriteByte(b); - if (IsJ(prevByte, b)) - break; - prevByte = b; - } - processedBytes += i; - if (i == kBurstSize) - continue; - unsigned index = GetIndex(prevByte, b); - if (_statusDecoder[index].Decode(&_rangeDecoder) == 1) - { - UInt32 src = 0; - CInBuffer &s = (b == 0xE8) ? _callStream : _jumpStream; - for (int i = 0; i < 4; i++) - { - Byte b0; - if(!s.ReadByte(b0)) - return S_FALSE; - src <<= 8; - src |= ((UInt32)b0); - } - UInt32 dest = src - (UInt32(_outStream.GetProcessedSize()) + 4) ; - _outStream.WriteByte((Byte)(dest)); - _outStream.WriteByte((Byte)(dest >> 8)); - _outStream.WriteByte((Byte)(dest >> 16)); - _outStream.WriteByte((Byte)(dest >> 24)); - prevByte = (Byte)(dest >> 24); - processedBytes += 4; - } - else - prevByte = b; - } -} - -STDMETHODIMP CDecoder::Code(ISequentialInStream **inStreams, - const UInt64 **inSizes, - UInt32 numInStreams, - ISequentialOutStream **outStreams, - const UInt64 **outSizes, - UInt32 numOutStreams, - ICompressProgressInfo *progress) -{ - try - { - return CodeReal(inStreams, inSizes, numInStreams, - outStreams, outSizes,numOutStreams, progress); - } - catch(const CInBufferException &e) { return e.ErrorCode; } - catch(const COutBufferException &e) { return e.ErrorCode; } - catch(...) { return S_FALSE; } -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/Bcj2Coder.h b/desmume/src/windows/7z/CPP/7zip/Compress/Bcj2Coder.h deleted file mode 100644 index fcbc2a411..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/Bcj2Coder.h +++ /dev/null @@ -1,125 +0,0 @@ -// Bcj2Coder.h - -#ifndef __COMPRESS_BCJ2_CODER_H -#define __COMPRESS_BCJ2_CODER_H - -#include "../../Common/MyCom.h" - -#include "../ICoder.h" - -#include "RangeCoderBit.h" - -namespace NCompress { -namespace NBcj2 { - -const int kNumMoveBits = 5; - -#ifndef EXTRACT_ONLY - -class CEncoder: - public ICompressCoder2, - public CMyUnknownImp -{ - Byte *_buffer; -public: - CEncoder(): _buffer(0) {}; - ~CEncoder(); - bool Create(); - - COutBuffer _mainStream; - COutBuffer _callStream; - COutBuffer _jumpStream; - NCompress::NRangeCoder::CEncoder _rangeEncoder; - NCompress::NRangeCoder::CBitEncoder _statusEncoder[256 + 2]; - - HRESULT Flush(); - void ReleaseStreams() - { - _mainStream.ReleaseStream(); - _callStream.ReleaseStream(); - _jumpStream.ReleaseStream(); - _rangeEncoder.ReleaseStream(); - } - - class CCoderReleaser - { - CEncoder *_coder; - public: - CCoderReleaser(CEncoder *coder): _coder(coder) {} - ~CCoderReleaser() { _coder->ReleaseStreams(); } - }; - -public: - - MY_UNKNOWN_IMP - - HRESULT CodeReal(ISequentialInStream **inStreams, - const UInt64 **inSizes, - UInt32 numInStreams, - ISequentialOutStream **outStreams, - const UInt64 **outSizes, - UInt32 numOutStreams, - ICompressProgressInfo *progress); - STDMETHOD(Code)(ISequentialInStream **inStreams, - const UInt64 **inSizes, - UInt32 numInStreams, - ISequentialOutStream **outStreams, - const UInt64 **outSizes, - UInt32 numOutStreams, - ICompressProgressInfo *progress); -}; - -#endif - -class CDecoder: - public ICompressCoder2, - public CMyUnknownImp -{ -public: - CInBuffer _mainInStream; - CInBuffer _callStream; - CInBuffer _jumpStream; - NCompress::NRangeCoder::CDecoder _rangeDecoder; - NCompress::NRangeCoder::CBitDecoder _statusDecoder[256 + 2]; - - COutBuffer _outStream; - - void ReleaseStreams() - { - _mainInStream.ReleaseStream(); - _callStream.ReleaseStream(); - _jumpStream.ReleaseStream(); - _rangeDecoder.ReleaseStream(); - _outStream.ReleaseStream(); - } - - HRESULT Flush() { return _outStream.Flush(); } - class CCoderReleaser - { - CDecoder *_coder; - public: - CCoderReleaser(CDecoder *coder): _coder(coder) {} - ~CCoderReleaser() { _coder->ReleaseStreams(); } - }; - -public: - MY_UNKNOWN_IMP - HRESULT CodeReal(ISequentialInStream **inStreams, - const UInt64 **inSizes, - UInt32 numInStreams, - ISequentialOutStream **outStreams, - const UInt64 **outSizes, - UInt32 numOutStreams, - ICompressProgressInfo *progress); - STDMETHOD(Code)(ISequentialInStream **inStreams, - const UInt64 **inSizes, - UInt32 numInStreams, - ISequentialOutStream **outStreams, - const UInt64 **outSizes, - UInt32 numOutStreams, - ICompressProgressInfo *progress); -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/Bcj2Register.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/Bcj2Register.cpp deleted file mode 100644 index b063f3f69..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/Bcj2Register.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// Bcj2Register.cpp - -#include "StdAfx.h" - -#include "../Common/RegisterCodec.h" - -#include "Bcj2Coder.h" - -static void *CreateCodec() { return (void *)(ICompressCoder2 *)(new NCompress::NBcj2::CDecoder()); } -#ifndef EXTRACT_ONLY -static void *CreateCodecOut() { return (void *)(ICompressCoder2 *)(new NCompress::NBcj2::CEncoder()); } -#else -#define CreateCodecOut 0 -#endif - -static CCodecInfo g_CodecInfo = - { CreateCodec, CreateCodecOut, 0x0303011B, L"BCJ2", 4, false }; - -REGISTER_CODEC(BCJ2) diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/BcjCoder.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/BcjCoder.cpp deleted file mode 100644 index 108c573d5..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/BcjCoder.cpp +++ /dev/null @@ -1,15 +0,0 @@ -// BcjCoder.cpp - -#include "StdAfx.h" - -#include "BcjCoder.h" - -UInt32 CBCJ_x86_Encoder::SubFilter(Byte *data, UInt32 size) -{ - return (UInt32)::x86_Convert(data, size, _bufferPos, &_prevMask, 1); -} - -UInt32 CBCJ_x86_Decoder::SubFilter(Byte *data, UInt32 size) -{ - return (UInt32)::x86_Convert(data, size, _bufferPos, &_prevMask, 0); -} diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/BcjCoder.h b/desmume/src/windows/7z/CPP/7zip/Compress/BcjCoder.h deleted file mode 100644 index 3389b2092..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/BcjCoder.h +++ /dev/null @@ -1,22 +0,0 @@ -// BcjCoder.h - -#ifndef __COMPRESS_BCJ_CODER_H -#define __COMPRESS_BCJ_CODER_H - -extern "C" -{ -#include "../../../C/Bra.h" -} - -#include "BranchCoder.h" - -struct CBranch86 -{ - UInt32 _prevMask; - void x86Init() { x86_Convert_Init(_prevMask); } -}; - -MyClassB(BCJ_x86, 0x01, 3, CBranch86 , - virtual void SubInit() { x86Init(); }) - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/BcjRegister.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/BcjRegister.cpp deleted file mode 100644 index 09e53c655..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/BcjRegister.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// BcjRegister.cpp - -#include "StdAfx.h" - -#include "../Common/RegisterCodec.h" - -#include "BcjCoder.h" - -static void *CreateCodec() { return (void *)(ICompressFilter *)(new CBCJ_x86_Decoder()); } -#ifndef EXTRACT_ONLY -static void *CreateCodecOut() { return (void *)(ICompressFilter *)(new CBCJ_x86_Encoder()); } -#else -#define CreateCodecOut 0 -#endif - -static CCodecInfo g_CodecInfo = - { CreateCodec, CreateCodecOut, 0x03030103, L"BCJ", 1, true }; - -REGISTER_CODEC(BCJ) diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/BitlDecoder.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/BitlDecoder.cpp deleted file mode 100644 index 6022e8bf5..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/BitlDecoder.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// BitlDecoder.cpp - -#include "StdAfx.h" - -#include "BitlDecoder.h" - -namespace NBitl { - -Byte kInvertTable[256]; - -struct CInverterTableInitializer -{ - CInverterTableInitializer() - { - for (int i = 0; i < 256; i++) - { - int x = ((i & 0x55) << 1) | ((i & 0xAA) >> 1); - x = ((x & 0x33) << 2) | ((x & 0xCC) >> 2); - kInvertTable[i] = (Byte)(((x & 0x0F) << 4) | ((x & 0xF0) >> 4)); - } - } -} g_InverterTableInitializer; - -} diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/BitlDecoder.h b/desmume/src/windows/7z/CPP/7zip/Compress/BitlDecoder.h deleted file mode 100644 index f2e115d48..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/BitlDecoder.h +++ /dev/null @@ -1,125 +0,0 @@ -// BitlDecoder.h -- the Least Significant Bit of byte is First - -#ifndef __BITL_DECODER_H -#define __BITL_DECODER_H - -#include "../IStream.h" - -namespace NBitl { - -const int kNumBigValueBits = 8 * 4; - -const int kNumValueBytes = 3; -const int kNumValueBits = 8 * kNumValueBytes; - -const UInt32 kMask = (1 << kNumValueBits) - 1; - -extern Byte kInvertTable[256]; - -template -class CBaseDecoder -{ -protected: - int m_BitPos; - UInt32 m_Value; - TInByte m_Stream; -public: - UInt32 NumExtraBytes; - bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); } - void SetStream(ISequentialInStream *inStream) { m_Stream.SetStream(inStream); } - void ReleaseStream() { m_Stream.ReleaseStream(); } - void Init() - { - m_Stream.Init(); - m_BitPos = kNumBigValueBits; - m_Value = 0; - NumExtraBytes = 0; - } - UInt64 GetProcessedSize() const - { return m_Stream.GetProcessedSize() - (kNumBigValueBits - m_BitPos) / 8; } - UInt64 GetProcessedBitsSize() const - { return (m_Stream.GetProcessedSize() << 3) - (kNumBigValueBits - m_BitPos); } - int GetBitPosition() const { return (m_BitPos & 7); } - - void Normalize() - { - for (;m_BitPos >= 8; m_BitPos -= 8) - { - Byte b = 0; - if (!m_Stream.ReadByte(b)) - { - b = 0xFF; // check it - NumExtraBytes++; - } - m_Value = (b << (kNumBigValueBits - m_BitPos)) | m_Value; - } - } - - UInt32 ReadBits(int numBits) - { - Normalize(); - UInt32 res = m_Value & ((1 << numBits) - 1); - m_BitPos += numBits; - m_Value >>= numBits; - return res; - } - - bool ExtraBitsWereRead() const - { - if (NumExtraBytes == 0) - return false; - return ((UInt32)(kNumBigValueBits - m_BitPos) < (NumExtraBytes << 3)); - } -}; - -template -class CDecoder: public CBaseDecoder -{ - UInt32 m_NormalValue; - -public: - void Init() - { - CBaseDecoder::Init(); - m_NormalValue = 0; - } - - void Normalize() - { - for (; this->m_BitPos >= 8; this->m_BitPos -= 8) - { - Byte b = 0; - if (!this->m_Stream.ReadByte(b)) - { - b = 0xFF; // check it - this->NumExtraBytes++; - } - m_NormalValue = (b << (kNumBigValueBits - this->m_BitPos)) | m_NormalValue; - this->m_Value = (this->m_Value << 8) | kInvertTable[b]; - } - } - - UInt32 GetValue(int numBits) - { - Normalize(); - return ((this->m_Value >> (8 - this->m_BitPos)) & kMask) >> (kNumValueBits - numBits); - } - - void MovePos(int numBits) - { - this->m_BitPos += numBits; - m_NormalValue >>= numBits; - } - - UInt32 ReadBits(int numBits) - { - Normalize(); - UInt32 res = m_NormalValue & ( (1 << numBits) - 1); - MovePos(numBits); - return res; - } -}; - -} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/BitmDecoder.h b/desmume/src/windows/7z/CPP/7zip/Compress/BitmDecoder.h deleted file mode 100644 index f58ec29e5..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/BitmDecoder.h +++ /dev/null @@ -1,66 +0,0 @@ -// BitmDecoder.h -- the Most Significant Bit of byte is First - -#ifndef __BITM_DECODER_H -#define __BITM_DECODER_H - -#include "../IStream.h" - -namespace NBitm { - -const int kNumBigValueBits = 8 * 4; -const int kNumValueBytes = 3; -const int kNumValueBits = 8 * kNumValueBytes; - -const UInt32 kMask = (1 << kNumValueBits) - 1; - -template -class CDecoder -{ - UInt32 m_BitPos; - UInt32 m_Value; -public: - TInByte m_Stream; - bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); } - void SetStream(ISequentialInStream *inStream) { m_Stream.SetStream(inStream);} - void ReleaseStream() { m_Stream.ReleaseStream();} - - void Init() - { - m_Stream.Init(); - m_BitPos = kNumBigValueBits; - Normalize(); - } - - UInt64 GetProcessedSize() const - { return m_Stream.GetProcessedSize() - (kNumBigValueBits - m_BitPos) / 8; } - UInt32 GetBitPosition() const { return (m_BitPos & 7); } - - void Normalize() - { - for (;m_BitPos >= 8; m_BitPos -= 8) - m_Value = (m_Value << 8) | m_Stream.ReadByte(); - } - - UInt32 GetValue(UInt32 numBits) const - { - // return (m_Value << m_BitPos) >> (kNumBigValueBits - numBits); - return ((m_Value >> (8 - m_BitPos)) & kMask) >> (kNumValueBits - numBits); - } - - void MovePos(UInt32 numBits) - { - m_BitPos += numBits; - Normalize(); - } - - UInt32 ReadBits(UInt32 numBits) - { - UInt32 res = GetValue(numBits); - MovePos(numBits); - return res; - } -}; - -} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/BranchCoder.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/BranchCoder.cpp deleted file mode 100644 index 6cacc66ac..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/BranchCoder.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// BranchCoder.cpp - -#include "StdAfx.h" - -#include "BranchCoder.h" - -STDMETHODIMP CBranchConverter::Init() -{ - _bufferPos = 0; - SubInit(); - return S_OK; -} - -STDMETHODIMP_(UInt32) CBranchConverter::Filter(Byte *data, UInt32 size) -{ - UInt32 processedSize = SubFilter(data, size); - _bufferPos += processedSize; - return processedSize; -} diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/BranchCoder.h b/desmume/src/windows/7z/CPP/7zip/Compress/BranchCoder.h deleted file mode 100644 index 473286af3..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/BranchCoder.h +++ /dev/null @@ -1,44 +0,0 @@ -// BranchCoder.h - -#ifndef __COMPRESS_BRANCH_CODER_H -#define __COMPRESS_BRANCH_CODER_H - -#include "../../Common/MyCom.h" - -#include "../ICoder.h" - -class CBranchConverter: - public ICompressFilter, - public CMyUnknownImp -{ -protected: - UInt32 _bufferPos; - virtual void SubInit() {} - virtual UInt32 SubFilter(Byte *data, UInt32 size) = 0; -public: - MY_UNKNOWN_IMP; - STDMETHOD(Init)(); - STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size); -}; - -#define MyClassEncoderA(Name) class C ## Name: public CBranchConverter \ - { public: UInt32 SubFilter(Byte *data, UInt32 size); }; - -#define MyClassDecoderA(Name) class C ## Name: public CBranchConverter \ - { public: UInt32 SubFilter(Byte *data, UInt32 size); }; - -#define MyClassEncoderB(Name, ADD_ITEMS, ADD_INIT) class C ## Name: public CBranchConverter, public ADD_ITEMS \ - { public: UInt32 SubFilter(Byte *data, UInt32 size); ADD_INIT}; - -#define MyClassDecoderB(Name, ADD_ITEMS, ADD_INIT) class C ## Name: public CBranchConverter, public ADD_ITEMS \ - { public: UInt32 SubFilter(Byte *data, UInt32 size); ADD_INIT}; - -#define MyClassA(Name, id, subId) \ -MyClassEncoderA(Name ## _Encoder) \ -MyClassDecoderA(Name ## _Decoder) - -#define MyClassB(Name, id, subId, ADD_ITEMS, ADD_INIT) \ -MyClassEncoderB(Name ## _Encoder, ADD_ITEMS, ADD_INIT) \ -MyClassDecoderB(Name ## _Decoder, ADD_ITEMS, ADD_INIT) - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/BranchMisc.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/BranchMisc.cpp deleted file mode 100644 index 238dbe311..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/BranchMisc.cpp +++ /dev/null @@ -1,40 +0,0 @@ -// BranchMisc.cpp - -#include "StdAfx.h" - -extern "C" -{ -#include "../../../C/Bra.h" -} - -#include "BranchMisc.h" - -UInt32 CBC_ARM_Encoder::SubFilter(Byte *data, UInt32 size) - { return (UInt32)::ARM_Convert(data, size, _bufferPos, 1); } - -UInt32 CBC_ARM_Decoder::SubFilter(Byte *data, UInt32 size) - { return (UInt32)::ARM_Convert(data, size, _bufferPos, 0); } - -UInt32 CBC_ARMT_Encoder::SubFilter(Byte *data, UInt32 size) - { return (UInt32)::ARMT_Convert(data, size, _bufferPos, 1); } - -UInt32 CBC_ARMT_Decoder::SubFilter(Byte *data, UInt32 size) - { return (UInt32)::ARMT_Convert(data, size, _bufferPos, 0); } - -UInt32 CBC_PPC_Encoder::SubFilter(Byte *data, UInt32 size) - { return (UInt32)::PPC_Convert(data, size, _bufferPos, 1); } - -UInt32 CBC_PPC_Decoder::SubFilter(Byte *data, UInt32 size) - { return (UInt32)::PPC_Convert(data, size, _bufferPos, 0); } - -UInt32 CBC_SPARC_Encoder::SubFilter(Byte *data, UInt32 size) - { return (UInt32)::SPARC_Convert(data, size, _bufferPos, 1); } - -UInt32 CBC_SPARC_Decoder::SubFilter(Byte *data, UInt32 size) - { return (UInt32)::SPARC_Convert(data, size, _bufferPos, 0); } - -UInt32 CBC_IA64_Encoder::SubFilter(Byte *data, UInt32 size) - { return (UInt32)::IA64_Convert(data, size, _bufferPos, 1); } - -UInt32 CBC_IA64_Decoder::SubFilter(Byte *data, UInt32 size) - { return (UInt32)::IA64_Convert(data, size, _bufferPos, 0); } diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/BranchMisc.h b/desmume/src/windows/7z/CPP/7zip/Compress/BranchMisc.h deleted file mode 100644 index 053e923a9..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/BranchMisc.h +++ /dev/null @@ -1,14 +0,0 @@ -// BranchMisc.h - -#ifndef __COMPRESS_BRANCH_MISC_H -#define __COMPRESS_BRANCH_MISC_H - -#include "BranchCoder.h" - -MyClassA(BC_ARM, 0x05, 1) -MyClassA(BC_ARMT, 0x07, 1) -MyClassA(BC_PPC, 0x02, 5) -MyClassA(BC_SPARC, 0x08, 5) -MyClassA(BC_IA64, 0x04, 1) - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/BranchRegister.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/BranchRegister.cpp deleted file mode 100644 index bc55dd668..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/BranchRegister.cpp +++ /dev/null @@ -1,30 +0,0 @@ -// BranchRegister.cpp - -#include "StdAfx.h" - -#include "../Common/RegisterCodec.h" - -#include "BranchMisc.h" - -#define CREATE_CODEC(x) \ - static void *CreateCodec ## x() { return (void *)(ICompressFilter *)(new C ## x ## _Decoder); } \ - static void *CreateCodec ## x ## Out() { return (void *)(ICompressFilter *)(new C ## x ## _Encoder); } - -CREATE_CODEC(BC_PPC) -CREATE_CODEC(BC_IA64) -CREATE_CODEC(BC_ARM) -CREATE_CODEC(BC_ARMT) -CREATE_CODEC(BC_SPARC) - -#define METHOD_ITEM(x, id1, id2, name) { CreateCodec ## x, CreateCodec ## x ## Out, 0x03030000 + (id1 * 256) + id2, name, 1, true } - -static CCodecInfo g_CodecsInfo[] = -{ - METHOD_ITEM(BC_PPC, 0x02, 0x05, L"PPC"), - METHOD_ITEM(BC_IA64, 0x04, 1, L"IA64"), - METHOD_ITEM(BC_ARM, 0x05, 1, L"ARM"), - METHOD_ITEM(BC_ARMT, 0x07, 1, L"ARMT"), - METHOD_ITEM(BC_SPARC, 0x08, 0x05, L"SPARC") -}; - -REGISTER_CODECS(Branch) diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/ByteSwap.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/ByteSwap.cpp deleted file mode 100644 index f21a7acfe..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/ByteSwap.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// ByteSwap.cpp - -#include "StdAfx.h" - -#include "ByteSwap.h" - -STDMETHODIMP CByteSwap2::Init() { return S_OK; } - -STDMETHODIMP_(UInt32) CByteSwap2::Filter(Byte *data, UInt32 size) -{ - const UInt32 kStep = 2; - UInt32 i; - for (i = 0; i + kStep <= size; i += kStep) - { - Byte b = data[i]; - data[i] = data[i + 1]; - data[i + 1] = b; - } - return i; -} - -STDMETHODIMP CByteSwap4::Init() { return S_OK; } - -STDMETHODIMP_(UInt32) CByteSwap4::Filter(Byte *data, UInt32 size) -{ - const UInt32 kStep = 4; - UInt32 i; - for (i = 0; i + kStep <= size; i += kStep) - { - Byte b0 = data[i]; - Byte b1 = data[i + 1]; - data[i] = data[i + 3]; - data[i + 1] = data[i + 2]; - data[i + 2] = b1; - data[i + 3] = b0; - } - return i; -} diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/ByteSwap.h b/desmume/src/windows/7z/CPP/7zip/Compress/ByteSwap.h deleted file mode 100644 index ecf983db4..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/ByteSwap.h +++ /dev/null @@ -1,30 +0,0 @@ -// ByteSwap.h - -#ifndef __COMPRESS_BYTE_SWAP_H -#define __COMPRESS_BYTE_SWAP_H - -#include "../../Common/MyCom.h" - -#include "../ICoder.h" - -class CByteSwap2: - public ICompressFilter, - public CMyUnknownImp -{ -public: - MY_UNKNOWN_IMP - STDMETHOD(Init)(); - STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size); -}; - -class CByteSwap4: - public ICompressFilter, - public CMyUnknownImp -{ -public: - MY_UNKNOWN_IMP - STDMETHOD(Init)(); - STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size); -}; - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/ByteSwapRegister.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/ByteSwapRegister.cpp deleted file mode 100644 index c3413f67b..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/ByteSwapRegister.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// ByteSwapRegister.cpp - -#include "StdAfx.h" - -#include "../Common/RegisterCodec.h" - -#include "ByteSwap.h" - -static void *CreateCodec2() { return (void *)(ICompressFilter *)(new CByteSwap2); } -static void *CreateCodec4() { return (void *)(ICompressFilter *)(new CByteSwap4); } - -static CCodecInfo g_CodecsInfo[] = -{ - { CreateCodec2, CreateCodec4, 0x020302, L"Swap2", 1, true }, - { CreateCodec4, CreateCodec4, 0x020304, L"Swap4", 1, true } -}; - -REGISTER_CODECS(ByteSwap) diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/Codec.def b/desmume/src/windows/7z/CPP/7zip/Compress/Codec.def deleted file mode 100644 index aab87ef8e..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/Codec.def +++ /dev/null @@ -1,4 +0,0 @@ -EXPORTS - CreateObject PRIVATE - GetNumberOfMethods PRIVATE - GetMethodProperty PRIVATE diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/CodecExports.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/CodecExports.cpp deleted file mode 100644 index 0cf84e73f..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/CodecExports.cpp +++ /dev/null @@ -1,157 +0,0 @@ -// CodecExports.cpp - -#include "StdAfx.h" - -#include "../../Common/ComTry.h" -#include "../../Windows/PropVariant.h" -#include "../Common/RegisterCodec.h" -#include "../ICoder.h" - -extern unsigned int g_NumCodecs; -extern const CCodecInfo *g_Codecs[]; - -static const UInt16 kDecodeId = 0x2790; - -DEFINE_GUID(CLSID_CCodec, -0x23170F69, 0x40C1, kDecodeId, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); - -static inline HRESULT SetPropString(const char *s, unsigned int size, PROPVARIANT *value) -{ - if ((value->bstrVal = ::SysAllocStringByteLen(s, size)) != 0) - value->vt = VT_BSTR; - return S_OK; -} - -static inline HRESULT SetPropGUID(const GUID &guid, PROPVARIANT *value) -{ - return SetPropString((const char *)&guid, sizeof(GUID), value); -} - -static HRESULT SetClassID(CMethodId id, bool encode, PROPVARIANT *value) -{ - GUID clsId = CLSID_CCodec; - for (int i = 0; i < sizeof(id); i++, id >>= 8) - clsId.Data4[i] = (Byte)(id & 0xFF); - if (encode) - clsId.Data3++; - return SetPropGUID(clsId, value); -} - -static HRESULT FindCodecClassId(const GUID *clsID, UInt32 isCoder2, bool isFilter, bool &encode, int &index) -{ - index = -1; - if (clsID->Data1 != CLSID_CCodec.Data1 || - clsID->Data2 != CLSID_CCodec.Data2 || - (clsID->Data3 & ~1) != kDecodeId) - return S_OK; - encode = (clsID->Data3 != kDecodeId); - UInt64 id = 0; - for (int j = 0; j < 8; j++) - id |= ((UInt64)clsID->Data4[j]) << (8 * j); - for (unsigned i = 0; i < g_NumCodecs; i++) - { - const CCodecInfo &codec = *g_Codecs[i]; - if (id != codec.Id || encode && !codec.CreateEncoder || !encode && !codec.CreateDecoder) - continue; - if (!isFilter && codec.IsFilter || isFilter && !codec.IsFilter || - codec.NumInStreams != 1 && !isCoder2 || codec.NumInStreams == 1 && isCoder2) - return E_NOINTERFACE; - index = i; - return S_OK; - } - return S_OK; -} - -STDAPI CreateCoder2(bool encode, UInt32 index, const GUID *iid, void **outObject) -{ - COM_TRY_BEGIN - *outObject = 0; - bool isCoder = (*iid == IID_ICompressCoder) != 0; - bool isCoder2 = (*iid == IID_ICompressCoder2) != 0; - bool isFilter = (*iid == IID_ICompressFilter) != 0; - const CCodecInfo &codec = *g_Codecs[index]; - if (!isFilter && codec.IsFilter || isFilter && !codec.IsFilter || - codec.NumInStreams != 1 && !isCoder2 || codec.NumInStreams == 1 && isCoder2) - return E_NOINTERFACE; - if (encode) - { - if (!codec.CreateEncoder) - return CLASS_E_CLASSNOTAVAILABLE; - *outObject = codec.CreateEncoder(); - } - else - { - if (!codec.CreateDecoder) - return CLASS_E_CLASSNOTAVAILABLE; - *outObject = codec.CreateDecoder(); - } - if (isCoder) - ((ICompressCoder *)*outObject)->AddRef(); - else if (isCoder2) - ((ICompressCoder2 *)*outObject)->AddRef(); - else - ((ICompressFilter *)*outObject)->AddRef(); - return S_OK; - COM_TRY_END -} - -STDAPI CreateCoder(const GUID *clsid, const GUID *iid, void **outObject) -{ - *outObject = 0; - bool isCoder = (*iid == IID_ICompressCoder) != 0; - bool isCoder2 = (*iid == IID_ICompressCoder2) != 0; - bool isFilter = (*iid == IID_ICompressFilter) != 0; - if (!isCoder && !isCoder2 && !isFilter) - return E_NOINTERFACE; - bool encode; - int codecIndex; - HRESULT res = FindCodecClassId(clsid, isCoder2, isFilter, encode, codecIndex); - if (res != S_OK) - return res; - if (codecIndex < 0) - return CLASS_E_CLASSNOTAVAILABLE; - return CreateCoder2(encode, codecIndex, iid, outObject); -} - -STDAPI GetMethodProperty(UInt32 codecIndex, PROPID propID, PROPVARIANT *value) -{ - ::VariantClear((VARIANTARG *)value); - const CCodecInfo &codec = *g_Codecs[codecIndex]; - switch(propID) - { - case NMethodPropID::kID: - { - value->uhVal.QuadPart = (UInt64)codec.Id; - value->vt = VT_UI8; - break; - } - case NMethodPropID::kName: - if ((value->bstrVal = ::SysAllocString(codec.Name)) != 0) - value->vt = VT_BSTR; - break; - case NMethodPropID::kDecoder: - if (codec.CreateDecoder) - return SetClassID(codec.Id, false, value); - break; - case NMethodPropID::kEncoder: - if (codec.CreateEncoder) - return SetClassID(codec.Id, true, value); - break; - case NMethodPropID::kInStreams: - { - if (codec.NumInStreams != 1) - { - value->vt = VT_UI4; - value->ulVal = (ULONG)codec.NumInStreams; - } - break; - } - } - return S_OK; -} - -STDAPI GetNumberOfMethods(UINT32 *numCodecs) -{ - *numCodecs = g_NumCodecs; - return S_OK; -} diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/CopyCoder.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/CopyCoder.cpp deleted file mode 100644 index 4c2f5e0fc..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/CopyCoder.cpp +++ /dev/null @@ -1,62 +0,0 @@ -// Compress/CopyCoder.cpp - -#include "StdAfx.h" - -extern "C" -{ -#include "../../../C/Alloc.h" -} - -#include "../Common/StreamUtils.h" - -#include "CopyCoder.h" - -namespace NCompress { - -static const UInt32 kBufferSize = 1 << 17; - -CCopyCoder::~CCopyCoder() -{ - ::MidFree(_buffer); -} - -STDMETHODIMP CCopyCoder::Code(ISequentialInStream *inStream, - ISequentialOutStream *outStream, - const UInt64 * /* inSize */, const UInt64 *outSize, - ICompressProgressInfo *progress) -{ - if (_buffer == 0) - { - _buffer = (Byte *)::MidAlloc(kBufferSize); - if (_buffer == 0) - return E_OUTOFMEMORY; - } - - TotalSize = 0; - for (;;) - { - UInt32 realProcessedSize; - UInt32 size = kBufferSize; - if (outSize != 0) - if (size > *outSize - TotalSize) - size = (UInt32)(*outSize - TotalSize); - RINOK(inStream->Read(_buffer, size, &realProcessedSize)); - if (realProcessedSize == 0) - break; - RINOK(WriteStream(outStream, _buffer, realProcessedSize)); - TotalSize += realProcessedSize; - if (progress != NULL) - { - RINOK(progress->SetRatioInfo(&TotalSize, &TotalSize)); - } - } - return S_OK; -} - -STDMETHODIMP CCopyCoder::GetInStreamProcessedSize(UInt64 *value) -{ - *value = TotalSize; - return S_OK; -} - -} diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/CopyCoder.h b/desmume/src/windows/7z/CPP/7zip/Compress/CopyCoder.h deleted file mode 100644 index 7c9d3d355..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/CopyCoder.h +++ /dev/null @@ -1,32 +0,0 @@ -// Compress/CopyCoder.h - -#ifndef __COMPRESS_COPY_CODER_H -#define __COMPRESS_COPY_CODER_H - -#include "../../Common/MyCom.h" - -#include "../ICoder.h" - -namespace NCompress { - -class CCopyCoder: - public ICompressCoder, - public ICompressGetInStreamProcessedSize, - public CMyUnknownImp -{ - Byte *_buffer; -public: - UInt64 TotalSize; - CCopyCoder(): TotalSize(0) , _buffer(0) {}; - ~CCopyCoder(); - - MY_UNKNOWN_IMP1(ICompressGetInStreamProcessedSize) - - STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); - STDMETHOD(GetInStreamProcessedSize)(UInt64 *value); -}; - -} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/CopyRegister.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/CopyRegister.cpp deleted file mode 100644 index 3ef245978..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/CopyRegister.cpp +++ /dev/null @@ -1,14 +0,0 @@ -// CopyRegister.cpp - -#include "StdAfx.h" - -#include "../Common/RegisterCodec.h" - -#include "CopyCoder.h" - -static void *CreateCodec() { return (void *)(ICompressCoder *)(new NCompress::CCopyCoder); } - -static CCodecInfo g_CodecInfo = -{ CreateCodec, CreateCodec, 0x00, L"Copy", 1, false }; - -REGISTER_CODEC(Copy) diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/Deflate64Register.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/Deflate64Register.cpp deleted file mode 100644 index 6d6a904d1..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/Deflate64Register.cpp +++ /dev/null @@ -1,20 +0,0 @@ -// Deflate64Register.cpp - -#include "StdAfx.h" - -#include "../Common/RegisterCodec.h" - -#include "DeflateDecoder.h" - -static void *CreateCodecDeflate64() { return (void *)(ICompressCoder *)(new NCompress::NDeflate::NDecoder::CCOMCoder64); } -#if !defined(EXTRACT_ONLY) && !defined(DEFLATE_EXTRACT_ONLY) -#include "DeflateEncoder.h" -static void *CreateCodecOutDeflate64() { return (void *)(ICompressCoder *)(new NCompress::NDeflate::NEncoder::CCOMCoder64); } -#else -#define CreateCodecOutDeflate64 0 -#endif - -static CCodecInfo g_CodecInfo = - { CreateCodecDeflate64, CreateCodecOutDeflate64, 0x040109, L"Deflate64", 1, false }; - -REGISTER_CODEC(Deflate64) diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/DeflateConst.h b/desmume/src/windows/7z/CPP/7zip/Compress/DeflateConst.h deleted file mode 100644 index b5c28d79e..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/DeflateConst.h +++ /dev/null @@ -1,134 +0,0 @@ -// DeflateConst.h - -#ifndef __DEFLATE_CONST_H -#define __DEFLATE_CONST_H - -namespace NCompress { -namespace NDeflate { - -const int kNumHuffmanBits = 15; - -const UInt32 kHistorySize32 = (1 << 15); -const UInt32 kHistorySize64 = (1 << 16); - -const UInt32 kDistTableSize32 = 30; -const UInt32 kDistTableSize64 = 32; - -const UInt32 kNumLenSymbols32 = 256; -const UInt32 kNumLenSymbols64 = 255; // don't change it. It must be <= 255. -const UInt32 kNumLenSymbolsMax = kNumLenSymbols32; - -const UInt32 kNumLenSlots = 29; - -const UInt32 kFixedDistTableSize = 32; -const UInt32 kFixedLenTableSize = 31; - -const UInt32 kSymbolEndOfBlock = 0x100; -const UInt32 kSymbolMatch = kSymbolEndOfBlock + 1; - -const UInt32 kMainTableSize = kSymbolMatch + kNumLenSlots; -const UInt32 kFixedMainTableSize = kSymbolMatch + kFixedLenTableSize; - -const UInt32 kLevelTableSize = 19; - -const UInt32 kTableDirectLevels = 16; -const UInt32 kTableLevelRepNumber = kTableDirectLevels; -const UInt32 kTableLevel0Number = kTableLevelRepNumber + 1; -const UInt32 kTableLevel0Number2 = kTableLevel0Number + 1; - -const UInt32 kLevelMask = 0xF; - -const Byte kLenStart32[kFixedLenTableSize] = - {0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224, 255, 0, 0}; -const Byte kLenStart64[kFixedLenTableSize] = - {0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224, 0, 0, 0}; - -const Byte kLenDirectBits32[kFixedLenTableSize] = - {0,0,0,0,0,0,0,0,1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0}; -const Byte kLenDirectBits64[kFixedLenTableSize] = - {0,0,0,0,0,0,0,0,1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 16, 0, 0}; - -const UInt32 kDistStart[kDistTableSize64] = - {0,1,2,3,4,6,8,12,16,24,32,48,64,96,128,192,256,384,512,768, - 1024,1536,2048,3072,4096,6144,8192,12288,16384,24576,32768,49152}; -const Byte kDistDirectBits[kDistTableSize64] = - {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14}; - -const Byte kLevelDirectBits[3] = {2, 3, 7}; - -const Byte kCodeLengthAlphabetOrder[kLevelTableSize] = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; - -const UInt32 kMatchMinLen = 3; -const UInt32 kMatchMaxLen32 = kNumLenSymbols32 + kMatchMinLen - 1; //256 + 2 -const UInt32 kMatchMaxLen64 = kNumLenSymbols64 + kMatchMinLen - 1; //255 + 2 -const UInt32 kMatchMaxLen = kMatchMaxLen32; - -const int kFinalBlockFieldSize = 1; - -namespace NFinalBlockField -{ - enum - { - kNotFinalBlock = 0, - kFinalBlock = 1 - }; -} - -const int kBlockTypeFieldSize = 2; - -namespace NBlockType -{ - enum - { - kStored = 0, - kFixedHuffman = 1, - kDynamicHuffman = 2 - }; -} - -const int kNumLenCodesFieldSize = 5; -const int kNumDistCodesFieldSize = 5; -const int kNumLevelCodesFieldSize = 4; - -const UInt32 kNumLitLenCodesMin = 257; -const UInt32 kNumDistCodesMin = 1; -const UInt32 kNumLevelCodesMin = 4; - -const int kLevelFieldSize = 3; - -const int kStoredBlockLengthFieldSize = 16; - -struct CLevels -{ - Byte litLenLevels[kFixedMainTableSize]; - Byte distLevels[kFixedDistTableSize]; - - void SubClear() - { - UInt32 i; - for(i = kNumLitLenCodesMin; i < kFixedMainTableSize; i++) - litLenLevels[i] = 0; - for(i = 0; i < kFixedDistTableSize; i++) - distLevels[i] = 0; - } - - void SetFixedLevels() - { - int i; - - for (i = 0; i < 144; i++) - litLenLevels[i] = 8; - for (; i < 256; i++) - litLenLevels[i] = 9; - for (; i < 280; i++) - litLenLevels[i] = 7; - for (; i < 288; i++) - litLenLevels[i] = 8; - for (i = 0; i < kFixedDistTableSize; i++) // test it: InfoZip only uses kDistTableSize - distLevels[i] = 5; - } -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/DeflateDecoder.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/DeflateDecoder.cpp deleted file mode 100644 index 31a61371b..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/DeflateDecoder.cpp +++ /dev/null @@ -1,345 +0,0 @@ -// DeflateDecoder.cpp - -#include "StdAfx.h" - -#include "DeflateDecoder.h" - -namespace NCompress { -namespace NDeflate { -namespace NDecoder { - -static const int kLenIdFinished = -1; -static const int kLenIdNeedInit = -2; - -CCoder::CCoder(bool deflate64Mode, bool deflateNSIS): - _deflate64Mode(deflate64Mode), - _deflateNSIS(deflateNSIS), - _keepHistory(false), - ZlibMode(false) {} - -UInt32 CCoder::ReadBits(int numBits) -{ - return m_InBitStream.ReadBits(numBits); -} - -bool CCoder::DeCodeLevelTable(Byte *values, int numSymbols) -{ - int i = 0; - do - { - UInt32 number = m_LevelDecoder.DecodeSymbol(&m_InBitStream); - if (number < kTableDirectLevels) - values[i++] = (Byte)number; - else if (number < kLevelTableSize) - { - if (number == kTableLevelRepNumber) - { - if (i == 0) - return false; - int num = ReadBits(2) + 3; - for (; num > 0 && i < numSymbols; num--, i++) - values[i] = values[i - 1]; - } - else - { - int num; - if (number == kTableLevel0Number) - num = ReadBits(3) + 3; - else - num = ReadBits(7) + 11; - for (;num > 0 && i < numSymbols; num--) - values[i++] = 0; - } - } - else - return false; - } - while(i < numSymbols); - return true; -} - -#define RIF(x) { if (!(x)) return false; } - -bool CCoder::ReadTables(void) -{ - m_FinalBlock = (ReadBits(kFinalBlockFieldSize) == NFinalBlockField::kFinalBlock); - UInt32 blockType = ReadBits(kBlockTypeFieldSize); - if (blockType > NBlockType::kDynamicHuffman) - return false; - - if (blockType == NBlockType::kStored) - { - m_StoredMode = true; - UInt32 currentBitPosition = m_InBitStream.GetBitPosition(); - int numBitsForAlign = (int)(currentBitPosition > 0 ? (8 - currentBitPosition): 0); - ReadBits(numBitsForAlign); - m_StoredBlockSize = ReadBits(kStoredBlockLengthFieldSize); - if (_deflateNSIS) - return true; - return (m_StoredBlockSize == (UInt16)~ReadBits(kStoredBlockLengthFieldSize)); - } - - m_StoredMode = false; - - CLevels levels; - if (blockType == NBlockType::kFixedHuffman) - { - levels.SetFixedLevels(); - _numDistLevels = _deflate64Mode ? kDistTableSize64 : kDistTableSize32; - } - else - { - int numLitLenLevels = ReadBits(kNumLenCodesFieldSize) + kNumLitLenCodesMin; - _numDistLevels = ReadBits(kNumDistCodesFieldSize) + kNumDistCodesMin; - int numLevelCodes = ReadBits(kNumLevelCodesFieldSize) + kNumLevelCodesMin; - - if (!_deflate64Mode) - if (_numDistLevels > kDistTableSize32) - return false; - - Byte levelLevels[kLevelTableSize]; - for (int i = 0; i < kLevelTableSize; i++) - { - int position = kCodeLengthAlphabetOrder[i]; - if(i < numLevelCodes) - levelLevels[position] = (Byte)ReadBits(kLevelFieldSize); - else - levelLevels[position] = 0; - } - - RIF(m_LevelDecoder.SetCodeLengths(levelLevels)); - - Byte tmpLevels[kFixedMainTableSize + kFixedDistTableSize]; - if (!DeCodeLevelTable(tmpLevels, numLitLenLevels + _numDistLevels)) - return false; - - levels.SubClear(); - memcpy(levels.litLenLevels, tmpLevels, numLitLenLevels); - memcpy(levels.distLevels, tmpLevels + numLitLenLevels, _numDistLevels); - } - RIF(m_MainDecoder.SetCodeLengths(levels.litLenLevels)); - return m_DistDecoder.SetCodeLengths(levels.distLevels); -} - -HRESULT CCoder::CodeSpec(UInt32 curSize) -{ - if (_remainLen == kLenIdFinished) - return S_OK; - if (_remainLen == kLenIdNeedInit) - { - if (!_keepHistory) - if (!m_OutWindowStream.Create(_deflate64Mode ? kHistorySize64: kHistorySize32)) - return E_OUTOFMEMORY; - if (!m_InBitStream.Create(1 << 17)) - return E_OUTOFMEMORY; - m_OutWindowStream.Init(_keepHistory); - m_InBitStream.Init(); - m_FinalBlock = false; - _remainLen = 0; - _needReadTable = true; - } - - if (curSize == 0) - return S_OK; - - while(_remainLen > 0 && curSize > 0) - { - _remainLen--; - Byte b = m_OutWindowStream.GetByte(_rep0); - m_OutWindowStream.PutByte(b); - curSize--; - } - - while(curSize > 0) - { - if (_needReadTable) - { - if (m_FinalBlock) - { - _remainLen = kLenIdFinished; - break; - } - if (!ReadTables()) - return S_FALSE; - _needReadTable = false; - } - - if(m_StoredMode) - { - for (; m_StoredBlockSize > 0 && curSize > 0; m_StoredBlockSize--, curSize--) - m_OutWindowStream.PutByte((Byte)m_InBitStream.ReadBits(8)); - _needReadTable = (m_StoredBlockSize == 0); - continue; - } - while(curSize > 0) - { - if (m_InBitStream.NumExtraBytes > 4) - return S_FALSE; - - UInt32 number = m_MainDecoder.DecodeSymbol(&m_InBitStream); - if (number < 0x100) - { - m_OutWindowStream.PutByte((Byte)number); - curSize--; - continue; - } - else if (number == kSymbolEndOfBlock) - { - _needReadTable = true; - break; - } - else if (number < kMainTableSize) - { - number -= kSymbolMatch; - UInt32 len; - { - int numBits; - if (_deflate64Mode) - { - len = kLenStart64[number]; - numBits = kLenDirectBits64[number]; - } - else - { - len = kLenStart32[number]; - numBits = kLenDirectBits32[number]; - } - len += kMatchMinLen + m_InBitStream.ReadBits(numBits); - } - UInt32 locLen = len; - if (locLen > curSize) - locLen = (UInt32)curSize; - number = m_DistDecoder.DecodeSymbol(&m_InBitStream); - if (number >= _numDistLevels) - return S_FALSE; - UInt32 distance = kDistStart[number] + m_InBitStream.ReadBits(kDistDirectBits[number]); - if (!m_OutWindowStream.CopyBlock(distance, locLen)) - return S_FALSE; - curSize -= locLen; - len -= locLen; - if (len != 0) - { - _remainLen = (Int32)len; - _rep0 = distance; - break; - } - } - else - return S_FALSE; - } - } - return S_OK; -} - -HRESULT CCoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *, const UInt64 *outSize, ICompressProgressInfo *progress) -{ - SetInStream(inStream); - m_OutWindowStream.SetStream(outStream); - SetOutStreamSize(outSize); - CCoderReleaser flusher(this); - - const UInt64 start = m_OutWindowStream.GetProcessedSize(); - for (;;) - { - UInt32 curSize = 1 << 18; - if (outSize != 0) - { - const UInt64 rem = *outSize - (m_OutWindowStream.GetProcessedSize() - start); - if (curSize > rem) - curSize = (UInt32)rem; - } - if (curSize == 0) - break; - RINOK(CodeSpec(curSize)); - if (_remainLen == kLenIdFinished) - break; - if (progress != NULL) - { - const UInt64 inSize = m_InBitStream.GetProcessedSize(); - const UInt64 nowPos64 = m_OutWindowStream.GetProcessedSize() - start; - RINOK(progress->SetRatioInfo(&inSize, &nowPos64)); - } - } - if (_remainLen == kLenIdFinished && ZlibMode) - { - UInt32 currentBitPosition = m_InBitStream.GetBitPosition(); - int numBitsForAlign = (int)(currentBitPosition > 0 ? (8 - currentBitPosition): 0); - ReadBits(numBitsForAlign); - for (int i = 0; i < 4; i++) - ZlibFooter[i] = (Byte)m_InBitStream.ReadBits(8); - } - flusher.NeedFlush = false; - return Flush(); -} - - -#ifdef _NO_EXCEPTIONS - -#define DEFLATE_TRY_BEGIN -#define DEFLATE_TRY_END - -#else - -#define DEFLATE_TRY_BEGIN try { -#define DEFLATE_TRY_END } \ - catch(const CInBufferException &e) { return e.ErrorCode; } \ - catch(const CLzOutWindowException &e) { return e.ErrorCode; } \ - catch(...) { return S_FALSE; } - -#endif - -HRESULT CCoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress) -{ - DEFLATE_TRY_BEGIN - return CodeReal(inStream, outStream, inSize, outSize, progress); - DEFLATE_TRY_END -} - -STDMETHODIMP CCoder::GetInStreamProcessedSize(UInt64 *value) -{ - if (value == NULL) - return E_INVALIDARG; - *value = m_InBitStream.GetProcessedSize(); - return S_OK; -} - -STDMETHODIMP CCoder::SetInStream(ISequentialInStream *inStream) -{ - m_InBitStream.SetStream(inStream); - return S_OK; -} - -STDMETHODIMP CCoder::ReleaseInStream() -{ - m_InBitStream.ReleaseStream(); - return S_OK; -} - -STDMETHODIMP CCoder::SetOutStreamSize(const UInt64 * /* outSize */) -{ - _remainLen = kLenIdNeedInit; - m_OutWindowStream.Init(_keepHistory); - return S_OK; -} - -#ifndef NO_READ_FROM_CODER - -STDMETHODIMP CCoder::Read(void *data, UInt32 size, UInt32 *processedSize) -{ - DEFLATE_TRY_BEGIN - if (processedSize) - *processedSize = 0; - const UInt64 startPos = m_OutWindowStream.GetProcessedSize(); - m_OutWindowStream.SetMemStream((Byte *)data); - RINOK(CodeSpec(size)); - if (processedSize) - *processedSize = (UInt32)(m_OutWindowStream.GetProcessedSize() - startPos); - return Flush(); - DEFLATE_TRY_END -} - -#endif - -}}} diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/DeflateDecoder.h b/desmume/src/windows/7z/CPP/7zip/Compress/DeflateDecoder.h deleted file mode 100644 index 3a81e1657..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/DeflateDecoder.h +++ /dev/null @@ -1,136 +0,0 @@ -// DeflateDecoder.h - -#ifndef __DEFLATE_DECODER_H -#define __DEFLATE_DECODER_H - -#include "../../Common/MyCom.h" - -#include "../ICoder.h" - -#include "../Common/InBuffer.h" - -#include "BitlDecoder.h" -#include "DeflateConst.h" -#include "HuffmanDecoder.h" -#include "LzOutWindow.h" - -namespace NCompress { -namespace NDeflate { -namespace NDecoder { - -class CCoder: - public ICompressCoder, - public ICompressGetInStreamProcessedSize, - #ifndef NO_READ_FROM_CODER - public ICompressSetInStream, - public ICompressSetOutStreamSize, - public ISequentialInStream, - #endif - public CMyUnknownImp -{ - CLzOutWindow m_OutWindowStream; - NBitl::CDecoder m_InBitStream; - NCompress::NHuffman::CDecoder m_MainDecoder; - NCompress::NHuffman::CDecoder m_DistDecoder; - NCompress::NHuffman::CDecoder m_LevelDecoder; - - UInt32 m_StoredBlockSize; - - bool m_FinalBlock; - bool m_StoredMode; - UInt32 _numDistLevels; - - - bool _deflateNSIS; - bool _deflate64Mode; - bool _keepHistory; - Int32 _remainLen; - UInt32 _rep0; - bool _needReadTable; - - UInt32 ReadBits(int numBits); - - bool DeCodeLevelTable(Byte *values, int numSymbols); - bool ReadTables(); - - void ReleaseStreams() - { - m_OutWindowStream.ReleaseStream(); - ReleaseInStream(); - } - - HRESULT Flush() { return m_OutWindowStream.Flush(); } - class CCoderReleaser - { - CCoder *m_Coder; - public: - bool NeedFlush; - CCoderReleaser(CCoder *coder): m_Coder(coder), NeedFlush(true) {} - ~CCoderReleaser() - { - if (NeedFlush) - m_Coder->Flush(); - m_Coder->ReleaseStreams(); - } - }; - friend class CCoderReleaser; - - HRESULT CodeSpec(UInt32 curSize); -public: - bool ZlibMode; - Byte ZlibFooter[4]; - - CCoder(bool deflate64Mode, bool deflateNSIS = false); - void SetKeepHistory(bool keepHistory) { _keepHistory = keepHistory; } - - HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); - - #ifndef NO_READ_FROM_CODER - MY_UNKNOWN_IMP4( - ICompressGetInStreamProcessedSize, - ICompressSetInStream, - ICompressSetOutStreamSize, - ISequentialInStream - ) - #else - MY_UNKNOWN_IMP1( - ICompressGetInStreamProcessedSize) - #endif - - STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); - - STDMETHOD(SetInStream)(ISequentialInStream *inStream); - STDMETHOD(ReleaseInStream)(); - STDMETHOD(SetOutStreamSize)(const UInt64 *outSize); - - #ifndef NO_READ_FROM_CODER - STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); - #endif - - // IGetInStreamProcessedSize - STDMETHOD(GetInStreamProcessedSize)(UInt64 *value); -}; - -class CCOMCoder : public CCoder -{ -public: - CCOMCoder(): CCoder(false) {} -}; - -class CNsisCOMCoder : public CCoder -{ -public: - CNsisCOMCoder(): CCoder(false, true) {} -}; - -class CCOMCoder64 : public CCoder -{ -public: - CCOMCoder64(): CCoder(true) {} -}; - -}}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/DeflateNsisRegister.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/DeflateNsisRegister.cpp deleted file mode 100644 index dbb128368..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/DeflateNsisRegister.cpp +++ /dev/null @@ -1,14 +0,0 @@ -// DeflateNsisRegister.cpp - -#include "StdAfx.h" - -#include "../Common/RegisterCodec.h" - -#include "DeflateDecoder.h" - -static void *CreateCodecDeflateNsis() { return (void *)(ICompressCoder *)(new NCompress::NDeflate::NDecoder::CNsisCOMCoder); } - -static CCodecInfo g_CodecInfo = - { CreateCodecDeflateNsis, 0, 0x040901, L"DeflateNSIS", 1, false }; - -REGISTER_CODEC(DeflateNsis) diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/DeflateRegister.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/DeflateRegister.cpp deleted file mode 100644 index d8a9c8dc8..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/DeflateRegister.cpp +++ /dev/null @@ -1,21 +0,0 @@ -// DeflateRegister.cpp - -#include "StdAfx.h" - -#include "../Common/RegisterCodec.h" - -#include "DeflateDecoder.h" - -static void *CreateCodecDeflate() { return (void *)(ICompressCoder *)(new NCompress::NDeflate::NDecoder::CCOMCoder); } - -#if !defined(EXTRACT_ONLY) && !defined(DEFLATE_EXTRACT_ONLY) -#include "DeflateEncoder.h" -static void *CreateCodecOutDeflate() { return (void *)(ICompressCoder *)(new NCompress::NDeflate::NEncoder::CCOMCoder); } -#else -#define CreateCodecOutDeflate 0 -#endif - -static CCodecInfo g_CodecInfo = - { CreateCodecDeflate, CreateCodecOutDeflate, 0x040108, L"Deflate", 1, false }; - -REGISTER_CODEC(Deflate) diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/HuffmanDecoder.h b/desmume/src/windows/7z/CPP/7zip/Compress/HuffmanDecoder.h deleted file mode 100644 index f71a58282..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/HuffmanDecoder.h +++ /dev/null @@ -1,89 +0,0 @@ -// Compress/HuffmanDecoder.h - -#ifndef __COMPRESS_HUFFMAN_DECODER_H -#define __COMPRESS_HUFFMAN_DECODER_H - -#include "../../Common/Types.h" - -namespace NCompress { -namespace NHuffman { - -const int kNumTableBits = 9; - -template -class CDecoder -{ - UInt32 m_Limits[kNumBitsMax + 1]; // m_Limits[i] = value limit for symbols with length = i - UInt32 m_Positions[kNumBitsMax + 1]; // m_Positions[i] = index in m_Symbols[] of first symbol with length = i - UInt32 m_Symbols[m_NumSymbols]; - Byte m_Lengths[1 << kNumTableBits]; // Table oh length for short codes. - -public: - - bool SetCodeLengths(const Byte *codeLengths) - { - int lenCounts[kNumBitsMax + 1]; - UInt32 tmpPositions[kNumBitsMax + 1]; - int i; - for(i = 1; i <= kNumBitsMax; i++) - lenCounts[i] = 0; - UInt32 symbol; - for (symbol = 0; symbol < m_NumSymbols; symbol++) - { - int len = codeLengths[symbol]; - if (len > kNumBitsMax) - return false; - lenCounts[len]++; - m_Symbols[symbol] = 0xFFFFFFFF; - } - lenCounts[0] = 0; - m_Positions[0] = m_Limits[0] = 0; - UInt32 startPos = 0; - UInt32 index = 0; - const UInt32 kMaxValue = (1 << kNumBitsMax); - for (i = 1; i <= kNumBitsMax; i++) - { - startPos += lenCounts[i] << (kNumBitsMax - i); - if (startPos > kMaxValue) - return false; - m_Limits[i] = (i == kNumBitsMax) ? kMaxValue : startPos; - m_Positions[i] = m_Positions[i - 1] + lenCounts[i - 1]; - tmpPositions[i] = m_Positions[i]; - if(i <= kNumTableBits) - { - UInt32 limit = (m_Limits[i] >> (kNumBitsMax - kNumTableBits)); - for (; index < limit; index++) - m_Lengths[index] = (Byte)i; - } - } - for (symbol = 0; symbol < m_NumSymbols; symbol++) - { - int len = codeLengths[symbol]; - if (len != 0) - m_Symbols[tmpPositions[len]++] = symbol; - } - return true; - } - - template - UInt32 DecodeSymbol(TBitDecoder *bitStream) - { - int numBits; - UInt32 value = bitStream->GetValue(kNumBitsMax); - if (value < m_Limits[kNumTableBits]) - numBits = m_Lengths[value >> (kNumBitsMax - kNumTableBits)]; - else - for (numBits = kNumTableBits + 1; value >= m_Limits[numBits]; numBits++); - bitStream->MovePos(numBits); - UInt32 index = m_Positions[numBits] + - ((value - m_Limits[numBits - 1]) >> (kNumBitsMax - numBits)); - if (index >= m_NumSymbols) - // throw CDecoderException(); // test it - return 0xFFFFFFFF; - return m_Symbols[index]; - } -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/ImplodeDecoder.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/ImplodeDecoder.cpp deleted file mode 100644 index 6c5e36284..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/ImplodeDecoder.cpp +++ /dev/null @@ -1,219 +0,0 @@ -// Implode/Decoder.cpp - -#include "StdAfx.h" - -#include "ImplodeDecoder.h" -#include "Common/Defs.h" - -namespace NCompress { -namespace NImplode { -namespace NDecoder { - -class CException -{ -public: - enum ECauseType - { - kData - } m_Cause; - CException(ECauseType cause): m_Cause(cause) {} -}; - -static const int kNumDistanceLowDirectBitsForBigDict = 7; -static const int kNumDistanceLowDirectBitsForSmallDict = 6; - -static const int kNumBitsInByte = 8; - -// static const int kLevelStructuresNumberFieldSize = kNumBitsInByte; -static const int kLevelStructuresNumberAdditionalValue = 1; - -static const int kNumLevelStructureLevelBits = 4; -static const int kLevelStructureLevelAdditionalValue = 1; - -static const int kNumLevelStructureRepNumberBits = 4; -static const int kLevelStructureRepNumberAdditionalValue = 1; - - -static const int kLiteralTableSize = (1 << kNumBitsInByte); -static const int kDistanceTableSize = 64; -static const int kLengthTableSize = 64; - -static const UInt32 kHistorySize = - (1 << MyMax(kNumDistanceLowDirectBitsForBigDict, - kNumDistanceLowDirectBitsForSmallDict)) * - kDistanceTableSize; // = 8 KB; - -static const int kNumAdditionalLengthBits = 8; - -static const UInt32 kMatchMinLenWhenLiteralsOn = 3; -static const UInt32 kMatchMinLenWhenLiteralsOff = 2; - -static const UInt32 kMatchMinLenMax = MyMax(kMatchMinLenWhenLiteralsOn, - kMatchMinLenWhenLiteralsOff); // 3 - -// static const UInt32 kMatchMaxLenMax = kMatchMinLenMax + (kLengthTableSize - 1) + (1 << kNumAdditionalLengthBits) - 1; // or 2 - -enum -{ - kMatchId = 0, - kLiteralId = 1 -}; - - -CCoder::CCoder(): - m_LiteralDecoder(kLiteralTableSize), - m_LengthDecoder(kLengthTableSize), - m_DistanceDecoder(kDistanceTableSize) -{ -} - -void CCoder::ReleaseStreams() -{ - m_OutWindowStream.ReleaseStream(); - m_InBitStream.ReleaseStream(); -} - -bool CCoder::ReadLevelItems(NImplode::NHuffman::CDecoder &decoder, - Byte *levels, int numLevelItems) -{ - int numCodedStructures = m_InBitStream.ReadBits(kNumBitsInByte) + - kLevelStructuresNumberAdditionalValue; - int currentIndex = 0; - for(int i = 0; i < numCodedStructures; i++) - { - int level = m_InBitStream.ReadBits(kNumLevelStructureLevelBits) + - kLevelStructureLevelAdditionalValue; - int rep = m_InBitStream.ReadBits(kNumLevelStructureRepNumberBits) + - kLevelStructureRepNumberAdditionalValue; - if (currentIndex + rep > numLevelItems) - throw CException(CException::kData); - for(int j = 0; j < rep; j++) - levels[currentIndex++] = (Byte)level; - } - if (currentIndex != numLevelItems) - return false; - return decoder.SetCodeLengths(levels); -} - - -bool CCoder::ReadTables(void) -{ - if (m_LiteralsOn) - { - Byte literalLevels[kLiteralTableSize]; - if (!ReadLevelItems(m_LiteralDecoder, literalLevels, kLiteralTableSize)) - return false; - } - - Byte lengthLevels[kLengthTableSize]; - if (!ReadLevelItems(m_LengthDecoder, lengthLevels, kLengthTableSize)) - return false; - - Byte distanceLevels[kDistanceTableSize]; - return ReadLevelItems(m_DistanceDecoder, distanceLevels, kDistanceTableSize); -} - -class CCoderReleaser -{ - CCoder *m_Coder; -public: - CCoderReleaser(CCoder *coder): m_Coder(coder) {} - ~CCoderReleaser() { m_Coder->ReleaseStreams(); } -}; - -HRESULT CCoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress) -{ - if (!m_InBitStream.Create(1 << 20)) - return E_OUTOFMEMORY; - if (!m_OutWindowStream.Create(kHistorySize)) - return E_OUTOFMEMORY; - if (outSize == NULL) - return E_INVALIDARG; - UInt64 pos = 0, unPackSize = *outSize; - - m_OutWindowStream.SetStream(outStream); - m_OutWindowStream.Init(false); - m_InBitStream.SetStream(inStream); - m_InBitStream.Init(); - CCoderReleaser coderReleaser(this); - - if (!ReadTables()) - return S_FALSE; - - while(pos < unPackSize) - { - if (progress != NULL && pos % (1 << 16) == 0) - { - UInt64 packSize = m_InBitStream.GetProcessedSize(); - RINOK(progress->SetRatioInfo(&packSize, &pos)); - } - if(m_InBitStream.ReadBits(1) == kMatchId) // match - { - UInt32 lowDistBits = m_InBitStream.ReadBits(m_NumDistanceLowDirectBits); - UInt32 distance = m_DistanceDecoder.DecodeSymbol(&m_InBitStream); - if (distance >= kDistanceTableSize) - return S_FALSE; - distance = (distance << m_NumDistanceLowDirectBits) + lowDistBits; - UInt32 lengthSymbol = m_LengthDecoder.DecodeSymbol(&m_InBitStream); - if (lengthSymbol >= kLengthTableSize) - return S_FALSE; - UInt32 length = lengthSymbol + m_MinMatchLength; - if (lengthSymbol == kLengthTableSize - 1) // special symbol = 63 - length += m_InBitStream.ReadBits(kNumAdditionalLengthBits); - while(distance >= pos && length > 0) - { - m_OutWindowStream.PutByte(0); - pos++; - length--; - } - if (length > 0) - m_OutWindowStream.CopyBlock(distance, length); - pos += length; - } - else - { - Byte b; - if (m_LiteralsOn) - { - UInt32 temp = m_LiteralDecoder.DecodeSymbol(&m_InBitStream); - if (temp >= kLiteralTableSize) - return S_FALSE; - b = (Byte)temp; - } - else - b = (Byte)m_InBitStream.ReadBits(kNumBitsInByte); - m_OutWindowStream.PutByte(b); - pos++; - } - } - if (pos > unPackSize) - return S_FALSE; - return m_OutWindowStream.Flush(); -} - -STDMETHODIMP CCoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress) -{ - try { return CodeReal(inStream, outStream, inSize, outSize, progress); } - catch(const CLzOutWindowException &e) { return e.ErrorCode; } - catch(...) { return S_FALSE; } -} - -STDMETHODIMP CCoder::SetDecoderProperties2(const Byte *data, UInt32 size) -{ - if (size < 1) - return E_INVALIDARG; - Byte flag = data[0]; - m_BigDictionaryOn = ((flag & 2) != 0); - m_NumDistanceLowDirectBits = m_BigDictionaryOn ? - kNumDistanceLowDirectBitsForBigDict: - kNumDistanceLowDirectBitsForSmallDict; - m_LiteralsOn = ((flag & 4) != 0); - m_MinMatchLength = m_LiteralsOn ? - kMatchMinLenWhenLiteralsOn : - kMatchMinLenWhenLiteralsOff; - return S_OK; -} - -}}} diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/ImplodeDecoder.h b/desmume/src/windows/7z/CPP/7zip/Compress/ImplodeDecoder.h deleted file mode 100644 index 2b45f05da..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/ImplodeDecoder.h +++ /dev/null @@ -1,57 +0,0 @@ -// ImplodeDecoder.h - -#ifndef __COMPRESS_IMPLODE_DECODER_H -#define __COMPRESS_IMPLODE_DECODER_H - -#include "../../Common/MyCom.h" - -#include "../ICoder.h" - -#include "ImplodeHuffmanDecoder.h" -#include "LzOutWindow.h" - -namespace NCompress { -namespace NImplode { -namespace NDecoder { - -class CCoder: - public ICompressCoder, - public ICompressSetDecoderProperties2, - public CMyUnknownImp -{ - CLzOutWindow m_OutWindowStream; - NBitl::CDecoder m_InBitStream; - - NImplode::NHuffman::CDecoder m_LiteralDecoder; - NImplode::NHuffman::CDecoder m_LengthDecoder; - NImplode::NHuffman::CDecoder m_DistanceDecoder; - - bool m_BigDictionaryOn; - bool m_LiteralsOn; - - int m_NumDistanceLowDirectBits; - UInt32 m_MinMatchLength; - - bool ReadLevelItems(NImplode::NHuffman::CDecoder &table, Byte *levels, int numLevelItems); - bool ReadTables(); - void DeCodeLevelTable(Byte *newLevels, int numLevels); -public: - CCoder(); - - MY_UNKNOWN_IMP1(ICompressSetDecoderProperties2) - - void ReleaseStreams(); - HRESULT Flush() { return m_OutWindowStream.Flush(); } - - HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); - - STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); - - STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size); -}; - -}}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/ImplodeHuffmanDecoder.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/ImplodeHuffmanDecoder.cpp deleted file mode 100644 index c7a163433..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/ImplodeHuffmanDecoder.cpp +++ /dev/null @@ -1,89 +0,0 @@ -// ImplodeHuffmanDecoder.cpp - -#include "StdAfx.h" - -#include "ImplodeHuffmanDecoder.h" - -namespace NCompress { -namespace NImplode { -namespace NHuffman { - -CDecoder::CDecoder(UInt32 numSymbols): - m_NumSymbols(numSymbols) -{ - m_Symbols = new UInt32[m_NumSymbols]; -} - -CDecoder::~CDecoder() -{ - delete []m_Symbols; -} - -bool CDecoder::SetCodeLengths(const Byte *codeLengths) -{ - // int lenCounts[kNumBitsInLongestCode + 1], tmpPositions[kNumBitsInLongestCode + 1]; - int lenCounts[kNumBitsInLongestCode + 2], tmpPositions[kNumBitsInLongestCode + 1]; - int i; - for(i = 0; i <= kNumBitsInLongestCode; i++) - lenCounts[i] = 0; - UInt32 symbolIndex; - for (symbolIndex = 0; symbolIndex < m_NumSymbols; symbolIndex++) - lenCounts[codeLengths[symbolIndex]]++; - // lenCounts[0] = 0; - - // tmpPositions[0] = m_Positions[0] = m_Limitits[0] = 0; - m_Limitits[kNumBitsInLongestCode + 1] = 0; - m_Positions[kNumBitsInLongestCode + 1] = 0; - lenCounts[kNumBitsInLongestCode + 1] = 0; - - - UInt32 startPos = 0; - static const UInt32 kMaxValue = (1 << kNumBitsInLongestCode); - - for (i = kNumBitsInLongestCode; i > 0; i--) - { - startPos += lenCounts[i] << (kNumBitsInLongestCode - i); - if (startPos > kMaxValue) - return false; - m_Limitits[i] = startPos; - m_Positions[i] = m_Positions[i + 1] + lenCounts[i + 1]; - tmpPositions[i] = m_Positions[i] + lenCounts[i]; - - } - - // if _ZIP_MODE do not throw exception for trees containing only one node - // #ifndef _ZIP_MODE - if (startPos != kMaxValue) - return false; - // #endif - - for (symbolIndex = 0; symbolIndex < m_NumSymbols; symbolIndex++) - if (codeLengths[symbolIndex] != 0) - m_Symbols[--tmpPositions[codeLengths[symbolIndex]]] = symbolIndex; - return true; -} - -UInt32 CDecoder::DecodeSymbol(CInBit *inStream) -{ - UInt32 numBits = 0; - UInt32 value = inStream->GetValue(kNumBitsInLongestCode); - int i; - for(i = kNumBitsInLongestCode; i > 0; i--) - { - if (value < m_Limitits[i]) - { - numBits = i; - break; - } - } - if (i == 0) - return 0xFFFFFFFF; - inStream->MovePos(numBits); - UInt32 index = m_Positions[numBits] + - ((value - m_Limitits[numBits + 1]) >> (kNumBitsInLongestCode - numBits)); - if (index >= m_NumSymbols) - return 0xFFFFFFFF; - return m_Symbols[index]; -} - -}}} diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/ImplodeHuffmanDecoder.h b/desmume/src/windows/7z/CPP/7zip/Compress/ImplodeHuffmanDecoder.h deleted file mode 100644 index 8936c09e6..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/ImplodeHuffmanDecoder.h +++ /dev/null @@ -1,34 +0,0 @@ -// ImplodeHuffmanDecoder.h - -#ifndef __IMPLODE_HUFFMAN_DECODER_H -#define __IMPLODE_HUFFMAN_DECODER_H - -#include "../Common/InBuffer.h" - -#include "BitlDecoder.h" - -namespace NCompress { -namespace NImplode { -namespace NHuffman { - -const int kNumBitsInLongestCode = 16; - -typedef NBitl::CDecoder CInBit; - -class CDecoder -{ - UInt32 m_Limitits[kNumBitsInLongestCode + 2]; // m_Limitits[i] = value limit for symbols with length = i - UInt32 m_Positions[kNumBitsInLongestCode + 2]; // m_Positions[i] = index in m_Symbols[] of first symbol with length = i - UInt32 m_NumSymbols; // number of symbols in m_Symbols - UInt32 *m_Symbols; // symbols: at first with len=1 then 2, ... 15. -public: - CDecoder(UInt32 numSymbols); - ~CDecoder(); - - bool SetCodeLengths(const Byte *codeLengths); - UInt32 DecodeSymbol(CInBit *inStream); -}; - -}}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/LzOutWindow.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/LzOutWindow.cpp deleted file mode 100644 index b04789471..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/LzOutWindow.cpp +++ /dev/null @@ -1,14 +0,0 @@ -// LzOutWindow.cpp - -#include "StdAfx.h" - -#include "LzOutWindow.h" - -void CLzOutWindow::Init(bool solid) -{ - if (!solid) - COutBuffer::Init(); - #ifdef _NO_EXCEPTIONS - ErrorCode = S_OK; - #endif -} diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/LzOutWindow.h b/desmume/src/windows/7z/CPP/7zip/Compress/LzOutWindow.h deleted file mode 100644 index bbec7ad5b..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/LzOutWindow.h +++ /dev/null @@ -1,66 +0,0 @@ -// LzOutWindow.h - -#ifndef __LZ_OUT_WINDOW_H -#define __LZ_OUT_WINDOW_H - -#include "../IStream.h" - -#include "../Common/OutBuffer.h" - -#ifndef _NO_EXCEPTIONS -typedef COutBufferException CLzOutWindowException; -#endif - -class CLzOutWindow: public COutBuffer -{ -public: - void Init(bool solid = false); - - // distance >= 0, len > 0, - bool CopyBlock(UInt32 distance, UInt32 len) - { - UInt32 pos = _pos - distance - 1; - if (distance >= _pos) - { - if (!_overDict || distance >= _bufferSize) - return false; - pos += _bufferSize; - } - if (_limitPos - _pos > len && _bufferSize - pos > len) - { - const Byte *src = _buffer + pos; - Byte *dest = _buffer + _pos; - _pos += len; - do - *dest++ = *src++; - while(--len != 0); - } - else do - { - if (pos == _bufferSize) - pos = 0; - _buffer[_pos++] = _buffer[pos++]; - if (_pos == _limitPos) - FlushWithCheck(); - } - while(--len != 0); - return true; - } - - void PutByte(Byte b) - { - _buffer[_pos++] = b; - if (_pos == _limitPos) - FlushWithCheck(); - } - - Byte GetByte(UInt32 distance) const - { - UInt32 pos = _pos - distance - 1; - if (pos >= _bufferSize) - pos += _bufferSize; - return _buffer[pos]; - } -}; - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/LzhDecoder.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/LzhDecoder.cpp deleted file mode 100644 index e1591f46f..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/LzhDecoder.cpp +++ /dev/null @@ -1,220 +0,0 @@ -// LzhDecoder.cpp - -#include "StdAfx.h" - -#include "LzhDecoder.h" - -#include "Windows/Defs.h" - -namespace NCompress{ -namespace NLzh { -namespace NDecoder { - -static const UInt32 kHistorySize = (1 << 16); - -static const int kBlockSizeBits = 16; -static const int kNumCBits = 9; -static const int kNumLevelBits = 5; // smallest integer such that (1 << kNumLevelBits) > kNumLevelSymbols/ - -UInt32 CCoder::ReadBits(int numBits) { return m_InBitStream.ReadBits(numBits); } - -HRESULT CCoder::ReadLevelTable() -{ - int n = ReadBits(kNumLevelBits); - if (n == 0) - { - m_LevelHuffman.Symbol = ReadBits(kNumLevelBits); - if (m_LevelHuffman.Symbol >= kNumLevelSymbols) - return S_FALSE; - } - else - { - if (n > kNumLevelSymbols) - return S_FALSE; - m_LevelHuffman.Symbol = -1; - Byte lens[kNumLevelSymbols]; - int i = 0; - while (i < n) - { - int c = m_InBitStream.ReadBits(3); - if (c == 7) - while (ReadBits(1)) - if (c++ > kMaxHuffmanLen) - return S_FALSE; - lens[i++] = (Byte)c; - if (i == kNumSpecLevelSymbols) - { - c = ReadBits(2); - while (--c >= 0) - lens[i++] = 0; - } - } - while (i < kNumLevelSymbols) - lens[i++] = 0; - m_LevelHuffman.SetCodeLengths(lens); - } - return S_OK; -} - -HRESULT CCoder::ReadPTable(int numBits) -{ - int n = ReadBits(numBits); - if (n == 0) - { - m_PHuffmanDecoder.Symbol = ReadBits(numBits); - if (m_PHuffmanDecoder.Symbol >= kNumDistanceSymbols) - return S_FALSE; - } - else - { - if (n > kNumDistanceSymbols) - return S_FALSE; - m_PHuffmanDecoder.Symbol = -1; - Byte lens[kNumDistanceSymbols]; - int i = 0; - while (i < n) - { - int c = m_InBitStream.ReadBits(3); - if (c == 7) - while (ReadBits(1)) - { - if (c > kMaxHuffmanLen) - return S_FALSE; - c++; - } - lens[i++] = (Byte)c; - } - while (i < kNumDistanceSymbols) - lens[i++] = 0; - m_PHuffmanDecoder.SetCodeLengths(lens); - } - return S_OK; -} - -HRESULT CCoder::ReadCTable() -{ - int n = ReadBits(kNumCBits); - if (n == 0) - { - m_CHuffmanDecoder.Symbol = ReadBits(kNumCBits); - if (m_CHuffmanDecoder.Symbol >= kNumCSymbols) - return S_FALSE; - } - else - { - if (n > kNumCSymbols) - return S_FALSE; - m_CHuffmanDecoder.Symbol = -1; - Byte lens[kNumCSymbols]; - int i = 0; - while (i < n) - { - int c = m_LevelHuffman.Decode(&m_InBitStream); - if (c < kNumSpecLevelSymbols) - { - if (c == 0) - c = 1; - else if (c == 1) - c = ReadBits(4) + 3; - else - c = ReadBits(kNumCBits) + 20; - while (--c >= 0) - { - if (i > kNumCSymbols) - return S_FALSE; - lens[i++] = 0; - } - } - else - lens[i++] = (Byte)(c - 2); - } - while (i < kNumCSymbols) - lens[i++] = 0; - m_CHuffmanDecoder.SetCodeLengths(lens); - } - return S_OK; -} - -STDMETHODIMP CCoder::CodeReal(ISequentialInStream *inStream, - ISequentialOutStream *outStream, const UInt64 * /* inSize */, const UInt64 *outSize, - ICompressProgressInfo *progress) -{ - if (outSize == NULL) - return E_INVALIDARG; - - if (!m_OutWindowStream.Create(kHistorySize)) - return E_OUTOFMEMORY; - if (!m_InBitStream.Create(1 << 20)) - return E_OUTOFMEMORY; - - UInt64 pos = 0; - m_OutWindowStream.SetStream(outStream); - m_OutWindowStream.Init(false); - m_InBitStream.SetStream(inStream); - m_InBitStream.Init(); - - CCoderReleaser coderReleaser(this); - - int pbit; - if (m_NumDictBits <= 13) - pbit = 4; - else - pbit = 5; - - UInt32 blockSize = 0; - - while(pos < *outSize) - { - // for (i = 0; i < dictSize; i++) dtext[i] = 0x20; - - if (blockSize == 0) - { - if (progress != NULL) - { - UInt64 packSize = m_InBitStream.GetProcessedSize(); - RINOK(progress->SetRatioInfo(&packSize, &pos)); - } - blockSize = ReadBits(kBlockSizeBits); - ReadLevelTable(); - ReadCTable(); - RINOK(ReadPTable(pbit)); - } - blockSize--; - UInt32 c = m_CHuffmanDecoder.Decode(&m_InBitStream); - if (c < 256) - { - m_OutWindowStream.PutByte((Byte)c); - pos++; - } - else if (c >= kNumCSymbols) - return S_FALSE; - else - { - // offset = (interface->method == LARC_METHOD_NUM) ? 0x100 - 2 : 0x100 - 3; - UInt32 len = c - 256 + kMinMatch; - UInt32 distance = m_PHuffmanDecoder.Decode(&m_InBitStream); - if (distance != 0) - distance = (1 << (distance - 1)) + ReadBits(distance - 1); - if (distance >= pos) - return S_FALSE; - if (pos + len > *outSize) - len = (UInt32)(*outSize - pos); - pos += len; - m_OutWindowStream.CopyBlock(distance, len); - } - } - coderReleaser.NeedFlush = false; - return m_OutWindowStream.Flush(); -} - -STDMETHODIMP CCoder::Code(ISequentialInStream *inStream, - ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize, - ICompressProgressInfo *progress) -{ - try { return CodeReal(inStream, outStream, inSize, outSize, progress);} - catch(const CInBufferException &e) { return e.ErrorCode; } - catch(const CLzOutWindowException &e) { return e.ErrorCode; } - catch(...) { return S_FALSE; } -} - -}}} diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/LzhDecoder.h b/desmume/src/windows/7z/CPP/7zip/Compress/LzhDecoder.h deleted file mode 100644 index 3048797fb..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/LzhDecoder.h +++ /dev/null @@ -1,106 +0,0 @@ -// LzhDecoder.h - -#ifndef __COMPRESS_LZH_DECODER_H -#define __COMPRESS_LZH_DECODER_H - -#include "../../Common/MyCom.h" - -#include "../ICoder.h" - -#include "../Common/InBuffer.h" - -#include "BitmDecoder.h" -#include "HuffmanDecoder.h" -#include "LzOutWindow.h" - -namespace NCompress { -namespace NLzh { -namespace NDecoder { - -const int kMaxHuffmanLen = 16; // Check it - -const int kNumSpecLevelSymbols = 3; -const int kNumLevelSymbols = kNumSpecLevelSymbols + kMaxHuffmanLen; - -const int kDictBitsMax = 16; -const int kNumDistanceSymbols = kDictBitsMax + 1; - -const int kMaxMatch = 256; -const int kMinMatch = 3; -const int kNumCSymbols = 256 + kMaxMatch + 2 - kMinMatch; - -template -class CHuffmanDecoder:public NCompress::NHuffman::CDecoder -{ -public: - int Symbol; - template - UInt32 Decode(TBitDecoder *bitStream) - { - if (Symbol >= 0) - return (UInt32)Symbol; - return DecodeSymbol(bitStream); - } -}; - -class CCoder : - public ICompressCoder, - public CMyUnknownImp -{ - CLzOutWindow m_OutWindowStream; - NBitm::CDecoder m_InBitStream; - - int m_NumDictBits; - - CHuffmanDecoder m_LevelHuffman; - CHuffmanDecoder m_PHuffmanDecoder; - CHuffmanDecoder m_CHuffmanDecoder; - - void ReleaseStreams() - { - m_OutWindowStream.ReleaseStream(); - m_InBitStream.ReleaseStream(); - } - - class CCoderReleaser - { - CCoder *m_Coder; - public: - bool NeedFlush; - CCoderReleaser(CCoder *coder): m_Coder(coder), NeedFlush(true) {} - ~CCoderReleaser() - { - if (NeedFlush) - m_Coder->m_OutWindowStream.Flush(); - m_Coder->ReleaseStreams(); - } - }; - friend class CCoderReleaser; - - void MakeTable(int nchar, Byte *bitlen, int tablebits, - UInt32 *table, int tablesize); - - UInt32 ReadBits(int numBits); - HRESULT ReadLevelTable(); - HRESULT ReadPTable(int numBits); - HRESULT ReadCTable(); - -public: - - MY_UNKNOWN_IMP - - STDMETHOD(CodeReal)(ISequentialInStream *inStream, - ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize, - ICompressProgressInfo *progress); - - STDMETHOD(Code)(ISequentialInStream *inStream, - ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize, - ICompressProgressInfo *progress); - - void SetDictionary(int numDictBits) { m_NumDictBits = numDictBits; } - CCoder(): m_NumDictBits(0) {} -}; - -}}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/LzmaDecoder.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/LzmaDecoder.cpp deleted file mode 100644 index 61a8cc009..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/LzmaDecoder.cpp +++ /dev/null @@ -1,190 +0,0 @@ -// LzmaDecoder.cpp - -#include "StdAfx.h" - -extern "C" -{ -#include "../../../C/Alloc.h" -} - -#include "../Common/StreamUtils.h" - -#include "LzmaDecoder.h" - -static HRESULT SResToHRESULT(SRes res) -{ - switch(res) - { - case SZ_OK: return S_OK; - case SZ_ERROR_MEM: return E_OUTOFMEMORY; - case SZ_ERROR_PARAM: return E_INVALIDARG; - case SZ_ERROR_UNSUPPORTED: return E_NOTIMPL; - // case SZ_ERROR_PROGRESS: return E_ABORT; - case SZ_ERROR_DATA: return S_FALSE; - } - return E_FAIL; -} - -namespace NCompress { -namespace NLzma { - -static const UInt32 kInBufSize = 1 << 20; - -CDecoder::CDecoder(): _inBuf(0), _outSizeDefined(false), FinishStream(false) -{ - LzmaDec_Construct(&_state); -} - -static void *SzAlloc(void *p, size_t size) { p = p; return MyAlloc(size); } -static void SzFree(void *p, void *address) { p = p; MyFree(address); } -static ISzAlloc g_Alloc = { SzAlloc, SzFree }; - -CDecoder::~CDecoder() -{ - LzmaDec_Free(&_state, &g_Alloc); - MyFree(_inBuf); -} - -STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *prop, UInt32 size) -{ - RINOK(SResToHRESULT(LzmaDec_Allocate(&_state, prop, size, &g_Alloc))); - - if (_inBuf == 0) - { - _inBuf = (Byte *)MyAlloc(kInBufSize); - if (_inBuf == 0) - return E_OUTOFMEMORY; - } - - return S_OK; -} - -STDMETHODIMP CDecoder::GetInStreamProcessedSize(UInt64 *value) { *value = _inSizeProcessed; return S_OK; } -STDMETHODIMP CDecoder::SetInStream(ISequentialInStream *inStream) { _inStream = inStream; return S_OK; } -STDMETHODIMP CDecoder::ReleaseInStream() { _inStream.Release(); return S_OK; } - -STDMETHODIMP CDecoder::SetOutStreamSize(const UInt64 *outSize) -{ - _outSizeDefined = (outSize != NULL); - if (_outSizeDefined) - _outSize = *outSize; - - LzmaDec_Init(&_state); - - _inPos = _inSize = 0; - _inSizeProcessed = _outSizeProcessed = 0; - return S_OK; -} - -STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress) -{ - if (_inBuf == 0) - return S_FALSE; - SetOutStreamSize(outSize); - - for (;;) - { - if (_inPos == _inSize) - { - _inPos = _inSize = 0; - RINOK(inStream->Read(_inBuf, kInBufSize, &_inSize)); - } - - SizeT dicPos = _state.dicPos; - SizeT curSize = _state.dicBufSize - dicPos; - const UInt32 kStepSize = ((UInt32)1 << 22); - if (curSize > kStepSize) - curSize = (SizeT)kStepSize; - - ELzmaFinishMode finishMode = LZMA_FINISH_ANY; - if (_outSizeDefined) - { - const UInt64 rem = _outSize - _outSizeProcessed; - if (rem < curSize) - { - curSize = (SizeT)rem; - if (FinishStream) - finishMode = LZMA_FINISH_END; - } - } - - SizeT inSizeProcessed = _inSize - _inPos; - ELzmaStatus status; - SRes res = LzmaDec_DecodeToDic(&_state, dicPos + curSize, _inBuf + _inPos, &inSizeProcessed, finishMode, &status); - - _inPos += (UInt32)inSizeProcessed; - _inSizeProcessed += inSizeProcessed; - SizeT outSizeProcessed = _state.dicPos - dicPos; - _outSizeProcessed += outSizeProcessed; - - bool finished = (inSizeProcessed == 0 && outSizeProcessed == 0); - bool stopDecoding = (_outSizeDefined && _outSizeProcessed >= _outSize); - - if (res != 0 || _state.dicPos == _state.dicBufSize || finished || stopDecoding) - { - HRESULT res2 = WriteStream(outStream, _state.dic, _state.dicPos); - if (res != 0) - return S_FALSE; - RINOK(res2); - if (stopDecoding) - return S_OK; - if (finished) - return (status == LZMA_STATUS_FINISHED_WITH_MARK ? S_OK : S_FALSE); - } - if (_state.dicPos == _state.dicBufSize) - _state.dicPos = 0; - - if (progress != NULL) - { - RINOK(progress->SetRatioInfo(&_inSizeProcessed, &_outSizeProcessed)); - } - } -} - -#ifndef NO_READ_FROM_CODER - -STDMETHODIMP CDecoder::Read(void *data, UInt32 size, UInt32 *processedSize) -{ - if (processedSize) - *processedSize = 0; - do - { - if (_inPos == _inSize) - { - _inPos = _inSize = 0; - RINOK(_inStream->Read(_inBuf, kInBufSize, &_inSize)); - } - { - SizeT inProcessed = _inSize - _inPos; - - if (_outSizeDefined) - { - const UInt64 rem = _outSize - _outSizeProcessed; - if (rem < size) - size = (UInt32)rem; - } - - SizeT outProcessed = size; - ELzmaStatus status; - SRes res = LzmaDec_DecodeToBuf(&_state, (Byte *)data, &outProcessed, - _inBuf + _inPos, &inProcessed, LZMA_FINISH_ANY, &status); - _inPos += (UInt32)inProcessed; - _inSizeProcessed += inProcessed; - _outSizeProcessed += outProcessed; - size -= (UInt32)outProcessed; - data = (Byte *)data + outProcessed; - if (processedSize) - *processedSize += (UInt32)outProcessed; - RINOK(SResToHRESULT(res)); - if (inProcessed == 0 && outProcessed == 0) - return S_OK; - } - } - while (size != 0); - return S_OK; -} - -#endif - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/LzmaDecoder.h b/desmume/src/windows/7z/CPP/7zip/Compress/LzmaDecoder.h deleted file mode 100644 index 16b4791b0..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/LzmaDecoder.h +++ /dev/null @@ -1,73 +0,0 @@ -// LzmaDecoder.h - -#ifndef __LZMA_DECODER_H -#define __LZMA_DECODER_H - -extern "C" -{ -#include "../../../C/LzmaDec.h" -} - -#include "../../Common/MyCom.h" -#include "../ICoder.h" - -namespace NCompress { -namespace NLzma { - -class CDecoder: - public ICompressCoder, - public ICompressSetDecoderProperties2, - public ICompressGetInStreamProcessedSize, - #ifndef NO_READ_FROM_CODER - public ICompressSetInStream, - public ICompressSetOutStreamSize, - public ISequentialInStream, - #endif - public CMyUnknownImp -{ - CMyComPtr _inStream; - Byte *_inBuf; - UInt32 _inPos; - UInt32 _inSize; - CLzmaDec _state; - bool _outSizeDefined; - UInt64 _outSize; - UInt64 _inSizeProcessed; - UInt64 _outSizeProcessed; -public: - - #ifndef NO_READ_FROM_CODER - MY_UNKNOWN_IMP5( - ICompressSetDecoderProperties2, - ICompressGetInStreamProcessedSize, - ICompressSetInStream, - ICompressSetOutStreamSize, - ISequentialInStream) - #else - MY_UNKNOWN_IMP2( - ICompressSetDecoderProperties2, - ICompressGetInStreamProcessedSize) - #endif - - STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); - STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size); - STDMETHOD(GetInStreamProcessedSize)(UInt64 *value); - STDMETHOD(SetInStream)(ISequentialInStream *inStream); - STDMETHOD(ReleaseInStream)(); - STDMETHOD(SetOutStreamSize)(const UInt64 *outSize); - - #ifndef NO_READ_FROM_CODER - STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); - #endif - - bool FinishStream; - - CDecoder(); - virtual ~CDecoder(); - -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/LzmaRegister.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/LzmaRegister.cpp deleted file mode 100644 index 9c67eaf94..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/LzmaRegister.cpp +++ /dev/null @@ -1,20 +0,0 @@ -// LzmaRegister.cpp - -#include "StdAfx.h" - -#include "../Common/RegisterCodec.h" - -#include "LzmaDecoder.h" - -static void *CreateCodec() { return (void *)(ICompressCoder *)(new NCompress::NLzma::CDecoder); } -#ifndef EXTRACT_ONLY -#include "LzmaEncoder.h" -static void *CreateCodecOut() { return (void *)(ICompressCoder *)(new NCompress::NLzma::CEncoder); } -#else -#define CreateCodecOut 0 -#endif - -static CCodecInfo g_CodecInfo = - { CreateCodec, CreateCodecOut, 0x030101, L"LZMA", 1, false }; - -REGISTER_CODEC(LZMA) diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/Mtf8.h b/desmume/src/windows/7z/CPP/7zip/Compress/Mtf8.h deleted file mode 100644 index e5e0046de..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/Mtf8.h +++ /dev/null @@ -1,196 +0,0 @@ -// Mtf8.h - -#ifndef __COMPRESS_MTF8_H -#define __COMPRESS_MTF8_H - -#include "../../Common/Types.h" - -namespace NCompress { - -struct CMtf8Encoder -{ - Byte Buf[256]; - - int FindAndMove(Byte v) - { - int pos; - for (pos = 0; Buf[pos] != v; pos++); - int resPos = pos; - for (; pos >= 8; pos -= 8) - { - Buf[pos] = Buf[pos - 1]; - Buf[pos - 1] = Buf[pos - 2]; - Buf[pos - 2] = Buf[pos - 3]; - Buf[pos - 3] = Buf[pos - 4]; - Buf[pos - 4] = Buf[pos - 5]; - Buf[pos - 5] = Buf[pos - 6]; - Buf[pos - 6] = Buf[pos - 7]; - Buf[pos - 7] = Buf[pos - 8]; - } - for (; pos > 0; pos--) - Buf[pos] = Buf[pos - 1]; - Buf[0] = v; - return resPos; - } -}; - -/* -struct CMtf8Decoder -{ - Byte Buf[256]; - - void Init(int) {}; - Byte GetHead() const { return Buf[0]; } - Byte GetAndMove(int pos) - { - Byte res = Buf[pos]; - for (; pos >= 8; pos -= 8) - { - Buf[pos] = Buf[pos - 1]; - Buf[pos - 1] = Buf[pos - 2]; - Buf[pos - 2] = Buf[pos - 3]; - Buf[pos - 3] = Buf[pos - 4]; - Buf[pos - 4] = Buf[pos - 5]; - Buf[pos - 5] = Buf[pos - 6]; - Buf[pos - 6] = Buf[pos - 7]; - Buf[pos - 7] = Buf[pos - 8]; - } - for (; pos > 0; pos--) - Buf[pos] = Buf[pos - 1]; - Buf[0] = res; - return res; - } -}; -*/ - -#ifdef _WIN64 -#define MODE_64BIT -#endif - -#ifdef MODE_64BIT -typedef UInt64 CMtfVar; -#define MTF_MOVS 3 -#else -typedef UInt32 CMtfVar; -#define MTF_MOVS 2 -#endif - -#define MTF_MASK ((1 << MTF_MOVS) - 1) - - -struct CMtf8Decoder -{ - CMtfVar Buf[256 >> MTF_MOVS]; - - void StartInit() { memset(Buf, 0, sizeof(Buf)); } - void Add(unsigned int pos, Byte val) { Buf[pos >> MTF_MOVS] |= ((CMtfVar)val << ((pos & MTF_MASK) << 3)); } - Byte GetHead() const { return (Byte)Buf[0]; } - Byte GetAndMove(unsigned int pos) - { - UInt32 lim = ((UInt32)pos >> MTF_MOVS); - pos = (pos & MTF_MASK) << 3; - CMtfVar prev = (Buf[lim] >> pos) & 0xFF; - - UInt32 i = 0; - if ((lim & 1) != 0) - { - CMtfVar next = Buf[0]; - Buf[0] = (next << 8) | prev; - prev = (next >> (MTF_MASK << 3)); - i = 1; - lim -= 1; - } - for (; i < lim; i += 2) - { - CMtfVar next = Buf[i]; - Buf[i] = (next << 8) | prev; - prev = (next >> (MTF_MASK << 3)); - next = Buf[i + 1]; - Buf[i + 1] = (next << 8) | prev; - prev = (next >> (MTF_MASK << 3)); - } - CMtfVar next = Buf[i]; - CMtfVar mask = (((CMtfVar)0x100 << pos) - 1); - Buf[i] = (next & ~mask) | (((next << 8) | prev) & mask); - return (Byte)Buf[0]; - } -}; - -/* -const int kSmallSize = 64; -class CMtf8Decoder -{ - Byte SmallBuffer[kSmallSize]; - int SmallSize; - Byte Counts[16]; - int Size; -public: - Byte Buf[256]; - - Byte GetHead() const - { - if (SmallSize > 0) - return SmallBuffer[kSmallSize - SmallSize]; - return Buf[0]; - } - - void Init(int size) - { - Size = size; - SmallSize = 0; - for (int i = 0; i < 16; i++) - { - Counts[i] = ((size >= 16) ? 16 : size); - size -= Counts[i]; - } - } - - Byte GetAndMove(int pos) - { - if (pos < SmallSize) - { - Byte *p = SmallBuffer + kSmallSize - SmallSize; - Byte res = p[pos]; - for (; pos > 0; pos--) - p[pos] = p[pos - 1]; - SmallBuffer[kSmallSize - SmallSize] = res; - return res; - } - if (SmallSize == kSmallSize) - { - int i = Size - 1; - int g = 16; - do - { - g--; - int offset = (g << 4); - for (int t = Counts[g] - 1; t >= 0; t--, i--) - Buf[i] = Buf[offset + t]; - } - while(g != 0); - - for (i = kSmallSize - 1; i >= 0; i--) - Buf[i] = SmallBuffer[i]; - Init(Size); - } - pos -= SmallSize; - int g; - for (g = 0; pos >= Counts[g]; g++) - pos -= Counts[g]; - int offset = (g << 4); - Byte res = Buf[offset + pos]; - for (pos; pos < 16 - 1; pos++) - Buf[offset + pos] = Buf[offset + pos + 1]; - - SmallSize++; - SmallBuffer[kSmallSize - SmallSize] = res; - - Counts[g]--; - return res; - } -}; -*/ - -} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/PpmdContext.h b/desmume/src/windows/7z/CPP/7zip/Compress/PpmdContext.h deleted file mode 100644 index 11502a951..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/PpmdContext.h +++ /dev/null @@ -1,489 +0,0 @@ -// PpmdContext.h -// This code is based on Dmitry Shkarin's PPMdH code - -#ifndef __COMPRESS_PPMD_CONTEXT_H -#define __COMPRESS_PPMD_CONTEXT_H - -#include "../../Common/Types.h" - -#include "PpmdSubAlloc.h" -#include "RangeCoder.h" - -namespace NCompress { -namespace NPpmd { - -const int INT_BITS=7, PERIOD_BITS=7, TOT_BITS=INT_BITS+PERIOD_BITS, - INTERVAL=1 << INT_BITS, BIN_SCALE=1 << TOT_BITS, MAX_FREQ=124; - -struct SEE2_CONTEXT -{ - // SEE-contexts for PPM-contexts with masked symbols - UInt16 Summ; - Byte Shift, Count; - void init(int InitVal) { Summ = (UInt16)(InitVal << (Shift=PERIOD_BITS-4)); Count=4; } - unsigned int getMean() - { - unsigned int RetVal=(Summ >> Shift); - Summ = (UInt16)(Summ - RetVal); - return RetVal+(RetVal == 0); - } - void update() - { - if (Shift < PERIOD_BITS && --Count == 0) - { - Summ <<= 1; - Count = (Byte)(3 << Shift++); - } - } -}; - -struct PPM_CONTEXT -{ - UInt16 NumStats; // sizeof(UInt16) > sizeof(Byte) - UInt16 SummFreq; - - struct STATE - { - Byte Symbol, Freq; - UInt16 SuccessorLow; - UInt16 SuccessorHigh; - - UInt32 GetSuccessor() const { return SuccessorLow | ((UInt32)SuccessorHigh << 16); } - void SetSuccessor(UInt32 v) - { - SuccessorLow = (UInt16)(v & 0xFFFF); - SuccessorHigh = (UInt16)((v >> 16) & 0xFFFF); - } - }; - - UInt32 Stats; - UInt32 Suffix; - - PPM_CONTEXT* createChild(CSubAllocator &subAllocator, STATE* pStats, STATE& FirstState) - { - PPM_CONTEXT* pc = (PPM_CONTEXT*) subAllocator.AllocContext(); - if (pc) - { - pc->NumStats = 1; - pc->oneState() = FirstState; - pc->Suffix = subAllocator.GetOffset(this); - pStats->SetSuccessor(subAllocator.GetOffsetNoCheck(pc)); - } - return pc; - } - - STATE& oneState() const { return (STATE&) SummFreq; } -}; - -///////////////////////////////// - -const UInt16 InitBinEsc[] = - {0x3CDD, 0x1F3F, 0x59BF, 0x48F3, 0x64A1, 0x5ABC, 0x6632, 0x6051}; - -struct CInfo -{ - CSubAllocator SubAllocator; - SEE2_CONTEXT SEE2Cont[25][16], DummySEE2Cont; - PPM_CONTEXT * MinContext, * MaxContext; - - PPM_CONTEXT::STATE* FoundState; // found next state transition - int NumMasked, InitEsc, OrderFall, RunLength, InitRL, MaxOrder; - Byte CharMask[256], NS2Indx[256], NS2BSIndx[256], HB2Flag[256]; - Byte EscCount, PrintCount, PrevSuccess, HiBitsFlag; - UInt16 BinSumm[128][64]; // binary SEE-contexts - - UInt16 &GetBinSumm(const PPM_CONTEXT::STATE &rs, int numStates) - { - HiBitsFlag = HB2Flag[FoundState->Symbol]; - return BinSumm[rs.Freq - 1][ - PrevSuccess + NS2BSIndx[numStates - 1] + - HiBitsFlag + 2 * HB2Flag[rs.Symbol] + - ((RunLength >> 26) & 0x20)]; - } - - PPM_CONTEXT *GetContext(UInt32 offset) const { return (PPM_CONTEXT *)SubAllocator.GetPtr(offset); } - PPM_CONTEXT *GetContextNoCheck(UInt32 offset) const { return (PPM_CONTEXT *)SubAllocator.GetPtrNoCheck(offset); } - PPM_CONTEXT::STATE *GetState(UInt32 offset) const { return (PPM_CONTEXT::STATE *)SubAllocator.GetPtr(offset); } - PPM_CONTEXT::STATE *GetStateNoCheck(UInt32 offset) const { return (PPM_CONTEXT::STATE *)SubAllocator.GetPtr(offset); } - - void RestartModelRare() - { - int i, k, m; - memset(CharMask,0,sizeof(CharMask)); - SubAllocator.InitSubAllocator(); - InitRL = -((MaxOrder < 12) ? MaxOrder : 12) - 1; - MinContext = MaxContext = (PPM_CONTEXT*) SubAllocator.AllocContext(); - MinContext->Suffix = 0; - OrderFall = MaxOrder; - MinContext->SummFreq = (UInt16)((MinContext->NumStats = 256) + 1); - FoundState = (PPM_CONTEXT::STATE*)SubAllocator.AllocUnits(256 / 2); - MinContext->Stats = SubAllocator.GetOffsetNoCheck(FoundState); - PrevSuccess = 0; - for (RunLength = InitRL, i = 0; i < 256; i++) - { - PPM_CONTEXT::STATE &state = FoundState[i]; - state.Symbol = (Byte)i; - state.Freq = 1; - state.SetSuccessor(0); - } - for (i = 0; i < 128; i++) - for (k = 0; k < 8; k++) - for ( m=0; m < 64; m += 8) - BinSumm[i][k + m] = (UInt16)(BIN_SCALE - InitBinEsc[k] / (i + 2)); - for (i = 0; i < 25; i++) - for (k = 0; k < 16; k++) - SEE2Cont[i][k].init(5*i+10); - } - - void StartModelRare(int maxOrder) - { - int i, k, m ,Step; - EscCount=PrintCount=1; - if (maxOrder < 2) - { - memset(CharMask,0,sizeof(CharMask)); - OrderFall = MaxOrder; - MinContext = MaxContext; - while (MinContext->Suffix != 0) - { - MinContext = GetContextNoCheck(MinContext->Suffix); - OrderFall--; - } - FoundState = GetState(MinContext->Stats); - MinContext = MaxContext; - } - else - { - MaxOrder = maxOrder; - RestartModelRare(); - NS2BSIndx[0] = 2 * 0; - NS2BSIndx[1] = 2 * 1; - memset(NS2BSIndx + 2, 2 * 2, 9); - memset(NS2BSIndx + 11, 2 * 3, 256 - 11); - for (i = 0; i < 3; i++) - NS2Indx[i] = (Byte)i; - for (m = i, k = Step = 1; i < 256; i++) - { - NS2Indx[i] = (Byte)m; - if ( !--k ) - { - k = ++Step; - m++; - } - } - memset(HB2Flag, 0, 0x40); - memset(HB2Flag + 0x40, 0x08, 0x100 - 0x40); - DummySEE2Cont.Shift = PERIOD_BITS; - } - } - - PPM_CONTEXT* CreateSuccessors(bool skip, PPM_CONTEXT::STATE* p1) - { - // static UpState declaration bypasses IntelC bug - // static PPM_CONTEXT::STATE UpState; - PPM_CONTEXT::STATE UpState; - - PPM_CONTEXT *pc = MinContext; - PPM_CONTEXT *UpBranch = GetContext(FoundState->GetSuccessor()); - PPM_CONTEXT::STATE * p, * ps[MAX_O], ** pps = ps; - if ( !skip ) - { - *pps++ = FoundState; - if ( !pc->Suffix ) - goto NO_LOOP; - } - if ( p1 ) - { - p = p1; - pc = GetContext(pc->Suffix); - goto LOOP_ENTRY; - } - do - { - pc = GetContext(pc->Suffix); - if (pc->NumStats != 1) - { - if ((p = GetStateNoCheck(pc->Stats))->Symbol != FoundState->Symbol) - do { p++; } while (p->Symbol != FoundState->Symbol); - } - else - p = &(pc->oneState()); -LOOP_ENTRY: - if (GetContext(p->GetSuccessor()) != UpBranch) - { - pc = GetContext(p->GetSuccessor()); - break; - } - *pps++ = p; - } - while ( pc->Suffix ); -NO_LOOP: - if (pps == ps) - return pc; - UpState.Symbol = *(Byte*) UpBranch; - UpState.SetSuccessor(SubAllocator.GetOffset(UpBranch) + 1); - if (pc->NumStats != 1) - { - if ((p = GetStateNoCheck(pc->Stats))->Symbol != UpState.Symbol) - do { p++; } while (p->Symbol != UpState.Symbol); - unsigned int cf = p->Freq-1; - unsigned int s0 = pc->SummFreq - pc->NumStats - cf; - UpState.Freq = (Byte)(1 + ((2 * cf <= s0) ? (5 * cf > s0) : - ((2 * cf + 3 * s0 - 1) / (2 * s0)))); - } - else - UpState.Freq = pc->oneState().Freq; - do - { - pc = pc->createChild(SubAllocator, *--pps, UpState); - if ( !pc ) - return NULL; - } - while (pps != ps); - return pc; - } - - void UpdateModel() - { - PPM_CONTEXT::STATE fs = *FoundState, * p = NULL; - PPM_CONTEXT* pc, * Successor; - unsigned int ns1, ns, cf, sf, s0; - if (fs.Freq < MAX_FREQ / 4 && MinContext->Suffix != 0) - { - pc = GetContextNoCheck(MinContext->Suffix); - - if (pc->NumStats != 1) - { - if ((p = GetStateNoCheck(pc->Stats))->Symbol != fs.Symbol) - { - do { p++; } while (p->Symbol != fs.Symbol); - if (p[0].Freq >= p[-1].Freq) - { - _PPMD_SWAP(p[0],p[-1]); - p--; - } - } - if (p->Freq < MAX_FREQ-9) - { - p->Freq += 2; - pc->SummFreq += 2; - } - } - else - { - p = &(pc->oneState()); - p->Freq = (Byte)(p->Freq + ((p->Freq < 32) ? 1 : 0)); - } - } - if ( !OrderFall ) - { - MinContext = MaxContext = CreateSuccessors(true, p); - FoundState->SetSuccessor(SubAllocator.GetOffset(MinContext)); - if (MinContext == 0) - goto RESTART_MODEL; - return; - } - *SubAllocator.pText++ = fs.Symbol; - Successor = (PPM_CONTEXT*) SubAllocator.pText; - if (SubAllocator.pText >= SubAllocator.UnitsStart) - goto RESTART_MODEL; - if (fs.GetSuccessor() != 0) - { - if ((Byte *)GetContext(fs.GetSuccessor()) <= SubAllocator.pText) - { - PPM_CONTEXT* cs = CreateSuccessors(false, p); - fs.SetSuccessor(SubAllocator.GetOffset(cs)); - if (cs == NULL) - goto RESTART_MODEL; - } - if ( !--OrderFall ) - { - Successor = GetContext(fs.GetSuccessor()); - SubAllocator.pText -= (MaxContext != MinContext); - } - } - else - { - FoundState->SetSuccessor(SubAllocator.GetOffsetNoCheck(Successor)); - fs.SetSuccessor(SubAllocator.GetOffsetNoCheck(MinContext)); - } - s0 = MinContext->SummFreq - (ns = MinContext->NumStats) - (fs.Freq - 1); - for (pc = MaxContext; pc != MinContext; pc = GetContext(pc->Suffix)) - { - if ((ns1 = pc->NumStats) != 1) - { - if ((ns1 & 1) == 0) - { - void *ppp = SubAllocator.ExpandUnits(GetState(pc->Stats), ns1 >> 1); - pc->Stats = SubAllocator.GetOffset(ppp); - if (!ppp) - goto RESTART_MODEL; - } - pc->SummFreq = (UInt16)(pc->SummFreq + (2 * ns1 < ns) + 2 * ((4 * ns1 <= ns) & - (pc->SummFreq <= 8 * ns1))); - } - else - { - p = (PPM_CONTEXT::STATE*) SubAllocator.AllocUnits(1); - if ( !p ) - goto RESTART_MODEL; - *p = pc->oneState(); - pc->Stats = SubAllocator.GetOffsetNoCheck(p); - if (p->Freq < MAX_FREQ / 4 - 1) - p->Freq <<= 1; - else - p->Freq = MAX_FREQ - 4; - pc->SummFreq = (UInt16)(p->Freq + InitEsc + (ns > 3)); - } - cf = 2 * fs.Freq * (pc->SummFreq+6); - sf = s0 + pc->SummFreq; - if (cf < 6 * sf) - { - cf = 1 + (cf > sf)+(cf >= 4 * sf); - pc->SummFreq += 3; - } - else - { - cf = 4 + (cf >= 9 * sf) + (cf >= 12 * sf) + (cf >= 15 * sf); - pc->SummFreq = (UInt16)(pc->SummFreq + cf); - } - p = GetState(pc->Stats) + ns1; - p->SetSuccessor(SubAllocator.GetOffset(Successor)); - p->Symbol = fs.Symbol; - p->Freq = (Byte)cf; - pc->NumStats = (UInt16)++ns1; - } - MaxContext = MinContext = GetContext(fs.GetSuccessor()); - return; -RESTART_MODEL: - RestartModelRare(); - EscCount = 0; - PrintCount = 0xFF; - } - - void ClearMask() - { - EscCount = 1; - memset(CharMask, 0, sizeof(CharMask)); - // if (++PrintCount == 0) - // PrintInfo(DecodedFile,EncodedFile); - } - - void update1(PPM_CONTEXT::STATE* p) - { - (FoundState = p)->Freq += 4; - MinContext->SummFreq += 4; - if (p[0].Freq > p[-1].Freq) - { - _PPMD_SWAP(p[0],p[-1]); - FoundState = --p; - if (p->Freq > MAX_FREQ) - rescale(); - } - } - - - void update2(PPM_CONTEXT::STATE* p) - { - (FoundState = p)->Freq += 4; - MinContext->SummFreq += 4; - if (p->Freq > MAX_FREQ) - rescale(); - EscCount++; - RunLength = InitRL; - } - - SEE2_CONTEXT* makeEscFreq2(int Diff, UInt32 &scale) - { - SEE2_CONTEXT* psee2c; - if (MinContext->NumStats != 256) - { - psee2c = SEE2Cont[NS2Indx[Diff-1]] + - (Diff < (GetContext(MinContext->Suffix))->NumStats - MinContext->NumStats) + - 2 * (MinContext->SummFreq < 11 * MinContext->NumStats) + - 4 * (NumMasked > Diff) + - HiBitsFlag; - scale = psee2c->getMean(); - } - else - { - psee2c = &DummySEE2Cont; - scale = 1; - } - return psee2c; - } - - - - void rescale() - { - int OldNS = MinContext->NumStats, i = MinContext->NumStats - 1, Adder, EscFreq; - PPM_CONTEXT::STATE* p1, * p; - PPM_CONTEXT::STATE *stats = GetStateNoCheck(MinContext->Stats); - for (p = FoundState; p != stats; p--) - _PPMD_SWAP(p[0], p[-1]); - stats->Freq += 4; - MinContext->SummFreq += 4; - EscFreq = MinContext->SummFreq - p->Freq; - Adder = (OrderFall != 0); - p->Freq = (Byte)((p->Freq + Adder) >> 1); - MinContext->SummFreq = p->Freq; - do - { - EscFreq -= (++p)->Freq; - p->Freq = (Byte)((p->Freq + Adder) >> 1); - MinContext->SummFreq = (UInt16)(MinContext->SummFreq + p->Freq); - if (p[0].Freq > p[-1].Freq) - { - PPM_CONTEXT::STATE tmp = *(p1 = p); - do - { - p1[0] = p1[-1]; - } - while (--p1 != stats && tmp.Freq > p1[-1].Freq); - *p1 = tmp; - } - } - while ( --i ); - if (p->Freq == 0) - { - do { i++; } while ((--p)->Freq == 0); - EscFreq += i; - MinContext->NumStats = (UInt16)(MinContext->NumStats - i); - if (MinContext->NumStats == 1) - { - PPM_CONTEXT::STATE tmp = *stats; - do { tmp.Freq = (Byte)(tmp.Freq - (tmp.Freq >> 1)); EscFreq >>= 1; } while (EscFreq > 1); - SubAllocator.FreeUnits(stats, (OldNS+1) >> 1); - *(FoundState = &MinContext->oneState()) = tmp; return; - } - } - EscFreq -= (EscFreq >> 1); - MinContext->SummFreq = (UInt16)(MinContext->SummFreq + EscFreq); - int n0 = (OldNS+1) >> 1, n1 = (MinContext->NumStats + 1) >> 1; - if (n0 != n1) - MinContext->Stats = SubAllocator.GetOffset(SubAllocator.ShrinkUnits(stats, n0, n1)); - FoundState = GetState(MinContext->Stats); - } - - void NextContext() - { - PPM_CONTEXT *c = GetContext(FoundState->GetSuccessor()); - if (!OrderFall && (Byte *)c > SubAllocator.pText) - MinContext = MaxContext = c; - else - { - UpdateModel(); - if (EscCount == 0) - ClearMask(); - } - } -}; - -// Tabulated escapes for exponential symbol distribution -const Byte ExpEscape[16]={ 25,14, 9, 7, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 2 }; -#define GET_MEAN(SUMM,SHIFT,ROUND) ((SUMM+(1 << (SHIFT-ROUND))) >> (SHIFT)) - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/PpmdDecode.h b/desmume/src/windows/7z/CPP/7zip/Compress/PpmdDecode.h deleted file mode 100644 index 3ad037da6..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/PpmdDecode.h +++ /dev/null @@ -1,154 +0,0 @@ -// PpmdDecode.h -// This code is based on Dmitry Shkarin's PPMdH code - -#ifndef __COMPRESS_PPMD_DECODE_H -#define __COMPRESS_PPMD_DECODE_H - -#include "PpmdContext.h" - -namespace NCompress { -namespace NPpmd { - -class CRangeDecoderVirt -{ -public: - virtual UInt32 GetThreshold(UInt32 total) = 0; - virtual void Decode(UInt32 start, UInt32 size) = 0; - virtual UInt32 DecodeBit(UInt32 size0, UInt32 numTotalBits) = 0; -}; - -typedef NRangeCoder::CDecoder CRangeDecoderMy; - -class CRangeDecoder:public CRangeDecoderVirt, public CRangeDecoderMy -{ - UInt32 GetThreshold(UInt32 total) { return CRangeDecoderMy::GetThreshold(total); } - void Decode(UInt32 start, UInt32 size) { CRangeDecoderMy::Decode(start, size); } - UInt32 DecodeBit(UInt32 size0, UInt32 numTotalBits) { return CRangeDecoderMy::DecodeBit(size0, numTotalBits); } -}; - -struct CDecodeInfo: public CInfo -{ - void DecodeBinSymbol(CRangeDecoderVirt *rangeDecoder) - { - PPM_CONTEXT::STATE& rs = MinContext->oneState(); - UInt16& bs = GetBinSumm(rs, GetContextNoCheck(MinContext->Suffix)->NumStats); - if (rangeDecoder->DecodeBit(bs, TOT_BITS) == 0) - { - FoundState = &rs; - rs.Freq = (Byte)(rs.Freq + (rs.Freq < 128 ? 1: 0)); - bs = (UInt16)(bs + INTERVAL - GET_MEAN(bs, PERIOD_BITS, 2)); - PrevSuccess = 1; - RunLength++; - } - else - { - bs = (UInt16)(bs - GET_MEAN(bs, PERIOD_BITS, 2)); - InitEsc = ExpEscape[bs >> 10]; - NumMasked = 1; - CharMask[rs.Symbol] = EscCount; - PrevSuccess = 0; - FoundState = NULL; - } - } - - void DecodeSymbol1(CRangeDecoderVirt *rangeDecoder) - { - PPM_CONTEXT::STATE* p = GetStateNoCheck(MinContext->Stats); - int i, count, hiCnt; - if ((count = rangeDecoder->GetThreshold(MinContext->SummFreq)) < (hiCnt = p->Freq)) - { - PrevSuccess = (2 * hiCnt > MinContext->SummFreq); - RunLength += PrevSuccess; - rangeDecoder->Decode(0, p->Freq); // MinContext->SummFreq); - (FoundState = p)->Freq = (Byte)(hiCnt += 4); - MinContext->SummFreq += 4; - if (hiCnt > MAX_FREQ) - rescale(); - return; - } - PrevSuccess = 0; - i = MinContext->NumStats - 1; - while ((hiCnt += (++p)->Freq) <= count) - if (--i == 0) - { - HiBitsFlag = HB2Flag[FoundState->Symbol]; - rangeDecoder->Decode(hiCnt, MinContext->SummFreq - hiCnt); // , MinContext->SummFreq); - CharMask[p->Symbol] = EscCount; - i = (NumMasked = MinContext->NumStats)-1; - FoundState = NULL; - do { CharMask[(--p)->Symbol] = EscCount; } while ( --i ); - return; - } - rangeDecoder->Decode(hiCnt - p->Freq, p->Freq); // , MinContext->SummFreq); - update1(p); - } - - - void DecodeSymbol2(CRangeDecoderVirt *rangeDecoder) - { - int count, hiCnt, i = MinContext->NumStats - NumMasked; - UInt32 freqSum; - SEE2_CONTEXT* psee2c = makeEscFreq2(i, freqSum); - PPM_CONTEXT::STATE* ps[256], ** pps = ps, * p = GetStateNoCheck(MinContext->Stats)-1; - hiCnt = 0; - do - { - do { p++; } while (CharMask[p->Symbol] == EscCount); - hiCnt += p->Freq; - *pps++ = p; - } - while ( --i ); - - freqSum += hiCnt; - count = rangeDecoder->GetThreshold(freqSum); - - p = *(pps = ps); - if (count < hiCnt) - { - hiCnt = 0; - while ((hiCnt += p->Freq) <= count) - p=*++pps; - rangeDecoder->Decode(hiCnt - p->Freq, p->Freq); // , freqSum); - - psee2c->update(); - update2(p); - } - else - { - rangeDecoder->Decode(hiCnt, freqSum - hiCnt); // , freqSum); - - i = MinContext->NumStats - NumMasked; - pps--; - do { CharMask[(*++pps)->Symbol] = EscCount; } while ( --i ); - psee2c->Summ = (UInt16)(psee2c->Summ + freqSum); - NumMasked = MinContext->NumStats; - } - } - - int DecodeSymbol(CRangeDecoderVirt *rangeDecoder) - { - if (MinContext->NumStats != 1) - DecodeSymbol1(rangeDecoder); - else - DecodeBinSymbol(rangeDecoder); - while ( !FoundState ) - { - do - { - OrderFall++; - MinContext = GetContext(MinContext->Suffix); - if (MinContext == 0) - return -1; - } - while (MinContext->NumStats == NumMasked); - DecodeSymbol2(rangeDecoder); - } - Byte symbol = FoundState->Symbol; - NextContext(); - return symbol; - } -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/PpmdDecoder.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/PpmdDecoder.cpp deleted file mode 100644 index 9049a472b..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/PpmdDecoder.cpp +++ /dev/null @@ -1,182 +0,0 @@ -// PpmdDecoder.cpp - -#include "StdAfx.h" - -#include "Common/Defs.h" -#include "Windows/Defs.h" - -#include "PpmdDecoder.h" - -namespace NCompress { -namespace NPpmd { - -const int kLenIdFinished = -1; -const int kLenIdNeedInit = -2; - -STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *properties, UInt32 size) -{ - if (size < 5) - return E_INVALIDARG; - _order = properties[0]; - _usedMemorySize = 0; - for (int i = 0; i < 4; i++) - _usedMemorySize += ((UInt32)(properties[1 + i])) << (i * 8); - - if (_usedMemorySize > kMaxMemBlockSize) - return E_NOTIMPL; - - if (!_rangeDecoder.Create(1 << 20)) - return E_OUTOFMEMORY; - if (!_info.SubAllocator.StartSubAllocator(_usedMemorySize)) - return E_OUTOFMEMORY; - - return S_OK; -} - -class CDecoderFlusher -{ - CDecoder *_coder; -public: - bool NeedFlush; - CDecoderFlusher(CDecoder *coder): _coder(coder), NeedFlush(true) {} - ~CDecoderFlusher() - { - if (NeedFlush) - _coder->Flush(); - _coder->ReleaseStreams(); - } -}; - -HRESULT CDecoder::CodeSpec(UInt32 size, Byte *memStream) -{ - if (_outSizeDefined) - { - const UInt64 rem = _outSize - _processedSize; - if (size > rem) - size = (UInt32)rem; - } - const UInt32 startSize = size; - - if (_remainLen == kLenIdFinished) - return S_OK; - if (_remainLen == kLenIdNeedInit) - { - _rangeDecoder.Init(); - _remainLen = 0; - _info.MaxOrder = 0; - _info.StartModelRare(_order); - } - while (size != 0) - { - int symbol = _info.DecodeSymbol(&_rangeDecoder); - if (symbol < 0) - { - _remainLen = kLenIdFinished; - break; - } - if (memStream != 0) - *memStream++ = (Byte)symbol; - else - _outStream.WriteByte((Byte)symbol); - size--; - } - _processedSize += startSize - size; - return S_OK; -} - -STDMETHODIMP CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress) -{ - if (!_outStream.Create(1 << 20)) - return E_OUTOFMEMORY; - - SetInStream(inStream); - _outStream.SetStream(outStream); - SetOutStreamSize(outSize); - CDecoderFlusher flusher(this); - - for (;;) - { - _processedSize = _outStream.GetProcessedSize(); - UInt32 curSize = (1 << 18); - RINOK(CodeSpec(curSize, NULL)); - if (_remainLen == kLenIdFinished) - break; - if (progress != NULL) - { - UInt64 inSize = _rangeDecoder.GetProcessedSize(); - RINOK(progress->SetRatioInfo(&inSize, &_processedSize)); - } - if (_outSizeDefined) - if (_outStream.GetProcessedSize() >= _outSize) - break; - } - flusher.NeedFlush = false; - return Flush(); -} - -#ifdef _NO_EXCEPTIONS - -#define PPMD_TRY_BEGIN -#define PPMD_TRY_END - -#else - -#define PPMD_TRY_BEGIN try { -#define PPMD_TRY_END } \ - catch(const CInBufferException &e) { return e.ErrorCode; } \ - catch(const COutBufferException &e) { return e.ErrorCode; } \ - catch(...) { return S_FALSE; } - -#endif - - -STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress) -{ - PPMD_TRY_BEGIN - return CodeReal(inStream, outStream, inSize, outSize, progress); - PPMD_TRY_END -} - -STDMETHODIMP CDecoder::SetInStream(ISequentialInStream *inStream) -{ - _rangeDecoder.SetStream(inStream); - return S_OK; -} - -STDMETHODIMP CDecoder::ReleaseInStream() -{ - _rangeDecoder.ReleaseStream(); - return S_OK; -} - -STDMETHODIMP CDecoder::SetOutStreamSize(const UInt64 *outSize) -{ - _outSizeDefined = (outSize != NULL); - if (_outSizeDefined) - _outSize = *outSize; - _processedSize = 0; - _remainLen = kLenIdNeedInit; - _outStream.Init(); - return S_OK; -} - -#ifndef NO_READ_FROM_CODER - -STDMETHODIMP CDecoder::Read(void *data, UInt32 size, UInt32 *processedSize) -{ - PPMD_TRY_BEGIN - if (processedSize) - *processedSize = 0; - const UInt64 startPos = _processedSize; - RINOK(CodeSpec(size, (Byte *)data)); - if (processedSize) - *processedSize = (UInt32)(_processedSize - startPos); - return Flush(); - PPMD_TRY_END -} - -#endif - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/PpmdDecoder.h b/desmume/src/windows/7z/CPP/7zip/Compress/PpmdDecoder.h deleted file mode 100644 index e14d37303..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/PpmdDecoder.h +++ /dev/null @@ -1,86 +0,0 @@ -// PpmdDecoder.h - -#ifndef __COMPRESS_PPMD_DECODER_H -#define __COMPRESS_PPMD_DECODER_H - -#include "../../Common/MyCom.h" - -#include "../ICoder.h" - -#include "../Common/OutBuffer.h" - -#include "PpmdDecode.h" -#include "RangeCoder.h" - -namespace NCompress { -namespace NPpmd { - -class CDecoder : - public ICompressCoder, - public ICompressSetDecoderProperties2, - #ifndef NO_READ_FROM_CODER - public ICompressSetInStream, - public ICompressSetOutStreamSize, - public ISequentialInStream, - #endif - public CMyUnknownImp -{ - CRangeDecoder _rangeDecoder; - - COutBuffer _outStream; - - CDecodeInfo _info; - - Byte _order; - UInt32 _usedMemorySize; - - int _remainLen; - UInt64 _outSize; - bool _outSizeDefined; - UInt64 _processedSize; - - HRESULT CodeSpec(UInt32 num, Byte *memStream); - -public: - - #ifndef NO_READ_FROM_CODER - MY_UNKNOWN_IMP4( - ICompressSetDecoderProperties2, - ICompressSetInStream, - ICompressSetOutStreamSize, - ISequentialInStream) - #else - MY_UNKNOWN_IMP1( - ICompressSetDecoderProperties2) - #endif - - void ReleaseStreams() - { - ReleaseInStream(); - _outStream.ReleaseStream(); - } - - HRESULT Flush() { return _outStream.Flush(); } - - STDMETHOD(CodeReal)(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); - - STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); - - STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size); - - STDMETHOD(SetInStream)(ISequentialInStream *inStream); - STDMETHOD(ReleaseInStream)(); - STDMETHOD(SetOutStreamSize)(const UInt64 *outSize); - - #ifndef NO_READ_FROM_CODER - STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); - #endif - - CDecoder(): _outSizeDefined(false) {} -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/PpmdRegister.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/PpmdRegister.cpp deleted file mode 100644 index eed3d7b16..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/PpmdRegister.cpp +++ /dev/null @@ -1,20 +0,0 @@ -// PpmdRegister.cpp - -#include "StdAfx.h" - -#include "../Common/RegisterCodec.h" - -#include "PpmdDecoder.h" - -static void *CreateCodec() { return (void *)(ICompressCoder *)(new NCompress::NPpmd::CDecoder); } -#ifndef EXTRACT_ONLY -#include "PpmdEncoder.h" -static void *CreateCodecOut() { return (void *)(ICompressCoder *)(new NCompress::NPpmd::CEncoder); } -#else -#define CreateCodecOut 0 -#endif - -static CCodecInfo g_CodecInfo = - { CreateCodec, CreateCodecOut, 0x030401, L"PPMD", 1, false }; - -REGISTER_CODEC(PPMD) diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/PpmdSubAlloc.h b/desmume/src/windows/7z/CPP/7zip/Compress/PpmdSubAlloc.h deleted file mode 100644 index fdea6d5df..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/PpmdSubAlloc.h +++ /dev/null @@ -1,295 +0,0 @@ -// PpmdSubAlloc.h -// This code is based on Dmitry Shkarin's PPMdH code - -#ifndef __COMPRESS_PPMD_SUB_ALLOC_H -#define __COMPRESS_PPMD_SUB_ALLOC_H - -extern "C" -{ -#include "../../../C/Alloc.h" -} - -#include "PpmdType.h" - -const UINT N1=4, N2=4, N3=4, N4=(128+3-1*N1-2*N2-3*N3)/4; -const UINT UNIT_SIZE=12, N_INDEXES=N1+N2+N3+N4; - -// Extra 1 * UNIT_SIZE for NULL support -// Extra 2 * UNIT_SIZE for s0 in GlueFreeBlocks() -const UInt32 kExtraSize = (UNIT_SIZE * 3); -const UInt32 kMaxMemBlockSize = 0xFFFFFFFF - kExtraSize; - -struct MEM_BLK -{ - UInt16 Stamp, NU; - UInt32 Next, Prev; - void InsertAt(Byte *Base, UInt32 p) - { - Prev = p; - MEM_BLK *pp = (MEM_BLK *)(Base + p); - Next = pp->Next; - pp->Next = ((MEM_BLK *)(Base + Next))->Prev = (UInt32)((Byte *)this - Base); - } - void Remove(Byte *Base) - { - ((MEM_BLK *)(Base + Prev))->Next = Next; - ((MEM_BLK *)(Base + Next))->Prev = Prev; - } -}; - - -class CSubAllocator -{ - UInt32 SubAllocatorSize; - Byte Indx2Units[N_INDEXES], Units2Indx[128], GlueCount; - UInt32 FreeList[N_INDEXES]; - - Byte *Base; - Byte *HeapStart, *LoUnit, *HiUnit; -public: - Byte *pText, *UnitsStart; - CSubAllocator(): - SubAllocatorSize(0), - GlueCount(0), - LoUnit(0), - HiUnit(0), - pText(0), - UnitsStart(0) - { - memset(Indx2Units, 0, sizeof(Indx2Units)); - memset(FreeList, 0, sizeof(FreeList)); - } - ~CSubAllocator() - { - StopSubAllocator(); - }; - - void *GetPtr(UInt32 offset) const { return (offset == 0) ? 0 : (void *)(Base + offset); } - void *GetPtrNoCheck(UInt32 offset) const { return (void *)(Base + offset); } - UInt32 GetOffset(void *ptr) const { return (ptr == 0) ? 0 : (UInt32)((Byte *)ptr - Base); } - UInt32 GetOffsetNoCheck(void *ptr) const { return (UInt32)((Byte *)ptr - Base); } - MEM_BLK *GetBlk(UInt32 offset) const { return (MEM_BLK *)(Base + offset); } - UInt32 *GetNode(UInt32 offset) const { return (UInt32 *)(Base + offset); } - - void InsertNode(void* p, int indx) - { - *(UInt32 *)p = FreeList[indx]; - FreeList[indx] = GetOffsetNoCheck(p); - } - - void* RemoveNode(int indx) - { - UInt32 offset = FreeList[indx]; - UInt32 *p = GetNode(offset); - FreeList[indx] = *p; - return (void *)p; - } - - UINT U2B(int NU) const { return (UINT)(NU) * UNIT_SIZE; } - - void SplitBlock(void* pv, int oldIndx, int newIndx) - { - int i, UDiff = Indx2Units[oldIndx] - Indx2Units[newIndx]; - Byte* p = ((Byte*)pv) + U2B(Indx2Units[newIndx]); - if (Indx2Units[i = Units2Indx[UDiff-1]] != UDiff) - { - InsertNode(p, --i); - p += U2B(i = Indx2Units[i]); - UDiff -= i; - } - InsertNode(p, Units2Indx[UDiff - 1]); - } - - UInt32 GetUsedMemory() const - { - UInt32 RetVal = SubAllocatorSize - (UInt32)(HiUnit - LoUnit) - (UInt32)(UnitsStart - pText); - for (UInt32 i = 0; i < N_INDEXES; i++) - for (UInt32 pn = FreeList[i]; pn != 0; RetVal -= (UInt32)Indx2Units[i] * UNIT_SIZE) - pn = *GetNode(pn); - return (RetVal >> 2); - } - - UInt32 GetSubAllocatorSize() const { return SubAllocatorSize; } - - void StopSubAllocator() - { - if (SubAllocatorSize != 0) - { - BigFree(Base); - SubAllocatorSize = 0; - Base = 0; - } - } - - bool StartSubAllocator(UInt32 size) - { - if (SubAllocatorSize == size) - return true; - StopSubAllocator(); - if (size == 0) - Base = 0; - else - { - if ((Base = (Byte *)::BigAlloc(size + kExtraSize)) == 0) - return false; - HeapStart = Base + UNIT_SIZE; // we need such code to support NULL; - } - SubAllocatorSize = size; - return true; - } - - void InitSubAllocator() - { - int i, k; - memset(FreeList, 0, sizeof(FreeList)); - HiUnit = (pText = HeapStart) + SubAllocatorSize; - UINT Diff = UNIT_SIZE * (SubAllocatorSize / 8 / UNIT_SIZE * 7); - LoUnit = UnitsStart = HiUnit - Diff; - for (i = 0, k=1; i < N1 ; i++, k += 1) Indx2Units[i] = (Byte)k; - for (k++; i < N1 + N2 ;i++, k += 2) Indx2Units[i] = (Byte)k; - for (k++; i < N1 + N2 + N3 ;i++,k += 3) Indx2Units[i] = (Byte)k; - for (k++; i < N1 + N2 + N3 + N4; i++, k += 4) Indx2Units[i] = (Byte)k; - GlueCount = 0; - for (k = i = 0; k < 128; k++) - { - i += (Indx2Units[i] < k+1); - Units2Indx[k] = (Byte)i; - } - } - - void GlueFreeBlocks() - { - UInt32 s0 = (UInt32)(HeapStart + SubAllocatorSize - Base); - - // We need add exta MEM_BLK with Stamp=0 - GetBlk(s0)->Stamp = 0; - s0 += UNIT_SIZE; - MEM_BLK *ps0 = GetBlk(s0); - - UInt32 p; - int i; - if (LoUnit != HiUnit) - *LoUnit=0; - ps0->Next = ps0->Prev = s0; - - for (i = 0; i < N_INDEXES; i++) - while (FreeList[i] != 0) - { - MEM_BLK *pp = (MEM_BLK *)RemoveNode(i); - pp->InsertAt(Base, s0); - pp->Stamp = 0xFFFF; - pp->NU = Indx2Units[i]; - } - for (p = ps0->Next; p != s0; p = GetBlk(p)->Next) - { - for (;;) - { - MEM_BLK *pp = GetBlk(p); - MEM_BLK *pp1 = GetBlk(p + pp->NU * UNIT_SIZE); - if (pp1->Stamp != 0xFFFF || int(pp->NU) + pp1->NU >= 0x10000) - break; - pp1->Remove(Base); - pp->NU = (UInt16)(pp->NU + pp1->NU); - } - } - while ((p = ps0->Next) != s0) - { - MEM_BLK *pp = GetBlk(p); - pp->Remove(Base); - int sz; - for (sz = pp->NU; sz > 128; sz -= 128, p += 128 * UNIT_SIZE) - InsertNode(Base + p, N_INDEXES - 1); - if (Indx2Units[i = Units2Indx[sz-1]] != sz) - { - int k = sz - Indx2Units[--i]; - InsertNode(Base + p + (sz - k) * UNIT_SIZE, k - 1); - } - InsertNode(Base + p, i); - } - } - void* AllocUnitsRare(int indx) - { - if ( !GlueCount ) - { - GlueCount = 255; - GlueFreeBlocks(); - if (FreeList[indx] != 0) - return RemoveNode(indx); - } - int i = indx; - do - { - if (++i == N_INDEXES) - { - GlueCount--; - i = U2B(Indx2Units[indx]); - return (UnitsStart - pText > i) ? (UnitsStart -= i) : (NULL); - } - } while (FreeList[i] == 0); - void* RetVal = RemoveNode(i); - SplitBlock(RetVal, i, indx); - return RetVal; - } - - void* AllocUnits(int NU) - { - int indx = Units2Indx[NU - 1]; - if (FreeList[indx] != 0) - return RemoveNode(indx); - void* RetVal = LoUnit; - LoUnit += U2B(Indx2Units[indx]); - if (LoUnit <= HiUnit) - return RetVal; - LoUnit -= U2B(Indx2Units[indx]); - return AllocUnitsRare(indx); - } - - void* AllocContext() - { - if (HiUnit != LoUnit) - return (HiUnit -= UNIT_SIZE); - if (FreeList[0] != 0) - return RemoveNode(0); - return AllocUnitsRare(0); - } - - void* ExpandUnits(void* oldPtr, int oldNU) - { - int i0=Units2Indx[oldNU - 1], i1=Units2Indx[oldNU - 1 + 1]; - if (i0 == i1) - return oldPtr; - void* ptr = AllocUnits(oldNU + 1); - if (ptr) - { - memcpy(ptr, oldPtr, U2B(oldNU)); - InsertNode(oldPtr, i0); - } - return ptr; - } - - void* ShrinkUnits(void* oldPtr, int oldNU, int newNU) - { - int i0 = Units2Indx[oldNU - 1], i1 = Units2Indx[newNU - 1]; - if (i0 == i1) - return oldPtr; - if (FreeList[i1] != 0) - { - void* ptr = RemoveNode(i1); - memcpy(ptr, oldPtr, U2B(newNU)); - InsertNode(oldPtr,i0); - return ptr; - } - else - { - SplitBlock(oldPtr, i0, i1); - return oldPtr; - } - } - - void FreeUnits(void* ptr, int oldNU) - { - InsertNode(ptr, Units2Indx[oldNU - 1]); - } -}; - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/PpmdType.h b/desmume/src/windows/7z/CPP/7zip/Compress/PpmdType.h deleted file mode 100644 index 313c5f28e..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/PpmdType.h +++ /dev/null @@ -1,20 +0,0 @@ -/**************************************************************************** - * This file is part of PPMd project * - * Written and distributed to public domain by Dmitry Shkarin 1997, * - * 1999-2001 * - * Contents: compilation parameters and miscelaneous definitions * - * Comments: system & compiler dependent file - - * modified by Igor Pavlov (2004-08-29). - ****************************************************************************/ - -#ifndef __COMPRESS_PPMD_TYPE_H -#define __COMPRESS_PPMD_TYPE_H - -const int kMaxOrderCompress = 32; -const int MAX_O = 255; /* maximum allowed model order */ - -template -inline void _PPMD_SWAP(T& t1,T& t2) { T tmp = t1; t1 = t2; t2 = tmp; } - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/RangeCoder.h b/desmume/src/windows/7z/CPP/7zip/Compress/RangeCoder.h deleted file mode 100644 index 8040bcd06..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/RangeCoder.h +++ /dev/null @@ -1,204 +0,0 @@ -// Compress/RangeCoder.h - -#ifndef __COMPRESS_RANGE_CODER_H -#define __COMPRESS_RANGE_CODER_H - -#include "../Common/InBuffer.h" -#include "../Common/OutBuffer.h" - -namespace NCompress { -namespace NRangeCoder { - -const int kNumTopBits = 24; -const UInt32 kTopValue = (1 << kNumTopBits); - -class CEncoder -{ - UInt32 _cacheSize; - Byte _cache; -public: - UInt64 Low; - UInt32 Range; - COutBuffer Stream; - bool Create(UInt32 bufferSize) { return Stream.Create(bufferSize); } - - void SetStream(ISequentialOutStream *stream) { Stream.SetStream(stream); } - void Init() - { - Stream.Init(); - Low = 0; - Range = 0xFFFFFFFF; - _cacheSize = 1; - _cache = 0; - } - - void FlushData() - { - // Low += 1; - for(int i = 0; i < 5; i++) - ShiftLow(); - } - - HRESULT FlushStream() { return Stream.Flush(); } - - void ReleaseStream() { Stream.ReleaseStream(); } - - void Encode(UInt32 start, UInt32 size, UInt32 total) - { - Low += start * (Range /= total); - Range *= size; - while (Range < kTopValue) - { - Range <<= 8; - ShiftLow(); - } - } - - void ShiftLow() - { - if ((UInt32)Low < (UInt32)0xFF000000 || (int)(Low >> 32) != 0) - { - Byte temp = _cache; - do - { - Stream.WriteByte((Byte)(temp + (Byte)(Low >> 32))); - temp = 0xFF; - } - while(--_cacheSize != 0); - _cache = (Byte)((UInt32)Low >> 24); - } - _cacheSize++; - Low = (UInt32)Low << 8; - } - - void EncodeDirectBits(UInt32 value, int numBits) - { - for (numBits--; numBits >= 0; numBits--) - { - Range >>= 1; - Low += Range & (0 - ((value >> numBits) & 1)); - if (Range < kTopValue) - { - Range <<= 8; - ShiftLow(); - } - } - } - - void EncodeBit(UInt32 size0, UInt32 numTotalBits, UInt32 symbol) - { - UInt32 newBound = (Range >> numTotalBits) * size0; - if (symbol == 0) - Range = newBound; - else - { - Low += newBound; - Range -= newBound; - } - while (Range < kTopValue) - { - Range <<= 8; - ShiftLow(); - } - } - - UInt64 GetProcessedSize() { return Stream.GetProcessedSize() + _cacheSize + 4; } -}; - -class CDecoder -{ -public: - CInBuffer Stream; - UInt32 Range; - UInt32 Code; - bool Create(UInt32 bufferSize) { return Stream.Create(bufferSize); } - - void Normalize() - { - while (Range < kTopValue) - { - Code = (Code << 8) | Stream.ReadByte(); - Range <<= 8; - } - } - - void SetStream(ISequentialInStream *stream) { Stream.SetStream(stream); } - void Init() - { - Stream.Init(); - Code = 0; - Range = 0xFFFFFFFF; - for(int i = 0; i < 5; i++) - Code = (Code << 8) | Stream.ReadByte(); - } - - void ReleaseStream() { Stream.ReleaseStream(); } - - UInt32 GetThreshold(UInt32 total) - { - return (Code) / ( Range /= total); - } - - void Decode(UInt32 start, UInt32 size) - { - Code -= start * Range; - Range *= size; - Normalize(); - } - - UInt32 DecodeDirectBits(int numTotalBits) - { - UInt32 range = Range; - UInt32 code = Code; - UInt32 result = 0; - for (int i = numTotalBits; i != 0; i--) - { - range >>= 1; - /* - result <<= 1; - if (code >= range) - { - code -= range; - result |= 1; - } - */ - UInt32 t = (code - range) >> 31; - code -= range & (t - 1); - result = (result << 1) | (1 - t); - - if (range < kTopValue) - { - code = (code << 8) | Stream.ReadByte(); - range <<= 8; - } - } - Range = range; - Code = code; - return result; - } - - UInt32 DecodeBit(UInt32 size0, UInt32 numTotalBits) - { - UInt32 newBound = (Range >> numTotalBits) * size0; - UInt32 symbol; - if (Code < newBound) - { - symbol = 0; - Range = newBound; - } - else - { - symbol = 1; - Code -= newBound; - Range -= newBound; - } - Normalize(); - return symbol; - } - - UInt64 GetProcessedSize() {return Stream.GetProcessedSize(); } -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/RangeCoderBit.h b/desmume/src/windows/7z/CPP/7zip/Compress/RangeCoderBit.h deleted file mode 100644 index f2fe45d7f..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/RangeCoderBit.h +++ /dev/null @@ -1,113 +0,0 @@ -// Compress/RangeCoderBit.h - -#ifndef __COMPRESS_RANGE_CODER_BIT_H -#define __COMPRESS_RANGE_CODER_BIT_H - -#include "RangeCoder.h" - -namespace NCompress { -namespace NRangeCoder { - -const int kNumBitModelTotalBits = 11; -const UInt32 kBitModelTotal = (1 << kNumBitModelTotalBits); - -const int kNumMoveReducingBits = 4; - -const int kNumBitPriceShiftBits = 4; -const UInt32 kBitPrice = 1 << kNumBitPriceShiftBits; - -extern UInt32 ProbPrices[kBitModelTotal >> kNumMoveReducingBits]; - -template -class CBitModel -{ -public: - UInt32 Prob; - void UpdateModel(UInt32 symbol) - { - /* - Prob -= (Prob + ((symbol - 1) & ((1 << numMoveBits) - 1))) >> numMoveBits; - Prob += (1 - symbol) << (kNumBitModelTotalBits - numMoveBits); - */ - if (symbol == 0) - Prob += (kBitModelTotal - Prob) >> numMoveBits; - else - Prob -= (Prob) >> numMoveBits; - } -public: - void Init() { Prob = kBitModelTotal / 2; } -}; - -template -class CBitEncoder: public CBitModel -{ -public: - void Encode(CEncoder *encoder, UInt32 symbol) - { - /* - encoder->EncodeBit(this->Prob, kNumBitModelTotalBits, symbol); - this->UpdateModel(symbol); - */ - UInt32 newBound = (encoder->Range >> kNumBitModelTotalBits) * this->Prob; - if (symbol == 0) - { - encoder->Range = newBound; - this->Prob += (kBitModelTotal - this->Prob) >> numMoveBits; - } - else - { - encoder->Low += newBound; - encoder->Range -= newBound; - this->Prob -= (this->Prob) >> numMoveBits; - } - if (encoder->Range < kTopValue) - { - encoder->Range <<= 8; - encoder->ShiftLow(); - } - } - UInt32 GetPrice(UInt32 symbol) const - { - return ProbPrices[(this->Prob ^ ((-(int)symbol)) & (kBitModelTotal - 1)) >> kNumMoveReducingBits]; - } - UInt32 GetPrice0() const { return ProbPrices[this->Prob >> kNumMoveReducingBits]; } - UInt32 GetPrice1() const { return ProbPrices[(this->Prob ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits]; } -}; - - -template -class CBitDecoder: public CBitModel -{ -public: - UInt32 Decode(CDecoder *decoder) - { - UInt32 newBound = (decoder->Range >> kNumBitModelTotalBits) * this->Prob; - if (decoder->Code < newBound) - { - decoder->Range = newBound; - this->Prob += (kBitModelTotal - this->Prob) >> numMoveBits; - if (decoder->Range < kTopValue) - { - decoder->Code = (decoder->Code << 8) | decoder->Stream.ReadByte(); - decoder->Range <<= 8; - } - return 0; - } - else - { - decoder->Range -= newBound; - decoder->Code -= newBound; - this->Prob -= (this->Prob) >> numMoveBits; - if (decoder->Range < kTopValue) - { - decoder->Code = (decoder->Code << 8) | decoder->Stream.ReadByte(); - decoder->Range <<= 8; - } - return 1; - } - } -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/Rar1Decoder.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/Rar1Decoder.cpp deleted file mode 100644 index a6a7c854f..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/Rar1Decoder.cpp +++ /dev/null @@ -1,478 +0,0 @@ -// Rar1Decoder.cpp -// According to unRAR license, this code may not be used to develop -// a program that creates RAR archives - -#include "StdAfx.h" - -#include "Rar1Decoder.h" - -namespace NCompress { -namespace NRar1 { - -static UInt32 PosL1[]={0,0,0,2,3,5,7,11,16,20,24,32,32, 256}; -static UInt32 PosL2[]={0,0,0,0,5,7,9,13,18,22,26,34,36, 256}; -static UInt32 PosHf0[]={0,0,0,0,0,8,16,24,33,33,33,33,33, 257}; -static UInt32 PosHf1[]={0,0,0,0,0,0,4,44,60,76,80,80,127, 257}; -static UInt32 PosHf2[]={0,0,0,0,0,0,2,7,53,117,233, 257,0}; -static UInt32 PosHf3[]={0,0,0,0,0,0,0,2,16,218,251, 257,0}; -static UInt32 PosHf4[]={0,0,0,0,0,0,0,0,0,255, 257,0,0}; - -static const UInt32 kHistorySize = (1 << 16); - -class CCoderReleaser -{ - CDecoder *m_Coder; -public: - CCoderReleaser(CDecoder *coder): m_Coder(coder) {} - ~CCoderReleaser() { m_Coder->ReleaseStreams(); } -}; - -CDecoder::CDecoder(): m_IsSolid(false) { } - -void CDecoder::InitStructures() -{ - for(int i = 0; i < kNumRepDists; i++) - m_RepDists[i] = 0; - m_RepDistPtr = 0; - LastLength = 0; - LastDist = 0; -} - -UInt32 CDecoder::ReadBits(int numBits) { return m_InBitStream.ReadBits(numBits); } - -HRESULT CDecoder::CopyBlock(UInt32 distance, UInt32 len) -{ - m_UnpackSize -= len; - return m_OutWindowStream.CopyBlock(distance, len) ? S_OK : S_FALSE; -} - - -UInt32 CDecoder::DecodeNum(const UInt32 *posTab) -{ - UInt32 startPos = 2; - UInt32 num = m_InBitStream.GetValue(12); - for (;;) - { - UInt32 cur = (posTab[startPos + 1] - posTab[startPos]) << (12 - startPos); - if (num < cur) - break; - startPos++; - num -= cur; - } - m_InBitStream.MovePos(startPos); - return((num >> (12 - startPos)) + posTab[startPos]); -} - -static Byte kShortLen1[] = {1,3,4,4,5,6,7,8,8,4,4,5,6,6 }; -static Byte kShortLen1a[] = {1,4,4,4,5,6,7,8,8,4,4,5,6,6,4 }; -static Byte kShortLen2[] = {2,3,3,3,4,4,5,6,6,4,4,5,6,6 }; -static Byte kShortLen2a[] = {2,3,3,4,4,4,5,6,6,4,4,5,6,6,4 }; -static UInt32 kShortXor1[] = {0,0xa0,0xd0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xc0,0x80,0x90,0x98,0x9c,0xb0}; -static UInt32 kShortXor2[] = {0,0x40,0x60,0xa0,0xd0,0xe0,0xf0,0xf8,0xfc,0xc0,0x80,0x90,0x98,0x9c,0xb0}; - -HRESULT CDecoder::ShortLZ() -{ - UInt32 len, saveLen, dist; - int distancePlace; - Byte *kShortLen; - const UInt32 *kShortXor; - NumHuf = 0; - - if (LCount == 2) - { - if (ReadBits(1)) - return CopyBlock(LastDist, LastLength); - LCount = 0; - } - - UInt32 bitField = m_InBitStream.GetValue(8); - - if (AvrLn1 < 37) - { - kShortLen = Buf60 ? kShortLen1a : kShortLen1; - kShortXor = kShortXor1; - } - else - { - kShortLen = Buf60 ? kShortLen2a : kShortLen2; - kShortXor = kShortXor2; - } - - for (len = 0; ((bitField ^ kShortXor[len]) & (~(0xff >> kShortLen[len]))) != 0; len++); - m_InBitStream.MovePos(kShortLen[len]); - - if (len >= 9) - { - if (len == 9) - { - LCount++; - return CopyBlock(LastDist, LastLength); - } - if (len == 14) - { - LCount = 0; - len = DecodeNum(PosL2) + 5; - dist = 0x8000 + ReadBits(15) - 1; - LastLength = len; - LastDist = dist; - return CopyBlock(dist, len); - } - - LCount = 0; - saveLen = len; - dist = m_RepDists[(m_RepDistPtr - (len - 9)) & 3]; - len = DecodeNum(PosL1) + 2; - if (len == 0x101 && saveLen == 10) - { - Buf60 ^= 1; - return S_OK; - } - if (dist >= 256) - len++; - if (dist >= MaxDist3 - 1) - len++; - } - else - { - LCount = 0; - AvrLn1 += len; - AvrLn1 -= AvrLn1 >> 4; - - distancePlace = DecodeNum(PosHf2) & 0xff; - dist = ChSetA[distancePlace]; - if (--distancePlace != -1) - { - PlaceA[dist]--; - UInt32 lastDistance = ChSetA[distancePlace]; - PlaceA[lastDistance]++; - ChSetA[distancePlace + 1] = lastDistance; - ChSetA[distancePlace] = dist; - } - len += 2; - } - m_RepDists[m_RepDistPtr++] = dist; - m_RepDistPtr &= 3; - LastLength = len; - LastDist = dist; - return CopyBlock(dist, len); -} - - -HRESULT CDecoder::LongLZ() -{ - UInt32 len; - UInt32 dist; - UInt32 distancePlace, newDistancePlace; - UInt32 oldAvr2, oldAvr3; - - NumHuf = 0; - Nlzb += 16; - if (Nlzb > 0xff) - { - Nlzb = 0x90; - Nhfb >>= 1; - } - oldAvr2=AvrLn2; - - if (AvrLn2 >= 122) - len = DecodeNum(PosL2); - else if (AvrLn2 >= 64) - len = DecodeNum(PosL1); - else - { - UInt32 bitField = m_InBitStream.GetValue(16); - if (bitField < 0x100) - { - len = bitField; - m_InBitStream.MovePos(16); - } - else - { - for (len = 0; ((bitField << len) & 0x8000) == 0; len++) - ; - m_InBitStream.MovePos(len + 1); - } - } - - AvrLn2 += len; - AvrLn2 -= AvrLn2 >> 5; - - if (AvrPlcB > 0x28ff) - distancePlace = DecodeNum(PosHf2); - else if (AvrPlcB > 0x6ff) - distancePlace = DecodeNum(PosHf1); - else - distancePlace = DecodeNum(PosHf0); - - AvrPlcB += distancePlace; - AvrPlcB -= AvrPlcB >> 8; - for (;;) - { - dist = ChSetB[distancePlace & 0xff]; - newDistancePlace = NToPlB[dist++ & 0xff]++; - if (!(dist & 0xff)) - CorrHuff(ChSetB,NToPlB); - else - break; - } - - ChSetB[distancePlace] = ChSetB[newDistancePlace]; - ChSetB[newDistancePlace] = dist; - - dist = ((dist & 0xff00) >> 1) | ReadBits(7); - - oldAvr3 = AvrLn3; - if (len != 1 && len != 4) - if (len == 0 && dist <= MaxDist3) - { - AvrLn3++; - AvrLn3 -= AvrLn3 >> 8; - } - else - if (AvrLn3 > 0) - AvrLn3--; - len += 3; - if (dist >= MaxDist3) - len++; - if (dist <= 256) - len += 8; - if (oldAvr3 > 0xb0 || AvrPlc >= 0x2a00 && oldAvr2 < 0x40) - MaxDist3 = 0x7f00; - else - MaxDist3 = 0x2001; - m_RepDists[m_RepDistPtr++] = --dist; - m_RepDistPtr &= 3; - LastLength = len; - LastDist = dist; - return CopyBlock(dist, len); -} - - -HRESULT CDecoder::HuffDecode() -{ - UInt32 curByte, newBytePlace; - UInt32 len; - UInt32 dist; - int bytePlace; - - if (AvrPlc > 0x75ff) bytePlace = DecodeNum(PosHf4); - else if (AvrPlc > 0x5dff) bytePlace = DecodeNum(PosHf3); - else if (AvrPlc > 0x35ff) bytePlace = DecodeNum(PosHf2); - else if (AvrPlc > 0x0dff) bytePlace = DecodeNum(PosHf1); - else bytePlace = DecodeNum(PosHf0); - if (StMode) - { - if (--bytePlace == -1) - { - if (ReadBits(1)) - { - NumHuf = StMode = 0; - return S_OK; - } - else - { - len = (ReadBits(1)) ? 4 : 3; - dist = DecodeNum(PosHf2); - dist = (dist << 5) | ReadBits(5); - return CopyBlock(dist - 1, len); - } - } - } - else if (NumHuf++ >= 16 && FlagsCnt == 0) - StMode = 1; - bytePlace &= 0xff; - AvrPlc += bytePlace; - AvrPlc -= AvrPlc >> 8; - Nhfb+=16; - if (Nhfb > 0xff) - { - Nhfb=0x90; - Nlzb >>= 1; - } - - m_UnpackSize --; - m_OutWindowStream.PutByte((Byte)(ChSet[bytePlace] >> 8)); - - for (;;) - { - curByte = ChSet[bytePlace]; - newBytePlace = NToPl[curByte++ & 0xff]++; - if ((curByte & 0xff) > 0xa1) - CorrHuff(ChSet, NToPl); - else - break; - } - - ChSet[bytePlace] = ChSet[newBytePlace]; - ChSet[newBytePlace] = curByte; - return S_OK; -} - - -void CDecoder::GetFlagsBuf() -{ - UInt32 flags, newFlagsPlace; - UInt32 flagsPlace = DecodeNum(PosHf2); - - for (;;) - { - flags = ChSetC[flagsPlace]; - FlagBuf = flags >> 8; - newFlagsPlace = NToPlC[flags++ & 0xff]++; - if ((flags & 0xff) != 0) - break; - CorrHuff(ChSetC, NToPlC); - } - - ChSetC[flagsPlace] = ChSetC[newFlagsPlace]; - ChSetC[newFlagsPlace] = flags; -} - -void CDecoder::InitData() -{ - if (!m_IsSolid) - { - AvrPlcB = AvrLn1 = AvrLn2 = AvrLn3 = NumHuf = Buf60 = 0; - AvrPlc = 0x3500; - MaxDist3 = 0x2001; - Nhfb = Nlzb = 0x80; - } - FlagsCnt = 0; - FlagBuf = 0; - StMode = 0; - LCount = 0; -} - -void CDecoder::CorrHuff(UInt32 *CharSet,UInt32 *NumToPlace) -{ - int i; - for (i = 7; i >= 0; i--) - for (int j = 0; j < 32; j++, CharSet++) - *CharSet = (*CharSet & ~0xff) | i; - memset(NumToPlace, 0, sizeof(NToPl)); - for (i = 6; i >= 0; i--) - NumToPlace[i] = (7 - i) * 32; -} - -void CDecoder::InitHuff() -{ - for (UInt32 i = 0; i < 256; i++) - { - Place[i] = PlaceA[i] = PlaceB[i] = i; - PlaceC[i] = (~i + 1) & 0xff; - ChSet[i] = ChSetB[i] = i << 8; - ChSetA[i] = i; - ChSetC[i] = ((~i + 1) & 0xff) << 8; - } - memset(NToPl, 0, sizeof(NToPl)); - memset(NToPlB, 0, sizeof(NToPlB)); - memset(NToPlC, 0, sizeof(NToPlC)); - CorrHuff(ChSetB, NToPlB); -} - -HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo * /* progress */) -{ - if (inSize == NULL || outSize == NULL) - return E_INVALIDARG; - - if (!m_OutWindowStream.Create(kHistorySize)) - return E_OUTOFMEMORY; - if (!m_InBitStream.Create(1 << 20)) - return E_OUTOFMEMORY; - - m_UnpackSize = (Int64)*outSize; - m_OutWindowStream.SetStream(outStream); - m_OutWindowStream.Init(m_IsSolid); - m_InBitStream.SetStream(inStream); - m_InBitStream.Init(); - - CCoderReleaser coderReleaser(this); - InitData(); - if (!m_IsSolid) - { - InitStructures(); - InitHuff(); - } - if (m_UnpackSize > 0) - { - GetFlagsBuf(); - FlagsCnt = 8; - } - - while (m_UnpackSize > 0) - { - if (StMode) - { - RINOK(HuffDecode()); - continue; - } - - if (--FlagsCnt < 0) - { - GetFlagsBuf(); - FlagsCnt=7; - } - - if (FlagBuf & 0x80) - { - FlagBuf <<= 1; - if (Nlzb > Nhfb) - { - RINOK(LongLZ()); - } - else - { - RINOK(HuffDecode()); - } - } - else - { - FlagBuf <<= 1; - if (--FlagsCnt < 0) - { - GetFlagsBuf(); - FlagsCnt = 7; - } - if (FlagBuf & 0x80) - { - FlagBuf <<= 1; - if (Nlzb > Nhfb) - { - RINOK(HuffDecode()); - } - else - { - RINOK(LongLZ()); - } - } - else - { - FlagBuf <<= 1; - RINOK(ShortLZ()); - } - } - } - if (m_UnpackSize < 0) - return S_FALSE; - return m_OutWindowStream.Flush(); -} - -STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress) -{ - try { return CodeReal(inStream, outStream, inSize, outSize, progress); } - catch(const CInBufferException &e) { return e.ErrorCode; } - catch(const CLzOutWindowException &e) { return e.ErrorCode; } - catch(...) { return S_FALSE; } -} - -STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size) -{ - if (size < 1) - return E_INVALIDARG; - m_IsSolid = (data[0] != 0); - return S_OK; -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/Rar1Decoder.h b/desmume/src/windows/7z/CPP/7zip/Compress/Rar1Decoder.h deleted file mode 100644 index 1b960e457..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/Rar1Decoder.h +++ /dev/null @@ -1,88 +0,0 @@ -// Rar1Decoder.h -// According to unRAR license, this code may not be used to develop -// a program that creates RAR archives - -#ifndef __COMPRESS_RAR1_DECODER_H -#define __COMPRESS_RAR1_DECODER_H - -#include "../../Common/MyCom.h" - -#include "../ICoder.h" - -#include "../Common/InBuffer.h" - -#include "BitmDecoder.h" -#include "HuffmanDecoder.h" -#include "LzOutWindow.h" - -namespace NCompress { -namespace NRar1 { - -const UInt32 kNumRepDists = 4; - -typedef NBitm::CDecoder CBitDecoder; - -class CDecoder : - public ICompressCoder, - public ICompressSetDecoderProperties2, - public CMyUnknownImp -{ -public: - CLzOutWindow m_OutWindowStream; - CBitDecoder m_InBitStream; - - UInt32 m_RepDists[kNumRepDists]; - UInt32 m_RepDistPtr; - - UInt32 LastDist; - UInt32 LastLength; - - Int64 m_UnpackSize; - bool m_IsSolid; - - UInt32 ReadBits(int numBits); - HRESULT CopyBlock(UInt32 distance, UInt32 len); - - UInt32 DecodeNum(const UInt32 *posTab); - HRESULT ShortLZ(); - HRESULT LongLZ(); - HRESULT HuffDecode(); - void GetFlagsBuf(); - void InitData(); - void InitHuff(); - void CorrHuff(UInt32 *CharSet, UInt32 *NumToPlace); - void OldUnpWriteBuf(); - - UInt32 ChSet[256],ChSetA[256],ChSetB[256],ChSetC[256]; - UInt32 Place[256],PlaceA[256],PlaceB[256],PlaceC[256]; - UInt32 NToPl[256],NToPlB[256],NToPlC[256]; - UInt32 FlagBuf,AvrPlc,AvrPlcB,AvrLn1,AvrLn2,AvrLn3; - int Buf60,NumHuf,StMode,LCount,FlagsCnt; - UInt32 Nhfb,Nlzb,MaxDist3; - - void InitStructures(); - - HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); - -public: - CDecoder(); - - MY_UNKNOWN_IMP1(ICompressSetDecoderProperties2) - - void ReleaseStreams() - { - m_OutWindowStream.ReleaseStream(); - m_InBitStream.ReleaseStream(); - } - - STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); - - STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size); - -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/Rar2Decoder.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/Rar2Decoder.cpp deleted file mode 100644 index 194a4bdf3..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/Rar2Decoder.cpp +++ /dev/null @@ -1,389 +0,0 @@ -// Rar2Decoder.cpp -// According to unRAR license, this code may not be used to develop -// a program that creates RAR archives - -#include "StdAfx.h" - -#include "Rar2Decoder.h" - -namespace NCompress { -namespace NRar2 { - -namespace NMultimedia { - -Byte CFilter::Decode(int &channelDelta, Byte deltaByte) -{ - D4 = D3; - D3 = D2; - D2 = LastDelta - D1; - D1 = LastDelta; - int predictedValue = ((8 * LastChar + K1 * D1 + K2 * D2 + K3 * D3 + K4 * D4 + K5 * channelDelta) >> 3); - - Byte realValue = (Byte)(predictedValue - deltaByte); - int i = ((int)(signed char)deltaByte) << 3; - - Dif[0] += abs(i); - Dif[1] += abs(i - D1); - Dif[2] += abs(i + D1); - Dif[3] += abs(i - D2); - Dif[4] += abs(i + D2); - Dif[5] += abs(i - D3); - Dif[6] += abs(i + D3); - Dif[7] += abs(i - D4); - Dif[8] += abs(i + D4); - Dif[9] += abs(i - channelDelta); - Dif[10] += abs(i + channelDelta); - - channelDelta = LastDelta = (signed char)(realValue - LastChar); - LastChar = realValue; - - if (((++ByteCount) & 0x1F) == 0) - { - UInt32 minDif = Dif[0]; - UInt32 numMinDif = 0; - Dif[0] = 0; - for (i = 1; i < sizeof(Dif) / sizeof(Dif[0]); i++) - { - if (Dif[i] < minDif) - { - minDif = Dif[i]; - numMinDif = i; - } - Dif[i] = 0; - } - switch(numMinDif) - { - case 1: if (K1 >= -16) K1--; break; - case 2: if (K1 < 16) K1++; break; - case 3: if (K2 >= -16) K2--; break; - case 4: if (K2 < 16) K2++; break; - case 5: if (K3 >= -16) K3--; break; - case 6: if (K3 < 16) K3++; break; - case 7: if (K4 >= -16) K4--; break; - case 8: if (K4 < 16) K4++; break; - case 9: if (K5 >= -16) K5--; break; - case 10:if (K5 < 16) K5++; break; - } - } - return realValue; -} -} - -static const char *kNumberErrorMessage = "Number error"; - -static const UInt32 kHistorySize = 1 << 20; - -static const int kNumStats = 11; - -static const UInt32 kWindowReservSize = (1 << 22) + 256; - -CDecoder::CDecoder(): - m_IsSolid(false) -{ -} - -void CDecoder::InitStructures() -{ - m_MmFilter.Init(); - for(int i = 0; i < kNumRepDists; i++) - m_RepDists[i] = 0; - m_RepDistPtr = 0; - m_LastLength = 0; - memset(m_LastLevels, 0, kMaxTableSize); -} - -UInt32 CDecoder::ReadBits(int numBits) { return m_InBitStream.ReadBits(numBits); } - -#define RIF(x) { if (!(x)) return false; } - -bool CDecoder::ReadTables(void) -{ - Byte levelLevels[kLevelTableSize]; - Byte newLevels[kMaxTableSize]; - m_AudioMode = (ReadBits(1) == 1); - - if (ReadBits(1) == 0) - memset(m_LastLevels, 0, kMaxTableSize); - int numLevels; - if (m_AudioMode) - { - m_NumChannels = ReadBits(2) + 1; - if (m_MmFilter.CurrentChannel >= m_NumChannels) - m_MmFilter.CurrentChannel = 0; - numLevels = m_NumChannels * kMMTableSize; - } - else - numLevels = kHeapTablesSizesSum; - - int i; - for (i = 0; i < kLevelTableSize; i++) - levelLevels[i] = (Byte)ReadBits(4); - RIF(m_LevelDecoder.SetCodeLengths(levelLevels)); - i = 0; - while (i < numLevels) - { - UInt32 number = m_LevelDecoder.DecodeSymbol(&m_InBitStream); - if (number < kTableDirectLevels) - { - newLevels[i] = (Byte)((number + m_LastLevels[i]) & kLevelMask); - i++; - } - else - { - if (number == kTableLevelRepNumber) - { - int t = ReadBits(2) + 3; - for (int reps = t; reps > 0 && i < numLevels ; reps--, i++) - newLevels[i] = newLevels[i - 1]; - } - else - { - int num; - if (number == kTableLevel0Number) - num = ReadBits(3) + 3; - else if (number == kTableLevel0Number2) - num = ReadBits(7) + 11; - else - return false; - for (;num > 0 && i < numLevels; num--) - newLevels[i++] = 0; - } - } - } - if (m_AudioMode) - for (i = 0; i < m_NumChannels; i++) - { - RIF(m_MMDecoders[i].SetCodeLengths(&newLevels[i * kMMTableSize])); - } - else - { - RIF(m_MainDecoder.SetCodeLengths(&newLevels[0])); - RIF(m_DistDecoder.SetCodeLengths(&newLevels[kMainTableSize])); - RIF(m_LenDecoder.SetCodeLengths(&newLevels[kMainTableSize + kDistTableSize])); - } - memcpy(m_LastLevels, newLevels, kMaxTableSize); - return true; -} - -bool CDecoder::ReadLastTables() -{ - // it differs a little from pure RAR sources; - // UInt64 ttt = m_InBitStream.GetProcessedSize() + 2; - // + 2 works for: return 0xFF; in CInBuffer::ReadByte. - if (m_InBitStream.GetProcessedSize() + 7 <= m_PackSize) // test it: probably incorrect; - // if (m_InBitStream.GetProcessedSize() + 2 <= m_PackSize) // test it: probably incorrect; - if (m_AudioMode) - { - UInt32 symbol = m_MMDecoders[m_MmFilter.CurrentChannel].DecodeSymbol(&m_InBitStream); - if (symbol == 256) - return ReadTables(); - if (symbol >= kMMTableSize) - return false; - } - else - { - UInt32 number = m_MainDecoder.DecodeSymbol(&m_InBitStream); - if (number == kReadTableNumber) - return ReadTables(); - if (number >= kMainTableSize) - return false; - } - return true; -} - -class CCoderReleaser -{ - CDecoder *m_Coder; -public: - CCoderReleaser(CDecoder *coder): m_Coder(coder) {} - ~CCoderReleaser() - { - m_Coder->ReleaseStreams(); - } -}; - -bool CDecoder::DecodeMm(UInt32 pos) -{ - while (pos-- > 0) - { - UInt32 symbol = m_MMDecoders[m_MmFilter.CurrentChannel].DecodeSymbol(&m_InBitStream); - if (symbol == 256) - return true; - if (symbol >= kMMTableSize) - return false; - /* - Byte byPredict = m_Predictor.Predict(); - Byte byReal = (Byte)(byPredict - (Byte)symbol); - m_Predictor.Update(byReal, byPredict); - */ - Byte byReal = m_MmFilter.Decode((Byte)symbol); - m_OutWindowStream.PutByte(byReal); - if (++m_MmFilter.CurrentChannel == m_NumChannels) - m_MmFilter.CurrentChannel = 0; - } - return true; -} - -bool CDecoder::DecodeLz(Int32 pos) -{ - while (pos > 0) - { - UInt32 number = m_MainDecoder.DecodeSymbol(&m_InBitStream); - UInt32 length, distance; - if (number < 256) - { - m_OutWindowStream.PutByte(Byte(number)); - pos--; - continue; - } - else if (number >= kMatchNumber) - { - number -= kMatchNumber; - length = kNormalMatchMinLen + UInt32(kLenStart[number]) + - m_InBitStream.ReadBits(kLenDirectBits[number]); - number = m_DistDecoder.DecodeSymbol(&m_InBitStream); - if (number >= kDistTableSize) - return false; - distance = kDistStart[number] + m_InBitStream.ReadBits(kDistDirectBits[number]); - if (distance >= kDistLimit3) - { - length += 2 - ((distance - kDistLimit4) >> 31); - // length++; - // if (distance >= kDistLimit4) - // length++; - } - } - else if (number == kRepBothNumber) - { - length = m_LastLength; - distance = m_RepDists[(m_RepDistPtr + 4 - 1) & 3]; - } - else if (number < kLen2Number) - { - distance = m_RepDists[(m_RepDistPtr - (number - kRepNumber + 1)) & 3]; - number = m_LenDecoder.DecodeSymbol(&m_InBitStream); - if (number >= kLenTableSize) - return false; - length = 2 + kLenStart[number] + m_InBitStream.ReadBits(kLenDirectBits[number]); - if (distance >= kDistLimit2) - { - length++; - if (distance >= kDistLimit3) - { - length += 2 - ((distance - kDistLimit4) >> 31); - // length++; - // if (distance >= kDistLimit4) - // length++; - } - } - } - else if (number < kReadTableNumber) - { - number -= kLen2Number; - distance = kLen2DistStarts[number] + - m_InBitStream.ReadBits(kLen2DistDirectBits[number]); - length = 2; - } - else if (number == kReadTableNumber) - return true; - else - return false; - m_RepDists[m_RepDistPtr++ & 3] = distance; - m_LastLength = length; - if (!m_OutWindowStream.CopyBlock(distance, length)) - return false; - pos -= length; - } - return true; -} - -HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress) -{ - if (inSize == NULL || outSize == NULL) - return E_INVALIDARG; - - if (!m_OutWindowStream.Create(kHistorySize)) - return E_OUTOFMEMORY; - if (!m_InBitStream.Create(1 << 20)) - return E_OUTOFMEMORY; - - m_PackSize = *inSize; - - UInt64 pos = 0, unPackSize = *outSize; - - m_OutWindowStream.SetStream(outStream); - m_OutWindowStream.Init(m_IsSolid); - m_InBitStream.SetStream(inStream); - m_InBitStream.Init(); - - CCoderReleaser coderReleaser(this); - if (!m_IsSolid) - { - InitStructures(); - if (unPackSize == 0) - { - if (m_InBitStream.GetProcessedSize() + 2 <= m_PackSize) // test it: probably incorrect; - if (!ReadTables()) - return S_FALSE; - return S_OK; - } - if (!ReadTables()) - return S_FALSE; - } - - UInt64 startPos = m_OutWindowStream.GetProcessedSize(); - while(pos < unPackSize) - { - UInt32 blockSize = 1 << 20; - if (blockSize > unPackSize - pos) - blockSize = (UInt32)(unPackSize - pos); - UInt64 blockStartPos = m_OutWindowStream.GetProcessedSize(); - if (m_AudioMode) - { - if (!DecodeMm(blockSize)) - return S_FALSE; - } - else - { - if (!DecodeLz((Int32)blockSize)) - return S_FALSE; - } - UInt64 globalPos = m_OutWindowStream.GetProcessedSize(); - pos = globalPos - blockStartPos; - if (pos < blockSize) - if (!ReadTables()) - return S_FALSE; - pos = globalPos - startPos; - if (progress != 0) - { - UInt64 packSize = m_InBitStream.GetProcessedSize(); - RINOK(progress->SetRatioInfo(&packSize, &pos)); - } - } - if (pos > unPackSize) - return S_FALSE; - - if (!ReadLastTables()) - return S_FALSE; - return m_OutWindowStream.Flush(); -} - -STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress) -{ - try { return CodeReal(inStream, outStream, inSize, outSize, progress); } - catch(const CInBufferException &e) { return e.ErrorCode; } - catch(const CLzOutWindowException &e) { return e.ErrorCode; } - catch(...) { return S_FALSE; } -} - -STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size) -{ - if (size < 1) - return E_INVALIDARG; - m_IsSolid = (data[0] != 0); - return S_OK; -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/Rar2Decoder.h b/desmume/src/windows/7z/CPP/7zip/Compress/Rar2Decoder.h deleted file mode 100644 index 65cc97307..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/Rar2Decoder.h +++ /dev/null @@ -1,174 +0,0 @@ -// Rar2Decoder.h -// According to unRAR license, this code may not be used to develop -// a program that creates RAR archives - -#ifndef __COMPRESS_RAR2_DECODER_H -#define __COMPRESS_RAR2_DECODER_H - -#include "../../Common/MyCom.h" - -#include "../ICoder.h" - -#include "../Common/InBuffer.h" - -#include "BitmDecoder.h" -#include "HuffmanDecoder.h" -#include "LzOutWindow.h" - -namespace NCompress { -namespace NRar2 { - -const UInt32 kNumRepDists = 4; -const UInt32 kDistTableSize = 48; - -const int kMMTableSize = 256 + 1; - -const UInt32 kMainTableSize = 298; -const UInt32 kLenTableSize = 28; - -const UInt32 kDistTableStart = kMainTableSize; -const UInt32 kLenTableStart = kDistTableStart + kDistTableSize; - -const UInt32 kHeapTablesSizesSum = kMainTableSize + kDistTableSize + kLenTableSize; - -const UInt32 kLevelTableSize = 19; - -const UInt32 kMMTablesSizesSum = kMMTableSize * 4; - -const UInt32 kMaxTableSize = kMMTablesSizesSum; - -const UInt32 kTableDirectLevels = 16; -const UInt32 kTableLevelRepNumber = kTableDirectLevels; -const UInt32 kTableLevel0Number = kTableLevelRepNumber + 1; -const UInt32 kTableLevel0Number2 = kTableLevel0Number + 1; - -const UInt32 kLevelMask = 0xF; - - -const UInt32 kRepBothNumber = 256; -const UInt32 kRepNumber = kRepBothNumber + 1; -const UInt32 kLen2Number = kRepNumber + 4; - -const UInt32 kLen2NumNumbers = 8; -const UInt32 kReadTableNumber = kLen2Number + kLen2NumNumbers; -const UInt32 kMatchNumber = kReadTableNumber + 1; - -const Byte kLenStart[kLenTableSize] = {0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224}; -const Byte kLenDirectBits[kLenTableSize] = {0,0,0,0,0,0,0,0,1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5}; - -const UInt32 kDistStart[kDistTableSize] = {0,1,2,3,4,6,8,12,16,24,32,48,64,96,128,192,256,384,512,768,1024,1536,2048,3072,4096,6144,8192,12288,16384,24576,32768U,49152U,65536,98304,131072,196608,262144,327680,393216,458752,524288,589824,655360,720896,786432,851968,917504,983040}; -const Byte kDistDirectBits[kDistTableSize] = {0,0,0,0,1,1,2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}; - -const Byte kLevelDirectBits[kLevelTableSize] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7}; - -const Byte kLen2DistStarts[kLen2NumNumbers]={0,4,8,16,32,64,128,192}; -const Byte kLen2DistDirectBits[kLen2NumNumbers]={2,2,3, 4, 5, 6, 6, 6}; - -const UInt32 kDistLimit2 = 0x101 - 1; -const UInt32 kDistLimit3 = 0x2000 - 1; -const UInt32 kDistLimit4 = 0x40000 - 1; - -const UInt32 kMatchMaxLen = 255 + 2; -const UInt32 kMatchMaxLenMax = 255 + 5; -const UInt32 kNormalMatchMinLen = 3; - -namespace NMultimedia { - -struct CFilter -{ - int K1,K2,K3,K4,K5; - int D1,D2,D3,D4; - int LastDelta; - UInt32 Dif[11]; - UInt32 ByteCount; - int LastChar; - - Byte Decode(int &channelDelta, Byte delta); - - void Init() { memset(this, 0, sizeof(*this)); } - -}; - -const int kNumChanelsMax = 4; - -class CFilter2 -{ -public: - CFilter m_Filters[kNumChanelsMax]; - int m_ChannelDelta; - int CurrentChannel; - - void Init() { memset(this, 0, sizeof(*this)); } - Byte Decode(Byte delta) - { - return m_Filters[CurrentChannel].Decode(m_ChannelDelta, delta); - } - -}; - -} - -typedef NBitm::CDecoder CBitDecoder; - -const int kNumHuffmanBits = 15; - -class CDecoder : - public ICompressCoder, - public ICompressSetDecoderProperties2, - public CMyUnknownImp -{ - CLzOutWindow m_OutWindowStream; - CBitDecoder m_InBitStream; - NHuffman::CDecoder m_MainDecoder; - NHuffman::CDecoder m_DistDecoder; - NHuffman::CDecoder m_LenDecoder; - NHuffman::CDecoder m_MMDecoders[NMultimedia::kNumChanelsMax]; - NHuffman::CDecoder m_LevelDecoder; - - bool m_AudioMode; - - NMultimedia::CFilter2 m_MmFilter; - int m_NumChannels; - - UInt32 m_RepDists[kNumRepDists]; - UInt32 m_RepDistPtr; - - UInt32 m_LastLength; - - Byte m_LastLevels[kMaxTableSize]; - - UInt64 m_PackSize; - bool m_IsSolid; - - void InitStructures(); - UInt32 ReadBits(int numBits); - bool ReadTables(); - bool ReadLastTables(); - - bool DecodeMm(UInt32 pos); - bool DecodeLz(Int32 pos); - - HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); - -public: - CDecoder(); - - MY_UNKNOWN_IMP1(ICompressSetDecoderProperties2) - - void ReleaseStreams() - { - m_OutWindowStream.ReleaseStream(); - m_InBitStream.ReleaseStream(); - } - - STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); - - STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size); - -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/Rar3Decoder.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/Rar3Decoder.cpp deleted file mode 100644 index fb52437e7..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/Rar3Decoder.cpp +++ /dev/null @@ -1,834 +0,0 @@ -// Rar3Decoder.cpp -// According to unRAR license, this code may not be used to develop -// a program that creates RAR archives - -#include "StdAfx.h" - -#include "../Common/StreamUtils.h" - -#include "Rar3Decoder.h" - -namespace NCompress { -namespace NRar3 { - -static const UInt32 kNumAlignReps = 15; - -static const UInt32 kSymbolReadTable = 256; -static const UInt32 kSymbolRep = 259; -static const UInt32 kSymbolLen2 = kSymbolRep + kNumReps; - -static const Byte kLenStart[kLenTableSize] = {0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224}; -static const Byte kLenDirectBits[kLenTableSize] = {0,0,0,0,0,0,0,0,1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5}; - -static const Byte kDistDirectBits[kDistTableSize] = - {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 18,18,18,18,18,18,18,18,18,18,18,18}; - -static const Byte kLevelDirectBits[kLevelTableSize] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; - -static const Byte kLen2DistStarts[kNumLen2Symbols]={0,4,8,16,32,64,128,192}; -static const Byte kLen2DistDirectBits[kNumLen2Symbols]={2,2,3, 4, 5, 6, 6, 6}; - -static const UInt32 kDistLimit3 = 0x2000 - 2; -static const UInt32 kDistLimit4 = 0x40000 - 2; - -static const UInt32 kNormalMatchMinLen = 3; - -static const UInt32 kVmDataSizeMax = 1 << 16; -static const UInt32 kVmCodeSizeMax = 1 << 16; - -CDecoder::CDecoder(): - _window(0), - _winPos(0), - _wrPtr(0), - _lzSize(0), - _writtenFileSize(0), - _vmData(0), - _vmCode(0), - m_IsSolid(false) -{ -} - -CDecoder::~CDecoder() -{ - InitFilters(); - ::MidFree(_vmData); - ::MidFree(_window); -} - -HRESULT CDecoder::WriteDataToStream(const Byte *data, UInt32 size) -{ - return WriteStream(_outStream, data, size); -} - -HRESULT CDecoder::WriteData(const Byte *data, UInt32 size) -{ - HRESULT res = S_OK; - if (_writtenFileSize < _unpackSize) - { - UInt32 curSize = size; - UInt64 remain = _unpackSize - _writtenFileSize; - if (remain < curSize) - curSize = (UInt32)remain; - res = WriteDataToStream(data, curSize); - } - _writtenFileSize += size; - return res; -} - -HRESULT CDecoder::WriteArea(UInt32 startPtr, UInt32 endPtr) -{ - if (startPtr <= endPtr) - return WriteData(_window + startPtr, endPtr - startPtr); - RINOK(WriteData(_window + startPtr, kWindowSize - startPtr)); - return WriteData(_window, endPtr); -} - -void CDecoder::ExecuteFilter(int tempFilterIndex, NVm::CBlockRef &outBlockRef) -{ - CTempFilter *tempFilter = _tempFilters[tempFilterIndex]; - tempFilter->InitR[6] = (UInt32)_writtenFileSize; - NVm::SetValue32(&tempFilter->GlobalData[0x24], (UInt32)_writtenFileSize); - NVm::SetValue32(&tempFilter->GlobalData[0x28], (UInt32)(_writtenFileSize >> 32)); - CFilter *filter = _filters[tempFilter->FilterIndex]; - _vm.Execute(filter, tempFilter, outBlockRef, filter->GlobalData); - delete tempFilter; - _tempFilters[tempFilterIndex] = 0; -} - -HRESULT CDecoder::WriteBuf() -{ - UInt32 writtenBorder = _wrPtr; - UInt32 writeSize = (_winPos - writtenBorder) & kWindowMask; - for (int i = 0; i < _tempFilters.Size(); i++) - { - CTempFilter *filter = _tempFilters[i]; - if (filter == NULL) - continue; - if (filter->NextWindow) - { - filter->NextWindow = false; - continue; - } - UInt32 blockStart = filter->BlockStart; - UInt32 blockSize = filter->BlockSize; - if (((blockStart - writtenBorder) & kWindowMask) < writeSize) - { - if (writtenBorder != blockStart) - { - RINOK(WriteArea(writtenBorder, blockStart)); - writtenBorder = blockStart; - writeSize = (_winPos - writtenBorder) & kWindowMask; - } - if (blockSize <= writeSize) - { - UInt32 blockEnd = (blockStart + blockSize) & kWindowMask; - if (blockStart < blockEnd || blockEnd == 0) - _vm.SetMemory(0, _window + blockStart, blockSize); - else - { - UInt32 tailSize = kWindowSize - blockStart; - _vm.SetMemory(0, _window + blockStart, tailSize); - _vm.SetMemory(tailSize, _window, blockEnd); - } - NVm::CBlockRef outBlockRef; - ExecuteFilter(i, outBlockRef); - while (i + 1 < _tempFilters.Size()) - { - CTempFilter *nextFilter = _tempFilters[i + 1]; - if (nextFilter == NULL || nextFilter->BlockStart != blockStart || - nextFilter->BlockSize != outBlockRef.Size || nextFilter->NextWindow) - break; - _vm.SetMemory(0, _vm.GetDataPointer(outBlockRef.Offset), outBlockRef.Size); - ExecuteFilter(++i, outBlockRef); - } - WriteDataToStream(_vm.GetDataPointer(outBlockRef.Offset), outBlockRef.Size); - _writtenFileSize += outBlockRef.Size; - writtenBorder = blockEnd; - writeSize = (_winPos - writtenBorder) & kWindowMask; - } - else - { - for (int j = i; j < _tempFilters.Size(); j++) - { - CTempFilter *filter = _tempFilters[j]; - if (filter != NULL && filter->NextWindow) - filter->NextWindow = false; - } - _wrPtr = writtenBorder; - return S_OK; // check it - } - } - } - - _wrPtr = _winPos; - return WriteArea(writtenBorder, _winPos); -} - -void CDecoder::InitFilters() -{ - _lastFilter = 0; - int i; - for (i = 0; i < _tempFilters.Size(); i++) - delete _tempFilters[i]; - _tempFilters.Clear(); - for (i = 0; i < _filters.Size(); i++) - delete _filters[i]; - _filters.Clear(); -} - -bool CDecoder::AddVmCode(UInt32 firstByte, UInt32 codeSize) -{ - CMemBitDecoder inp; - inp.Init(_vmData, codeSize); - - UInt32 filterIndex; - if (firstByte & 0x80) - { - filterIndex = NVm::ReadEncodedUInt32(inp); - if (filterIndex == 0) - InitFilters(); - else - filterIndex--; - } - else - filterIndex = _lastFilter; - if (filterIndex > (UInt32)_filters.Size()) - return false; - _lastFilter = filterIndex; - bool newFilter = (filterIndex == (UInt32)_filters.Size()); - - CFilter *filter; - if (newFilter) - { - // check if too many filters - if (filterIndex > 1024) - return false; - filter = new CFilter; - _filters.Add(filter); - } - else - { - filter = _filters[filterIndex]; - filter->ExecCount++; - } - - int numEmptyItems = 0; - int i; - for (i = 0; i < _tempFilters.Size(); i++) - { - _tempFilters[i - numEmptyItems] = _tempFilters[i]; - if (_tempFilters[i] == NULL) - numEmptyItems++; - if (numEmptyItems > 0) - _tempFilters[i] = NULL; - } - if (numEmptyItems == 0) - { - _tempFilters.Add(NULL); - numEmptyItems = 1; - } - CTempFilter *tempFilter = new CTempFilter; - _tempFilters[_tempFilters.Size() - numEmptyItems] = tempFilter; - tempFilter->FilterIndex = filterIndex; - tempFilter->ExecCount = filter->ExecCount; - - UInt32 blockStart = NVm::ReadEncodedUInt32(inp); - if (firstByte & 0x40) - blockStart += 258; - tempFilter->BlockStart = (blockStart + _winPos) & kWindowMask; - if (firstByte & 0x20) - filter->BlockSize = NVm::ReadEncodedUInt32(inp); - tempFilter->BlockSize = filter->BlockSize; - tempFilter->NextWindow = _wrPtr != _winPos && ((_wrPtr - _winPos) & kWindowMask) <= blockStart; - - memset(tempFilter->InitR, 0, sizeof(tempFilter->InitR)); - tempFilter->InitR[3] = NVm::kGlobalOffset; - tempFilter->InitR[4] = tempFilter->BlockSize; - tempFilter->InitR[5] = tempFilter->ExecCount; - if (firstByte & 0x10) - { - UInt32 initMask = inp.ReadBits(NVm::kNumGpRegs); - for (int i = 0; i < NVm::kNumGpRegs; i++) - if (initMask & (1 << i)) - tempFilter->InitR[i] = NVm::ReadEncodedUInt32(inp); - } - if (newFilter) - { - UInt32 vmCodeSize = NVm::ReadEncodedUInt32(inp); - if (vmCodeSize >= kVmCodeSizeMax || vmCodeSize == 0) - return false; - for (UInt32 i = 0; i < vmCodeSize; i++) - _vmCode[i] = (Byte)inp.ReadBits(8); - _vm.PrepareProgram(_vmCode, vmCodeSize, filter); - } - - tempFilter->AllocateEmptyFixedGlobal(); - - Byte *globalData = &tempFilter->GlobalData[0]; - for (i = 0; i < NVm::kNumGpRegs; i++) - NVm::SetValue32(&globalData[i * 4], tempFilter->InitR[i]); - NVm::SetValue32(&globalData[NVm::NGlobalOffset::kBlockSize], tempFilter->BlockSize); - NVm::SetValue32(&globalData[NVm::NGlobalOffset::kBlockPos], 0); // It was commented. why? - NVm::SetValue32(&globalData[NVm::NGlobalOffset::kExecCount], tempFilter->ExecCount); - - if (firstByte & 8) - { - UInt32 dataSize = NVm::ReadEncodedUInt32(inp); - if (dataSize > NVm::kGlobalSize - NVm::kFixedGlobalSize) - return false; - CRecordVector &globalData = tempFilter->GlobalData; - int requredSize = (int)(dataSize + NVm::kFixedGlobalSize); - if (globalData.Size() < requredSize) - { - globalData.Reserve(requredSize); - for (; globalData.Size() < requredSize; i++) - globalData.Add(0); - } - for (UInt32 i = 0; i < dataSize; i++) - globalData[NVm::kFixedGlobalSize + i] = (Byte)inp.ReadBits(8); - } - return true; -} - -bool CDecoder::ReadVmCodeLZ() -{ - UInt32 firstByte = m_InBitStream.ReadBits(8); - UInt32 length = (firstByte & 7) + 1; - if (length == 7) - length = m_InBitStream.ReadBits(8) + 7; - else if (length == 8) - length = m_InBitStream.ReadBits(16); - if (length > kVmDataSizeMax) - return false; - for (UInt32 i = 0; i < length; i++) - _vmData[i] = (Byte)m_InBitStream.ReadBits(8); - return AddVmCode(firstByte, length); -} - -bool CDecoder::ReadVmCodePPM() -{ - int firstByte = DecodePpmSymbol(); - if (firstByte == -1) - return false; - UInt32 length = (firstByte & 7) + 1; - if (length == 7) - { - int b1 = DecodePpmSymbol(); - if (b1 == -1) - return false; - length = b1 + 7; - } - else if (length == 8) - { - int b1 = DecodePpmSymbol(); - if (b1 == -1) - return false; - int b2 = DecodePpmSymbol(); - if (b2 == -1) - return false; - length = b1 * 256 + b2; - } - if (length > kVmDataSizeMax) - return false; - for (UInt32 i = 0; i < length; i++) - { - int b = DecodePpmSymbol(); - if (b == -1) - return false; - _vmData[i] = (Byte)b; - } - return AddVmCode(firstByte, length); -} - -#define RIF(x) { if (!(x)) return S_FALSE; } - -UInt32 CDecoder::ReadBits(int numBits) { return m_InBitStream.ReadBits(numBits); } - -///////////////////////////////////////////////// -// PPM - -HRESULT CDecoder::InitPPM() -{ - Byte maxOrder = (Byte)ReadBits(7); - - bool reset = ((maxOrder & 0x20) != 0); - int maxMB = 0; - if (reset) - maxMB = (Byte)ReadBits(8); - else - { - if (_ppm.SubAllocator.GetSubAllocatorSize()== 0) - return S_FALSE; - } - if (maxOrder & 0x40) - PpmEscChar = (Byte)ReadBits(8); - m_InBitStream.InitRangeCoder(); - /* - if (m_InBitStream.m_BitPos != 0) - return S_FALSE; - */ - if (reset) - { - maxOrder = (maxOrder & 0x1F) + 1; - if (maxOrder > 16) - maxOrder = 16 + (maxOrder - 16) * 3; - if (maxOrder == 1) - { - // SubAlloc.StopSubAllocator(); - _ppm.SubAllocator.StopSubAllocator(); - return S_FALSE; - } - // SubAlloc.StartSubAllocator(MaxMB+1); - // StartModelRare(maxOrder); - - if (!_ppm.SubAllocator.StartSubAllocator((maxMB + 1) << 20)) - return E_OUTOFMEMORY; - _ppm.MaxOrder = 0; - _ppm.StartModelRare(maxOrder); - - } - // return (minContext != NULL); - - return S_OK; -} - -int CDecoder::DecodePpmSymbol() { return _ppm.DecodeSymbol(&m_InBitStream); } - -HRESULT CDecoder::DecodePPM(Int32 num, bool &keepDecompressing) -{ - keepDecompressing = false; - do - { - if (((_wrPtr - _winPos) & kWindowMask) < 260 && _wrPtr != _winPos) - { - RINOK(WriteBuf()); - if (_writtenFileSize > _unpackSize) - { - keepDecompressing = false; - return S_OK; - } - } - int c = DecodePpmSymbol(); - if (c == -1) - { - // Original code sets PPMError=true here and then it returns S_OK. Why ??? - // return S_OK; - return S_FALSE; - } - if (c == PpmEscChar) - { - int nextCh = DecodePpmSymbol(); - if (nextCh == 0) - return ReadTables(keepDecompressing); - if (nextCh == 2 || nextCh == -1) - return S_OK; - if (nextCh == 3) - { - if (!ReadVmCodePPM()) - return S_FALSE; - continue; - } - if (nextCh == 4 || nextCh == 5) - { - UInt32 distance = 0; - UInt32 length = 4; - if (nextCh == 4) - { - for (int i = 0; i < 3; i++) - { - int c = DecodePpmSymbol(); - if (c == -1) - return S_OK; - distance = (distance << 8) + (Byte)c; - } - distance++; - length += 28; - } - int c = DecodePpmSymbol(); - if (c == -1) - return S_OK; - length += c; - if (distance >= _lzSize) - return S_FALSE; - CopyBlock(distance, length); - num -= (Int32)length; - continue; - } - } - PutByte((Byte)c); - num--; - } - while (num >= 0); - keepDecompressing = true; - return S_OK; -} - -///////////////////////////////////////////////// -// LZ - -HRESULT CDecoder::ReadTables(bool &keepDecompressing) -{ - keepDecompressing = true; - ReadBits((8 - m_InBitStream.GetBitPosition()) & 7); - if (ReadBits(1) != 0) - { - _lzMode = false; - return InitPPM(); - } - - _lzMode = true; - PrevAlignBits = 0; - PrevAlignCount = 0; - - Byte levelLevels[kLevelTableSize]; - Byte newLevels[kTablesSizesSum]; - - if (ReadBits(1) == 0) - memset(m_LastLevels, 0, kTablesSizesSum); - - int i; - for (i = 0; i < kLevelTableSize; i++) - { - UInt32 length = ReadBits(4); - if (length == 15) - { - UInt32 zeroCount = ReadBits(4); - if (zeroCount != 0) - { - zeroCount += 2; - while (zeroCount-- > 0 && i < kLevelTableSize) - levelLevels[i++]=0; - i--; - continue; - } - } - levelLevels[i] = (Byte)length; - } - RIF(m_LevelDecoder.SetCodeLengths(levelLevels)); - i = 0; - while (i < kTablesSizesSum) - { - UInt32 number = m_LevelDecoder.DecodeSymbol(&m_InBitStream); - if (number < 16) - { - newLevels[i] = Byte((number + m_LastLevels[i]) & 15); - i++; - } - else if (number > kLevelTableSize) - return S_FALSE; - else - { - int num; - if (((number - 16) & 1) == 0) - num = ReadBits(3) + 3; - else - num = ReadBits(7) + 11; - if (number < 18) - { - if (i == 0) - return S_FALSE; - for (; num > 0 && i < kTablesSizesSum; num--, i++) - newLevels[i] = newLevels[i - 1]; - } - else - { - for (; num > 0 && i < kTablesSizesSum; num--) - newLevels[i++] = 0; - } - } - } - TablesRead = true; - - // original code has check here: - /* - if (InAddr > ReadTop) - { - keepDecompressing = false; - return true; - } - */ - - RIF(m_MainDecoder.SetCodeLengths(&newLevels[0])); - RIF(m_DistDecoder.SetCodeLengths(&newLevels[kMainTableSize])); - RIF(m_AlignDecoder.SetCodeLengths(&newLevels[kMainTableSize + kDistTableSize])); - RIF(m_LenDecoder.SetCodeLengths(&newLevels[kMainTableSize + kDistTableSize + kAlignTableSize])); - - memcpy(m_LastLevels, newLevels, kTablesSizesSum); - return S_OK; -} - -class CCoderReleaser -{ - CDecoder *m_Coder; -public: - CCoderReleaser(CDecoder *coder): m_Coder(coder) {} - ~CCoderReleaser() - { - // m_Coder->m_OutWindowStream.Flush(); - m_Coder->ReleaseStreams(); - } -}; - -HRESULT CDecoder::ReadEndOfBlock(bool &keepDecompressing) -{ - if (ReadBits(1) != 0) - { - // old file - TablesRead = false; - return ReadTables(keepDecompressing); - } - // new file - keepDecompressing = false; - TablesRead = (ReadBits(1) == 0); - return S_OK; -} - -UInt32 kDistStart[kDistTableSize]; - -class CDistInit -{ -public: - CDistInit() { Init(); } - void Init() - { - UInt32 start = 0; - for (UInt32 i = 0; i < kDistTableSize; i++) - { - kDistStart[i] = start; - start += (1 << kDistDirectBits[i]); - } - } -} g_DistInit; - -HRESULT CDecoder::DecodeLZ(bool &keepDecompressing) -{ - UInt32 rep0 = _reps[0]; - UInt32 rep1 = _reps[1]; - UInt32 rep2 = _reps[2]; - UInt32 rep3 = _reps[3]; - UInt32 length = _lastLength; - for (;;) - { - if (((_wrPtr - _winPos) & kWindowMask) < 260 && _wrPtr != _winPos) - { - RINOK(WriteBuf()); - if (_writtenFileSize > _unpackSize) - { - keepDecompressing = false; - return S_OK; - } - } - UInt32 number = m_MainDecoder.DecodeSymbol(&m_InBitStream); - if (number < 256) - { - PutByte(Byte(number)); - - continue; - } - else if (number == kSymbolReadTable) - { - RINOK(ReadEndOfBlock(keepDecompressing)); - break; - } - else if (number == 257) - { - if (!ReadVmCodeLZ()) - return S_FALSE; - continue; - } - else if (number == 258) - { - } - else if (number < kSymbolRep + 4) - { - if (number != kSymbolRep) - { - UInt32 distance; - if (number == kSymbolRep + 1) - distance = rep1; - else - { - if (number == kSymbolRep + 2) - distance = rep2; - else - { - distance = rep3; - rep3 = rep2; - } - rep2 = rep1; - } - rep1 = rep0; - rep0 = distance; - } - - UInt32 number = m_LenDecoder.DecodeSymbol(&m_InBitStream); - if (number >= kLenTableSize) - return S_FALSE; - length = 2 + kLenStart[number] + m_InBitStream.ReadBits(kLenDirectBits[number]); - } - else - { - rep3 = rep2; - rep2 = rep1; - rep1 = rep0; - if (number < 271) - { - number -= 263; - rep0 = kLen2DistStarts[number] + m_InBitStream.ReadBits(kLen2DistDirectBits[number]); - length = 2; - } - else if (number < 299) - { - number -= 271; - length = kNormalMatchMinLen + (UInt32)kLenStart[number] + m_InBitStream.ReadBits(kLenDirectBits[number]); - UInt32 number = m_DistDecoder.DecodeSymbol(&m_InBitStream); - if (number >= kDistTableSize) - return S_FALSE; - rep0 = kDistStart[number]; - int numBits = kDistDirectBits[number]; - if (number >= (kNumAlignBits * 2) + 2) - { - if (numBits > kNumAlignBits) - rep0 += (m_InBitStream.ReadBits(numBits - kNumAlignBits) << kNumAlignBits); - if (PrevAlignCount > 0) - { - PrevAlignCount--; - rep0 += PrevAlignBits; - } - else - { - UInt32 number = m_AlignDecoder.DecodeSymbol(&m_InBitStream); - if (number < (1 << kNumAlignBits)) - { - rep0 += number; - PrevAlignBits = number; - } - else if (number == (1 << kNumAlignBits)) - { - PrevAlignCount = kNumAlignReps; - rep0 += PrevAlignBits; - } - else - return S_FALSE; - } - } - else - rep0 += m_InBitStream.ReadBits(numBits); - length += ((kDistLimit4 - rep0) >> 31) + ((kDistLimit3 - rep0) >> 31); - } - else - return S_FALSE; - } - if (rep0 >= _lzSize) - return S_FALSE; - CopyBlock(rep0, length); - } - _reps[0] = rep0; - _reps[1] = rep1; - _reps[2] = rep2; - _reps[3] = rep3; - _lastLength = length; - - return S_OK; -} - -HRESULT CDecoder::CodeReal(ICompressProgressInfo *progress) -{ - _writtenFileSize = 0; - if (!m_IsSolid) - { - _lzSize = 0; - _winPos = 0; - _wrPtr = 0; - for (int i = 0; i < kNumReps; i++) - _reps[i] = 0; - _lastLength = 0; - memset(m_LastLevels, 0, kTablesSizesSum); - TablesRead = false; - PpmEscChar = 2; - InitFilters(); - } - if (!m_IsSolid || !TablesRead) - { - bool keepDecompressing; - RINOK(ReadTables(keepDecompressing)); - if (!keepDecompressing) - return S_OK; - } - - for(;;) - { - bool keepDecompressing; - if (_lzMode) - { - RINOK(DecodeLZ(keepDecompressing)) - } - else - { - RINOK(DecodePPM(1 << 18, keepDecompressing)) - } - UInt64 packSize = m_InBitStream.GetProcessedSize(); - RINOK(progress->SetRatioInfo(&packSize, &_writtenFileSize)); - if (!keepDecompressing) - break; - } - RINOK(WriteBuf()); - if (_writtenFileSize < _unpackSize) - return S_FALSE; - // return m_OutWindowStream.Flush(); - return S_OK; -} - -STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress) -{ - try - { - if (inSize == NULL || outSize == NULL) - return E_INVALIDARG; - - if (_vmData == 0) - { - _vmData = (Byte *)::MidAlloc(kVmDataSizeMax + kVmCodeSizeMax); - if (_vmData == 0) - return E_OUTOFMEMORY; - _vmCode = _vmData + kVmDataSizeMax; - } - - if (_window == 0) - { - _window = (Byte *)::MidAlloc(kWindowSize); - if (_window == 0) - return E_OUTOFMEMORY; - } - if (!m_InBitStream.Create(1 << 20)) - return E_OUTOFMEMORY; - if (!_vm.Create()) - return E_OUTOFMEMORY; - - - m_InBitStream.SetStream(inStream); - m_InBitStream.Init(); - _outStream = outStream; - - CCoderReleaser coderReleaser(this); - _unpackSize = *outSize; - return CodeReal(progress); - } - catch(const CInBufferException &e) { return e.ErrorCode; } - catch(...) { return S_FALSE; } - // CNewException is possible here. But probably CNewException is caused - // by error in data stream. -} - -STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size) -{ - if (size < 1) - return E_INVALIDARG; - m_IsSolid = (data[0] != 0); - return S_OK; -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/Rar3Decoder.h b/desmume/src/windows/7z/CPP/7zip/Compress/Rar3Decoder.h deleted file mode 100644 index da0b73f19..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/Rar3Decoder.h +++ /dev/null @@ -1,301 +0,0 @@ -// Rar3Decoder.h -// According to unRAR license, this code may not be used to develop -// a program that creates RAR archives - -#ifndef __COMPRESS_RAR3_DECODER_H -#define __COMPRESS_RAR3_DECODER_H - -#include "../../Common/MyCom.h" - -#include "../ICoder.h" - -#include "../Common/InBuffer.h" - -#include "BitmDecoder.h" -#include "HuffmanDecoder.h" -#include "PpmdDecode.h" -#include "Rar3Vm.h" - -namespace NCompress { -namespace NRar3 { - -const UInt32 kWindowSize = 1 << 22; -const UInt32 kWindowMask = (kWindowSize - 1); - -const UInt32 kNumReps = 4; -const UInt32 kNumLen2Symbols = 8; -const UInt32 kLenTableSize = 28; -const UInt32 kMainTableSize = 256 + 1 + 1 + 1 + kNumReps + kNumLen2Symbols + kLenTableSize; -const UInt32 kDistTableSize = 60; - -const int kNumAlignBits = 4; -const UInt32 kAlignTableSize = (1 << kNumAlignBits) + 1; - -const UInt32 kLevelTableSize = 20; - -const UInt32 kTablesSizesSum = kMainTableSize + kDistTableSize + kAlignTableSize + kLenTableSize; - -class CBitDecoder -{ - UInt32 m_Value; -public: - UInt32 m_BitPos; - CInBuffer m_Stream; - bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); } - void SetStream(ISequentialInStream *inStream) { m_Stream.SetStream(inStream);} - void ReleaseStream() { m_Stream.ReleaseStream();} - - void Init() - { - m_Stream.Init(); - m_BitPos = 0; - m_Value = 0; - // m_BitPos = kNumBigValueBits; - // Normalize(); - } - - UInt64 GetProcessedSize() const - { return m_Stream.GetProcessedSize() - (m_BitPos) / 8; } - UInt32 GetBitPosition() const { return ((8 - m_BitPos) & 7); } - - /* - void Normalize() - { - for (;m_BitPos >= 8; m_BitPos -= 8) - m_Value = (m_Value << 8) | m_Stream.ReadByte(); - } - */ - - UInt32 GetValue(UInt32 numBits) - { - // return (m_Value << m_BitPos) >> (kNumBigValueBits - numBits); - // return ((m_Value >> (8 - m_BitPos)) & kMask) >> (kNumValueBits - numBits); - if (m_BitPos < numBits) - { - m_BitPos += 8; - m_Value = (m_Value << 8) | m_Stream.ReadByte(); - if (m_BitPos < numBits) - { - m_BitPos += 8; - m_Value = (m_Value << 8) | m_Stream.ReadByte(); - } - } - return m_Value >> (m_BitPos - numBits); - } - - void MovePos(UInt32 numBits) - { - m_BitPos -= numBits; - m_Value = m_Value & ((1 << m_BitPos) - 1); - } - - UInt32 ReadBits(UInt32 numBits) - { - UInt32 res = GetValue(numBits); - MovePos(numBits); - return res; - } -}; - -const int kNumTopBits = 24; -const UInt32 kTopValue = (1 << kNumTopBits); -const UInt32 kBot = (1 << 15); - -class CRangeDecoder:public NPpmd::CRangeDecoderVirt, public CBitDecoder -{ -public: - UInt32 Range; - UInt32 Low; - UInt32 Code; - - void Normalize() - { - while ((Low ^ (Low + Range)) < kTopValue || - Range < kBot && ((Range = (0 - Low) & (kBot - 1)), 1)) - { - Code = (Code << 8) | m_Stream.ReadByte(); - Range <<= 8; - Low <<= 8; - } - } - - void InitRangeCoder() - { - Code = 0; - Low = 0; - Range = 0xFFFFFFFF; - for(int i = 0; i < 4; i++) - Code = (Code << 8) | ReadBits(8); - } - - virtual UInt32 GetThreshold(UInt32 total) - { - return (Code - Low) / ( Range /= total); - } - - virtual void Decode(UInt32 start, UInt32 size) - { - Low += start * Range; - Range *= size; - Normalize(); - } - - virtual UInt32 DecodeBit(UInt32 size0, UInt32 numTotalBits) - { - if (((Code - Low) / (Range >>= numTotalBits)) < size0) - { - Decode(0, size0); - return 0; - } - else - { - Decode(size0, (1 << numTotalBits) - size0); - return 1; - } - } - - // UInt64 GetProcessedSizeRangeCoder() {return Stream.GetProcessedSize(); } -}; - - -struct CFilter: public NVm::CProgram -{ - CRecordVector GlobalData; - UInt32 BlockStart; - UInt32 BlockSize; - UInt32 ExecCount; - CFilter(): BlockStart(0), BlockSize(0), ExecCount(0) {} -}; - -struct CTempFilter: public NVm::CProgramInitState -{ - UInt32 BlockStart; - UInt32 BlockSize; - UInt32 ExecCount; - bool NextWindow; - - UInt32 FilterIndex; -}; - -const int kNumHuffmanBits = 15; - -class CDecoder: - public ICompressCoder, - public ICompressSetDecoderProperties2, - public CMyUnknownImp -{ - CRangeDecoder m_InBitStream; - Byte *_window; - UInt32 _winPos; - UInt32 _wrPtr; - UInt64 _lzSize; - UInt64 _unpackSize; - UInt64 _writtenFileSize; // if it's > _unpackSize, then _unpackSize only written - CMyComPtr _outStream; - NHuffman::CDecoder m_MainDecoder; - NHuffman::CDecoder m_DistDecoder; - NHuffman::CDecoder m_AlignDecoder; - NHuffman::CDecoder m_LenDecoder; - NHuffman::CDecoder m_LevelDecoder; - - UInt32 _reps[kNumReps]; - UInt32 _lastLength; - - Byte m_LastLevels[kTablesSizesSum]; - - Byte *_vmData; - Byte *_vmCode; - NVm::CVm _vm; - CRecordVector _filters; - CRecordVector _tempFilters; - UInt32 _lastFilter; - - bool m_IsSolid; - - bool _lzMode; - - UInt32 PrevAlignBits; - UInt32 PrevAlignCount; - - bool TablesRead; - - NPpmd::CDecodeInfo _ppm; - int PpmEscChar; - - HRESULT WriteDataToStream(const Byte *data, UInt32 size); - HRESULT WriteData(const Byte *data, UInt32 size); - HRESULT WriteArea(UInt32 startPtr, UInt32 endPtr); - void ExecuteFilter(int tempFilterIndex, NVm::CBlockRef &outBlockRef); - HRESULT WriteBuf(); - - void InitFilters(); - bool AddVmCode(UInt32 firstByte, UInt32 codeSize); - bool ReadVmCodeLZ(); - bool ReadVmCodePPM(); - - UInt32 ReadBits(int numBits); - - HRESULT InitPPM(); - int DecodePpmSymbol(); - HRESULT DecodePPM(Int32 num, bool &keepDecompressing); - - HRESULT ReadTables(bool &keepDecompressing); - HRESULT ReadEndOfBlock(bool &keepDecompressing); - HRESULT DecodeLZ(bool &keepDecompressing); - HRESULT CodeReal(ICompressProgressInfo *progress); -public: - CDecoder(); - ~CDecoder(); - - MY_UNKNOWN_IMP1(ICompressSetDecoderProperties2) - - void ReleaseStreams() - { - _outStream.Release(); - m_InBitStream.ReleaseStream(); - } - - STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); - - STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size); - - void CopyBlock(UInt32 distance, UInt32 len) - { - _lzSize += len; - UInt32 pos = (_winPos - distance - 1) & kWindowMask; - Byte *window = _window; - UInt32 winPos = _winPos; - if (kWindowSize - winPos > len && kWindowSize - pos > len) - { - const Byte *src = window + pos; - Byte *dest = window + winPos; - _winPos += len; - do - *dest++ = *src++; - while(--len != 0); - return; - } - do - { - window[winPos] = window[pos]; - winPos = (winPos + 1) & kWindowMask; - pos = (pos + 1) & kWindowMask; - } - while(--len != 0); - _winPos = winPos; - } - - void PutByte(Byte b) - { - _window[_winPos] = b; - _winPos = (_winPos + 1) & kWindowMask; - _lzSize++; - } - - -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/Rar3Vm.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/Rar3Vm.cpp deleted file mode 100644 index 6aeabbccc..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/Rar3Vm.cpp +++ /dev/null @@ -1,1094 +0,0 @@ -// Rar3Vm.cpp -// According to unRAR license, this code may not be used to develop -// a program that creates RAR archives - -/* -Note: - Due to performance considerations Rar VM may set Flags C incorrectly - for some operands (SHL x, 0, ... ). - Check implementation of concrete VM command - to see if it sets flags right. -*/ - -#include "StdAfx.h" - -extern "C" -{ -#include "../../../C/7zCrc.h" -#include "../../../C/Alloc.h" -} - -#include "Rar3Vm.h" - -namespace NCompress { -namespace NRar3 { - -UInt32 CMemBitDecoder::ReadBits(int numBits) -{ - UInt32 res = 0; - for (;;) - { - Byte b = _bitPos < _bitSize ? _data[_bitPos >> 3] : 0; - int avail = (int)(8 - (_bitPos & 7)); - if (numBits <= avail) - { - _bitPos += numBits; - return res | (b >> (avail - numBits)) & ((1 << numBits) - 1); - } - numBits -= avail; - res |= (UInt32)(b & ((1 << avail) - 1)) << numBits; - _bitPos += avail; - } -} - -UInt32 CMemBitDecoder::ReadBit() { return ReadBits(1); } - -namespace NVm { - -static const UInt32 kStackRegIndex = kNumRegs - 1; - -static const UInt32 FLAG_C = 1; -static const UInt32 FLAG_Z = 2; -static const UInt32 FLAG_S = 0x80000000; - -static const Byte CF_OP0 = 0; -static const Byte CF_OP1 = 1; -static const Byte CF_OP2 = 2; -static const Byte CF_OPMASK = 3; -static const Byte CF_BYTEMODE = 4; -static const Byte CF_JUMP = 8; -static const Byte CF_PROC = 16; -static const Byte CF_USEFLAGS = 32; -static const Byte CF_CHFLAGS = 64; - -static Byte kCmdFlags[]= -{ - /* CMD_MOV */ CF_OP2 | CF_BYTEMODE, - /* CMD_CMP */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS, - /* CMD_ADD */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS, - /* CMD_SUB */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS, - /* CMD_JZ */ CF_OP1 | CF_JUMP | CF_USEFLAGS, - /* CMD_JNZ */ CF_OP1 | CF_JUMP | CF_USEFLAGS, - /* CMD_INC */ CF_OP1 | CF_BYTEMODE | CF_CHFLAGS, - /* CMD_DEC */ CF_OP1 | CF_BYTEMODE | CF_CHFLAGS, - /* CMD_JMP */ CF_OP1 | CF_JUMP, - /* CMD_XOR */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS, - /* CMD_AND */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS, - /* CMD_OR */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS, - /* CMD_TEST */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS, - /* CMD_JS */ CF_OP1 | CF_JUMP | CF_USEFLAGS, - /* CMD_JNS */ CF_OP1 | CF_JUMP | CF_USEFLAGS, - /* CMD_JB */ CF_OP1 | CF_JUMP | CF_USEFLAGS, - /* CMD_JBE */ CF_OP1 | CF_JUMP | CF_USEFLAGS, - /* CMD_JA */ CF_OP1 | CF_JUMP | CF_USEFLAGS, - /* CMD_JAE */ CF_OP1 | CF_JUMP | CF_USEFLAGS, - /* CMD_PUSH */ CF_OP1, - /* CMD_POP */ CF_OP1, - /* CMD_CALL */ CF_OP1 | CF_PROC, - /* CMD_RET */ CF_OP0 | CF_PROC, - /* CMD_NOT */ CF_OP1 | CF_BYTEMODE, - /* CMD_SHL */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS, - /* CMD_SHR */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS, - /* CMD_SAR */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS, - /* CMD_NEG */ CF_OP1 | CF_BYTEMODE | CF_CHFLAGS, - /* CMD_PUSHA */ CF_OP0, - /* CMD_POPA */ CF_OP0, - /* CMD_PUSHF */ CF_OP0 | CF_USEFLAGS, - /* CMD_POPF */ CF_OP0 | CF_CHFLAGS, - /* CMD_MOVZX */ CF_OP2, - /* CMD_MOVSX */ CF_OP2, - /* CMD_XCHG */ CF_OP2 | CF_BYTEMODE, - /* CMD_MUL */ CF_OP2 | CF_BYTEMODE, - /* CMD_DIV */ CF_OP2 | CF_BYTEMODE, - /* CMD_ADC */ CF_OP2 | CF_BYTEMODE | CF_USEFLAGS | CF_CHFLAGS , - /* CMD_SBB */ CF_OP2 | CF_BYTEMODE | CF_USEFLAGS | CF_CHFLAGS , - /* CMD_PRINT */ CF_OP0 -}; - -CVm::CVm(): Mem(NULL) {} - -bool CVm::Create() -{ - if (Mem == NULL) - Mem = (Byte *)::MyAlloc(kSpaceSize + 4); - return (Mem != NULL); -} - -CVm::~CVm() -{ - ::MyFree(Mem); -} - -// CVm::Execute can change CProgram object: it clears progarm if VM returns error. - -bool CVm::Execute(CProgram *prg, const CProgramInitState *initState, - CBlockRef &outBlockRef, CRecordVector &outGlobalData) -{ - memcpy(R, initState->InitR, sizeof(initState->InitR)); - R[kStackRegIndex] = kSpaceSize; - R[kNumRegs] = 0; - Flags = 0; - - UInt32 globalSize = MyMin((UInt32)initState->GlobalData.Size(), kGlobalSize); - if (globalSize != 0) - memcpy(Mem + kGlobalOffset, &initState->GlobalData[0], globalSize); - UInt32 staticSize = MyMin((UInt32)prg->StaticData.Size(), kGlobalSize - globalSize); - if (staticSize != 0) - memcpy(Mem + kGlobalOffset + globalSize, &prg->StaticData[0], staticSize); - - bool res = true; - #ifdef RARVM_STANDARD_FILTERS - if (prg->StandardFilterIndex >= 0) - ExecuteStandardFilter(prg->StandardFilterIndex); - else - #endif - { - res = ExecuteCode(prg); - if (!res) - prg->Commands[0].OpCode = CMD_RET; - } - UInt32 newBlockPos = GetFixedGlobalValue32(NGlobalOffset::kBlockPos) & kSpaceMask; - UInt32 newBlockSize = GetFixedGlobalValue32(NGlobalOffset::kBlockSize) & kSpaceMask; - if (newBlockPos + newBlockSize >= kSpaceSize) - newBlockPos = newBlockSize = 0; - outBlockRef.Offset = newBlockPos; - outBlockRef.Size = newBlockSize; - - outGlobalData.Clear(); - UInt32 dataSize = GetFixedGlobalValue32(NGlobalOffset::kGlobalMemOutSize); - dataSize = MyMin(dataSize, kGlobalSize - kFixedGlobalSize); - if (dataSize != 0) - { - dataSize += kFixedGlobalSize; - outGlobalData.Reserve(dataSize); - for (UInt32 i = 0; i < dataSize; i++) - outGlobalData.Add(Mem[kGlobalOffset + i]); - } - return res; -} - - -#define SET_IP(IP) \ - if ((IP) >= numCommands) return true; \ - if (--maxOpCount <= 0) return false; \ - cmd = commands + (IP); - -#define GET_FLAG_S_B(res) (((res) & 0x80) ? FLAG_S : 0) -#define SET_IP_OP1 { UInt32 val = GetOperand32(&cmd->Op1); SET_IP(val); } -#define FLAGS_UPDATE_SZ Flags = res == 0 ? FLAG_Z : res & FLAG_S -#define FLAGS_UPDATE_SZ_B Flags = (res & 0xFF) == 0 ? FLAG_Z : GET_FLAG_S_B(res) - -UInt32 CVm::GetOperand32(const COperand *op) const -{ - switch(op->Type) - { - case OP_TYPE_REG: return R[op->Data]; - case OP_TYPE_REGMEM: return GetValue32(&Mem[(op->Base + R[op->Data]) & kSpaceMask]); - default: return op->Data; - } -} - -void CVm::SetOperand32(const COperand *op, UInt32 val) -{ - switch(op->Type) - { - case OP_TYPE_REG: R[op->Data] = val; return; - case OP_TYPE_REGMEM: SetValue32(&Mem[(op->Base + R[op->Data]) & kSpaceMask], val); return; - } -} - -Byte CVm::GetOperand8(const COperand *op) const -{ - switch(op->Type) - { - case OP_TYPE_REG: return (Byte)R[op->Data]; - case OP_TYPE_REGMEM: return Mem[(op->Base + R[op->Data]) & kSpaceMask];; - default: return (Byte)op->Data; - } -} - -void CVm::SetOperand8(const COperand *op, Byte val) -{ - switch(op->Type) - { - case OP_TYPE_REG: R[op->Data] = (R[op->Data] & 0xFFFFFF00) | val; return; - case OP_TYPE_REGMEM: Mem[(op->Base + R[op->Data]) & kSpaceMask] = val; return; - } -} - -UInt32 CVm::GetOperand(bool byteMode, const COperand *op) const -{ - if (byteMode) - return GetOperand8(op); - return GetOperand32(op); -} - -void CVm::SetOperand(bool byteMode, const COperand *op, UInt32 val) -{ - if (byteMode) - SetOperand8(op, (Byte)(val & 0xFF)); - else - SetOperand32(op, val); -} - -bool CVm::ExecuteCode(const CProgram *prg) -{ - Int32 maxOpCount = 25000000; - const CCommand *commands = &prg->Commands[0]; - const CCommand *cmd = commands; - UInt32 numCommands = prg->Commands.Size(); - for (;;) - { - switch(cmd->OpCode) - { - #ifndef RARVM_NO_VM - - case CMD_MOV: - SetOperand32(&cmd->Op1, GetOperand32(&cmd->Op2)); - break; - case CMD_MOVB: - SetOperand8(&cmd->Op1, GetOperand8(&cmd->Op2)); - break; - case CMD_CMP: - { - UInt32 v1 = GetOperand32(&cmd->Op1); - UInt32 res = v1 - GetOperand32(&cmd->Op2); - Flags = res == 0 ? FLAG_Z : (res > v1) | (res & FLAG_S); - } - break; - case CMD_CMPB: - { - Byte v1 = GetOperand8(&cmd->Op1); - Byte res = v1 - GetOperand8(&cmd->Op2); - res &= 0xFF; - Flags = res == 0 ? FLAG_Z : (res > v1) | GET_FLAG_S_B(res); - } - break; - case CMD_ADD: - { - UInt32 v1 = GetOperand32(&cmd->Op1); - UInt32 res = v1 + GetOperand32(&cmd->Op2); - SetOperand32(&cmd->Op1, res); - Flags = (res < v1) | (res == 0 ? FLAG_Z : (res & FLAG_S)); - } - break; - case CMD_ADDB: - { - Byte v1 = GetOperand8(&cmd->Op1); - Byte res = v1 + GetOperand8(&cmd->Op2); - res &= 0xFF; - SetOperand8(&cmd->Op1, (Byte)res); - Flags = (res < v1) | (res == 0 ? FLAG_Z : GET_FLAG_S_B(res)); - } - break; - case CMD_ADC: - { - UInt32 v1 = GetOperand(cmd->ByteMode, &cmd->Op1); - UInt32 FC = (Flags & FLAG_C); - UInt32 res = v1 + GetOperand(cmd->ByteMode, &cmd->Op2) + FC; - if (cmd->ByteMode) - res &= 0xFF; - SetOperand(cmd->ByteMode, &cmd->Op1, res); - Flags = (res < v1 || res == v1 && FC) | (res == 0 ? FLAG_Z : (res & FLAG_S)); - } - break; - case CMD_SUB: - { - UInt32 v1 = GetOperand32(&cmd->Op1); - UInt32 res = v1 - GetOperand32(&cmd->Op2); - SetOperand32(&cmd->Op1, res); - Flags = res == 0 ? FLAG_Z : (res > v1) | (res & FLAG_S); - } - break; - case CMD_SUBB: - { - UInt32 v1 = GetOperand8(&cmd->Op1); - UInt32 res = v1 - GetOperand8(&cmd->Op2); - SetOperand8(&cmd->Op1, (Byte)res); - Flags = res == 0 ? FLAG_Z : (res > v1) | (res & FLAG_S); - } - break; - case CMD_SBB: - { - UInt32 v1 = GetOperand(cmd->ByteMode, &cmd->Op1); - UInt32 FC = (Flags & FLAG_C); - UInt32 res = v1 - GetOperand(cmd->ByteMode, &cmd->Op2) - FC; - // Flags = res == 0 ? FLAG_Z : (res > v1 || res == v1 && FC) | (res & FLAG_S); - if (cmd->ByteMode) - res &= 0xFF; - SetOperand(cmd->ByteMode, &cmd->Op1, res); - Flags = (res > v1 || res == v1 && FC) | (res == 0 ? FLAG_Z : (res & FLAG_S)); - } - break; - case CMD_INC: - { - UInt32 res = GetOperand32(&cmd->Op1) + 1; - SetOperand32(&cmd->Op1, res); - FLAGS_UPDATE_SZ; - } - break; - case CMD_INCB: - { - Byte res = GetOperand8(&cmd->Op1) + 1; - SetOperand8(&cmd->Op1, res);; - FLAGS_UPDATE_SZ_B; - } - break; - case CMD_DEC: - { - UInt32 res = GetOperand32(&cmd->Op1) - 1; - SetOperand32(&cmd->Op1, res); - FLAGS_UPDATE_SZ; - } - break; - case CMD_DECB: - { - Byte res = GetOperand8(&cmd->Op1) - 1; - SetOperand8(&cmd->Op1, res);; - FLAGS_UPDATE_SZ_B; - } - break; - case CMD_XOR: - { - UInt32 res = GetOperand32(&cmd->Op1) ^ GetOperand32(&cmd->Op2); - SetOperand32(&cmd->Op1, res); - FLAGS_UPDATE_SZ; - } - break; - case CMD_XORB: - { - Byte res = GetOperand8(&cmd->Op1) ^ GetOperand8(&cmd->Op2); - SetOperand8(&cmd->Op1, res); - FLAGS_UPDATE_SZ_B; - } - break; - case CMD_AND: - { - UInt32 res = GetOperand32(&cmd->Op1) & GetOperand32(&cmd->Op2); - SetOperand32(&cmd->Op1, res); - FLAGS_UPDATE_SZ; - } - break; - case CMD_ANDB: - { - Byte res = GetOperand8(&cmd->Op1) & GetOperand8(&cmd->Op2); - SetOperand8(&cmd->Op1, res); - FLAGS_UPDATE_SZ_B; - } - break; - case CMD_OR: - { - UInt32 res = GetOperand32(&cmd->Op1) | GetOperand32(&cmd->Op2); - SetOperand32(&cmd->Op1, res); - FLAGS_UPDATE_SZ; - } - break; - case CMD_ORB: - { - Byte res = GetOperand8(&cmd->Op1) | GetOperand8(&cmd->Op2); - SetOperand8(&cmd->Op1, res); - FLAGS_UPDATE_SZ_B; - } - break; - case CMD_TEST: - { - UInt32 res = GetOperand32(&cmd->Op1) & GetOperand32(&cmd->Op2); - FLAGS_UPDATE_SZ; - } - break; - case CMD_TESTB: - { - Byte res = GetOperand8(&cmd->Op1) & GetOperand8(&cmd->Op2); - FLAGS_UPDATE_SZ_B; - } - break; - case CMD_NOT: - SetOperand(cmd->ByteMode, &cmd->Op1, ~GetOperand(cmd->ByteMode, &cmd->Op1)); - break; - case CMD_NEG: - { - UInt32 res = 0 - GetOperand32(&cmd->Op1); - SetOperand32(&cmd->Op1, res); - Flags = res == 0 ? FLAG_Z : FLAG_C | (res & FLAG_S); - } - break; - case CMD_NEGB: - { - Byte res = (Byte)(0 - GetOperand8(&cmd->Op1)); - SetOperand8(&cmd->Op1, res); - Flags = res == 0 ? FLAG_Z : FLAG_C | GET_FLAG_S_B(res); - } - break; - - case CMD_SHL: - { - UInt32 v1 = GetOperand32(&cmd->Op1); - int v2 = (int)GetOperand32(&cmd->Op2); - UInt32 res = v1 << v2; - SetOperand32(&cmd->Op1, res); - Flags = (res == 0 ? FLAG_Z : (res & FLAG_S)) | ((v1 << (v2 - 1)) & 0x80000000 ? FLAG_C : 0); - } - break; - case CMD_SHLB: - { - Byte v1 = GetOperand8(&cmd->Op1); - int v2 = (int)GetOperand8(&cmd->Op2); - Byte res = (Byte)(v1 << v2); - SetOperand8(&cmd->Op1, res); - Flags = (res == 0 ? FLAG_Z : GET_FLAG_S_B(res)) | ((v1 << (v2 - 1)) & 0x80 ? FLAG_C : 0); - } - break; - case CMD_SHR: - { - UInt32 v1 = GetOperand32(&cmd->Op1); - int v2 = (int)GetOperand32(&cmd->Op2); - UInt32 res = v1 >> v2; - SetOperand32(&cmd->Op1, res); - Flags = (res == 0 ? FLAG_Z : (res & FLAG_S)) | ((v1 >> (v2 - 1)) & FLAG_C); - } - break; - case CMD_SHRB: - { - Byte v1 = GetOperand8(&cmd->Op1); - int v2 = (int)GetOperand8(&cmd->Op2); - Byte res = (Byte)(v1 >> v2); - SetOperand8(&cmd->Op1, res); - Flags = (res == 0 ? FLAG_Z : GET_FLAG_S_B(res)) | ((v1 >> (v2 - 1)) & FLAG_C); - } - break; - case CMD_SAR: - { - UInt32 v1 = GetOperand32(&cmd->Op1); - int v2 = (int)GetOperand32(&cmd->Op2); - UInt32 res = UInt32(((Int32)v1) >> v2); - SetOperand32(&cmd->Op1, res); - Flags= (res == 0 ? FLAG_Z : (res & FLAG_S)) | ((v1 >> (v2 - 1)) & FLAG_C); - } - break; - case CMD_SARB: - { - Byte v1 = GetOperand8(&cmd->Op1); - int v2 = (int)GetOperand8(&cmd->Op2); - Byte res = (Byte)(((signed char)v1) >> v2); - SetOperand8(&cmd->Op1, res); - Flags= (res == 0 ? FLAG_Z : GET_FLAG_S_B(res)) | ((v1 >> (v2 - 1)) & FLAG_C); - } - break; - - case CMD_JMP: - SET_IP_OP1; - continue; - case CMD_JZ: - if ((Flags & FLAG_Z) != 0) - { - SET_IP_OP1; - continue; - } - break; - case CMD_JNZ: - if ((Flags & FLAG_Z) == 0) - { - SET_IP_OP1; - continue; - } - break; - case CMD_JS: - if ((Flags & FLAG_S) != 0) - { - SET_IP_OP1; - continue; - } - break; - case CMD_JNS: - if ((Flags & FLAG_S) == 0) - { - SET_IP_OP1; - continue; - } - break; - case CMD_JB: - if ((Flags & FLAG_C) != 0) - { - SET_IP_OP1; - continue; - } - break; - case CMD_JBE: - if ((Flags & (FLAG_C | FLAG_Z)) != 0) - { - SET_IP_OP1; - continue; - } - break; - case CMD_JA: - if ((Flags & (FLAG_C | FLAG_Z)) == 0) - { - SET_IP_OP1; - continue; - } - break; - case CMD_JAE: - if ((Flags & FLAG_C) == 0) - { - SET_IP_OP1; - continue; - } - break; - - case CMD_PUSH: - R[kStackRegIndex] -= 4; - SetValue32(&Mem[R[kStackRegIndex] & kSpaceMask], GetOperand32(&cmd->Op1)); - break; - case CMD_POP: - SetOperand32(&cmd->Op1, GetValue32(&Mem[R[kStackRegIndex] & kSpaceMask])); - R[kStackRegIndex] += 4; - break; - case CMD_CALL: - R[kStackRegIndex] -= 4; - SetValue32(&Mem[R[kStackRegIndex] & kSpaceMask], (UInt32)(cmd - commands + 1)); - SET_IP_OP1; - continue; - - case CMD_PUSHA: - { - for (UInt32 i = 0, SP = R[kStackRegIndex] - 4; i < kNumRegs; i++, SP -= 4) - SetValue32(&Mem[SP & kSpaceMask], R[i]); - R[kStackRegIndex] -= kNumRegs * 4; - } - break; - case CMD_POPA: - { - for (UInt32 i = 0, SP = R[kStackRegIndex]; i < kNumRegs; i++, SP += 4) - R[kStackRegIndex - i] = GetValue32(&Mem[SP & kSpaceMask]); - } - break; - case CMD_PUSHF: - R[kStackRegIndex] -= 4; - SetValue32(&Mem[R[kStackRegIndex]&kSpaceMask], Flags); - break; - case CMD_POPF: - Flags = GetValue32(&Mem[R[kStackRegIndex] & kSpaceMask]); - R[kStackRegIndex] += 4; - break; - - case CMD_MOVZX: - SetOperand32(&cmd->Op1, GetOperand8(&cmd->Op2)); - break; - case CMD_MOVSX: - SetOperand32(&cmd->Op1, (UInt32)(Int32)(signed char)GetOperand8(&cmd->Op2)); - break; - case CMD_XCHG: - { - UInt32 v1 = GetOperand(cmd->ByteMode, &cmd->Op1); - SetOperand(cmd->ByteMode, &cmd->Op1, GetOperand(cmd->ByteMode, &cmd->Op2)); - SetOperand(cmd->ByteMode, &cmd->Op2, v1); - } - break; - case CMD_MUL: - { - UInt32 res = GetOperand32(&cmd->Op1) * GetOperand32(&cmd->Op2); - SetOperand32(&cmd->Op1, res); - } - break; - case CMD_MULB: - { - Byte res = GetOperand8(&cmd->Op1) * GetOperand8(&cmd->Op2); - SetOperand8(&cmd->Op1, res); - } - break; - case CMD_DIV: - { - UInt32 divider = GetOperand(cmd->ByteMode, &cmd->Op2); - if (divider != 0) - { - UInt32 res = GetOperand(cmd->ByteMode, &cmd->Op1) / divider; - SetOperand(cmd->ByteMode, &cmd->Op1, res); - } - } - break; - - #endif - - case CMD_RET: - { - if (R[kStackRegIndex] >= kSpaceSize) - return true; - UInt32 ip = GetValue32(&Mem[R[kStackRegIndex] & kSpaceMask]); - SET_IP(ip); - R[kStackRegIndex] += 4; - continue; - } - case CMD_PRINT: - break; - } - cmd++; - --maxOpCount; - } -} - - -////////////////////////////////////////////////////// -// Read program - -UInt32 ReadEncodedUInt32(CMemBitDecoder &inp) -{ - switch(inp.ReadBits(2)) - { - case 0: - return inp.ReadBits(4); - case 1: - { - UInt32 v = inp.ReadBits(4); - if (v == 0) - return 0xFFFFFF00 | inp.ReadBits(8); - else - return (v << 4) | inp.ReadBits(4); - } - case 2: - return inp.ReadBits(16); - default: - return inp.ReadBits(32); - } -} - -void CVm::DecodeArg(CMemBitDecoder &inp, COperand &op, bool byteMode) -{ - if (inp.ReadBit()) - { - op.Type = OP_TYPE_REG; - op.Data = inp.ReadBits(kNumRegBits); - } - else if (inp.ReadBit() == 0) - { - op.Type = OP_TYPE_INT; - if (byteMode) - op.Data = inp.ReadBits(8); - else - op.Data = ReadEncodedUInt32(inp); - } - else - { - op.Type = OP_TYPE_REGMEM; - if (inp.ReadBit() == 0) - { - op.Data = inp.ReadBits(kNumRegBits); - op.Base = 0; - } - else - { - if (inp.ReadBit() == 0) - op.Data = inp.ReadBits(kNumRegBits); - else - op.Data = kNumRegs; - op.Base = ReadEncodedUInt32(inp); - } - } -} - -void CVm::ReadVmProgram(const Byte *code, UInt32 codeSize, CProgram *prg) -{ - CMemBitDecoder inp; - inp.Init(code, codeSize); - - prg->StaticData.Clear(); - if (inp.ReadBit()) - { - UInt32 dataSize = ReadEncodedUInt32(inp) + 1; - for (UInt32 i = 0; inp.Avail() && i < dataSize; i++) - prg->StaticData.Add((Byte)inp.ReadBits(8)); - } - while (inp.Avail()) - { - prg->Commands.Add(CCommand()); - CCommand *cmd = &prg->Commands.Back(); - if (inp.ReadBit() == 0) - cmd->OpCode = (ECommand)inp.ReadBits(3); - else - cmd->OpCode = (ECommand)(8 + inp.ReadBits(5)); - if (kCmdFlags[cmd->OpCode] & CF_BYTEMODE) - cmd->ByteMode = (inp.ReadBit()) ? true : false; - else - cmd->ByteMode = 0; - int opNum = (kCmdFlags[cmd->OpCode] & CF_OPMASK); - if (opNum > 0) - { - DecodeArg(inp, cmd->Op1, cmd->ByteMode); - if (opNum == 2) - DecodeArg(inp, cmd->Op2, cmd->ByteMode); - else - { - if (cmd->Op1.Type == OP_TYPE_INT && (kCmdFlags[cmd->OpCode] & (CF_JUMP | CF_PROC))) - { - int Distance = cmd->Op1.Data; - if (Distance >= 256) - Distance -= 256; - else - { - if (Distance >= 136) - Distance -= 264; - else if (Distance >= 16) - Distance -= 8; - else if (Distance >= 8) - Distance -= 16; - Distance += prg->Commands.Size() - 1; - } - cmd->Op1.Data = Distance; - } - } - } - if (cmd->ByteMode) - { - switch (cmd->OpCode) - { - case CMD_MOV: cmd->OpCode = CMD_MOVB; break; - case CMD_CMP: cmd->OpCode = CMD_CMPB; break; - case CMD_ADD: cmd->OpCode = CMD_ADDB; break; - case CMD_SUB: cmd->OpCode = CMD_SUBB; break; - case CMD_INC: cmd->OpCode = CMD_INCB; break; - case CMD_DEC: cmd->OpCode = CMD_DECB; break; - case CMD_XOR: cmd->OpCode = CMD_XORB; break; - case CMD_AND: cmd->OpCode = CMD_ANDB; break; - case CMD_OR: cmd->OpCode = CMD_ORB; break; - case CMD_TEST: cmd->OpCode = CMD_TESTB; break; - case CMD_NEG: cmd->OpCode = CMD_NEGB; break; - case CMD_SHL: cmd->OpCode = CMD_SHLB; break; - case CMD_SHR: cmd->OpCode = CMD_SHRB; break; - case CMD_SAR: cmd->OpCode = CMD_SARB; break; - case CMD_MUL: cmd->OpCode = CMD_MULB; break; - } - } - } -} - -#ifdef RARVM_STANDARD_FILTERS - -enum EStandardFilter -{ - SF_E8, - SF_E8E9, - SF_ITANIUM, - SF_RGB, - SF_AUDIO, - SF_DELTA, - SF_UPCASE -}; - -struct StandardFilterSignature -{ - UInt32 Length; - UInt32 CRC; - EStandardFilter Type; -} -kStdFilters[]= -{ - 53, 0xad576887, SF_E8, - 57, 0x3cd7e57e, SF_E8E9, - 120, 0x3769893f, SF_ITANIUM, - 29, 0x0e06077d, SF_DELTA, - 149, 0x1c2c5dc8, SF_RGB, - 216, 0xbc85e701, SF_AUDIO, - 40, 0x46b9c560, SF_UPCASE -}; - -static int FindStandardFilter(const Byte *code, UInt32 codeSize) -{ - UInt32 crc = CrcCalc(code, codeSize); - for (int i = 0; i < sizeof(kStdFilters) / sizeof(kStdFilters[0]); i++) - { - StandardFilterSignature &sfs = kStdFilters[i]; - if (sfs.CRC == crc && sfs.Length == codeSize) - return i; - } - return -1; -} - -#endif - -void CVm::PrepareProgram(const Byte *code, UInt32 codeSize, CProgram *prg) -{ - Byte xorSum = 0; - for (UInt32 i = 1; i < codeSize; i++) - xorSum ^= code[i]; - - prg->Commands.Clear(); - #ifdef RARVM_STANDARD_FILTERS - prg->StandardFilterIndex = -1; - #endif - - if (xorSum == code[0] && codeSize > 0) - { - #ifdef RARVM_STANDARD_FILTERS - prg->StandardFilterIndex = FindStandardFilter(code, codeSize); - if (prg->StandardFilterIndex >= 0) - return; - #endif - // 1 byte for checksum - ReadVmProgram(code + 1, codeSize - 1, prg); - } - prg->Commands.Add(CCommand()); - CCommand *cmd = &prg->Commands.Back(); - cmd->OpCode = CMD_RET; -} - -void CVm::SetMemory(UInt32 pos, const Byte *data, UInt32 dataSize) -{ - if (pos < kSpaceSize && data != Mem + pos) - memmove(Mem + pos, data, MyMin(dataSize, kSpaceSize - pos)); -} - -#ifdef RARVM_STANDARD_FILTERS - -static void E8E9Decode(Byte *data, UInt32 dataSize, UInt32 fileOffset, bool e9) -{ - if (dataSize <= 4) - return; - dataSize -= 4; - const UInt32 kFileSize = 0x1000000; - Byte cmpByte2 = (e9 ? 0xE9 : 0xE8); - for (UInt32 curPos = 0; curPos < dataSize;) - { - Byte curByte = *(data++); - curPos++; - if (curByte == 0xE8 || curByte == cmpByte2) - { - UInt32 offset = curPos + fileOffset; - UInt32 addr = (Int32)GetValue32(data); - if (addr < kFileSize) - SetValue32(data, addr - offset); - else if ((Int32)addr < 0 && (Int32)(addr + offset) >= 0) - SetValue32(data, addr + kFileSize); - data += 4; - curPos += 4; - } - } -} - -static inline UInt32 ItaniumGetOpType(const Byte *data, int bitPos) -{ - return (data[(unsigned int)bitPos >> 3] >> (bitPos & 7)) & 0xF; -} - - -static void ItaniumDecode(Byte *data, UInt32 dataSize, UInt32 fileOffset) -{ - UInt32 curPos = 0; - fileOffset >>= 4; - while (curPos < dataSize - 21) - { - int b = (data[0] & 0x1F) - 0x10; - if (b >= 0) - { - static Byte kCmdMasks[16] = {4,4,6,6,0,0,7,7,4,4,0,0,4,4,0,0}; - Byte cmdMask = kCmdMasks[b]; - if (cmdMask != 0) - for (int i = 0; i < 3; i++) - if (cmdMask & (1 << i)) - { - int startPos = i * 41 + 18; - if (ItaniumGetOpType(data, startPos + 24) == 5) - { - const UInt32 kMask = 0xFFFFF; - Byte *p = data + ((unsigned int)startPos >> 3); - UInt32 bitField = ((UInt32)p[0]) | ((UInt32)p[1] << 8) | ((UInt32)p[2] << 16); - int inBit = (startPos & 7); - UInt32 offset = (bitField >> inBit) & kMask; - UInt32 andMask = ~(kMask << inBit); - bitField = ((offset - fileOffset) & kMask) << inBit; - for (int j = 0; j < 3; j++) - { - p[j] &= andMask; - p[j] |= bitField; - andMask >>= 8; - bitField >>= 8; - } - } - } - } - data += 16; - curPos += 16; - fileOffset++; - } -} - -static void DeltaDecode(Byte *data, UInt32 dataSize, UInt32 numChannels) -{ - UInt32 srcPos = 0; - UInt32 border = dataSize * 2; - for (UInt32 curChannel = 0; curChannel < numChannels; curChannel++) - { - Byte prevByte = 0; - for (UInt32 destPos = dataSize + curChannel; destPos < border; destPos += numChannels) - data[destPos] = (prevByte = prevByte - data[srcPos++]); - } -} - -static void RgbDecode(Byte *srcData, UInt32 dataSize, UInt32 width, UInt32 posR) -{ - Byte *destData = srcData + dataSize; - const UInt32 numChannels = 3; - for (UInt32 curChannel = 0; curChannel < numChannels; curChannel++) - { - Byte prevByte = 0; - - for (UInt32 i = curChannel; i < dataSize; i+= numChannels) - { - unsigned int predicted; - if (i < width) - predicted = prevByte; - else - { - unsigned int upperLeftByte = destData[i - width]; - unsigned int upperByte = destData[i - width + 3]; - predicted = prevByte + upperByte - upperLeftByte; - int pa = abs((int)(predicted - prevByte)); - int pb = abs((int)(predicted - upperByte)); - int pc = abs((int)(predicted - upperLeftByte)); - if (pa <= pb && pa <= pc) - predicted = prevByte; - else - if (pb <= pc) - predicted = upperByte; - else - predicted = upperLeftByte; - } - destData[i] = prevByte = (Byte)(predicted - *(srcData++)); - } - } - if (dataSize < 3) - return; - for (UInt32 i = posR, border = dataSize - 2; i < border; i += 3) - { - Byte g = destData[i + 1]; - destData[i] = destData[i] + g; - destData[i + 2] = destData[i + 2] + g; - } -} - -static void AudioDecode(Byte *srcData, UInt32 dataSize, UInt32 numChannels) -{ - Byte *destData = srcData + dataSize; - for (UInt32 curChannel = 0; curChannel < numChannels; curChannel++) - { - UInt32 prevByte = 0, prevDelta = 0, dif[7]; - Int32 D1 = 0, D2 = 0, D3; - Int32 K1 = 0, K2 = 0, K3 = 0; - memset(dif, 0, sizeof(dif)); - - for (UInt32 i = curChannel, byteCount = 0; i < dataSize; i += numChannels, byteCount++) - { - D3 = D2; - D2 = prevDelta - D1; - D1 = prevDelta; - - UInt32 predicted = 8 * prevByte + K1 * D1 + K2 * D2 + K3 * D3; - predicted = (predicted >> 3) & 0xFF; - - UInt32 curByte = *(srcData++); - - predicted -= curByte; - destData[i] = (Byte)predicted; - prevDelta = (UInt32)(Int32)(signed char)(predicted - prevByte); - prevByte = predicted; - - Int32 D = ((Int32)(signed char)curByte) << 3; - - dif[0] += abs(D); - dif[1] += abs(D - D1); - dif[2] += abs(D + D1); - dif[3] += abs(D - D2); - dif[4] += abs(D + D2); - dif[5] += abs(D - D3); - dif[6] += abs(D + D3); - - if ((byteCount & 0x1F) == 0) - { - UInt32 minDif = dif[0], numMinDif = 0; - dif[0] = 0; - for (int j = 1; j < sizeof(dif) / sizeof(dif[0]); j++) - { - if (dif[j] < minDif) - { - minDif = dif[j]; - numMinDif = j; - } - dif[j] = 0; - } - switch (numMinDif) - { - case 1: if (K1 >= -16) K1--; break; - case 2: if (K1 < 16) K1++; break; - case 3: if (K2 >= -16) K2--; break; - case 4: if (K2 < 16) K2++; break; - case 5: if (K3 >= -16) K3--; break; - case 6: if (K3 < 16) K3++; break; - } - } - } - } -} - -static UInt32 UpCaseDecode(Byte *data, UInt32 dataSize) -{ - UInt32 srcPos = 0, destPos = dataSize; - while (srcPos < dataSize) - { - Byte curByte = data[srcPos++]; - if (curByte == 2 && (curByte = data[srcPos++]) != 2) - curByte -= 32; - data[destPos++] = curByte; - } - return destPos - dataSize; -} - -void CVm::ExecuteStandardFilter(int filterIndex) -{ - UInt32 dataSize = R[4]; - if (dataSize >= kGlobalOffset) - return; - EStandardFilter filterType = kStdFilters[filterIndex].Type; - - switch (filterType) - { - case SF_E8: - case SF_E8E9: - E8E9Decode(Mem, dataSize, R[6], (filterType == SF_E8E9)); - break; - case SF_ITANIUM: - ItaniumDecode(Mem, dataSize, R[6]); - break; - case SF_DELTA: - if (dataSize >= kGlobalOffset / 2) - break; - SetBlockPos(dataSize); - DeltaDecode(Mem, dataSize, R[0]); - break; - case SF_RGB: - if (dataSize >= kGlobalOffset / 2) - break; - { - UInt32 width = R[0]; - if (width <= 3) - break; - SetBlockPos(dataSize); - RgbDecode(Mem, dataSize, width, R[1]); - } - break; - case SF_AUDIO: - if (dataSize >= kGlobalOffset / 2) - break; - SetBlockPos(dataSize); - AudioDecode(Mem, dataSize, R[0]); - break; - case SF_UPCASE: - if (dataSize >= kGlobalOffset / 2) - break; - UInt32 destSize = UpCaseDecode(Mem, dataSize); - SetBlockSize(destSize); - SetBlockPos(dataSize); - break; - } -} - -#endif - -}}} diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/Rar3Vm.h b/desmume/src/windows/7z/CPP/7zip/Compress/Rar3Vm.h deleted file mode 100644 index 0d16e42cc..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/Rar3Vm.h +++ /dev/null @@ -1,179 +0,0 @@ -// Rar3Vm.h -// According to unRAR license, this code may not be used to develop -// a program that creates RAR archives - -#ifndef __COMPRESS_RAR3_VM_H -#define __COMPRESS_RAR3_VM_H - -#include "../../../C/CpuArch.h" - -#include "Common/MyVector.h" -#include "Common/Types.h" - -#define RARVM_STANDARD_FILTERS - -namespace NCompress { -namespace NRar3 { - -class CMemBitDecoder -{ - const Byte *_data; - UInt32 _bitSize; - UInt32 _bitPos; -public: - void Init(const Byte *data, UInt32 byteSize) - { - _data = data; - _bitSize = (byteSize << 3); - _bitPos = 0; - } - UInt32 ReadBits(int numBits); - UInt32 ReadBit(); - bool Avail() const { return (_bitPos < _bitSize); } -}; - -namespace NVm { - -inline UInt32 GetValue32(const void *addr) { return GetUi32(addr); } -inline void SetValue32(void *addr, UInt32 value) { SetUi32(addr, value); } - -UInt32 ReadEncodedUInt32(CMemBitDecoder &inp); - -const int kNumRegBits = 3; -const UInt32 kNumRegs = 1 << kNumRegBits; -const UInt32 kNumGpRegs = kNumRegs - 1; - -const UInt32 kSpaceSize = 0x40000; -const UInt32 kSpaceMask = kSpaceSize -1; -const UInt32 kGlobalOffset = 0x3C000; -const UInt32 kGlobalSize = 0x2000; -const UInt32 kFixedGlobalSize = 64; - -namespace NGlobalOffset -{ - const UInt32 kBlockSize = 0x1C; - const UInt32 kBlockPos = 0x20; - const UInt32 kExecCount = 0x2C; - const UInt32 kGlobalMemOutSize = 0x30; -} - -enum ECommand -{ - CMD_MOV, CMD_CMP, CMD_ADD, CMD_SUB, CMD_JZ, CMD_JNZ, CMD_INC, CMD_DEC, - CMD_JMP, CMD_XOR, CMD_AND, CMD_OR, CMD_TEST, CMD_JS, CMD_JNS, CMD_JB, - CMD_JBE, CMD_JA, CMD_JAE, CMD_PUSH, CMD_POP, CMD_CALL, CMD_RET, CMD_NOT, - CMD_SHL, CMD_SHR, CMD_SAR, CMD_NEG, CMD_PUSHA,CMD_POPA, CMD_PUSHF,CMD_POPF, - CMD_MOVZX,CMD_MOVSX,CMD_XCHG, CMD_MUL, CMD_DIV, CMD_ADC, CMD_SBB, CMD_PRINT, - - CMD_MOVB, CMD_CMPB, CMD_ADDB, CMD_SUBB, CMD_INCB, CMD_DECB, - CMD_XORB, CMD_ANDB, CMD_ORB, CMD_TESTB,CMD_NEGB, - CMD_SHLB, CMD_SHRB, CMD_SARB, CMD_MULB -}; - -enum EOpType {OP_TYPE_REG, OP_TYPE_INT, OP_TYPE_REGMEM, OP_TYPE_NONE}; - -// Addr in COperand object can link (point) to CVm object!!! - -struct COperand -{ - EOpType Type; - UInt32 Data; - UInt32 Base; - COperand(): Type(OP_TYPE_NONE), Data(0), Base(0) {} -}; - -struct CCommand -{ - ECommand OpCode; - bool ByteMode; - COperand Op1, Op2; -}; - -struct CBlockRef -{ - UInt32 Offset; - UInt32 Size; -}; - -struct CProgram -{ - CRecordVector Commands; - #ifdef RARVM_STANDARD_FILTERS - int StandardFilterIndex; - #endif - CRecordVector StaticData; -}; - -struct CProgramInitState -{ - UInt32 InitR[kNumGpRegs]; - CRecordVector GlobalData; - - void AllocateEmptyFixedGlobal() - { - GlobalData.Clear(); - GlobalData.Reserve(NVm::kFixedGlobalSize); - for (UInt32 i = 0; i < NVm::kFixedGlobalSize; i++) - GlobalData.Add(0); - } -}; - -class CVm -{ - static UInt32 GetValue(bool byteMode, const void *addr) - { - if (byteMode) - return(*(const Byte *)addr); - else - return GetUi32(addr); - } - - static void SetValue(bool byteMode, void *addr, UInt32 value) - { - if (byteMode) - *(Byte *)addr = (Byte)value; - else - SetUi32(addr, value); - } - - UInt32 GetFixedGlobalValue32(UInt32 globalOffset) { return GetValue(false, &Mem[kGlobalOffset + globalOffset]); } - - void SetBlockSize(UInt32 v) { SetValue(&Mem[kGlobalOffset + NGlobalOffset::kBlockSize], v); } - void SetBlockPos(UInt32 v) { SetValue(&Mem[kGlobalOffset + NGlobalOffset::kBlockPos], v); } -public: - static void SetValue(void *addr, UInt32 value) { SetValue(false, addr, value); } -private: - UInt32 GetOperand32(const COperand *op) const; - void SetOperand32(const COperand *op, UInt32 val); - Byte GetOperand8(const COperand *op) const; - void SetOperand8(const COperand *op, Byte val); - UInt32 GetOperand(bool byteMode, const COperand *op) const; - void SetOperand(bool byteMode, const COperand *op, UInt32 val); - - void DecodeArg(CMemBitDecoder &inp, COperand &op, bool byteMode); - - bool ExecuteCode(const CProgram *prg); - - #ifdef RARVM_STANDARD_FILTERS - void ExecuteStandardFilter(int filterIndex); - #endif - - Byte *Mem; - UInt32 R[kNumRegs + 1]; // R[kNumRegs] = 0 always (speed optimization) - UInt32 Flags; - void ReadVmProgram(const Byte *code, UInt32 codeSize, CProgram *prg); -public: - CVm(); - ~CVm(); - bool Create(); - void PrepareProgram(const Byte *code, UInt32 codeSize, CProgram *prg); - void SetMemory(UInt32 pos, const Byte *data, UInt32 dataSize); - bool Execute(CProgram *prg, const CProgramInitState *initState, - CBlockRef &outBlockRef, CRecordVector &outGlobalData); - const Byte *GetDataPointer(UInt32 offset) const { return Mem + offset; } - -}; - -#endif - -}}} diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/RarCodecsRegister.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/RarCodecsRegister.cpp deleted file mode 100644 index cb6242b3d..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/RarCodecsRegister.cpp +++ /dev/null @@ -1,26 +0,0 @@ -// RarCodecsRegister.cpp - -#include "StdAfx.h" - -#include "../Common/RegisterCodec.h" - -#include "Rar1Decoder.h" -#include "Rar2Decoder.h" -#include "Rar3Decoder.h" - -#define CREATE_CODEC(x) static void *CreateCodec ## x() { return (void *)(ICompressCoder *)(new NCompress::NRar ## x::CDecoder); } - -CREATE_CODEC(1) -CREATE_CODEC(2) -CREATE_CODEC(3) - -#define RAR_CODEC(x, name) { CreateCodec ## x, 0, 0x040300 + x, L"Rar" name, 1, false } - -static CCodecInfo g_CodecsInfo[] = -{ - RAR_CODEC(1, L"1"), - RAR_CODEC(2, L"2"), - RAR_CODEC(3, L"3"), -}; - -REGISTER_CODECS(Rar) diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/ShrinkDecoder.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/ShrinkDecoder.cpp deleted file mode 100644 index 2146fa733..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/ShrinkDecoder.cpp +++ /dev/null @@ -1,148 +0,0 @@ -// ShrinkDecoder.cpp - -#include "StdAfx.h" - -extern "C" -{ -#include "../../../C/Alloc.h" -} - -#include "../Common/InBuffer.h" -#include "../Common/OutBuffer.h" - -#include "BitlDecoder.h" -#include "ShrinkDecoder.h" - -namespace NCompress { -namespace NShrink { - -static const UInt32 kBufferSize = (1 << 20); -static const int kNumMinBits = 9; - -HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress) -{ - NBitl::CBaseDecoder inBuffer; - COutBuffer outBuffer; - - if (!inBuffer.Create(kBufferSize)) - return E_OUTOFMEMORY; - inBuffer.SetStream(inStream); - inBuffer.Init(); - - if (!outBuffer.Create(kBufferSize)) - return E_OUTOFMEMORY; - outBuffer.SetStream(outStream); - outBuffer.Init(); - - UInt64 prevPos = 0; - int numBits = kNumMinBits; - UInt32 head = 257; - bool needPrev = false; - UInt32 lastSymbol = 0; - - int i; - for (i = 0; i < kNumItems; i++) - _parents[i] = 0; - for (i = 0; i < kNumItems; i++) - _suffixes[i] = 0; - for (i = 0; i < 257; i++) - _isFree[i] = false; - for (; i < kNumItems; i++) - _isFree[i] = true; - - for (;;) - { - UInt32 symbol = inBuffer.ReadBits(numBits); - if (inBuffer.ExtraBitsWereRead()) - break; - if (_isFree[symbol]) - return S_FALSE; - if (symbol == 256) - { - UInt32 symbol = inBuffer.ReadBits(numBits); - if (symbol == 1) - { - if (numBits < kNumMaxBits) - numBits++; - } - else if (symbol == 2) - { - if (needPrev) - _isFree[head - 1] = true; - for (i = 257; i < kNumItems; i++) - _isParent[i] = false; - for (i = 257; i < kNumItems; i++) - if (!_isFree[i]) - _isParent[_parents[i]] = true; - for (i = 257; i < kNumItems; i++) - if (!_isParent[i]) - _isFree[i] = true; - head = 257; - while (head < kNumItems && !_isFree[head]) - head++; - if (head < kNumItems) - { - needPrev = true; - _isFree[head] = false; - _parents[head] = (UInt16)lastSymbol; - head++; - } - } - else - return S_FALSE; - continue; - } - UInt32 cur = symbol; - i = 0; - int corectionIndex = -1; - while (cur >= 256) - { - if (cur == head - 1) - corectionIndex = i; - _stack[i++] = _suffixes[cur]; - cur = _parents[cur]; - } - _stack[i++] = (Byte)cur; - if (needPrev) - { - _suffixes[head - 1] = (Byte)cur; - if (corectionIndex >= 0) - _stack[corectionIndex] = (Byte)cur; - } - while (i > 0) - outBuffer.WriteByte((_stack[--i])); - while (head < kNumItems && !_isFree[head]) - head++; - if (head < kNumItems) - { - needPrev = true; - _isFree[head] = false; - _parents[head] = (UInt16)symbol; - head++; - } - else - needPrev = false; - lastSymbol = symbol; - - UInt64 nowPos = outBuffer.GetProcessedSize(); - if (progress != NULL && nowPos - prevPos > (1 << 18)) - { - prevPos = nowPos; - UInt64 packSize = inBuffer.GetProcessedSize(); - RINOK(progress->SetRatioInfo(&packSize, &nowPos)); - } - } - return outBuffer.Flush(); -} - -STDMETHODIMP CDecoder ::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress) -{ - try { return CodeReal(inStream, outStream, inSize, outSize, progress); } - catch(const CInBufferException &e) { return e.ErrorCode; } - catch(const COutBufferException &e) { return e.ErrorCode; } - catch(...) { return S_FALSE; } -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/ShrinkDecoder.h b/desmume/src/windows/7z/CPP/7zip/Compress/ShrinkDecoder.h deleted file mode 100644 index 00f416402..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/ShrinkDecoder.h +++ /dev/null @@ -1,38 +0,0 @@ -// ShrinkDecoder.h - -#ifndef __COMPRESS_SHRINK_DECODER_H -#define __COMPRESS_SHRINK_DECODER_H - -#include "../../Common/MyCom.h" - -#include "../ICoder.h" - -namespace NCompress { -namespace NShrink { - -const int kNumMaxBits = 13; -const UInt32 kNumItems = 1 << kNumMaxBits; - -class CDecoder : - public ICompressCoder, - public CMyUnknownImp -{ - UInt16 _parents[kNumItems]; - Byte _suffixes[kNumItems]; - Byte _stack[kNumItems]; - bool _isFree[kNumItems]; - bool _isParent[kNumItems]; - -public: - MY_UNKNOWN_IMP - - HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); - - STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/StdAfx.h b/desmume/src/windows/7z/CPP/7zip/Compress/StdAfx.h deleted file mode 100644 index c28ffcea7..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/StdAfx.h +++ /dev/null @@ -1,8 +0,0 @@ -// StdAfx.h - -#ifndef __STDAFX_H -#define __STDAFX_H - -#include "../../Common/MyWindows.h" - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/ZlibDecoder.cpp b/desmume/src/windows/7z/CPP/7zip/Compress/ZlibDecoder.cpp deleted file mode 100644 index 505f21798..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/ZlibDecoder.cpp +++ /dev/null @@ -1,94 +0,0 @@ -// ZlibDecoder.cpp - -#include "StdAfx.h" - -#include "../Common/StreamUtils.h" - -#include "DeflateDecoder.h" -#include "ZlibDecoder.h" - -namespace NCompress { -namespace NZlib { - -#define DEFLATE_TRY_BEGIN try { -#define DEFLATE_TRY_END } \ - catch(...) { return S_FALSE; } - -#define ADLER_MOD 65521 -#define ADLER_LOOP_MAX 5550 - -static UInt32 Adler32_Update(UInt32 adler, const Byte *buf, size_t size) -{ - UInt32 a = adler & 0xFFFF; - UInt32 b = (adler >> 16) & 0xFFFF; - while (size > 0) - { - unsigned curSize = (size > ADLER_LOOP_MAX) ? ADLER_LOOP_MAX : (unsigned )size; - unsigned i; - for (i = 0; i < curSize; i++) - { - a += buf[i]; - b += a; - } - buf += curSize; - size -= curSize; - a %= ADLER_MOD; - b %= ADLER_MOD; - } - return (b << 16) + a; -} - -STDMETHODIMP COutStreamWithAdler::Write(const void *data, UInt32 size, UInt32 *processedSize) -{ - HRESULT result = _stream->Write(data, size, &size); - _adler = Adler32_Update(_adler, (const Byte *)data, size); - if (processedSize != NULL) - *processedSize = size; - return result; -} - -STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress) -{ - DEFLATE_TRY_BEGIN - if (!AdlerStream) - { - AdlerSpec = new COutStreamWithAdler; - AdlerStream = AdlerSpec; - } - if (!DeflateDecoder) - { - DeflateDecoderSpec = new NCompress::NDeflate::NDecoder::CCOMCoder; - DeflateDecoderSpec->ZlibMode = true; - DeflateDecoder = DeflateDecoderSpec; - } - - Byte buf[2]; - RINOK(ReadStream_FALSE(inStream, buf, 2)); - int method = buf[0] & 0xF; - if (method != 8) - return S_FALSE; - // int dicSize = buf[0] >> 4; - if ((((UInt32)buf[0] << 8) + buf[1]) % 31 != 0) - return S_FALSE; - if ((buf[1] & 0x20) != 0) // dictPresent - return S_FALSE; - // int level = (buf[1] >> 6); - - AdlerSpec->SetStream(outStream); - AdlerSpec->Init(); - HRESULT res = DeflateDecoder->Code(inStream, AdlerStream, inSize, outSize, progress); - AdlerSpec->ReleaseStream(); - - if (res == S_OK) - { - const Byte *p = DeflateDecoderSpec->ZlibFooter; - UInt32 adler = ((UInt32)p[0] << 24) | ((UInt32)p[1] << 16) | ((UInt32)p[2] << 8) | p[3]; - if (adler != AdlerSpec->GetAdler()) - return S_FALSE; - } - return res; - DEFLATE_TRY_END -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Compress/ZlibDecoder.h b/desmume/src/windows/7z/CPP/7zip/Compress/ZlibDecoder.h deleted file mode 100644 index a7ec07328..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Compress/ZlibDecoder.h +++ /dev/null @@ -1,46 +0,0 @@ -// ZlibDecoder.h - -#ifndef __ZLIB_DECODER_H -#define __ZLIB_DECODER_H - -#include "DeflateDecoder.h" - -namespace NCompress { -namespace NZlib { - -const UInt32 ADLER_INIT_VAL = 1; - -class COutStreamWithAdler: - public ISequentialOutStream, - public CMyUnknownImp -{ - CMyComPtr _stream; - UInt32 _adler; -public: - MY_UNKNOWN_IMP - STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); - void SetStream(ISequentialOutStream *stream) { _stream = stream; } - void ReleaseStream() { _stream.Release(); } - void Init() { _adler = ADLER_INIT_VAL; } - UInt32 GetAdler() const { return _adler; } -}; - -class CDecoder: - public ICompressCoder, - public CMyUnknownImp -{ - COutStreamWithAdler *AdlerSpec; - CMyComPtr AdlerStream; - - NCompress::NDeflate::NDecoder::CCOMCoder *DeflateDecoderSpec; - CMyComPtr DeflateDecoder; -public: - STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); - - MY_UNKNOWN_IMP -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Crypto/7zAes.cpp b/desmume/src/windows/7z/CPP/7zip/Crypto/7zAes.cpp deleted file mode 100644 index b5b5b4b43..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Crypto/7zAes.cpp +++ /dev/null @@ -1,245 +0,0 @@ -// 7zAes.cpp - -#include "StdAfx.h" - -extern "C" -{ -#include "../../../C/Sha256.h" -} - -#include "Windows/Synchronization.h" -#include "../Common/StreamObjects.h" -#include "../Common/StreamUtils.h" -#include "7zAes.h" -#include "MyAes.h" - -#ifndef EXTRACT_ONLY -#include "RandGen.h" -#endif - -using namespace NWindows; - -namespace NCrypto { -namespace NSevenZ { - -bool CKeyInfo::IsEqualTo(const CKeyInfo &a) const -{ - if (SaltSize != a.SaltSize || NumCyclesPower != a.NumCyclesPower) - return false; - for (UInt32 i = 0; i < SaltSize; i++) - if (Salt[i] != a.Salt[i]) - return false; - return (Password == a.Password); -} - -void CKeyInfo::CalculateDigest() -{ - if (NumCyclesPower == 0x3F) - { - UInt32 pos; - for (pos = 0; pos < SaltSize; pos++) - Key[pos] = Salt[pos]; - for (UInt32 i = 0; i < Password.GetCapacity() && pos < kKeySize; i++) - Key[pos++] = Password[i]; - for (; pos < kKeySize; pos++) - Key[pos] = 0; - } - else - { - CSha256 sha; - Sha256_Init(&sha); - const UInt64 numRounds = UInt64(1) << (NumCyclesPower); - Byte temp[8] = { 0,0,0,0,0,0,0,0 }; - for (UInt64 round = 0; round < numRounds; round++) - { - Sha256_Update(&sha, Salt, (size_t)SaltSize); - Sha256_Update(&sha, Password, Password.GetCapacity()); - Sha256_Update(&sha, temp, 8); - for (int i = 0; i < 8; i++) - if (++(temp[i]) != 0) - break; - } - Sha256_Final(&sha, Key); - } -} - -bool CKeyInfoCache::Find(CKeyInfo &key) -{ - for (int i = 0; i < Keys.Size(); i++) - { - const CKeyInfo &cached = Keys[i]; - if (key.IsEqualTo(cached)) - { - for (int j = 0; j < kKeySize; j++) - key.Key[j] = cached.Key[j]; - if (i != 0) - { - Keys.Insert(0, cached); - Keys.Delete(i+1); - } - return true; - } - } - return false; -} - -void CKeyInfoCache::Add(CKeyInfo &key) -{ - if (Find(key)) - return; - if (Keys.Size() >= Size) - Keys.DeleteBack(); - Keys.Insert(0, key); -} - -static CKeyInfoCache g_GlobalKeyCache(32); -static NSynchronization::CCriticalSection g_GlobalKeyCacheCriticalSection; - -CBase::CBase(): - _cachedKeys(16), - _ivSize(0) -{ - for (int i = 0; i < sizeof(_iv); i++) - _iv[i] = 0; -} - -void CBase::CalculateDigest() -{ - NSynchronization::CCriticalSectionLock lock(g_GlobalKeyCacheCriticalSection); - if (_cachedKeys.Find(_key)) - g_GlobalKeyCache.Add(_key); - else - { - if (!g_GlobalKeyCache.Find(_key)) - { - _key.CalculateDigest(); - g_GlobalKeyCache.Add(_key); - } - _cachedKeys.Add(_key); - } -} - -#ifndef EXTRACT_ONLY - -/* -STDMETHODIMP CEncoder::ResetSalt() -{ - _key.SaltSize = 4; - g_RandomGenerator.Generate(_key.Salt, _key.SaltSize); - return S_OK; -} -*/ - -STDMETHODIMP CEncoder::ResetInitVector() -{ - _ivSize = 8; - g_RandomGenerator.Generate(_iv, (unsigned)_ivSize); - return S_OK; -} - -STDMETHODIMP CEncoder::WriteCoderProperties(ISequentialOutStream *outStream) -{ - // _key.Init(); - for (UInt32 i = _ivSize; i < sizeof(_iv); i++) - _iv[i] = 0; - - UInt32 ivSize = _ivSize; - - // _key.NumCyclesPower = 0x3F; - _key.NumCyclesPower = 19; - - Byte firstByte = (Byte)(_key.NumCyclesPower | - (((_key.SaltSize == 0) ? 0 : 1) << 7) | - (((ivSize == 0) ? 0 : 1) << 6)); - RINOK(outStream->Write(&firstByte, 1, NULL)); - if (_key.SaltSize == 0 && ivSize == 0) - return S_OK; - Byte saltSizeSpec = (Byte)((_key.SaltSize == 0) ? 0 : (_key.SaltSize - 1)); - Byte ivSizeSpec = (Byte)((ivSize == 0) ? 0 : (ivSize - 1)); - Byte secondByte = (Byte)(((saltSizeSpec) << 4) | ivSizeSpec); - RINOK(outStream->Write(&secondByte, 1, NULL)); - if (_key.SaltSize > 0) - { - RINOK(WriteStream(outStream, _key.Salt, _key.SaltSize)); - } - if (ivSize > 0) - { - RINOK(WriteStream(outStream, _iv, ivSize)); - } - return S_OK; -} - -HRESULT CEncoder::CreateFilter() -{ - _aesFilter = new CAesCbcEncoder; - return S_OK; -} - -#endif - -STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size) -{ - _key.Init(); - UInt32 i; - for (i = 0; i < sizeof(_iv); i++) - _iv[i] = 0; - if (size == 0) - return S_OK; - UInt32 pos = 0; - Byte firstByte = data[pos++]; - - _key.NumCyclesPower = firstByte & 0x3F; - if ((firstByte & 0xC0) == 0) - return S_OK; - _key.SaltSize = (firstByte >> 7) & 1; - UInt32 ivSize = (firstByte >> 6) & 1; - - if (pos >= size) - return E_INVALIDARG; - Byte secondByte = data[pos++]; - - _key.SaltSize += (secondByte >> 4); - ivSize += (secondByte & 0x0F); - - if (pos + _key.SaltSize + ivSize > size) - return E_INVALIDARG; - for (i = 0; i < _key.SaltSize; i++) - _key.Salt[i] = data[pos++]; - for (i = 0; i < ivSize; i++) - _iv[i] = data[pos++]; - return S_OK; -} - -STDMETHODIMP CBaseCoder::CryptoSetPassword(const Byte *data, UInt32 size) -{ - _key.Password.SetCapacity((size_t)size); - memcpy(_key.Password, data, (size_t)size); - return S_OK; -} - -STDMETHODIMP CBaseCoder::Init() -{ - CalculateDigest(); - if (_aesFilter == 0) - { - RINOK(CreateFilter()); - } - CMyComPtr cp; - RINOK(_aesFilter.QueryInterface(IID_ICryptoProperties, &cp)); - RINOK(cp->SetKey(_key.Key, sizeof(_key.Key))); - RINOK(cp->SetInitVector(_iv, sizeof(_iv))); - return S_OK; -} - -STDMETHODIMP_(UInt32) CBaseCoder::Filter(Byte *data, UInt32 size) -{ - return _aesFilter->Filter(data, size); -} - -HRESULT CDecoder::CreateFilter() -{ - _aesFilter = new CAesCbcDecoder; - return S_OK; -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Crypto/7zAes.h b/desmume/src/windows/7z/CPP/7zip/Crypto/7zAes.h deleted file mode 100644 index 08da66649..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Crypto/7zAes.h +++ /dev/null @@ -1,117 +0,0 @@ -// 7zAes.h - -#ifndef __CRYPTO_7Z_AES_H -#define __CRYPTO_7Z_AES_H - -#include "Common/Buffer.h" -#include "Common/MyCom.h" -#include "Common/MyVector.h" - -#include "../ICoder.h" -#include "../IPassword.h" - -namespace NCrypto { -namespace NSevenZ { - -const int kKeySize = 32; - -class CKeyInfo -{ -public: - int NumCyclesPower; - UInt32 SaltSize; - Byte Salt[16]; - CByteBuffer Password; - Byte Key[kKeySize]; - - bool IsEqualTo(const CKeyInfo &a) const; - void CalculateDigest(); - - CKeyInfo() { Init(); } - void Init() - { - NumCyclesPower = 0; - SaltSize = 0; - for (int i = 0; i < sizeof(Salt); i++) - Salt[i] = 0; - } -}; - -class CKeyInfoCache -{ - int Size; - CObjectVector Keys; -public: - CKeyInfoCache(int size): Size(size) {} - bool Find(CKeyInfo &key); - // HRESULT Calculate(CKeyInfo &key); - void Add(CKeyInfo &key); -}; - -class CBase -{ - CKeyInfoCache _cachedKeys; -protected: - CKeyInfo _key; - Byte _iv[16]; - UInt32 _ivSize; - void CalculateDigest(); - CBase(); -}; - -class CBaseCoder: - public ICompressFilter, - public ICryptoSetPassword, - public CMyUnknownImp, - public CBase -{ -protected: - CMyComPtr _aesFilter; - - virtual HRESULT CreateFilter() = 0; - #ifndef CRYPTO_AES - HRESULT CreateFilterFromDLL(REFCLSID clsID); - #endif -public: - STDMETHOD(Init)(); - STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size); - - STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size); -}; - -#ifndef EXTRACT_ONLY - -class CEncoder: - public CBaseCoder, - public ICompressWriteCoderProperties, - // public ICryptoResetSalt, - public ICryptoResetInitVector -{ - virtual HRESULT CreateFilter(); -public: - MY_UNKNOWN_IMP3( - ICryptoSetPassword, - ICompressWriteCoderProperties, - // ICryptoResetSalt, - ICryptoResetInitVector) - STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream); - // STDMETHOD(ResetSalt)(); - STDMETHOD(ResetInitVector)(); -}; -#endif - -class CDecoder: - public CBaseCoder, - public ICompressSetDecoderProperties2 -{ - virtual HRESULT CreateFilter(); -public: - MY_UNKNOWN_IMP2( - ICryptoSetPassword, - ICompressSetDecoderProperties2) - STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size); -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Crypto/7zAesRegister.cpp b/desmume/src/windows/7z/CPP/7zip/Crypto/7zAesRegister.cpp deleted file mode 100644 index 87f8ae9c8..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Crypto/7zAesRegister.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// 7zAesRegister.cpp - -#include "StdAfx.h" - -#include "../Common/RegisterCodec.h" -#include "7zAes.h" - -static void *CreateCodec() { return (void *)(ICompressFilter *)(new NCrypto::NSevenZ::CDecoder()); } -#ifndef EXTRACT_ONLY -static void *CreateCodecOut() { return (void *)(ICompressFilter *)(new NCrypto::NSevenZ::CEncoder()); } -#else -#define CreateCodecOut 0 -#endif - -static CCodecInfo g_CodecInfo = - { CreateCodec, CreateCodecOut, 0x06F10701, L"7zAES", 1, true }; - -REGISTER_CODEC(7zAES) diff --git a/desmume/src/windows/7z/CPP/7zip/Crypto/HmacSha1.cpp b/desmume/src/windows/7z/CPP/7zip/Crypto/HmacSha1.cpp deleted file mode 100644 index 09621e958..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Crypto/HmacSha1.cpp +++ /dev/null @@ -1,109 +0,0 @@ -// HmacSha1.cpp - -#include "StdAfx.h" - -#include "HmacSha1.h" - -namespace NCrypto { -namespace NSha1 { - -void CHmac::SetKey(const Byte *key, size_t keySize) -{ - Byte keyTemp[kBlockSize]; - size_t i; - for (i = 0; i < kBlockSize; i++) - keyTemp[i] = 0; - if(keySize > kBlockSize) - { - _sha.Init(); - _sha.Update(key, keySize); - _sha.Final(keyTemp); - keySize = kDigestSize; - } - else - for (i = 0; i < keySize; i++) - keyTemp[i] = key[i]; - for (i = 0; i < kBlockSize; i++) - keyTemp[i] ^= 0x36; - _sha.Init(); - _sha.Update(keyTemp, kBlockSize); - for (i = 0; i < kBlockSize; i++) - keyTemp[i] ^= 0x36 ^ 0x5C; - _sha2.Init(); - _sha2.Update(keyTemp, kBlockSize); -} - -void CHmac::Final(Byte *mac, size_t macSize) -{ - Byte digest[kDigestSize]; - _sha.Final(digest); - _sha2.Update(digest, kDigestSize); - _sha2.Final(digest); - for(size_t i = 0; i < macSize; i++) - mac[i] = digest[i]; -} - - -void CHmac32::SetKey(const Byte *key, size_t keySize) -{ - UInt32 keyTemp[kBlockSizeInWords]; - size_t i; - for (i = 0; i < kBlockSizeInWords; i++) - keyTemp[i] = 0; - if(keySize > kBlockSize) - { - CContext sha; - sha.Init(); - sha.Update(key, keySize); - Byte digest[kDigestSize]; - sha.Final(digest); - - for (int i = 0 ; i < kDigestSizeInWords; i++) - keyTemp[i] = - ((UInt32)(digest[i * 4 + 0]) << 24) | - ((UInt32)(digest[i * 4 + 1]) << 16) | - ((UInt32)(digest[i * 4 + 2]) << 8) | - ((UInt32)(digest[i * 4 + 3])); - keySize = kDigestSizeInWords; - } - else - for (size_t i = 0; i < keySize; i++) - keyTemp[i / 4] |= (key[i] << (24 - 8 * (i & 3))); - for (i = 0; i < kBlockSizeInWords; i++) - keyTemp[i] ^= 0x36363636; - _sha.Init(); - _sha.Update(keyTemp, kBlockSizeInWords); - for (i = 0; i < kBlockSizeInWords; i++) - keyTemp[i] ^= 0x36363636 ^ 0x5C5C5C5C; - _sha2.Init(); - _sha2.Update(keyTemp, kBlockSizeInWords); -} - -void CHmac32::Final(UInt32 *mac, size_t macSize) -{ - UInt32 digest[kDigestSizeInWords]; - _sha.Final(digest); - _sha2.Update(digest, kDigestSizeInWords); - _sha2.Final(digest); - for(size_t i = 0; i < macSize; i++) - mac[i] = digest[i]; -} - -void CHmac32::GetLoopXorDigest(UInt32 *mac, UInt32 numIteration) -{ - UInt32 block[kBlockSizeInWords]; - UInt32 block2[kBlockSizeInWords]; - _sha.PrepareBlock(block, kDigestSizeInWords); - _sha2.PrepareBlock(block2, kDigestSizeInWords); - for(unsigned int s = 0; s < kDigestSizeInWords; s++) - block[s] = mac[s]; - for(UInt32 i = 0; i < numIteration; i++) - { - _sha.GetBlockDigest(block, block2); - _sha2.GetBlockDigest(block2, block); - for (unsigned int s = 0; s < kDigestSizeInWords; s++) - mac[s] ^= block[s]; - } -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Crypto/HmacSha1.h b/desmume/src/windows/7z/CPP/7zip/Crypto/HmacSha1.h deleted file mode 100644 index 2b12340ed..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Crypto/HmacSha1.h +++ /dev/null @@ -1,39 +0,0 @@ -// HmacSha1.h -// Implements HMAC-SHA-1 (RFC2104, FIPS-198) - -#ifndef __CRYPTO_HMAC_SHA1_H -#define __CRYPTO_HMAC_SHA1_H - -#include "Sha1.h" - -namespace NCrypto { -namespace NSha1 { - -// Use: SetKey(key, keySize); for () Update(data, size); Final(mac, macSize); - -class CHmac -{ - CContext _sha; - CContext _sha2; -public: - void SetKey(const Byte *key, size_t keySize); - void Update(const Byte *data, size_t dataSize) { _sha.Update(data, dataSize); } - void Final(Byte *mac, size_t macSize = kDigestSize); -}; - -class CHmac32 -{ - CContext32 _sha; - CContext32 _sha2; -public: - void SetKey(const Byte *key, size_t keySize); - void Update(const UInt32 *data, size_t dataSize) { _sha.Update(data, dataSize); } - void Final(UInt32 *mac, size_t macSize = kDigestSizeInWords); - - // It'sa for hmac function. in,out: mac[kDigestSizeInWords]. - void GetLoopXorDigest(UInt32 *mac, UInt32 numIteration); -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Crypto/MyAes.cpp b/desmume/src/windows/7z/CPP/7zip/Crypto/MyAes.cpp deleted file mode 100644 index 0f7b74b8d..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Crypto/MyAes.cpp +++ /dev/null @@ -1,57 +0,0 @@ -// Crypto/MyAes.cpp - -#include "StdAfx.h" - -#include "MyAes.h" - -namespace NCrypto { - -struct CAesTabInit { CAesTabInit() { AesGenTables();} } g_AesTabInit; - -STDMETHODIMP CAesCbcEncoder::Init() { return S_OK; } - -STDMETHODIMP_(UInt32) CAesCbcEncoder::Filter(Byte *data, UInt32 size) -{ - return (UInt32)AesCbc_Encode(&Aes, data, size); -} - -STDMETHODIMP CAesCbcEncoder::SetKey(const Byte *data, UInt32 size) -{ - if ((size & 0x7) != 0 || size < 16 || size > 32) - return E_INVALIDARG; - Aes_SetKeyEncode(&Aes.aes, data, size); - return S_OK; -} - -STDMETHODIMP CAesCbcEncoder::SetInitVector(const Byte *data, UInt32 size) -{ - if (size != AES_BLOCK_SIZE) - return E_INVALIDARG; - AesCbc_Init(&Aes, data); - return S_OK; -} - -STDMETHODIMP CAesCbcDecoder::Init() { return S_OK; } - -STDMETHODIMP_(UInt32) CAesCbcDecoder::Filter(Byte *data, UInt32 size) -{ - return (UInt32)AesCbc_Decode(&Aes, data, size); -} - -STDMETHODIMP CAesCbcDecoder::SetKey(const Byte *data, UInt32 size) -{ - if ((size & 0x7) != 0 || size < 16 || size > 32) - return E_INVALIDARG; - Aes_SetKeyDecode(&Aes.aes, data, size); - return S_OK; -} - -STDMETHODIMP CAesCbcDecoder::SetInitVector(const Byte *data, UInt32 size) -{ - if (size != AES_BLOCK_SIZE) - return E_INVALIDARG; - AesCbc_Init(&Aes, data); - return S_OK; -} - -} diff --git a/desmume/src/windows/7z/CPP/7zip/Crypto/MyAes.h b/desmume/src/windows/7z/CPP/7zip/Crypto/MyAes.h deleted file mode 100644 index bfa58cdba..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Crypto/MyAes.h +++ /dev/null @@ -1,48 +0,0 @@ -// Crypto/MyAes.h - -#ifndef __CRYPTO_MY_AES_H -#define __CRYPTO_MY_AES_H - -extern "C" -{ -#include "../../../C/Aes.h" -} - -#include "../../Common/MyCom.h" -#include "../../Common/Types.h" - -#include "../ICoder.h" - -namespace NCrypto { - -class CAesCbcEncoder: - public ICompressFilter, - public ICryptoProperties, - public CMyUnknownImp -{ - CAesCbc Aes; -public: - MY_UNKNOWN_IMP1(ICryptoProperties) - STDMETHOD(Init)(); - STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size); - STDMETHOD(SetKey)(const Byte *data, UInt32 size); - STDMETHOD(SetInitVector)(const Byte *data, UInt32 size); -}; - -class CAesCbcDecoder: - public ICompressFilter, - public ICryptoProperties, - public CMyUnknownImp -{ - CAesCbc Aes; -public: - MY_UNKNOWN_IMP1(ICryptoProperties) - STDMETHOD(Init)(); - STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size); - STDMETHOD(SetKey)(const Byte *data, UInt32 size); - STDMETHOD(SetInitVector)(const Byte *data, UInt32 size); -}; - -} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Crypto/Pbkdf2HmacSha1.cpp b/desmume/src/windows/7z/CPP/7zip/Crypto/Pbkdf2HmacSha1.cpp deleted file mode 100644 index 0ac6dc61b..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Crypto/Pbkdf2HmacSha1.cpp +++ /dev/null @@ -1,83 +0,0 @@ -// Pbkdf2HmacSha1.cpp - -#include "StdAfx.h" - -#include "HmacSha1.h" - -namespace NCrypto { -namespace NSha1 { - -void Pbkdf2Hmac(const Byte *pwd, size_t pwdSize, const Byte *salt, size_t saltSize, - UInt32 numIterations, Byte *key, size_t keySize) -{ - CHmac baseCtx; - baseCtx.SetKey(pwd, pwdSize); - for (UInt32 i = 1; keySize > 0; i++) - { - CHmac ctx = baseCtx; - ctx.Update(salt, saltSize); - Byte u[kDigestSize] = { (Byte)(i >> 24), (Byte)(i >> 16), (Byte)(i >> 8), (Byte)(i) }; - const unsigned int curSize = (keySize < kDigestSize) ? (unsigned int)keySize : kDigestSize; - ctx.Update(u, 4); - ctx.Final(u, kDigestSize); - - unsigned int s; - for (s = 0; s < curSize; s++) - key[s] = u[s]; - - for (UInt32 j = numIterations; j > 1; j--) - { - ctx = baseCtx; - ctx.Update(u, kDigestSize); - ctx.Final(u, kDigestSize); - for (s = 0; s < curSize; s++) - key[s] ^= u[s]; - } - - key += curSize; - keySize -= curSize; - } -} - -void Pbkdf2Hmac32(const Byte *pwd, size_t pwdSize, const UInt32 *salt, size_t saltSize, - UInt32 numIterations, UInt32 *key, size_t keySize) -{ - CHmac32 baseCtx; - baseCtx.SetKey(pwd, pwdSize); - for (UInt32 i = 1; keySize > 0; i++) - { - CHmac32 ctx = baseCtx; - ctx.Update(salt, saltSize); - UInt32 u[kDigestSizeInWords] = { i }; - const unsigned int curSize = (keySize < kDigestSizeInWords) ? (unsigned int)keySize : kDigestSizeInWords; - ctx.Update(u, 1); - ctx.Final(u, kDigestSizeInWords); - - // Speed-optimized code start - ctx = baseCtx; - ctx.GetLoopXorDigest(u, numIterations - 1); - // Speed-optimized code end - - unsigned int s; - for (s = 0; s < curSize; s++) - key[s] = u[s]; - - /* - // Default code start - for (UInt32 j = numIterations; j > 1; j--) - { - ctx = baseCtx; - ctx.Update(u, kDigestSizeInWords); - ctx.Final(u, kDigestSizeInWords); - for (s = 0; s < curSize; s++) - key[s] ^= u[s]; - } - // Default code end - */ - - key += curSize; - keySize -= curSize; - } -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Crypto/Pbkdf2HmacSha1.h b/desmume/src/windows/7z/CPP/7zip/Crypto/Pbkdf2HmacSha1.h deleted file mode 100644 index ea5d99f18..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Crypto/Pbkdf2HmacSha1.h +++ /dev/null @@ -1,21 +0,0 @@ -// Pbkdf2HmacSha1.h -// Password-Based Key Derivation Function (RFC 2898, PKCS #5) based on HMAC-SHA-1 - -#ifndef __CRYPTO_PBKDF2_HMAC_SHA1_H -#define __CRYPTO_PBKDF2_HMAC_SHA1_H - -#include -#include "../../Common/Types.h" - -namespace NCrypto { -namespace NSha1 { - -void Pbkdf2Hmac(const Byte *pwd, size_t pwdSize, const Byte *salt, size_t saltSize, - UInt32 numIterations, Byte *key, size_t keySize); - -void Pbkdf2Hmac32(const Byte *pwd, size_t pwdSize, const UInt32 *salt, size_t saltSize, - UInt32 numIterations, UInt32 *key, size_t keySize); - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Crypto/RandGen.cpp b/desmume/src/windows/7z/CPP/7zip/Crypto/RandGen.cpp deleted file mode 100644 index 66b323168..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Crypto/RandGen.cpp +++ /dev/null @@ -1,107 +0,0 @@ -// RandGen.cpp - -#include "StdAfx.h" - -#include -#include "Windows/Synchronization.h" -#include "RandGen.h" - -#ifndef _WIN32 -#include -#define USE_POSIX_TIME -#define USE_POSIX_TIME2 -#endif - -#ifdef USE_POSIX_TIME -#include -#ifdef USE_POSIX_TIME2 -#include -#endif -#endif - -// This is not very good random number generator. -// Please use it only for salt. -// First generated data block depends from timer and processID. -// Other generated data blocks depend from previous state -// Maybe it's possible to restore original timer value from generated value. - -void CRandomGenerator::Init() -{ - NCrypto::NSha1::CContext hash; - hash.Init(); - - #ifdef _WIN32 - DWORD w = ::GetCurrentProcessId(); - hash.Update((const Byte *)&w, sizeof(w)); - w = ::GetCurrentThreadId(); - hash.Update((const Byte *)&w, sizeof(w)); - #else - pid_t pid = getpid(); - hash.Update((const Byte *)&pid, sizeof(pid)); - pid = getppid(); - hash.Update((const Byte *)&pid, sizeof(pid)); - #endif - - for (int i = 0; i < 1000; i++) - { - #ifdef _WIN32 - LARGE_INTEGER v; - if (::QueryPerformanceCounter(&v)) - hash.Update((const Byte *)&v.QuadPart, sizeof(v.QuadPart)); - #endif - - #ifdef USE_POSIX_TIME - #ifdef USE_POSIX_TIME2 - timeval v; - if (gettimeofday(&v, 0) == 0) - { - hash.Update((const Byte *)&v.tv_sec, sizeof(v.tv_sec)); - hash.Update((const Byte *)&v.tv_usec, sizeof(v.tv_usec)); - } - #endif - time_t v2 = time(NULL); - hash.Update((const Byte *)&v2, sizeof(v2)); - #endif - - DWORD tickCount = ::GetTickCount(); - hash.Update((const Byte *)&tickCount, sizeof(tickCount)); - - for (int j = 0; j < 100; j++) - { - hash.Final(_buff); - hash.Init(); - hash.Update(_buff, NCrypto::NSha1::kDigestSize); - } - } - hash.Final(_buff); - _needInit = false; -} - -static NWindows::NSynchronization::CCriticalSection g_CriticalSection; - -void CRandomGenerator::Generate(Byte *data, unsigned int size) -{ - g_CriticalSection.Enter(); - if (_needInit) - Init(); - while (size > 0) - { - NCrypto::NSha1::CContext hash; - - hash.Init(); - hash.Update(_buff, NCrypto::NSha1::kDigestSize); - hash.Final(_buff); - - hash.Init(); - UInt32 salt = 0xF672ABD1; - hash.Update((const Byte *)&salt, sizeof(salt)); - hash.Update(_buff, NCrypto::NSha1::kDigestSize); - Byte buff[NCrypto::NSha1::kDigestSize]; - hash.Final(buff); - for (unsigned int i = 0; i < NCrypto::NSha1::kDigestSize && size > 0; i++, size--) - *data++ = buff[i]; - } - g_CriticalSection.Leave(); -} - -CRandomGenerator g_RandomGenerator; diff --git a/desmume/src/windows/7z/CPP/7zip/Crypto/RandGen.h b/desmume/src/windows/7z/CPP/7zip/Crypto/RandGen.h deleted file mode 100644 index a457897a9..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Crypto/RandGen.h +++ /dev/null @@ -1,21 +0,0 @@ -// RandGen.h - -#ifndef __CRYPTO_RAND_GEN_H -#define __CRYPTO_RAND_GEN_H - -#include "Sha1.h" - -class CRandomGenerator -{ - Byte _buff[NCrypto::NSha1::kDigestSize]; - bool _needInit; - - void Init(); -public: - CRandomGenerator(): _needInit(true) {}; - void Generate(Byte *data, unsigned size); -}; - -extern CRandomGenerator g_RandomGenerator; - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Crypto/Rar20Crypto.cpp b/desmume/src/windows/7z/CPP/7zip/Crypto/Rar20Crypto.cpp deleted file mode 100644 index bf5eb9894..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Crypto/Rar20Crypto.cpp +++ /dev/null @@ -1,136 +0,0 @@ -// Crypto/Rar20Crypto.cpp - -#include "StdAfx.h" - -extern "C" -{ - #include "../../../C/7zCrc.h" - #include "../../../C/CpuArch.h" - #include "../../../C/RotateDefs.h" -} - -#include "Rar20Crypto.h" - -namespace NCrypto { -namespace NRar20 { - -static const int kNumRounds = 32; - -static const Byte InitSubstTable[256] = { - 215, 19,149, 35, 73,197,192,205,249, 28, 16,119, 48,221, 2, 42, - 232, 1,177,233, 14, 88,219, 25,223,195,244, 90, 87,239,153,137, - 255,199,147, 70, 92, 66,246, 13,216, 40, 62, 29,217,230, 86, 6, - 71, 24,171,196,101,113,218,123, 93, 91,163,178,202, 67, 44,235, - 107,250, 75,234, 49,167,125,211, 83,114,157,144, 32,193,143, 36, - 158,124,247,187, 89,214,141, 47,121,228, 61,130,213,194,174,251, - 97,110, 54,229,115, 57,152, 94,105,243,212, 55,209,245, 63, 11, - 164,200, 31,156, 81,176,227, 21, 76, 99,139,188,127, 17,248, 51, - 207,120,189,210, 8,226, 41, 72,183,203,135,165,166, 60, 98, 7, - 122, 38,155,170, 69,172,252,238, 39,134, 59,128,236, 27,240, 80, - 131, 3, 85,206,145, 79,154,142,159,220,201,133, 74, 64, 20,129, - 224,185,138,103,173,182, 43, 34,254, 82,198,151,231,180, 58, 10, - 118, 26,102, 12, 50,132, 22,191,136,111,162,179, 45, 4,148,108, - 161, 56, 78,126,242,222, 15,175,146, 23, 33,241,181,190, 77,225, - 0, 46,169,186, 68, 95,237, 65, 53,208,253,168, 9, 18,100, 52, - 116,184,160, 96,109, 37, 30,106,140,104,150, 5,204,117,112, 84 -}; - -void CData::UpdateKeys(const Byte *data) -{ - for (int i = 0; i < 16; i += 4) - for (int j = 0; j < 4; j++) - Keys[j] ^= g_CrcTable[data[i + j]]; -} - -static void Swap(Byte *b1, Byte *b2) -{ - Byte b = *b1; - *b1 = *b2; - *b2 = b; -} - -void CData::SetPassword(const Byte *password, UInt32 passwordLen) -{ - Keys[0] = 0xD3A3B879L; - Keys[1] = 0x3F6D12F7L; - Keys[2] = 0x7515A235L; - Keys[3] = 0xA4E7F123L; - - Byte psw[256]; - memset(psw, 0, sizeof(psw)); - memcpy(psw, password, passwordLen); - memcpy(SubstTable, InitSubstTable, sizeof(SubstTable)); - - for (UInt32 j = 0; j < 256; j++) - for (UInt32 i = 0; i < passwordLen; i += 2) - { - UInt32 n2 = (Byte)g_CrcTable[(psw[i + 1] + j) & 0xFF]; - UInt32 n1 = (Byte)g_CrcTable[(psw[i] - j) & 0xFF]; - for (UInt32 k = 1; (n1 & 0xFF) != n2; n1++, k++) - Swap(&SubstTable[n1 & 0xFF], &SubstTable[(n1 + i + k) & 0xFF]); - } - for (UInt32 i = 0; i < passwordLen; i+= 16) - EncryptBlock(&psw[i]); -} - -void CData::CryptBlock(Byte *buf, bool encrypt) -{ - Byte inBuf[16]; - UInt32 A, B, C, D, T, TA, TB; - - A = GetUi32(buf + 0) ^ Keys[0]; - B = GetUi32(buf + 4) ^ Keys[1]; - C = GetUi32(buf + 8) ^ Keys[2]; - D = GetUi32(buf + 12) ^ Keys[3]; - - if (!encrypt) - memcpy(inBuf, buf, sizeof(inBuf)); - - for (int i = 0; i < kNumRounds; i++) - { - UInt32 key = Keys[(encrypt ? i : (kNumRounds - 1 - i)) & 3]; - T = ((C + rotlFixed(D, 11)) ^ key); - TA = A ^ SubstLong(T); - T = ((D ^ rotlFixed(C, 17)) + key); - TB = B ^ SubstLong(T); - A = C; - B = D; - C = TA; - D = TB; - } - - SetUi32(buf + 0, C ^ Keys[0]); - SetUi32(buf + 4, D ^ Keys[1]); - SetUi32(buf + 8, A ^ Keys[2]); - SetUi32(buf + 12, B ^ Keys[3]); - - UpdateKeys(encrypt ? buf : inBuf); -} - -STDMETHODIMP CDecoder::CryptoSetPassword(const Byte *data, UInt32 size) -{ - _cipher.SetPassword(data, size); - return S_OK; -} - -STDMETHODIMP CDecoder::Init() -{ - return S_OK; -} - -static const UInt32 kBlockSize = 16; - -STDMETHODIMP_(UInt32) CDecoder::Filter(Byte *data, UInt32 size) -{ - if (size == 0) - return 0; - if (size < kBlockSize) - return kBlockSize; - UInt32 i; - size -= kBlockSize; - for (i = 0; i <= size; i += kBlockSize) - _cipher.DecryptBlock(data + i); - return i; -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Crypto/Rar20Crypto.h b/desmume/src/windows/7z/CPP/7zip/Crypto/Rar20Crypto.h deleted file mode 100644 index 36f5590d1..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Crypto/Rar20Crypto.h +++ /dev/null @@ -1,50 +0,0 @@ -// Crypto/Rar20Crypto.h - -#ifndef __CRYPTO_RAR20_CRYPTO_H -#define __CRYPTO_RAR20_CRYPTO_H - -#include "Common/MyCom.h" - -#include "../ICoder.h" -#include "../IPassword.h" - -namespace NCrypto { -namespace NRar20 { - -class CData -{ - Byte SubstTable[256]; - UInt32 Keys[4]; - - UInt32 SubstLong(UInt32 t) - { - return (UInt32)SubstTable[(int)t & 255] | - ((UInt32)SubstTable[(int)(t >> 8) & 255] << 8) | - ((UInt32)SubstTable[(int)(t >> 16) & 255] << 16) | - ((UInt32)SubstTable[(int)(t >> 24) & 255] << 24); - } - void UpdateKeys(const Byte *data); - void CryptBlock(Byte *buf, bool encrypt); -public: - void EncryptBlock(Byte *buf) { CryptBlock(buf, true); } - void DecryptBlock(Byte *buf) { CryptBlock(buf, false); } - void SetPassword(const Byte *password, UInt32 passwordLen); -}; - -class CDecoder: - public ICompressFilter, - public ICryptoSetPassword, - public CMyUnknownImp -{ - CData _cipher; -public: - MY_UNKNOWN_IMP1(ICryptoSetPassword) - - STDMETHOD(Init)(); - STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size); - STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size); -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Crypto/RarAes.cpp b/desmume/src/windows/7z/CPP/7zip/Crypto/RarAes.cpp deleted file mode 100644 index be3cefcc4..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Crypto/RarAes.cpp +++ /dev/null @@ -1,139 +0,0 @@ -// Crypto/RarAes.cpp -// Note: you must include MyAes.cpp to project to initialize AES tables - -#include "StdAfx.h" - -#include "RarAes.h" -#include "Sha1.h" - -namespace NCrypto { -namespace NRar29 { - -CDecoder::CDecoder(): - _thereIsSalt(false), - _needCalculate(true), - _rar350Mode(false) -{ - for (int i = 0; i < sizeof(_salt); i++) - _salt[i] = 0; -} - -STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size) -{ - bool thereIsSaltPrev = _thereIsSalt; - _thereIsSalt = false; - if (size == 0) - return S_OK; - if (size < 8) - return E_INVALIDARG; - _thereIsSalt = true; - bool same = false; - if (_thereIsSalt == thereIsSaltPrev) - { - same = true; - if (_thereIsSalt) - { - for (int i = 0; i < sizeof(_salt); i++) - if (_salt[i] != data[i]) - { - same = false; - break; - } - } - } - for (int i = 0; i < sizeof(_salt); i++) - _salt[i] = data[i]; - if (!_needCalculate && !same) - _needCalculate = true; - return S_OK; -} - -static const int kMaxPasswordLength = 127 * 2; - -STDMETHODIMP CDecoder::CryptoSetPassword(const Byte *data, UInt32 size) -{ - if (size > kMaxPasswordLength) - size = kMaxPasswordLength; - bool same = false; - if (size == buffer.GetCapacity()) - { - same = true; - for (UInt32 i = 0; i < size; i++) - if (data[i] != buffer[i]) - { - same = false; - break; - } - } - if (!_needCalculate && !same) - _needCalculate = true; - buffer.SetCapacity(size); - memcpy(buffer, data, size); - return S_OK; -} - -STDMETHODIMP CDecoder::Init() -{ - Calculate(); - Aes_SetKeyDecode(&Aes.aes, aesKey, kRarAesKeySize); - AesCbc_Init(&Aes, aesInit); - return S_OK; -} - -STDMETHODIMP_(UInt32) CDecoder::Filter(Byte *data, UInt32 size) -{ - return (UInt32)AesCbc_Decode(&Aes, data, size); -} - -void CDecoder::Calculate() -{ - if (_needCalculate) - { - const int kSaltSize = 8; - - Byte rawPassword[kMaxPasswordLength + kSaltSize]; - - memcpy(rawPassword, buffer, buffer.GetCapacity()); - - size_t rawLength = buffer.GetCapacity(); - - if (_thereIsSalt) - { - memcpy(rawPassword + rawLength, _salt, kSaltSize); - rawLength += kSaltSize; - } - - NSha1::CContext sha; - sha.Init(); - - // seems rar reverts hash for sha. - const int hashRounds = 0x40000; - int i; - for (i = 0; i < hashRounds; i++) - { - sha.Update(rawPassword, rawLength, _rar350Mode); - Byte pswNum[3] = { (Byte)i, (Byte)(i >> 8), (Byte)(i >> 16) }; - sha.Update(pswNum, 3, _rar350Mode); - if (i % (hashRounds / 16) == 0) - { - NSha1::CContext shaTemp = sha; - Byte digest[NSha1::kDigestSize]; - shaTemp.Final(digest); - aesInit[i / (hashRounds / 16)] = (Byte)digest[4 * 4 + 3]; - } - } - /* - // it's test message for sha - const char *message = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"; - sha.Update((const Byte *)message, strlen(message)); - */ - Byte digest[20]; - sha.Final(digest); - for (i = 0; i < 4; i++) - for (int j = 0; j < 4; j++) - aesKey[i * 4 + j] = (digest[i * 4 + 3 - j]); - } - _needCalculate = false; -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Crypto/RarAes.h b/desmume/src/windows/7z/CPP/7zip/Crypto/RarAes.h deleted file mode 100644 index d21d12a55..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Crypto/RarAes.h +++ /dev/null @@ -1,62 +0,0 @@ -// Crypto/RarAes.h - -#ifndef __CRYPTO_RAR_AES_H -#define __CRYPTO_RAR_AES_H - -extern "C" -{ -#include "../../../C/Aes.h" -} - -#include "Common/Buffer.h" -#include "Common/MyCom.h" - -#include "../ICoder.h" -#include "../IPassword.h" - -namespace NCrypto { -namespace NRar29 { - -const UInt32 kRarAesKeySize = 16; - -class CDecoder: - public ICompressFilter, - public ICompressSetDecoderProperties2, - public ICryptoSetPassword, - public CMyUnknownImp -{ - Byte _salt[8]; - bool _thereIsSalt; - CByteBuffer buffer; - Byte aesKey[kRarAesKeySize]; - Byte aesInit[AES_BLOCK_SIZE]; - bool _needCalculate; - - CAesCbc Aes; - - bool _rar350Mode; - - void Calculate(); - -public: - - MY_UNKNOWN_IMP2( - ICryptoSetPassword, - ICompressSetDecoderProperties2) - - STDMETHOD(Init)(); - - STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size); - - STDMETHOD(CryptoSetPassword)(const Byte *aData, UInt32 aSize); - - // ICompressSetDecoderProperties - STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size); - - CDecoder(); - void SetRar350Mode(bool rar350Mode) { _rar350Mode = rar350Mode; } -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Crypto/Sha1.cpp b/desmume/src/windows/7z/CPP/7zip/Crypto/Sha1.cpp deleted file mode 100644 index 08bb57c94..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Crypto/Sha1.cpp +++ /dev/null @@ -1,213 +0,0 @@ -// Crypto/Sha1.cpp -// This file is based on public domain -// Steve Reid and Wei Dai's code from Crypto++ - -#include "StdAfx.h" - -#include "Sha1.h" -extern "C" -{ -#include "../../../C/RotateDefs.h" -} - -namespace NCrypto { -namespace NSha1 { - -// define it for speed optimization -// #define _SHA1_UNROLL - -static const unsigned kNumW = - #ifdef _SHA1_UNROLL - 16; - #else - 80; - #endif - - -#define w0(i) (W[(i)] = data[(i)]) - -#ifdef _SHA1_UNROLL -#define w1(i) (W[(i)&15] = rotlFixed(W[((i)-3)&15] ^ W[((i)-8)&15] ^ W[((i)-14)&15] ^ W[((i)-16)&15], 1)) -#else -#define w1(i) (W[(i)] = rotlFixed(W[(i)-3] ^ W[(i)-8] ^ W[(i)-14] ^ W[(i)-16], 1)) -#endif - -#define f1(x,y,z) (z^(x&(y^z))) -#define f2(x,y,z) (x^y^z) -#define f3(x,y,z) ((x&y)|(z&(x|y))) -#define f4(x,y,z) (x^y^z) - -#define RK1(a,b,c,d,e,i, f, w, k) e += f(b,c,d) + w(i) + k + rotlFixed(a,5); b = rotlFixed(b,30); - -#define R0(a,b,c,d,e,i) RK1(a,b,c,d,e,i, f1, w0, 0x5A827999) -#define R1(a,b,c,d,e,i) RK1(a,b,c,d,e,i, f1, w1, 0x5A827999) -#define R2(a,b,c,d,e,i) RK1(a,b,c,d,e,i, f2, w1, 0x6ED9EBA1) -#define R3(a,b,c,d,e,i) RK1(a,b,c,d,e,i, f3, w1, 0x8F1BBCDC) -#define R4(a,b,c,d,e,i) RK1(a,b,c,d,e,i, f4, w1, 0xCA62C1D6) - -#define RX_1_4(rx1, rx4, i) rx1(a,b,c,d,e,i); rx4(e,a,b,c,d,i+1); rx4(d,e,a,b,c,i+2); rx4(c,d,e,a,b,i+3); rx4(b,c,d,e,a,i+4); -#define RX_5(rx, i) RX_1_4(rx, rx, i); - -void CContextBase::Init() -{ - _state[0] = 0x67452301; - _state[1] = 0xEFCDAB89; - _state[2] = 0x98BADCFE; - _state[3] = 0x10325476; - _state[4] = 0xC3D2E1F0; - _count = 0; -} - -void CContextBase::GetBlockDigest(UInt32 *data, UInt32 *destDigest, bool returnRes) -{ - UInt32 a, b, c, d, e; - UInt32 W[kNumW]; - - a = _state[0]; - b = _state[1]; - c = _state[2]; - d = _state[3]; - e = _state[4]; - #ifdef _SHA1_UNROLL - RX_5(R0, 0); RX_5(R0, 5); RX_5(R0, 10); - #else - int i; - for (i = 0; i < 15; i += 5) { RX_5(R0, i); } - #endif - - RX_1_4(R0, R1, 15); - - - #ifdef _SHA1_UNROLL - RX_5(R2, 20); RX_5(R2, 25); RX_5(R2, 30); RX_5(R2, 35); - RX_5(R3, 40); RX_5(R3, 45); RX_5(R3, 50); RX_5(R3, 55); - RX_5(R4, 60); RX_5(R4, 65); RX_5(R4, 70); RX_5(R4, 75); - #else - i = 20; - for (; i < 40; i += 5) { RX_5(R2, i); } - for (; i < 60; i += 5) { RX_5(R3, i); } - for (; i < 80; i += 5) { RX_5(R4, i); } - #endif - - destDigest[0] = _state[0] + a; - destDigest[1] = _state[1] + b; - destDigest[2] = _state[2] + c; - destDigest[3] = _state[3] + d; - destDigest[4] = _state[4] + e; - - if (returnRes) - for (int i = 0 ; i < 16; i++) - data[i] = W[kNumW - 16 + i]; - - // Wipe variables - // a = b = c = d = e = 0; -} - -void CContextBase::PrepareBlock(UInt32 *block, unsigned size) const -{ - unsigned curBufferPos = size & 0xF; - block[curBufferPos++] = 0x80000000; - while (curBufferPos != (16 - 2)) - block[curBufferPos++] = 0; - const UInt64 lenInBits = (_count << 9) + ((UInt64)size << 5); - block[curBufferPos++] = (UInt32)(lenInBits >> 32); - block[curBufferPos++] = (UInt32)(lenInBits); -} - -void CContext::Update(Byte *data, size_t size, bool rar350Mode) -{ - bool returnRes = false; - unsigned curBufferPos = _count2; - while (size-- > 0) - { - int pos = (int)(curBufferPos & 3); - if (pos == 0) - _buffer[curBufferPos >> 2] = 0; - _buffer[curBufferPos >> 2] |= ((UInt32)*data++) << (8 * (3 - pos)); - if (++curBufferPos == kBlockSize) - { - curBufferPos = 0; - CContextBase::UpdateBlock(_buffer, returnRes); - if (returnRes) - for (int i = 0; i < kBlockSizeInWords; i++) - { - UInt32 d = _buffer[i]; - data[i * 4 + 0 - kBlockSize] = (Byte)(d); - data[i * 4 + 1 - kBlockSize] = (Byte)(d >> 8); - data[i * 4 + 2 - kBlockSize] = (Byte)(d >> 16); - data[i * 4 + 3 - kBlockSize] = (Byte)(d >> 24); - } - returnRes = rar350Mode; - } - } - _count2 = curBufferPos; -} - -void CContext::Final(Byte *digest) -{ - const UInt64 lenInBits = (_count << 9) + ((UInt64)_count2 << 3); - unsigned curBufferPos = _count2; - int pos = (int)(curBufferPos & 3); - curBufferPos >>= 2; - if (pos == 0) - _buffer[curBufferPos] = 0; - _buffer[curBufferPos++] |= ((UInt32)0x80) << (8 * (3 - pos)); - - while (curBufferPos != (16 - 2)) - { - curBufferPos &= 0xF; - if (curBufferPos == 0) - UpdateBlock(); - _buffer[curBufferPos++] = 0; - } - _buffer[curBufferPos++] = (UInt32)(lenInBits >> 32); - _buffer[curBufferPos++] = (UInt32)(lenInBits); - UpdateBlock(); - - int i; - for (i = 0; i < kDigestSizeInWords; i++) - { - UInt32 state = _state[i] & 0xFFFFFFFF; - *digest++ = (Byte)(state >> 24); - *digest++ = (Byte)(state >> 16); - *digest++ = (Byte)(state >> 8); - *digest++ = (Byte)(state); - } - Init(); -} - -/////////////////////////// -// Words version - -void CContext32::Update(const UInt32 *data, size_t size) -{ - while (size-- > 0) - { - _buffer[_count2++] = *data++; - if (_count2 == kBlockSizeInWords) - { - _count2 = 0; - UpdateBlock(); - } - } -} - -void CContext32::Final(UInt32 *digest) -{ - const UInt64 lenInBits = (_count << 9) + ((UInt64)_count2 << 5); - unsigned curBufferPos = _count2; - _buffer[curBufferPos++] = 0x80000000; - while (curBufferPos != (16 - 2)) - { - curBufferPos &= 0xF; - if (curBufferPos == 0) - UpdateBlock(); - _buffer[curBufferPos++] = 0; - } - _buffer[curBufferPos++] = (UInt32)(lenInBits >> 32); - _buffer[curBufferPos++] = (UInt32)(lenInBits); - GetBlockDigest(_buffer, digest); - Init(); -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Crypto/Sha1.h b/desmume/src/windows/7z/CPP/7zip/Crypto/Sha1.h deleted file mode 100644 index 06ae27024..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Crypto/Sha1.h +++ /dev/null @@ -1,68 +0,0 @@ -// Crypto/Sha1.h -// This file is based on public domain -// Steve Reid and Wei Dai's code from Crypto++ - -#ifndef __CRYPTO_SHA1_H -#define __CRYPTO_SHA1_H - -#include -#include "../../Common/Types.h" - -// Sha1 implementation in RAR before version 3.60 has bug: -// it changes data bytes in some cases. -// So this class supports both versions: normal_SHA and rar3Mode - -namespace NCrypto { -namespace NSha1 { - -const unsigned kBlockSize = 64; -const unsigned kDigestSize = 20; - -const unsigned kBlockSizeInWords = (kBlockSize >> 2); -const unsigned kDigestSizeInWords = (kDigestSize >> 2); - -class CContextBase -{ -protected: - UInt32 _state[5]; - UInt64 _count; - void UpdateBlock(UInt32 *data, bool returnRes = false) - { - GetBlockDigest(data, _state, returnRes); - _count++; - } -public: - void Init(); - void GetBlockDigest(UInt32 *blockData, UInt32 *destDigest, bool returnRes = false); - // PrepareBlock can be used only when size <= 13. size in Words - void PrepareBlock(UInt32 *block, unsigned int size) const; -}; - -class CContextBase2: public CContextBase -{ -protected: - unsigned _count2; - UInt32 _buffer[kBlockSizeInWords]; - void UpdateBlock() { CContextBase::UpdateBlock(_buffer); } -public: - void Init() { CContextBase::Init(); _count2 = 0; } -}; - -class CContext: public CContextBase2 -{ -public: - void Update(Byte *data, size_t size, bool rar350Mode = false); - void Update(const Byte *data, size_t size) { Update((Byte *)data, size, false); } - void Final(Byte *digest); -}; - -class CContext32: public CContextBase2 -{ -public: - void Update(const UInt32 *data, size_t size); - void Final(UInt32 *digest); -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Crypto/StdAfx.h b/desmume/src/windows/7z/CPP/7zip/Crypto/StdAfx.h deleted file mode 100644 index c28ffcea7..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Crypto/StdAfx.h +++ /dev/null @@ -1,8 +0,0 @@ -// StdAfx.h - -#ifndef __STDAFX_H -#define __STDAFX_H - -#include "../../Common/MyWindows.h" - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Crypto/WzAes.cpp b/desmume/src/windows/7z/CPP/7zip/Crypto/WzAes.cpp deleted file mode 100644 index b8f003034..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Crypto/WzAes.cpp +++ /dev/null @@ -1,209 +0,0 @@ -// Crypto/WzAes.cpp -/* -This code implements Brian Gladman's scheme -specified in password Based File Encryption Utility. - -Note: you must include MyAes.cpp to project to initialize AES tables -*/ - -#include "StdAfx.h" - -#include "../Common/StreamObjects.h" -#include "../Common/StreamUtils.h" - -#include "Pbkdf2HmacSha1.h" -#include "RandGen.h" -#include "WzAes.h" - -// define it if you don't want to use speed-optimized version of Pbkdf2HmacSha1 -// #define _NO_WZAES_OPTIMIZATIONS - -namespace NCrypto { -namespace NWzAes { - -const unsigned int kAesKeySizeMax = 32; - -static const UInt32 kNumKeyGenIterations = 1000; - -STDMETHODIMP CBaseCoder::CryptoSetPassword(const Byte *data, UInt32 size) -{ - if(size > kPasswordSizeMax) - return E_INVALIDARG; - _key.Password.SetCapacity(size); - memcpy(_key.Password, data, size); - return S_OK; -} - -#define SetUi32(p, d) { UInt32 x = (d); (p)[0] = (Byte)x; (p)[1] = (Byte)(x >> 8); \ - (p)[2] = (Byte)(x >> 16); (p)[3] = (Byte)(x >> 24); } - -void CBaseCoder::EncryptData(Byte *data, UInt32 size) -{ - unsigned int pos = _blockPos; - for (; size > 0; size--) - { - if (pos == AES_BLOCK_SIZE) - { - if (++_counter[0] == 0) - _counter[1]++; - UInt32 temp[4]; - Aes_Encode32(&Aes, temp, _counter); - SetUi32(_buffer, temp[0]); - SetUi32(_buffer + 4, temp[1]); - SetUi32(_buffer + 8, temp[2]); - SetUi32(_buffer + 12, temp[3]); - pos = 0; - } - *data++ ^= _buffer[pos++]; - } - _blockPos = pos; -} - -#ifndef _NO_WZAES_OPTIMIZATIONS - -static void BytesToBeUInt32s(const Byte *src, UInt32 *dest, int destSize) -{ - for (int i = 0 ; i < destSize; i++) - dest[i] = - ((UInt32)(src[i * 4 + 0]) << 24) | - ((UInt32)(src[i * 4 + 1]) << 16) | - ((UInt32)(src[i * 4 + 2]) << 8) | - ((UInt32)(src[i * 4 + 3])); -} - -#endif - -STDMETHODIMP CBaseCoder::Init() -{ - UInt32 keySize = _key.GetKeySize(); - UInt32 keysTotalSize = 2 * keySize + kPwdVerifCodeSize; - Byte buf[2 * kAesKeySizeMax + kPwdVerifCodeSize]; - - // for (int ii = 0; ii < 1000; ii++) - { - #ifdef _NO_WZAES_OPTIMIZATIONS - - NSha1::Pbkdf2Hmac( - _key.Password, _key.Password.GetCapacity(), - _key.Salt, _key.GetSaltSize(), - kNumKeyGenIterations, - buf, keysTotalSize); - - #else - - UInt32 buf32[(2 * kAesKeySizeMax + kPwdVerifCodeSize + 3) / 4]; - UInt32 key32SizeTotal = (keysTotalSize + 3) / 4; - UInt32 salt[kSaltSizeMax * 4]; - UInt32 saltSizeInWords = _key.GetSaltSize() / 4; - BytesToBeUInt32s(_key.Salt, salt, saltSizeInWords); - NSha1::Pbkdf2Hmac32( - _key.Password, _key.Password.GetCapacity(), - salt, saltSizeInWords, - kNumKeyGenIterations, - buf32, key32SizeTotal); - for (UInt32 j = 0; j < keysTotalSize; j++) - buf[j] = (Byte)(buf32[j / 4] >> (24 - 8 * (j & 3))); - - #endif - } - - _hmac.SetKey(buf + keySize, keySize); - memcpy(_key.PwdVerifComputed, buf + 2 * keySize, kPwdVerifCodeSize); - - _blockPos = AES_BLOCK_SIZE; - for (int i = 0; i < 4; i++) - _counter[i] = 0; - - Aes_SetKeyEncode(&Aes, buf, keySize); - return S_OK; -} - -/* -STDMETHODIMP CEncoder::WriteCoderProperties(ISequentialOutStream *outStream) -{ - Byte keySizeMode = 3; - return outStream->Write(&keySizeMode, 1, NULL); -} -*/ - -HRESULT CEncoder::WriteHeader(ISequentialOutStream *outStream) -{ - UInt32 saltSize = _key.GetSaltSize(); - g_RandomGenerator.Generate(_key.Salt, saltSize); - Init(); - RINOK(WriteStream(outStream, _key.Salt, saltSize)); - return WriteStream(outStream, _key.PwdVerifComputed, kPwdVerifCodeSize); -} - -HRESULT CEncoder::WriteFooter(ISequentialOutStream *outStream) -{ - Byte mac[kMacSize]; - _hmac.Final(mac, kMacSize); - return WriteStream(outStream, mac, kMacSize); -} - -STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size) -{ - if (size != 1) - return E_INVALIDARG; - _key.Init(); - Byte keySizeMode = data[0]; - if (keySizeMode < 1 || keySizeMode > 3) - return E_INVALIDARG; - _key.KeySizeMode = keySizeMode; - return S_OK; -} - -HRESULT CDecoder::ReadHeader(ISequentialInStream *inStream) -{ - UInt32 saltSize = _key.GetSaltSize(); - UInt32 extraSize = saltSize + kPwdVerifCodeSize; - Byte temp[kSaltSizeMax + kPwdVerifCodeSize]; - RINOK(ReadStream_FAIL(inStream, temp, extraSize)); - UInt32 i; - for (i = 0; i < saltSize; i++) - _key.Salt[i] = temp[i]; - for (i = 0; i < kPwdVerifCodeSize; i++) - _pwdVerifFromArchive[i] = temp[saltSize + i]; - return S_OK; -} - -static bool CompareArrays(const Byte *p1, const Byte *p2, UInt32 size) -{ - for (UInt32 i = 0; i < size; i++) - if (p1[i] != p2[i]) - return false; - return true; -} - -bool CDecoder::CheckPasswordVerifyCode() -{ - return CompareArrays(_key.PwdVerifComputed, _pwdVerifFromArchive, kPwdVerifCodeSize); -} - -HRESULT CDecoder::CheckMac(ISequentialInStream *inStream, bool &isOK) -{ - isOK = false; - Byte mac1[kMacSize]; - RINOK(ReadStream_FAIL(inStream, mac1, kMacSize)); - Byte mac2[kMacSize]; - _hmac.Final(mac2, kMacSize); - isOK = CompareArrays(mac1, mac2, kMacSize); - return S_OK; -} - -STDMETHODIMP_(UInt32) CEncoder::Filter(Byte *data, UInt32 size) -{ - EncryptData(data, size); - _hmac.Update(data, size); - return size; -} - -STDMETHODIMP_(UInt32) CDecoder::Filter(Byte *data, UInt32 size) -{ - _hmac.Update(data, size); - EncryptData(data, size); - return size; -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Crypto/WzAes.h b/desmume/src/windows/7z/CPP/7zip/Crypto/WzAes.h deleted file mode 100644 index 8d68cc2f3..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Crypto/WzAes.h +++ /dev/null @@ -1,119 +0,0 @@ -// Crypto/WzAes.h -/* -This code implements Brian Gladman's scheme -specified in password Based File Encryption Utility: - - AES encryption (128,192,256-bit) in Counter (CTR) mode. - - HMAC-SHA1 authentication for encrypted data (10 bytes) - - Keys are derived by PPKDF2(RFC2898)-HMAC-SHA1 from ASCII password and - Salt (saltSize = aesKeySize / 2). - - 2 bytes contain Password Verifier's Code -*/ - -#ifndef __CRYPTO_WZ_AES_H -#define __CRYPTO_WZ_AES_H - -extern "C" -{ -#include "../../../C/Aes.h" -} - -#include "Common/Buffer.h" -#include "Common/MyCom.h" -#include "Common/MyVector.h" - -#include "../ICoder.h" -#include "../IPassword.h" - -#include "HmacSha1.h" - -namespace NCrypto { -namespace NWzAes { - -const unsigned int kSaltSizeMax = 16; -const unsigned int kMacSize = 10; - -const UInt32 kPasswordSizeMax = 99; // 128; - -// Password Verification Code Size -const unsigned int kPwdVerifCodeSize = 2; - -class CKeyInfo -{ -public: - Byte KeySizeMode; // 1 - 128-bit , 2 - 192-bit , 3 - 256-bit - Byte Salt[kSaltSizeMax]; - Byte PwdVerifComputed[kPwdVerifCodeSize]; - - CByteBuffer Password; - - UInt32 GetKeySize() const { return (8 * (KeySizeMode & 3) + 8); } - UInt32 GetSaltSize() const { return (4 * (KeySizeMode & 3) + 4); } - - CKeyInfo() { Init(); } - void Init() { KeySizeMode = 3; } -}; - -class CBaseCoder: - public ICompressFilter, - public ICryptoSetPassword, - public CMyUnknownImp -{ -protected: - CKeyInfo _key; - UInt32 _counter[AES_BLOCK_SIZE / 4]; - Byte _buffer[AES_BLOCK_SIZE]; - NSha1::CHmac _hmac; - unsigned int _blockPos; - Byte _pwdVerifFromArchive[kPwdVerifCodeSize]; - - void EncryptData(Byte *data, UInt32 size); - - CAes Aes; - -public: - STDMETHOD(Init)(); - STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size) = 0; - - STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size); - - UInt32 GetHeaderSize() const { return _key.GetSaltSize() + kPwdVerifCodeSize; } -}; - -class CEncoder: - public CBaseCoder - // public ICompressWriteCoderProperties -{ -public: - MY_UNKNOWN_IMP1(ICryptoSetPassword) - // ICompressWriteCoderProperties - // STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream); - STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size); - HRESULT WriteHeader(ISequentialOutStream *outStream); - HRESULT WriteFooter(ISequentialOutStream *outStream); - bool SetKeyMode(Byte mode) - { - if (mode < 1 || mode > 3) - return false; - _key.KeySizeMode = mode; - return true; - } -}; - -class CDecoder: - public CBaseCoder, - public ICompressSetDecoderProperties2 -{ -public: - MY_UNKNOWN_IMP2( - ICryptoSetPassword, - ICompressSetDecoderProperties2) - STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size); - STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size); - HRESULT ReadHeader(ISequentialInStream *inStream); - bool CheckPasswordVerifyCode(); - HRESULT CheckMac(ISequentialInStream *inStream, bool &isOK); -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Crypto/ZipCrypto.cpp b/desmume/src/windows/7z/CPP/7zip/Crypto/ZipCrypto.cpp deleted file mode 100644 index b699d8950..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Crypto/ZipCrypto.cpp +++ /dev/null @@ -1,131 +0,0 @@ -// Crypto/ZipCrypto.cpp - -#include "StdAfx.h" - -extern "C" -{ -#include "../../../C/7zCrc.h" -} - -#include "../Common/StreamUtils.h" - -#include "RandGen.h" -#include "ZipCrypto.h" - -namespace NCrypto { -namespace NZip { - -void CCipher::UpdateKeys(Byte b) -{ - Keys[0] = CRC_UPDATE_BYTE(Keys[0], b); - Keys[1] += Keys[0] & 0xff; - Keys[1] = Keys[1] * 134775813L + 1; - Keys[2] = CRC_UPDATE_BYTE(Keys[2], (Byte)(Keys[1] >> 24)); -} - -void CCipher::SetPassword(const Byte *password, UInt32 passwordLen) -{ - Keys[0] = 305419896L; - Keys[1] = 591751049L; - Keys[2] = 878082192L; - for (UInt32 i = 0; i < passwordLen; i++) - UpdateKeys(password[i]); -} - -Byte CCipher::DecryptByteSpec() -{ - UInt32 temp = Keys[2] | 2; - return (Byte)((temp * (temp ^ 1)) >> 8); -} - -Byte CCipher::DecryptByte(Byte b) -{ - Byte c = (Byte)(b ^ DecryptByteSpec()); - UpdateKeys(c); - return c; -} - -Byte CCipher::EncryptByte(Byte b) -{ - Byte c = (Byte)(b ^ DecryptByteSpec()); - UpdateKeys(b); - return c; -} - -void CCipher::DecryptHeader(Byte *buf) -{ - for (unsigned i = 0; i < kHeaderSize; i++) - buf[i] = DecryptByte(buf[i]); -} - -void CCipher::EncryptHeader(Byte *buf) -{ - for (unsigned i = 0; i < kHeaderSize; i++) - buf[i] = EncryptByte(buf[i]); -} - -STDMETHODIMP CEncoder::CryptoSetPassword(const Byte *data, UInt32 size) -{ - _cipher.SetPassword(data, size); - return S_OK; -} - -STDMETHODIMP CEncoder::CryptoSetCRC(UInt32 crc) -{ - _crc = crc; - return S_OK; -} - -STDMETHODIMP CEncoder::Init() -{ - return S_OK; -} - -HRESULT CEncoder::WriteHeader(ISequentialOutStream *outStream) -{ - Byte header[kHeaderSize]; - g_RandomGenerator.Generate(header, kHeaderSize - 2); - - header[kHeaderSize - 1] = Byte(_crc >> 24); - header[kHeaderSize - 2] = Byte(_crc >> 16); - - _cipher.EncryptHeader(header); - return WriteStream(outStream, header, kHeaderSize); -} - -STDMETHODIMP_(UInt32) CEncoder::Filter(Byte *data, UInt32 size) -{ - UInt32 i; - for (i = 0; i < size; i++) - data[i] = _cipher.EncryptByte(data[i]); - return i; -} - -STDMETHODIMP CDecoder::CryptoSetPassword(const Byte *data, UInt32 size) -{ - _cipher.SetPassword(data, size); - return S_OK; -} - -HRESULT CDecoder::ReadHeader(ISequentialInStream *inStream) -{ - Byte header[kHeaderSize]; - RINOK(ReadStream_FAIL(inStream, header, kHeaderSize)); - _cipher.DecryptHeader(header); - return S_OK; -} - -STDMETHODIMP CDecoder::Init() -{ - return S_OK; -} - -STDMETHODIMP_(UInt32) CDecoder::Filter(Byte *data, UInt32 size) -{ - UInt32 i; - for (i = 0; i < size; i++) - data[i] = _cipher.DecryptByte(data[i]); - return i; -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Crypto/ZipCrypto.h b/desmume/src/windows/7z/CPP/7zip/Crypto/ZipCrypto.h deleted file mode 100644 index 2f8f335ae..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Crypto/ZipCrypto.h +++ /dev/null @@ -1,71 +0,0 @@ -// Crypto/ZipCrypto.h - -#ifndef __CRYPTO_ZIP_CRYPTO_H -#define __CRYPTO_ZIP_CRYPTO_H - -#include "Common/MyCom.h" - -#include "../ICoder.h" -#include "../IPassword.h" - -namespace NCrypto { -namespace NZip { - -const unsigned kHeaderSize = 12; - -class CCipher -{ - UInt32 Keys[3]; - - void UpdateKeys(Byte b); - Byte DecryptByteSpec(); -public: - void SetPassword(const Byte *password, UInt32 passwordLen); - Byte DecryptByte(Byte b); - Byte EncryptByte(Byte b); - void DecryptHeader(Byte *buf); - void EncryptHeader(Byte *buf); -}; - -class CEncoder : - public ICompressFilter, - public ICryptoSetPassword, - public ICryptoSetCRC, - public CMyUnknownImp -{ - CCipher _cipher; - UInt32 _crc; -public: - MY_UNKNOWN_IMP2( - ICryptoSetPassword, - ICryptoSetCRC - ) - STDMETHOD(Init)(); - STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size); - - STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size); - STDMETHOD(CryptoSetCRC)(UInt32 crc); - HRESULT WriteHeader(ISequentialOutStream *outStream); -}; - - -class CDecoder: - public ICompressFilter, - public ICryptoSetPassword, - public CMyUnknownImp -{ - CCipher _cipher; -public: - MY_UNKNOWN_IMP1(ICryptoSetPassword) - - STDMETHOD(Init)(); - STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size); - STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size); - - HRESULT ReadHeader(ISequentialInStream *inStream); -}; - - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/Crypto/ZipStrong.cpp b/desmume/src/windows/7z/CPP/7zip/Crypto/ZipStrong.cpp deleted file mode 100644 index 2302450f5..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Crypto/ZipStrong.cpp +++ /dev/null @@ -1,180 +0,0 @@ -// Crypto/ZipStrong.cpp - -#include "StdAfx.h" - -extern "C" -{ -#include "../../../C/7zCrc.h" -#include "../../../C/CpuArch.h" -} - -#include "../Common/StreamUtils.h" - -#include "MyAES.h" -#include "Sha1.h" -#include "ZipStrong.h" - -namespace NCrypto { -namespace NZipStrong { - -static const UInt16 kAES128 = 0x660E; - -// DeriveKey* function is similar to CryptDeriveKey() from Windows. -// But MSDN tells that we need such scheme only if -// "the required key length is longer than the hash value" -// but ZipStrong uses it always. - -static void DeriveKey2(const Byte *digest, Byte c, Byte *dest) -{ - Byte buf[64]; - memset(buf, c, 64); - for (unsigned i = 0; i < NSha1::kDigestSize; i++) - buf[i] ^= digest[i]; - NSha1::CContext sha; - sha.Init(); - sha.Update(buf, 64); - sha.Final(dest); -} - -static void DeriveKey(NSha1::CContext &sha, Byte *key) -{ - Byte digest[NSha1::kDigestSize]; - sha.Final(digest); - Byte temp[NSha1::kDigestSize * 2]; - DeriveKey2(digest, 0x36, temp); - DeriveKey2(digest, 0x5C, temp + NSha1::kDigestSize); - memcpy(key, temp, 32); -} - -void CKeyInfo::SetPassword(const Byte *data, UInt32 size) -{ - NSha1::CContext sha; - sha.Init(); - sha.Update(data, size); - DeriveKey(sha, MasterKey); -} - -STDMETHODIMP CBaseCoder::CryptoSetPassword(const Byte *data, UInt32 size) -{ - _key.SetPassword(data, size); - return S_OK; -} - -STDMETHODIMP CBaseCoder::Init() -{ - return S_OK; -} - -HRESULT CDecoder::ReadHeader(ISequentialInStream *inStream, UInt32 /* crc */, UInt64 /* unpackSize */) -{ - Byte temp[4]; - RINOK(ReadStream_FALSE(inStream, temp, 2)); - _ivSize = GetUi16(temp); - if (_ivSize == 0) - { - return E_NOTIMPL; - /* - SetUi32(_iv, crc); - for (int i = 0; i < 8; i++) - _iv[4 + i] = (Byte)(unpackSize >> (8 * i)); - SetUi32(_iv + 12, 0); - */ - } - else if (_ivSize == 16) - { - RINOK(ReadStream_FALSE(inStream, _iv, _ivSize)); - } - else - return E_NOTIMPL; - RINOK(ReadStream_FALSE(inStream, temp, 4)); - _remSize = GetUi32(temp); - if (_remSize > _buf.GetCapacity()) - { - _buf.Free(); - _buf.SetCapacity(_remSize); - } - return ReadStream_FALSE(inStream, _buf, _remSize); -} - -HRESULT CDecoder::CheckPassword(bool &passwOK) -{ - passwOK = false; - if (_remSize < 10) - return E_NOTIMPL; - Byte *p = _buf; - UInt16 format = GetUi16(p); - if (format != 3) - return E_NOTIMPL; - UInt16 algId = GetUi16(p + 2); - if (algId < kAES128) - return E_NOTIMPL; - algId -= kAES128; - if (algId > 2) - return E_NOTIMPL; - UInt16 bitLen = GetUi16(p + 4); - UInt16 flags = GetUi16(p + 6); - if (algId * 64 + 128 != bitLen) - return E_NOTIMPL; - _key.KeySize = 16 + algId * 8; - if ((flags & 1) == 0) - return E_NOTIMPL; - UInt32 rdSize = GetUi16(p + 8); - UInt32 pos = 10; - Byte *rd = p + pos; - pos += rdSize; - if (pos + 4 > _remSize) - return E_NOTIMPL; - UInt32 reserved = GetUi32(p + pos); - pos += 4; - if (reserved != 0) - return E_NOTIMPL; - if (pos + 2 > _remSize) - return E_NOTIMPL; - UInt32 validSize = GetUi16(p + pos); - pos += 2; - Byte *validData = p + pos; - if (pos + validSize != _remSize) - return E_NOTIMPL; - - if (!_aesFilter) - _aesFilter = new CAesCbcDecoder; - - CMyComPtr cp; - RINOK(_aesFilter.QueryInterface(IID_ICryptoProperties, &cp)); - { - RINOK(cp->SetKey(_key.MasterKey, _key.KeySize)); - RINOK(cp->SetInitVector(_iv, 16)); - _aesFilter->Init(); - if (_aesFilter->Filter(rd, rdSize) != rdSize) - return E_NOTIMPL; - } - - Byte fileKey[32]; - NSha1::CContext sha; - sha.Init(); - sha.Update(_iv, 16); - sha.Update(rd, rdSize - 16); // we don't use last 16 bytes (PAD bytes) - DeriveKey(sha, fileKey); - - RINOK(cp->SetKey(fileKey, _key.KeySize)); - RINOK(cp->SetInitVector(_iv, 16)); - _aesFilter->Init(); - if (_aesFilter->Filter(validData, validSize) != validSize) - return E_NOTIMPL; - - if (validSize < 4) - return E_NOTIMPL; - validSize -= 4; - if (GetUi32(validData + validSize) != CrcCalc(validData, validSize)) - return S_OK; - passwOK = true; - _aesFilter->Init(); - return S_OK; -} - -STDMETHODIMP_(UInt32) CDecoder::Filter(Byte *data, UInt32 size) -{ - return _aesFilter->Filter(data, size); -} - -}} diff --git a/desmume/src/windows/7z/CPP/7zip/Crypto/ZipStrong.h b/desmume/src/windows/7z/CPP/7zip/Crypto/ZipStrong.h deleted file mode 100644 index 33adbaa2a..000000000 --- a/desmume/src/windows/7z/CPP/7zip/Crypto/ZipStrong.h +++ /dev/null @@ -1,53 +0,0 @@ -// Crypto/ZipStrong.h - -#ifndef __CRYPTO_ZIP_STRONG_H -#define __CRYPTO_ZIP_STRONG_H - -#include "Common/MyCom.h" -#include "Common/Buffer.h" - -#include "../ICoder.h" -#include "../IPassword.h" - -namespace NCrypto { -namespace NZipStrong { - -struct CKeyInfo -{ - Byte MasterKey[32]; - UInt32 KeySize; - void SetPassword(const Byte *data, UInt32 size); -}; - -class CBaseCoder: - public ICompressFilter, - public ICryptoSetPassword, - public CMyUnknownImp -{ -protected: - CKeyInfo _key; - CMyComPtr _aesFilter; - CByteBuffer _buf; -public: - STDMETHOD(Init)(); - STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size) = 0; - - STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size); -}; - -class CDecoder: - public CBaseCoder -{ - UInt32 _ivSize; - Byte _iv[16]; - UInt32 _remSize; -public: - MY_UNKNOWN_IMP1(ICryptoSetPassword) - STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size); - HRESULT ReadHeader(ISequentialInStream *inStream, UInt32 crc, UInt64 unpackSize); - HRESULT CheckPassword(bool &passwOK); -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/ICoder.h b/desmume/src/windows/7z/CPP/7zip/ICoder.h deleted file mode 100644 index 150118c2c..000000000 --- a/desmume/src/windows/7z/CPP/7zip/ICoder.h +++ /dev/null @@ -1,186 +0,0 @@ -// ICoder.h - -#ifndef __ICODER_H -#define __ICODER_H - -#include "IStream.h" - -#define CODER_INTERFACE(i, x) DECL_INTERFACE(i, 4, x) - -CODER_INTERFACE(ICompressProgressInfo, 0x04) -{ - STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize) PURE; -}; - -CODER_INTERFACE(ICompressCoder, 0x05) -{ - STDMETHOD(Code)(ISequentialInStream *inStream, - ISequentialOutStream *outStream, - const UInt64 *inSize, - const UInt64 *outSize, - ICompressProgressInfo *progress) PURE; -}; - -CODER_INTERFACE(ICompressCoder2, 0x18) -{ - STDMETHOD(Code)(ISequentialInStream **inStreams, - const UInt64 **inSizes, - UInt32 numInStreams, - ISequentialOutStream **outStreams, - const UInt64 **outSizes, - UInt32 numOutStreams, - ICompressProgressInfo *progress) PURE; -}; - -namespace NCoderPropID -{ - enum EEnum - { - kDictionarySize = 0x400, - kUsedMemorySize, - kOrder, - kBlockSize, - kPosStateBits = 0x440, - kLitContextBits, - kLitPosBits, - kNumFastBytes = 0x450, - kMatchFinder, - kMatchFinderCycles, - kNumPasses = 0x460, - kAlgorithm = 0x470, - kMultiThread = 0x480, - kNumThreads, - kEndMarker = 0x490 - }; -} - -CODER_INTERFACE(ICompressSetCoderProperties, 0x20) -{ - STDMETHOD(SetCoderProperties)(const PROPID *propIDs, - const PROPVARIANT *properties, UInt32 numProperties) PURE; -}; - -/* -CODER_INTERFACE(ICompressSetCoderProperties, 0x21) -{ - STDMETHOD(SetDecoderProperties)(ISequentialInStream *inStream) PURE; -}; -*/ - -CODER_INTERFACE(ICompressSetDecoderProperties2, 0x22) -{ - STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size) PURE; -}; - -CODER_INTERFACE(ICompressWriteCoderProperties, 0x23) -{ - STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStreams) PURE; -}; - -CODER_INTERFACE(ICompressGetInStreamProcessedSize, 0x24) -{ - STDMETHOD(GetInStreamProcessedSize)(UInt64 *value) PURE; -}; - -CODER_INTERFACE(ICompressSetCoderMt, 0x25) -{ - STDMETHOD(SetNumberOfThreads)(UInt32 numThreads) PURE; -}; - -CODER_INTERFACE(ICompressGetSubStreamSize, 0x30) -{ - STDMETHOD(GetSubStreamSize)(UInt64 subStream, UInt64 *value) PURE; -}; - -CODER_INTERFACE(ICompressSetInStream, 0x31) -{ - STDMETHOD(SetInStream)(ISequentialInStream *inStream) PURE; - STDMETHOD(ReleaseInStream)() PURE; -}; - -CODER_INTERFACE(ICompressSetOutStream, 0x32) -{ - STDMETHOD(SetOutStream)(ISequentialOutStream *outStream) PURE; - STDMETHOD(ReleaseOutStream)() PURE; -}; - -CODER_INTERFACE(ICompressSetInStreamSize, 0x33) -{ - STDMETHOD(SetInStreamSize)(const UInt64 *inSize) PURE; -}; - -CODER_INTERFACE(ICompressSetOutStreamSize, 0x34) -{ - STDMETHOD(SetOutStreamSize)(const UInt64 *outSize) PURE; -}; - -CODER_INTERFACE(ICompressFilter, 0x40) -{ - STDMETHOD(Init)() PURE; - STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size) PURE; - // Filter return outSize (UInt32) - // if (outSize <= size): Filter have converted outSize bytes - // if (outSize > size): Filter have not converted anything. - // and it needs at least outSize bytes to convert one block - // (it's for crypto block algorithms). -}; - -CODER_INTERFACE(ICompressCodecsInfo, 0x60) -{ - STDMETHOD(GetNumberOfMethods)(UInt32 *numMethods) PURE; - STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value) PURE; - STDMETHOD(CreateDecoder)(UInt32 index, const GUID *iid, void **coder) PURE; - STDMETHOD(CreateEncoder)(UInt32 index, const GUID *iid, void **coder) PURE; -}; -CODER_INTERFACE(ISetCompressCodecsInfo, 0x61) -{ - STDMETHOD(SetCompressCodecsInfo)(ICompressCodecsInfo *compressCodecsInfo) PURE; -}; - -CODER_INTERFACE(ICryptoProperties, 0x80) -{ - STDMETHOD(SetKey)(const Byte *data, UInt32 size) PURE; - STDMETHOD(SetInitVector)(const Byte *data, UInt32 size) PURE; -}; - -/* -CODER_INTERFACE(ICryptoResetSalt, 0x88) -{ - STDMETHOD(ResetSalt)() PURE; -}; -*/ - -CODER_INTERFACE(ICryptoResetInitVector, 0x8C) -{ - STDMETHOD(ResetInitVector)() PURE; -}; - -CODER_INTERFACE(ICryptoSetPassword, 0x90) -{ - STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size) PURE; -}; - -CODER_INTERFACE(ICryptoSetCRC, 0xA0) -{ - STDMETHOD(CryptoSetCRC)(UInt32 crc) PURE; -}; - -////////////////////// -// It's for DLL file -namespace NMethodPropID -{ - enum EEnum - { - kID, - kName, - kDecoder, - kEncoder, - kInStreams, - kOutStreams, - kDescription, - kDecoderIsAssigned, - kEncoderIsAssigned - }; -} - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/IDecl.h b/desmume/src/windows/7z/CPP/7zip/IDecl.h deleted file mode 100644 index 768bbe710..000000000 --- a/desmume/src/windows/7z/CPP/7zip/IDecl.h +++ /dev/null @@ -1,15 +0,0 @@ -// IDecl.h - -#ifndef __IDECL_H -#define __IDECL_H - -#include "../Common/MyUnknown.h" - -#define DECL_INTERFACE_SUB(i, base, groupId, subId) \ -DEFINE_GUID(IID_ ## i, \ -0x23170F69, 0x40C1, 0x278A, 0, 0, 0, (groupId), 0, (subId), 0, 0); \ -struct i: public base - -#define DECL_INTERFACE(i, groupId, subId) DECL_INTERFACE_SUB(i, IUnknown, groupId, subId) - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/IPassword.h b/desmume/src/windows/7z/CPP/7zip/IPassword.h deleted file mode 100644 index 5679d84ce..000000000 --- a/desmume/src/windows/7z/CPP/7zip/IPassword.h +++ /dev/null @@ -1,24 +0,0 @@ -// IPassword.h - -#ifndef __IPASSWORD_H -#define __IPASSWORD_H - -#include "../Common/MyUnknown.h" -#include "../Common/Types.h" - -#include "IDecl.h" - -#define PASSWORD_INTERFACE(i, x) DECL_INTERFACE(i, 5, x) - -PASSWORD_INTERFACE(ICryptoGetTextPassword, 0x10) -{ - STDMETHOD(CryptoGetTextPassword)(BSTR *password) PURE; -}; - -PASSWORD_INTERFACE(ICryptoGetTextPassword2, 0x11) -{ - STDMETHOD(CryptoGetTextPassword2)(Int32 *passwordIsDefined, BSTR *password) PURE; -}; - -#endif - diff --git a/desmume/src/windows/7z/CPP/7zip/IProgress.h b/desmume/src/windows/7z/CPP/7zip/IProgress.h deleted file mode 100644 index 09486baf3..000000000 --- a/desmume/src/windows/7z/CPP/7zip/IProgress.h +++ /dev/null @@ -1,33 +0,0 @@ -// Interface/IProgress.h - -#ifndef __IPROGRESS_H -#define __IPROGRESS_H - -#include "../Common/MyUnknown.h" -#include "../Common/Types.h" - -#include "IDecl.h" - -#define INTERFACE_IProgress(x) \ - STDMETHOD(SetTotal)(UInt64 total) x; \ - STDMETHOD(SetCompleted)(const UInt64 *completeValue) x; \ - -DECL_INTERFACE(IProgress, 0, 5) -{ - INTERFACE_IProgress(PURE) -}; - -/* -// {23170F69-40C1-278A-0000-000000050002} -DEFINE_GUID(IID_IProgress2, -0x23170F69, 0x40C1, 0x278A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x02); -MIDL_INTERFACE("23170F69-40C1-278A-0000-000000050002") -IProgress2: public IUnknown -{ -public: - STDMETHOD(SetTotal)(const UInt64 *total) PURE; - STDMETHOD(SetCompleted)(const UInt64 *completeValue) PURE; -}; -*/ - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/IStream.h b/desmume/src/windows/7z/CPP/7zip/IStream.h deleted file mode 100644 index d5ed723fe..000000000 --- a/desmume/src/windows/7z/CPP/7zip/IStream.h +++ /dev/null @@ -1,58 +0,0 @@ -// IStream.h - -#ifndef __ISTREAM_H -#define __ISTREAM_H - -#include "../Common/MyUnknown.h" -#include "../Common/Types.h" - -#include "IDecl.h" - -#define STREAM_INTERFACE_SUB(i, base, x) DECL_INTERFACE_SUB(i, base, 3, x) -#define STREAM_INTERFACE(i, x) STREAM_INTERFACE_SUB(i, IUnknown, x) - -STREAM_INTERFACE(ISequentialInStream, 0x01) -{ - STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize) PURE; - /* - Out: if size != 0, return_value = S_OK and (*processedSize == 0), - then there are no more bytes in stream. - if (size > 0) && there are bytes in stream, - this function must read at least 1 byte. - This function is allowed to read less than number of remaining bytes in stream. - You must call Read function in loop, if you need exact amount of data - */ -}; - -STREAM_INTERFACE(ISequentialOutStream, 0x02) -{ - STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize) PURE; - /* - if (size > 0) this function must write at least 1 byte. - This function is allowed to write less than "size". - You must call Write function in loop, if you need to write exact amount of data - */ -}; - -STREAM_INTERFACE_SUB(IInStream, ISequentialInStream, 0x03) -{ - STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) PURE; -}; - -STREAM_INTERFACE_SUB(IOutStream, ISequentialOutStream, 0x04) -{ - STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) PURE; - STDMETHOD(SetSize)(Int64 newSize) PURE; -}; - -STREAM_INTERFACE(IStreamGetSize, 0x06) -{ - STDMETHOD(GetSize)(UInt64 *size) PURE; -}; - -STREAM_INTERFACE(IOutStreamFlush, 0x07) -{ - STDMETHOD(Flush)() PURE; -}; - -#endif diff --git a/desmume/src/windows/7z/CPP/7zip/PropID.h b/desmume/src/windows/7z/CPP/7zip/PropID.h deleted file mode 100644 index 695f80295..000000000 --- a/desmume/src/windows/7z/CPP/7zip/PropID.h +++ /dev/null @@ -1,69 +0,0 @@ -// PropID.h - -#ifndef __7ZIP_PROPID_H -#define __7ZIP_PROPID_H - -enum -{ - kpidNoProperty = 0, - - kpidHandlerItemIndex = 2, - kpidPath, - kpidName, - kpidExtension, - kpidIsDir, - kpidSize, - kpidPackSize, - kpidAttrib, - kpidCTime, - kpidATime, - kpidMTime, - kpidSolid, - kpidCommented, - kpidEncrypted, - kpidSplitBefore, - kpidSplitAfter, - kpidDictionarySize, - kpidCRC, - kpidType, - kpidIsAnti, - kpidMethod, - kpidHostOS, - kpidFileSystem, - kpidUser, - kpidGroup, - kpidBlock, - kpidComment, - kpidPosition, - kpidPrefix, - kpidNumSubDirs, - kpidNumSubFiles, - kpidUnpackVer, - kpidVolume, - kpidIsVolume, - kpidOffset, - kpidLinks, - kpidNumBlocks, - kpidNumVolumes, - kpidTimeType, - kpidBit64, - kpidBigEndian, - kpidCpu, - kpidPhySize, - kpidHeadersSize, - kpidChecksum, - kpidCharacts, - kpidVa, - - kpidTotalSize = 0x1100, - kpidFreeSpace, - kpidClusterSize, - kpidVolumeName, - - kpidLocalName = 0x1200, - kpidProvider, - - kpidUserDefined = 0x10000 -}; - -#endif diff --git a/desmume/src/windows/7z/CPP/Common/Buffer.h b/desmume/src/windows/7z/CPP/Common/Buffer.h deleted file mode 100644 index b0959eddb..000000000 --- a/desmume/src/windows/7z/CPP/Common/Buffer.h +++ /dev/null @@ -1,77 +0,0 @@ -// Common/Buffer.h - -#ifndef __COMMON_BUFFER_H -#define __COMMON_BUFFER_H - -#include "Defs.h" - -template class CBuffer -{ -protected: - size_t _capacity; - T *_items; -public: - void Free() - { - delete []_items; - _items = 0; - _capacity = 0; - } - CBuffer(): _capacity(0), _items(0) {}; - CBuffer(const CBuffer &buffer): _capacity(0), _items(0) { *this = buffer; } - CBuffer(size_t size): _items(0), _capacity(0) { SetCapacity(size); } - virtual ~CBuffer() { delete []_items; } - operator T *() { return _items; }; - operator const T *() const { return _items; }; - size_t GetCapacity() const { return _capacity; } - void SetCapacity(size_t newCapacity) - { - if (newCapacity == _capacity) - return; - T *newBuffer; - if (newCapacity > 0) - { - newBuffer = new T[newCapacity]; - if (_capacity > 0) - memmove(newBuffer, _items, MyMin(_capacity, newCapacity) * sizeof(T)); - } - else - newBuffer = 0; - delete []_items; - _items = newBuffer; - _capacity = newCapacity; - } - CBuffer& operator=(const CBuffer &buffer) - { - Free(); - if (buffer._capacity > 0) - { - SetCapacity(buffer._capacity); - memmove(_items, buffer._items, buffer._capacity * sizeof(T)); - } - return *this; - } -}; - -template -bool operator==(const CBuffer& b1, const CBuffer& b2) -{ - if (b1.GetCapacity() != b2.GetCapacity()) - return false; - for (size_t i = 0; i < b1.GetCapacity(); i++) - if (b1[i] != b2[i]) - return false; - return true; -} - -template -bool operator!=(const CBuffer& b1, const CBuffer& b2) -{ - return !(b1 == b2); -} - -typedef CBuffer CCharBuffer; -typedef CBuffer CWCharBuffer; -typedef CBuffer CByteBuffer; - -#endif diff --git a/desmume/src/windows/7z/CPP/Common/CRC.cpp b/desmume/src/windows/7z/CPP/Common/CRC.cpp deleted file mode 100644 index 987b8a03a..000000000 --- a/desmume/src/windows/7z/CPP/Common/CRC.cpp +++ /dev/null @@ -1,10 +0,0 @@ -// Common/CRC.cpp - -#include "StdAfx.h" - -extern "C" -{ -#include "../../C/7zCrc.h" -} - -struct CCRCTableInit { CCRCTableInit() { CrcGenerateTable(); } } g_CRCTableInit; diff --git a/desmume/src/windows/7z/CPP/Common/ComTry.h b/desmume/src/windows/7z/CPP/Common/ComTry.h deleted file mode 100644 index 98e592766..000000000 --- a/desmume/src/windows/7z/CPP/Common/ComTry.h +++ /dev/null @@ -1,17 +0,0 @@ -// ComTry.h - -#ifndef __COM_TRY_H -#define __COM_TRY_H - -#include "MyWindows.h" -// #include "Exception.h" -// #include "NewHandler.h" - -#define COM_TRY_BEGIN try { -#define COM_TRY_END } catch(...) { return E_OUTOFMEMORY; } - - // catch(const CNewException &) { return E_OUTOFMEMORY; }\ - // catch(const CSystemException &e) { return e.ErrorCode; }\ - // catch(...) { return E_FAIL; } - -#endif diff --git a/desmume/src/windows/7z/CPP/Common/Defs.h b/desmume/src/windows/7z/CPP/Common/Defs.h deleted file mode 100644 index 69b8ecea8..000000000 --- a/desmume/src/windows/7z/CPP/Common/Defs.h +++ /dev/null @@ -1,20 +0,0 @@ -// Common/Defs.h - -#ifndef __COMMON_DEFS_H -#define __COMMON_DEFS_H - -template inline T MyMin(T a, T b) - { return a < b ? a : b; } -template inline T MyMax(T a, T b) - { return a > b ? a : b; } - -template inline int MyCompare(T a, T b) - { return a < b ? -1 : (a == b ? 0 : 1); } - -inline int BoolToInt(bool value) - { return (value ? 1: 0); } - -inline bool IntToBool(int value) - { return (value != 0); } - -#endif diff --git a/desmume/src/windows/7z/CPP/Common/DynamicBuffer.h b/desmume/src/windows/7z/CPP/Common/DynamicBuffer.h deleted file mode 100644 index 83ef0ea2c..000000000 --- a/desmume/src/windows/7z/CPP/Common/DynamicBuffer.h +++ /dev/null @@ -1,47 +0,0 @@ -// Common/DynamicBuffer.h - -#ifndef __COMMON_DYNAMICBUFFER_H -#define __COMMON_DYNAMICBUFFER_H - -#include "Buffer.h" - -template class CDynamicBuffer: public CBuffer -{ - void GrowLength(size_t size) - { - size_t delta; - if (this->_capacity > 64) - delta = this->_capacity / 4; - else if (this->_capacity > 8) - delta = 16; - else - delta = 4; - delta = MyMax(delta, size); - SetCapacity(this->_capacity + delta); - } -public: - CDynamicBuffer(): CBuffer() {}; - CDynamicBuffer(const CDynamicBuffer &buffer): CBuffer(buffer) {}; - CDynamicBuffer(size_t size): CBuffer(size) {}; - CDynamicBuffer& operator=(const CDynamicBuffer &buffer) - { - this->Free(); - if (buffer._capacity > 0) - { - SetCapacity(buffer._capacity); - memmove(this->_items, buffer._items, buffer._capacity * sizeof(T)); - } - return *this; - } - void EnsureCapacity(size_t capacity) - { - if (this->_capacity < capacity) - GrowLength(capacity - this->_capacity); - } -}; - -typedef CDynamicBuffer CCharDynamicBuffer; -typedef CDynamicBuffer CWCharDynamicBuffer; -typedef CDynamicBuffer CByteDynamicBuffer; - -#endif diff --git a/desmume/src/windows/7z/CPP/Common/InitializeStaticLib.h b/desmume/src/windows/7z/CPP/Common/InitializeStaticLib.h deleted file mode 100644 index a0d70b6fd..000000000 --- a/desmume/src/windows/7z/CPP/Common/InitializeStaticLib.h +++ /dev/null @@ -1,29 +0,0 @@ -// Common/InitializeStaticLib.h -// -// it's necessary to include this from one cpp file in order to use 7zip as a static library, -// otherwise the linker will optimize away some important internals of 7zip. - -#ifndef __COMMON_INITIALIZESTATICLIB_H -#define __COMMON_INITIALIZESTATICLIB_H - -#define FORCE_REF(dec, var) extern dec var; void* var##ref = (void*)&var; - -#include "../7zip/Common/DeclareCodecs.h" -#include "../7zip/Common/DeclareArcs.h" - -FORCE_REF(struct CCRCTableInit, g_CRCTableInit) - - -// these don't seem to be necessary with my compiler, -// but they're here in case a different compiler more aggressively strips out unreferenced code -FORCE_REF(class CBZip2CrcTableInit, g_BZip2CrcTableInit) -namespace NCrypto { struct CAesTabInit; FORCE_REF(CAesTabInit, g_AesTabInit) } -namespace NBitl { struct CInverterTableInitializer; FORCE_REF(CInverterTableInitializer, g_InverterTableInitializer) } -namespace NCompress { namespace NRar3 { class CDistInit; FORCE_REF(CDistInit, g_DistInit) }} -namespace NArchive { namespace NLzh { class CCRCTableInit; FORCE_REF(CCRCTableInit, g_CRCTableInit) }} -namespace NArchive { namespace N7z { class SignatureInitializer; FORCE_REF(SignatureInitializer, g_SignatureInitializer) }} -namespace NArchive{ namespace NRar{ namespace NHeader{ class CMarkerInitializer; FORCE_REF(CMarkerInitializer, g_MarkerInitializer) }}} -namespace NArchive { namespace NZip { namespace NSignature{ class CMarkersInitializer; FORCE_REF(CMarkersInitializer, g_MarkerInitializer) }}} - - -#endif diff --git a/desmume/src/windows/7z/CPP/Common/IntToString.cpp b/desmume/src/windows/7z/CPP/Common/IntToString.cpp deleted file mode 100644 index f0a499d6b..000000000 --- a/desmume/src/windows/7z/CPP/Common/IntToString.cpp +++ /dev/null @@ -1,63 +0,0 @@ -// Common/IntToString.cpp - -#include "StdAfx.h" - -#include "IntToString.h" - -void ConvertUInt64ToString(UInt64 value, char *s, UInt32 base) -{ - if (base < 2 || base > 36) - { - *s = '\0'; - return; - } - char temp[72]; - int pos = 0; - do - { - int delta = (int)(value % base); - temp[pos++] = (char)((delta < 10) ? ('0' + delta) : ('a' + (delta - 10))); - value /= base; - } - while (value != 0); - do - *s++ = temp[--pos]; - while (pos > 0); - *s = '\0'; -} - -void ConvertUInt64ToString(UInt64 value, wchar_t *s) -{ - wchar_t temp[32]; - int pos = 0; - do - { - temp[pos++] = (wchar_t)(L'0' + (int)(value % 10)); - value /= 10; - } - while (value != 0); - do - *s++ = temp[--pos]; - while (pos > 0); - *s = L'\0'; -} - -void ConvertInt64ToString(Int64 value, char *s) -{ - if (value < 0) - { - *s++ = '-'; - value = -value; - } - ConvertUInt64ToString(value, s); -} - -void ConvertInt64ToString(Int64 value, wchar_t *s) -{ - if (value < 0) - { - *s++ = L'-'; - value = -value; - } - ConvertUInt64ToString(value, s); -} diff --git a/desmume/src/windows/7z/CPP/Common/IntToString.h b/desmume/src/windows/7z/CPP/Common/IntToString.h deleted file mode 100644 index 2f50ba95a..000000000 --- a/desmume/src/windows/7z/CPP/Common/IntToString.h +++ /dev/null @@ -1,15 +0,0 @@ -// Common/IntToString.h - -#ifndef __COMMON_INTTOSTRING_H -#define __COMMON_INTTOSTRING_H - -#include -#include "Types.h" - -void ConvertUInt64ToString(UInt64 value, char *s, UInt32 base = 10); -void ConvertUInt64ToString(UInt64 value, wchar_t *s); - -void ConvertInt64ToString(Int64 value, char *s); -void ConvertInt64ToString(Int64 value, wchar_t *s); - -#endif diff --git a/desmume/src/windows/7z/CPP/Common/MyCom.h b/desmume/src/windows/7z/CPP/Common/MyCom.h deleted file mode 100644 index d04fa4c3d..000000000 --- a/desmume/src/windows/7z/CPP/Common/MyCom.h +++ /dev/null @@ -1,225 +0,0 @@ -// MyCom.h - -#ifndef __MYCOM_H -#define __MYCOM_H - -#include "MyWindows.h" - -#ifndef RINOK -#define RINOK(x) { HRESULT __result_ = (x); if (__result_ != S_OK) return __result_; } -#endif - -template -class CMyComPtr -{ - T* _p; -public: - // typedef T _PtrClass; - CMyComPtr() { _p = NULL;} - CMyComPtr(T* p) {if ((_p = p) != NULL) p->AddRef(); } - CMyComPtr(const CMyComPtr& lp) - { - if ((_p = lp._p) != NULL) - _p->AddRef(); - } - ~CMyComPtr() { if (_p) _p->Release(); } - void Release() { if (_p) { _p->Release(); _p = NULL; } } - operator T*() const { return (T*)_p; } - // T& operator*() const { return *_p; } - T** operator&() { return &_p; } - T* operator->() const { return _p; } - T* operator=(T* p) - { - if (p != 0) - p->AddRef(); - if (_p) - _p->Release(); - _p = p; - return p; - } - T* operator=(const CMyComPtr& lp) { return (*this = lp._p); } - bool operator!() const { return (_p == NULL); } - // bool operator==(T* pT) const { return _p == pT; } - // Compare two objects for equivalence - void Attach(T* p2) - { - Release(); - _p = p2; - } - T* Detach() - { - T* pt = _p; - _p = NULL; - return pt; - } - #ifdef _WIN32 - HRESULT CoCreateInstance(REFCLSID rclsid, REFIID iid, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL) - { - return ::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, iid, (void**)&_p); - } - #endif - /* - HRESULT CoCreateInstance(LPCOLESTR szProgID, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL) - { - CLSID clsid; - HRESULT hr = CLSIDFromProgID(szProgID, &clsid); - ATLASSERT(_p == NULL); - if (SUCCEEDED(hr)) - hr = ::CoCreateInstance(clsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&_p); - return hr; - } - */ - template - HRESULT QueryInterface(REFGUID iid, Q** pp) const - { - return _p->QueryInterface(iid, (void**)pp); - } -}; - -////////////////////////////////////////////////////////// - -inline HRESULT StringToBstr(LPCOLESTR src, BSTR *bstr) -{ - *bstr = ::SysAllocString(src); - return (*bstr != 0) ? S_OK : E_OUTOFMEMORY; -} - -class CMyComBSTR -{ -public: - BSTR m_str; - CMyComBSTR(): m_str(NULL) {} - CMyComBSTR(LPCOLESTR src) { m_str = ::SysAllocString(src); } - // CMyComBSTR(int nSize) { m_str = ::SysAllocStringLen(NULL, nSize); } - // CMyComBSTR(int nSize, LPCOLESTR sz) { m_str = ::SysAllocStringLen(sz, nSize); } - CMyComBSTR(const CMyComBSTR& src) { m_str = src.MyCopy(); } - /* - CMyComBSTR(REFGUID src) - { - LPOLESTR szGuid; - StringFromCLSID(src, &szGuid); - m_str = ::SysAllocString(szGuid); - CoTaskMemFree(szGuid); - } - */ - ~CMyComBSTR() { ::SysFreeString(m_str); } - CMyComBSTR& operator=(const CMyComBSTR& src) - { - if (m_str != src.m_str) - { - if (m_str) - ::SysFreeString(m_str); - m_str = src.MyCopy(); - } - return *this; - } - CMyComBSTR& operator=(LPCOLESTR src) - { - ::SysFreeString(m_str); - m_str = ::SysAllocString(src); - return *this; - } - unsigned int Length() const { return ::SysStringLen(m_str); } - operator BSTR() const { return m_str; } - BSTR* operator&() { return &m_str; } - BSTR MyCopy() const - { - int byteLen = ::SysStringByteLen(m_str); - BSTR res = ::SysAllocStringByteLen(NULL, byteLen); - memcpy(res, m_str, byteLen); - return res; - } - /* - void Attach(BSTR src) { m_str = src; } - BSTR Detach() - { - BSTR s = m_str; - m_str = NULL; - return s; - } - */ - void Empty() - { - ::SysFreeString(m_str); - m_str = NULL; - } - bool operator!() const { return (m_str == NULL); } -}; - -////////////////////////////////////////////////////////// - -class CMyUnknownImp -{ -public: - ULONG __m_RefCount; - CMyUnknownImp(): __m_RefCount(0) {} -}; - -#define MY_QUERYINTERFACE_BEGIN STDMETHOD(QueryInterface) \ - (REFGUID iid, void **outObject) { - -#define MY_QUERYINTERFACE_ENTRY(i) if (iid == IID_ ## i) \ - { *outObject = (void *)(i *)this; AddRef(); return S_OK; } - -#define MY_QUERYINTERFACE_ENTRY_UNKNOWN(i) if (iid == IID_IUnknown) \ - { *outObject = (void *)(IUnknown *)(i *)this; AddRef(); return S_OK; } - -#define MY_QUERYINTERFACE_BEGIN2(i) MY_QUERYINTERFACE_BEGIN \ - MY_QUERYINTERFACE_ENTRY_UNKNOWN(i) \ - MY_QUERYINTERFACE_ENTRY(i) - -#define MY_QUERYINTERFACE_END return E_NOINTERFACE; } - -#define MY_ADDREF_RELEASE \ -STDMETHOD_(ULONG, AddRef)() { return ++__m_RefCount; } \ -STDMETHOD_(ULONG, Release)() { if (--__m_RefCount != 0) \ - return __m_RefCount; delete this; return 0; } - -#define MY_UNKNOWN_IMP_SPEC(i) \ - MY_QUERYINTERFACE_BEGIN \ - i \ - MY_QUERYINTERFACE_END \ - MY_ADDREF_RELEASE - - -#define MY_UNKNOWN_IMP MY_QUERYINTERFACE_BEGIN \ - MY_QUERYINTERFACE_ENTRY_UNKNOWN(IUnknown) \ - MY_QUERYINTERFACE_END \ - MY_ADDREF_RELEASE - -#define MY_UNKNOWN_IMP1(i) MY_UNKNOWN_IMP_SPEC( \ - MY_QUERYINTERFACE_ENTRY_UNKNOWN(i) \ - MY_QUERYINTERFACE_ENTRY(i) \ - ) - -#define MY_UNKNOWN_IMP2(i1, i2) MY_UNKNOWN_IMP_SPEC( \ - MY_QUERYINTERFACE_ENTRY_UNKNOWN(i1) \ - MY_QUERYINTERFACE_ENTRY(i1) \ - MY_QUERYINTERFACE_ENTRY(i2) \ - ) - -#define MY_UNKNOWN_IMP3(i1, i2, i3) MY_UNKNOWN_IMP_SPEC( \ - MY_QUERYINTERFACE_ENTRY_UNKNOWN(i1) \ - MY_QUERYINTERFACE_ENTRY(i1) \ - MY_QUERYINTERFACE_ENTRY(i2) \ - MY_QUERYINTERFACE_ENTRY(i3) \ - ) - -#define MY_UNKNOWN_IMP4(i1, i2, i3, i4) MY_UNKNOWN_IMP_SPEC( \ - MY_QUERYINTERFACE_ENTRY_UNKNOWN(i1) \ - MY_QUERYINTERFACE_ENTRY(i1) \ - MY_QUERYINTERFACE_ENTRY(i2) \ - MY_QUERYINTERFACE_ENTRY(i3) \ - MY_QUERYINTERFACE_ENTRY(i4) \ - ) - -#define MY_UNKNOWN_IMP5(i1, i2, i3, i4, i5) MY_UNKNOWN_IMP_SPEC( \ - MY_QUERYINTERFACE_ENTRY_UNKNOWN(i1) \ - MY_QUERYINTERFACE_ENTRY(i1) \ - MY_QUERYINTERFACE_ENTRY(i2) \ - MY_QUERYINTERFACE_ENTRY(i3) \ - MY_QUERYINTERFACE_ENTRY(i4) \ - MY_QUERYINTERFACE_ENTRY(i5) \ - ) - -#endif diff --git a/desmume/src/windows/7z/CPP/Common/MyException.h b/desmume/src/windows/7z/CPP/Common/MyException.h deleted file mode 100644 index cd9fe6948..000000000 --- a/desmume/src/windows/7z/CPP/Common/MyException.h +++ /dev/null @@ -1,14 +0,0 @@ -// Common/Exception.h - -#ifndef __COMMON_EXCEPTION_H -#define __COMMON_EXCEPTION_H - -#include "MyWindows.h" - -struct CSystemException -{ - HRESULT ErrorCode; - CSystemException(HRESULT errorCode): ErrorCode(errorCode) {} -}; - -#endif diff --git a/desmume/src/windows/7z/CPP/Common/MyInitGuid.h b/desmume/src/windows/7z/CPP/Common/MyInitGuid.h deleted file mode 100644 index b1e70d868..000000000 --- a/desmume/src/windows/7z/CPP/Common/MyInitGuid.h +++ /dev/null @@ -1,15 +0,0 @@ -// Common/MyInitGuid.h - -#ifndef __COMMON_MYINITGUID_H -#define __COMMON_MYINITGUID_H - -#ifdef _WIN32 -#include -#else -#define INITGUID -#include "MyGuidDef.h" -DEFINE_GUID(IID_IUnknown, -0x00000000, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46); -#endif - -#endif diff --git a/desmume/src/windows/7z/CPP/Common/MyMap.cpp b/desmume/src/windows/7z/CPP/Common/MyMap.cpp deleted file mode 100644 index a69c61a04..000000000 --- a/desmume/src/windows/7z/CPP/Common/MyMap.cpp +++ /dev/null @@ -1,140 +0,0 @@ -// MyMap.cpp - -#include "StdAfx.h" - -#include "MyMap.h" - -static const unsigned kNumBitsMax = sizeof(UInt32) * 8; - -static UInt32 GetSubBits(UInt32 value, unsigned startPos, unsigned numBits) -{ - if (startPos == sizeof(value) * 8) - return 0; - value >>= startPos; - if (numBits == sizeof(value) * 8) - return value; - return value & (((UInt32)1 << numBits) - 1); -} - -static inline unsigned GetSubBit(UInt32 v, unsigned n) { return (unsigned)(v >> n) & 1; } - -bool CMap32::Find(UInt32 key, UInt32 &valueRes) const -{ - valueRes = (UInt32)(Int32)-1; - if (Nodes.Size() == 0) - return false; - if (Nodes.Size() == 1) - { - const CNode &n = Nodes[0]; - if (n.Len == kNumBitsMax) - { - valueRes = n.Values[0]; - return (key == n.Key); - } - } - - int cur = 0; - unsigned bitPos = kNumBitsMax; - for (;;) - { - const CNode &n = Nodes[cur]; - bitPos -= n.Len; - if (GetSubBits(key, bitPos, n.Len) != GetSubBits(n.Key, bitPos, n.Len)) - return false; - unsigned bit = GetSubBit(key, --bitPos); - if (n.IsLeaf[bit]) - { - valueRes = n.Values[bit]; - return (key == n.Keys[bit]); - } - cur = (int)n.Keys[bit]; - } -} - -bool CMap32::Set(UInt32 key, UInt32 value) -{ - if (Nodes.Size() == 0) - { - CNode n; - n.Key = n.Keys[0] = n.Keys[1] = key; - n.Values[0] = n.Values[1] = value; - n.IsLeaf[0] = n.IsLeaf[1] = 1; - n.Len = kNumBitsMax; - Nodes.Add(n); - return false; - } - if (Nodes.Size() == 1) - { - CNode &n = Nodes[0]; - if (n.Len == kNumBitsMax) - { - if (key == n.Key) - { - n.Values[0] = n.Values[1] = value; - return true; - } - unsigned i = kNumBitsMax - 1; - for (;GetSubBit(key, i) == GetSubBit(n.Key, i); i--); - n.Len = (UInt16)(kNumBitsMax - (1 + i)); - unsigned newBit = GetSubBit(key, i); - n.Values[newBit] = value; - n.Keys[newBit] = key; - return false; - } - } - - int cur = 0; - unsigned bitPos = kNumBitsMax; - for (;;) - { - CNode &n = Nodes[cur]; - bitPos -= n.Len; - if (GetSubBits(key, bitPos, n.Len) != GetSubBits(n.Key, bitPos, n.Len)) - { - unsigned i = n.Len - 1; - for (; GetSubBit(key, bitPos + i) == GetSubBit(n.Key, bitPos + i); i--); - - CNode e2(n); - e2.Len = (UInt16)i; - - n.Len = (UInt16)(n.Len - (1 + i)); - unsigned newBit = GetSubBit(key, bitPos + i); - n.Values[newBit] = value; - n.IsLeaf[newBit] = 1; - n.IsLeaf[1 - newBit] = 0; - n.Keys[newBit] = key; - n.Keys[1 - newBit] = Nodes.Size(); - Nodes.Add(e2); - return false; - } - unsigned bit = GetSubBit(key, --bitPos); - - if (n.IsLeaf[bit]) - { - if (key == n.Keys[bit]) - { - n.Values[bit] = value; - return true; - } - unsigned i = bitPos - 1; - for (;GetSubBit(key, i) == GetSubBit(n.Keys[bit], i); i--); - - CNode e2; - - unsigned newBit = GetSubBit(key, i); - e2.Values[newBit] = value; - e2.Values[1 - newBit] = n.Values[bit]; - e2.IsLeaf[newBit] = e2.IsLeaf[1 - newBit] = 1; - e2.Keys[newBit] = key; - e2.Keys[1 - newBit] = e2.Key = n.Keys[bit]; - e2.Len = (UInt16)(bitPos - (1 + i)); - - n.IsLeaf[bit] = 0; - n.Keys[bit] = Nodes.Size(); - - Nodes.Add(e2); - return false; - } - cur = (int)n.Keys[bit]; - } -} diff --git a/desmume/src/windows/7z/CPP/Common/MyMap.h b/desmume/src/windows/7z/CPP/Common/MyMap.h deleted file mode 100644 index 4545bcef4..000000000 --- a/desmume/src/windows/7z/CPP/Common/MyMap.h +++ /dev/null @@ -1,28 +0,0 @@ -// MyMap.h - -#ifndef __COMMON_MYMAP_H -#define __COMMON_MYMAP_H - -#include "MyVector.h" -#include "Types.h" - -class CMap32 -{ - struct CNode - { - UInt32 Key; - UInt32 Keys[2]; - UInt32 Values[2]; - UInt16 Len; - Byte IsLeaf[2]; - }; - CRecordVector Nodes; - -public: - - void Clear() { Nodes.Clear(); } - bool Find(UInt32 key, UInt32 &valueRes) const; - bool Set(UInt32 key, UInt32 value); // returns true, if there is such key already -}; - -#endif diff --git a/desmume/src/windows/7z/CPP/Common/MyString.cpp b/desmume/src/windows/7z/CPP/Common/MyString.cpp deleted file mode 100644 index efab50350..000000000 --- a/desmume/src/windows/7z/CPP/Common/MyString.cpp +++ /dev/null @@ -1,198 +0,0 @@ -// Common/MyString.cpp - -#include "StdAfx.h" - -#ifdef _WIN32 -#include "StringConvert.h" -#else -#include -#endif - -#include "MyString.h" - - -#ifdef _WIN32 - -#ifndef _UNICODE - -wchar_t MyCharUpper(wchar_t c) -{ - if (c == 0) - return 0; - wchar_t *res = CharUpperW((LPWSTR)(UINT_PTR)(unsigned int)c); - if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) - return (wchar_t)(unsigned int)(UINT_PTR)res; - const int kBufferSize = 4; - char s[kBufferSize + 1]; - int numChars = ::WideCharToMultiByte(CP_ACP, 0, &c, 1, s, kBufferSize, 0, 0); - if (numChars == 0 || numChars > kBufferSize) - return c; - s[numChars] = 0; - ::CharUpperA(s); - ::MultiByteToWideChar(CP_ACP, 0, s, numChars, &c, 1); - return c; -} - -wchar_t MyCharLower(wchar_t c) -{ - if (c == 0) - return 0; - wchar_t *res = CharLowerW((LPWSTR)(UINT_PTR)(unsigned int)c); - if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) - return (wchar_t)(unsigned int)(UINT_PTR)res; - const int kBufferSize = 4; - char s[kBufferSize + 1]; - int numChars = ::WideCharToMultiByte(CP_ACP, 0, &c, 1, s, kBufferSize, 0, 0); - if (numChars == 0 || numChars > kBufferSize) - return c; - s[numChars] = 0; - ::CharLowerA(s); - ::MultiByteToWideChar(CP_ACP, 0, s, numChars, &c, 1); - return c; -} - -wchar_t * MyStringUpper(wchar_t *s) -{ - if (s == 0) - return 0; - wchar_t *res = CharUpperW(s); - if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) - return res; - AString a = UnicodeStringToMultiByte(s); - a.MakeUpper(); - return MyStringCopy(s, (const wchar_t *)MultiByteToUnicodeString(a)); -} - -wchar_t * MyStringLower(wchar_t *s) -{ - if (s == 0) - return 0; - wchar_t *res = CharLowerW(s); - if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) - return res; - AString a = UnicodeStringToMultiByte(s); - a.MakeLower(); - return MyStringCopy(s, (const wchar_t *)MultiByteToUnicodeString(a)); -} - -#endif - -/* -inline int ConvertCompareResult(int r) { return r - 2; } - -int MyStringCollate(const wchar_t *s1, const wchar_t *s2) -{ - int res = CompareStringW( - LOCALE_USER_DEFAULT, SORT_STRINGSORT, s1, -1, s2, -1); - #ifdef _UNICODE - return ConvertCompareResult(res); - #else - if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) - return ConvertCompareResult(res); - return MyStringCollate(UnicodeStringToMultiByte(s1), - UnicodeStringToMultiByte(s2)); - #endif -} - -#ifndef _WIN32_WCE -int MyStringCollate(const char *s1, const char *s2) -{ - return ConvertCompareResult(CompareStringA( - LOCALE_USER_DEFAULT, SORT_STRINGSORT, s1, -1, s2, -1)); -} - -int MyStringCollateNoCase(const char *s1, const char *s2) -{ - return ConvertCompareResult(CompareStringA( - LOCALE_USER_DEFAULT, NORM_IGNORECASE | SORT_STRINGSORT, s1, -1, s2, -1)); -} -#endif - -int MyStringCollateNoCase(const wchar_t *s1, const wchar_t *s2) -{ - int res = CompareStringW( - LOCALE_USER_DEFAULT, NORM_IGNORECASE | SORT_STRINGSORT, s1, -1, s2, -1); - #ifdef _UNICODE - return ConvertCompareResult(res); - #else - if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) - return ConvertCompareResult(res); - return MyStringCollateNoCase(UnicodeStringToMultiByte(s1), - UnicodeStringToMultiByte(s2)); - #endif -} -*/ - -#else - -wchar_t MyCharUpper(wchar_t c) -{ - return toupper(c); -} - -/* -int MyStringCollateNoCase(const wchar_t *s1, const wchar_t *s2) -{ - for (;;) - { - wchar_t c1 = *s1++; - wchar_t c2 = *s2++; - wchar_t u1 = MyCharUpper(c1); - wchar_t u2 = MyCharUpper(c2); - - if (u1 < u2) return -1; - if (u1 > u2) return 1; - if (u1 == 0) return 0; - } -} -*/ - -#endif - -int MyStringCompare(const char *s1, const char *s2) -{ - for (;;) - { - unsigned char c1 = (unsigned char)*s1++; - unsigned char c2 = (unsigned char)*s2++; - if (c1 < c2) return -1; - if (c1 > c2) return 1; - if (c1 == 0) return 0; - } -} - -int MyStringCompare(const wchar_t *s1, const wchar_t *s2) -{ - for (;;) - { - wchar_t c1 = *s1++; - wchar_t c2 = *s2++; - if (c1 < c2) return -1; - if (c1 > c2) return 1; - if (c1 == 0) return 0; - } -} - -int MyStringCompareNoCase(const wchar_t *s1, const wchar_t *s2) -{ - for (;;) - { - wchar_t c1 = *s1++; - wchar_t c2 = *s2++; - if (c1 != c2) - { - wchar_t u1 = MyCharUpper(c1); - wchar_t u2 = MyCharUpper(c2); - if (u1 < u2) return -1; - if (u1 > u2) return 1; - } - if (c1 == 0) return 0; - } -} - -#ifdef _WIN32 -int MyStringCompareNoCase(const char *s1, const char *s2) -{ - return MyStringCompareNoCase(MultiByteToUnicodeString(s1), MultiByteToUnicodeString(s2)); -} -#endif diff --git a/desmume/src/windows/7z/CPP/Common/MyString.h b/desmume/src/windows/7z/CPP/Common/MyString.h deleted file mode 100644 index 74c8af2fc..000000000 --- a/desmume/src/windows/7z/CPP/Common/MyString.h +++ /dev/null @@ -1,631 +0,0 @@ -// Common/String.h - -#ifndef __COMMON_STRING_H -#define __COMMON_STRING_H - -#include -// #include - -#include "MyVector.h" - -#ifdef _WIN32 -#include "MyWindows.h" -#endif - -template -inline int MyStringLen(const T *s) -{ - int i; - for (i = 0; s[i] != '\0'; i++); - return i; -} - -template -inline T * MyStringCopy(T *dest, const T *src) -{ - T *destStart = dest; - while ((*dest++ = *src++) != 0); - return destStart; -} - -inline wchar_t* MyStringGetNextCharPointer(wchar_t *p) - { return (p + 1); } -inline const wchar_t* MyStringGetNextCharPointer(const wchar_t *p) - { return (p + 1); } -inline wchar_t* MyStringGetPrevCharPointer(const wchar_t *, wchar_t *p) - { return (p - 1); } -inline const wchar_t* MyStringGetPrevCharPointer(const wchar_t *, const wchar_t *p) - { return (p - 1); } - -#ifdef _WIN32 - -inline char* MyStringGetNextCharPointer(char *p) - { return CharNextA(p); } -inline const char* MyStringGetNextCharPointer(const char *p) - { return CharNextA(p); } - -inline char* MyStringGetPrevCharPointer(char *base, char *p) - { return CharPrevA(base, p); } -inline const char* MyStringGetPrevCharPointer(const char *base, const char *p) - { return CharPrevA(base, p); } - -inline char MyCharUpper(char c) - { return (char)(unsigned int)(UINT_PTR)CharUpperA((LPSTR)(UINT_PTR)(unsigned int)(unsigned char)c); } -#ifdef _UNICODE -inline wchar_t MyCharUpper(wchar_t c) - { return (wchar_t)(unsigned int)(UINT_PTR)CharUpperW((LPWSTR)(UINT_PTR)(unsigned int)c); } -#else -wchar_t MyCharUpper(wchar_t c); -#endif - -inline char MyCharLower(char c) - { return (char)(unsigned int)(UINT_PTR)CharLowerA((LPSTR)(UINT_PTR)(unsigned int)(unsigned char)c); } -#ifdef _UNICODE -inline wchar_t MyCharLower(wchar_t c) - { return (wchar_t)(unsigned int)(UINT_PTR)CharLowerW((LPWSTR)(UINT_PTR)(unsigned int)c); } -#else -wchar_t MyCharLower(wchar_t c); -#endif - -inline char * MyStringUpper(char *s) { return CharUpperA(s); } -#ifdef _UNICODE -inline wchar_t * MyStringUpper(wchar_t *s) { return CharUpperW(s); } -#else -wchar_t * MyStringUpper(wchar_t *s); -#endif - -inline char * MyStringLower(char *s) { return CharLowerA(s); } -#ifdef _UNICODE -inline wchar_t * MyStringLower(wchar_t *s) { return CharLowerW(s); } -#else -wchar_t * MyStringLower(wchar_t *s); -#endif - -#else // Standard-C -wchar_t MyCharUpper(wchar_t c); -#endif - -////////////////////////////////////// -// Compare - -/* -#ifndef _WIN32_WCE -int MyStringCollate(const char *s1, const char *s2); -int MyStringCollateNoCase(const char *s1, const char *s2); -#endif -int MyStringCollate(const wchar_t *s1, const wchar_t *s2); -int MyStringCollateNoCase(const wchar_t *s1, const wchar_t *s2); -*/ - -int MyStringCompare(const char *s1, const char *s2); -int MyStringCompare(const wchar_t *s1, const wchar_t *s2); - -#ifdef _WIN32 -int MyStringCompareNoCase(const char *s1, const char *s2); -#endif - -int MyStringCompareNoCase(const wchar_t *s1, const wchar_t *s2); - -template -class CStringBase -{ - void TrimLeftWithCharSet(const CStringBase &charSet) - { - const T *p = _chars; - while (charSet.Find(*p) >= 0 && (*p != 0)) - p = GetNextCharPointer(p); - Delete(0, (int)(p - _chars)); - } - void TrimRightWithCharSet(const CStringBase &charSet) - { - const T *p = _chars; - const T *pLast = NULL; - while (*p != 0) - { - if (charSet.Find(*p) >= 0) - { - if (pLast == NULL) - pLast = p; - } - else - pLast = NULL; - p = GetNextCharPointer(p); - } - if (pLast != NULL) - { - int i = (int)(pLast - _chars); - Delete(i, _length - i); - } - - } - void MoveItems(int destIndex, int srcIndex) - { - memmove(_chars + destIndex, _chars + srcIndex, - sizeof(T) * (_length - srcIndex + 1)); - } - - void InsertSpace(int &index, int size) - { - CorrectIndex(index); - GrowLength(size); - MoveItems(index + size, index); - } - - static T *GetNextCharPointer(T *p) - { return MyStringGetNextCharPointer(p); } - static const T *GetNextCharPointer(const T *p) - { return MyStringGetNextCharPointer(p); } - static T *GetPrevCharPointer(T *base, T *p) - { return MyStringGetPrevCharPointer(base, p); } - static const T *GetPrevCharPointer(const T *base, const T *p) - { return MyStringGetPrevCharPointer(base, p); } -protected: - T *_chars; - int _length; - int _capacity; - - void SetCapacity(int newCapacity) - { - int realCapacity = newCapacity + 1; - if (realCapacity == _capacity) - return; - /* - const int kMaxStringSize = 0x20000000; - #ifndef _WIN32_WCE - if (newCapacity > kMaxStringSize || newCapacity < _length) - throw 1052337; - #endif - */ - T *newBuffer = new T[realCapacity]; - if (_capacity > 0) - { - for (int i = 0; i < _length; i++) - newBuffer[i] = _chars[i]; - delete []_chars; - } - _chars = newBuffer; - _chars[_length] = 0; - _capacity = realCapacity; - } - - void GrowLength(int n) - { - int freeSize = _capacity - _length - 1; - if (n <= freeSize) - return; - int delta; - if (_capacity > 64) - delta = _capacity / 2; - else if (_capacity > 8) - delta = 16; - else - delta = 4; - if (freeSize + delta < n) - delta = n - freeSize; - SetCapacity(_capacity + delta); - } - - void CorrectIndex(int &index) const - { - if (index > _length) - index = _length; - } - -public: - CStringBase(): _chars(0), _length(0), _capacity(0) { SetCapacity(3); } - CStringBase(T c): _chars(0), _length(0), _capacity(0) - { - SetCapacity(1); - _chars[0] = c; - _chars[1] = 0; - _length = 1; - } - CStringBase(const T *chars): _chars(0), _length(0), _capacity(0) - { - int length = MyStringLen(chars); - SetCapacity(length); - MyStringCopy(_chars, chars); // can be optimized by memove() - _length = length; - } - CStringBase(const CStringBase &s): _chars(0), _length(0), _capacity(0) - { - SetCapacity(s._length); - MyStringCopy(_chars, s._chars); - _length = s._length; - } - ~CStringBase() { delete []_chars; } - - operator const T*() const { return _chars;} - - // The minimum size of the character buffer in characters. - // This value does not include space for a null terminator. - T* GetBuffer(int minBufLength) - { - if (minBufLength >= _capacity) - SetCapacity(minBufLength); - return _chars; - } - void ReleaseBuffer() { ReleaseBuffer(MyStringLen(_chars)); } - void ReleaseBuffer(int newLength) - { - /* - #ifndef _WIN32_WCE - if (newLength >= _capacity) - throw 282217; - #endif - */ - _chars[newLength] = 0; - _length = newLength; - } - - CStringBase& operator=(T c) - { - Empty(); - SetCapacity(1); - _chars[0] = c; - _chars[1] = 0; - _length = 1; - return *this; - } - CStringBase& operator=(const T *chars) - { - Empty(); - int length = MyStringLen(chars); - SetCapacity(length); - MyStringCopy(_chars, chars); - _length = length; - return *this; - } - CStringBase& operator=(const CStringBase& s) - { - if (&s == this) - return *this; - Empty(); - SetCapacity(s._length); - MyStringCopy(_chars, s._chars); - _length = s._length; - return *this; - } - - CStringBase& operator+=(T c) - { - GrowLength(1); - _chars[_length] = c; - _chars[++_length] = 0; - return *this; - } - CStringBase& operator+=(const T *s) - { - int len = MyStringLen(s); - GrowLength(len); - MyStringCopy(_chars + _length, s); - _length += len; - return *this; - } - CStringBase& operator+=(const CStringBase &s) - { - GrowLength(s._length); - MyStringCopy(_chars + _length, s._chars); - _length += s._length; - return *this; - } - void Empty() - { - _length = 0; - _chars[0] = 0; - } - int Length() const { return _length; } - bool IsEmpty() const { return (_length == 0); } - - CStringBase Mid(int startIndex) const - { return Mid(startIndex, _length - startIndex); } - CStringBase Mid(int startIndex, int count ) const - { - if (startIndex + count > _length) - count = _length - startIndex; - - if (startIndex == 0 && startIndex + count == _length) - return *this; - - CStringBase result; - result.SetCapacity(count); - // MyStringNCopy(result._chars, _chars + startIndex, count); - for (int i = 0; i < count; i++) - result._chars[i] = _chars[startIndex + i]; - result._chars[count] = 0; - result._length = count; - return result; - } - CStringBase Left(int count) const - { return Mid(0, count); } - CStringBase Right(int count) const - { - if (count > _length) - count = _length; - return Mid(_length - count, count); - } - - void MakeUpper() - { MyStringUpper(_chars); } - void MakeLower() - { MyStringLower(_chars); } - - int Compare(const CStringBase& s) const - { return MyStringCompare(_chars, s._chars); } - - int Compare(const T *s) const - { return MyStringCompare(_chars, s); } - - int CompareNoCase(const CStringBase& s) const - { return MyStringCompareNoCase(_chars, s._chars); } - - int CompareNoCase(const T *s) const - { return MyStringCompareNoCase(_chars, s); } - - /* - int Collate(const CStringBase& s) const - { return MyStringCollate(_chars, s._chars); } - int CollateNoCase(const CStringBase& s) const - { return MyStringCollateNoCase(_chars, s._chars); } - */ - - int Find(T c) const { return Find(c, 0); } - int Find(T c, int startIndex) const - { - T *p = _chars + startIndex; - for (;;) - { - if (*p == c) - return (int)(p - _chars); - if (*p == 0) - return -1; - p = GetNextCharPointer(p); - } - } - int Find(const CStringBase &s) const { return Find(s, 0); } - int Find(const CStringBase &s, int startIndex) const - { - if (s.IsEmpty()) - return startIndex; - for (; startIndex < _length; startIndex++) - { - int j; - for (j = 0; j < s._length && startIndex + j < _length; j++) - if (_chars[startIndex+j] != s._chars[j]) - break; - if (j == s._length) - return startIndex; - } - return -1; - } - int ReverseFind(T c) const - { - if (_length == 0) - return -1; - T *p = _chars + _length - 1; - for (;;) - { - if (*p == c) - return (int)(p - _chars); - if (p == _chars) - return -1; - p = GetPrevCharPointer(_chars, p); - } - } - int FindOneOf(const CStringBase &s) const - { - for (int i = 0; i < _length; i++) - if (s.Find(_chars[i]) >= 0) - return i; - return -1; - } - - void TrimLeft(T c) - { - const T *p = _chars; - while (c == *p) - p = GetNextCharPointer(p); - Delete(0, p - _chars); - } - private: - CStringBase GetTrimDefaultCharSet() - { - CStringBase charSet; - charSet += (T)' '; - charSet += (T)'\n'; - charSet += (T)'\t'; - return charSet; - } - public: - - void TrimLeft() - { - TrimLeftWithCharSet(GetTrimDefaultCharSet()); - } - void TrimRight() - { - TrimRightWithCharSet(GetTrimDefaultCharSet()); - } - void TrimRight(T c) - { - const T *p = _chars; - const T *pLast = NULL; - while (*p != 0) - { - if (*p == c) - { - if (pLast == NULL) - pLast = p; - } - else - pLast = NULL; - p = GetNextCharPointer(p); - } - if (pLast != NULL) - { - int i = pLast - _chars; - Delete(i, _length - i); - } - } - void Trim() - { - TrimRight(); - TrimLeft(); - } - - int Insert(int index, T c) - { - InsertSpace(index, 1); - _chars[index] = c; - _length++; - return _length; - } - int Insert(int index, const CStringBase &s) - { - CorrectIndex(index); - if (s.IsEmpty()) - return _length; - int numInsertChars = s.Length(); - InsertSpace(index, numInsertChars); - for (int i = 0; i < numInsertChars; i++) - _chars[index + i] = s[i]; - _length += numInsertChars; - return _length; - } - - // !!!!!!!!!!!!!!! test it if newChar = '\0' - int Replace(T oldChar, T newChar) - { - if (oldChar == newChar) - return 0; - int number = 0; - int pos = 0; - while (pos < Length()) - { - pos = Find(oldChar, pos); - if (pos < 0) - break; - _chars[pos] = newChar; - pos++; - number++; - } - return number; - } - int Replace(const CStringBase &oldString, const CStringBase &newString) - { - if (oldString.IsEmpty()) - return 0; - if (oldString == newString) - return 0; - int oldStringLength = oldString.Length(); - int newStringLength = newString.Length(); - int number = 0; - int pos = 0; - while (pos < _length) - { - pos = Find(oldString, pos); - if (pos < 0) - break; - Delete(pos, oldStringLength); - Insert(pos, newString); - pos += newStringLength; - number++; - } - return number; - } - int Delete(int index, int count = 1 ) - { - if (index + count > _length) - count = _length - index; - if (count > 0) - { - MoveItems(index, index + count); - _length -= count; - } - return _length; - } -}; - -template -CStringBase operator+(const CStringBase& s1, const CStringBase& s2) -{ - CStringBase result(s1); - result += s2; - return result; -} - -template -CStringBase operator+(const CStringBase& s, T c) -{ - CStringBase result(s); - result += c; - return result; -} - -template -CStringBase operator+(T c, const CStringBase& s) -{ - CStringBase result(c); - result += s; - return result; -} - -template -CStringBase operator+(const CStringBase& s, const T * chars) -{ - CStringBase result(s); - result += chars; - return result; -} - -template -CStringBase operator+(const T * chars, const CStringBase& s) -{ - CStringBase result(chars); - result += s; - return result; -} - -template -bool operator==(const CStringBase& s1, const CStringBase& s2) - { return (s1.Compare(s2) == 0); } - -template -bool operator<(const CStringBase& s1, const CStringBase& s2) - { return (s1.Compare(s2) < 0); } - -template -bool operator==(const T *s1, const CStringBase& s2) - { return (s2.Compare(s1) == 0); } - -template -bool operator==(const CStringBase& s1, const T *s2) - { return (s1.Compare(s2) == 0); } - -template -bool operator!=(const CStringBase& s1, const CStringBase& s2) - { return (s1.Compare(s2) != 0); } - -template -bool operator!=(const T *s1, const CStringBase& s2) - { return (s2.Compare(s1) != 0); } - -template -bool operator!=(const CStringBase& s1, const T *s2) - { return (s1.Compare(s2) != 0); } - -typedef CStringBase AString; -typedef CStringBase UString; - -typedef CObjectVector AStringVector; -typedef CObjectVector UStringVector; - -#ifdef _UNICODE - typedef UString CSysString; -#else - typedef AString CSysString; -#endif - -typedef CObjectVector CSysStringVector; - -#endif diff --git a/desmume/src/windows/7z/CPP/Common/MyUnknown.h b/desmume/src/windows/7z/CPP/Common/MyUnknown.h deleted file mode 100644 index 257fa4ab7..000000000 --- a/desmume/src/windows/7z/CPP/Common/MyUnknown.h +++ /dev/null @@ -1,24 +0,0 @@ -// MyUnknown.h - -#ifndef __MYUNKNOWN_H -#define __MYUNKNOWN_H - -#ifdef _WIN32 - -#ifdef _WIN32_WCE -#if (_WIN32_WCE > 300) -#include -#else -#define MIDL_INTERFACE(x) struct -#endif -#else -#include -#endif - -#include - -#else -#include "MyWindows.h" -#endif - -#endif diff --git a/desmume/src/windows/7z/CPP/Common/MyVector.cpp b/desmume/src/windows/7z/CPP/Common/MyVector.cpp deleted file mode 100644 index e0788b751..000000000 --- a/desmume/src/windows/7z/CPP/Common/MyVector.cpp +++ /dev/null @@ -1,90 +0,0 @@ -// Common/MyVector.cpp - -#include "StdAfx.h" - -#include - -#include "MyVector.h" - -CBaseRecordVector::~CBaseRecordVector() { ClearAndFree(); } - -void CBaseRecordVector::ClearAndFree() -{ - Clear(); - delete []((unsigned char *)_items); - _capacity = 0; - _size = 0; - _items = 0; -} - -void CBaseRecordVector::Clear() { DeleteFrom(0); } -void CBaseRecordVector::DeleteBack() { Delete(_size - 1); } -void CBaseRecordVector::DeleteFrom(int index) -{ - Delete(index, _size - index); -} - -void CBaseRecordVector::ReserveOnePosition() -{ - if (_size != _capacity) - return; - int delta = 1; - if (_capacity >= 64) - delta = _capacity / 4; - else if (_capacity >= 8) - delta = 8; - Reserve(_capacity + delta); -} - -void CBaseRecordVector::Reserve(int newCapacity) -{ - // if (newCapacity <= _capacity) - if (newCapacity == _capacity) - return; - if ((unsigned)newCapacity >= ((unsigned)1 << (sizeof(unsigned) * 8 - 1))) - throw 1052353; - size_t newSize = (size_t)(unsigned)newCapacity * _itemSize; - if (newSize / _itemSize != (size_t)(unsigned)newCapacity) - throw 1052354; - unsigned char *p = NULL; - if (newSize > 0) - { - p = new unsigned char[newSize]; - if (p == 0) - throw 1052355; - int numRecordsToMove = (_size < newCapacity ? _size : newCapacity); - memcpy(p, _items, _itemSize * numRecordsToMove); - } - delete [](unsigned char *)_items; - _items = p; - _capacity = newCapacity; -} - -void CBaseRecordVector::ReserveDown() -{ - Reserve(_size); -} - -void CBaseRecordVector::MoveItems(int destIndex, int srcIndex) -{ - memmove(((unsigned char *)_items) + destIndex * _itemSize, - ((unsigned char *)_items) + srcIndex * _itemSize, - _itemSize * (_size - srcIndex)); -} - -void CBaseRecordVector::InsertOneItem(int index) -{ - ReserveOnePosition(); - MoveItems(index + 1, index); - _size++; -} - -void CBaseRecordVector::Delete(int index, int num) -{ - TestIndexAndCorrectNum(index, num); - if (num > 0) - { - MoveItems(index, index + num); - _size -= num; - } -} diff --git a/desmume/src/windows/7z/CPP/Common/MyVector.h b/desmume/src/windows/7z/CPP/Common/MyVector.h deleted file mode 100644 index b8f4cd929..000000000 --- a/desmume/src/windows/7z/CPP/Common/MyVector.h +++ /dev/null @@ -1,256 +0,0 @@ -// Common/Vector.h - -#ifndef __COMMON_VECTOR_H -#define __COMMON_VECTOR_H - -#include "Defs.h" - -class CBaseRecordVector -{ - void MoveItems(int destIndex, int srcIndex); -protected: - int _capacity; - int _size; - void *_items; - size_t _itemSize; - - void ReserveOnePosition(); - void InsertOneItem(int index); - void TestIndexAndCorrectNum(int index, int &num) const - { if (index + num > _size) num = _size - index; } -public: - CBaseRecordVector(size_t itemSize): _capacity(0), _size(0), _items(0), _itemSize(itemSize) {} - virtual ~CBaseRecordVector(); - void ClearAndFree(); - int Size() const { return _size; } - bool IsEmpty() const { return (_size == 0); } - void Reserve(int newCapacity); - void ReserveDown(); - virtual void Delete(int index, int num = 1); - void Clear(); - void DeleteFrom(int index); - void DeleteBack(); -}; - -template -class CRecordVector: public CBaseRecordVector -{ -public: - CRecordVector(): CBaseRecordVector(sizeof(T)){}; - CRecordVector(const CRecordVector &v): CBaseRecordVector(sizeof(T)) { *this = v; } - CRecordVector& operator=(const CRecordVector &v) - { - Clear(); - return (*this += v); - } - CRecordVector& operator+=(const CRecordVector &v) - { - int size = v.Size(); - Reserve(Size() + size); - for (int i = 0; i < size; i++) - Add(v[i]); - return *this; - } - int Add(T item) - { - ReserveOnePosition(); - ((T *)_items)[_size] = item; - return _size++; - } - void Insert(int index, T item) - { - InsertOneItem(index); - ((T *)_items)[index] = item; - } - // T* GetPointer() const { return (T*)_items; } - // operator const T *() const { return _items; }; - const T& operator[](int index) const { return ((T *)_items)[index]; } - T& operator[](int index) { return ((T *)_items)[index]; } - const T& Front() const { return operator[](0); } - T& Front() { return operator[](0); } - const T& Back() const { return operator[](_size - 1); } - T& Back() { return operator[](_size - 1); } - - void Swap(int i, int j) - { - T temp = operator[](i); - operator[](i) = operator[](j); - operator[](j) = temp; - } - - int FindInSorted(const T& item) const - { - int left = 0, right = Size(); - while (left != right) - { - int mid = (left + right) / 2; - const T& midValue = (*this)[mid]; - if (item == midValue) - return mid; - if (item < midValue) - right = mid; - else - left = mid + 1; - } - return -1; - } - - int AddToUniqueSorted(const T& item) - { - int left = 0, right = Size(); - while (left != right) - { - int mid = (left + right) / 2; - const T& midValue = (*this)[mid]; - if (item == midValue) - return mid; - if (item < midValue) - right = mid; - else - left = mid + 1; - } - Insert(right, item); - return right; - } - - static void SortRefDown(T* p, int k, int size, int (*compare)(const T*, const T*, void *), void *param) - { - T temp = p[k]; - for (;;) - { - int s = (k << 1); - if (s > size) - break; - if (s < size && compare(p + s + 1, p + s, param) > 0) - s++; - if (compare(&temp, p + s, param) >= 0) - break; - p[k] = p[s]; - k = s; - } - p[k] = temp; - } - - void Sort(int (*compare)(const T*, const T*, void *), void *param) - { - int size = _size; - if (size <= 1) - return; - T* p = (&Front()) - 1; - { - int i = size / 2; - do - SortRefDown(p, i, size, compare, param); - while (--i != 0); - } - do - { - T temp = p[size]; - p[size--] = p[1]; - p[1] = temp; - SortRefDown(p, 1, size, compare, param); - } - while (size > 1); - } -}; - -typedef CRecordVector CIntVector; -typedef CRecordVector CUIntVector; -typedef CRecordVector CBoolVector; -typedef CRecordVector CByteVector; -typedef CRecordVector CPointerVector; - -template -class CObjectVector: public CPointerVector -{ -public: - CObjectVector() {}; - ~CObjectVector() { Clear(); }; - CObjectVector(const CObjectVector &v) { *this = v; } - CObjectVector& operator=(const CObjectVector &v) - { - Clear(); - return (*this += v); - } - CObjectVector& operator+=(const CObjectVector &v) - { - int size = v.Size(); - Reserve(Size() + size); - for (int i = 0; i < size; i++) - Add(v[i]); - return *this; - } - const T& operator[](int index) const - { - return *((T *)CPointerVector::operator[](index)); - } - T& operator[](int index) - { - return *((T *)CPointerVector::operator[](index)); - } - T& Front() { return operator[](0); } - const T& Front() const { return operator[](0); } - T& Back() { return operator[](_size - 1); } - const T& Back() const { return operator[](_size - 1); } - int Add(const T& item) { return CPointerVector::Add(new T(item)); } - void Insert(int index, const T& item) { CPointerVector::Insert(index, new T(item)); } - virtual void Delete(int index, int num = 1) - { - TestIndexAndCorrectNum(index, num); - for (int i = 0; i < num; i++) - delete (T *)(((void **)_items)[index + i]); - CPointerVector::Delete(index, num); - } - int Find(const T& item) const - { - for (int i = 0; i < Size(); i++) - if (item == (*this)[i]) - return i; - return -1; - } - int FindInSorted(const T& item) const - { - int left = 0, right = Size(); - while (left != right) - { - int mid = (left + right) / 2; - const T& midValue = (*this)[mid]; - if (item == midValue) - return mid; - if (item < midValue) - right = mid; - else - left = mid + 1; - } - return -1; - } - int AddToSorted(const T& item) - { - int left = 0, right = Size(); - while (left != right) - { - int mid = (left + right) / 2; - const T& midValue = (*this)[mid]; - if (item == midValue) - { - right = mid + 1; - break; - } - if (item < midValue) - right = mid; - else - left = mid + 1; - } - Insert(right, item); - return right; - } - - void Sort(int (*compare)(void *const *, void *const *, void *), void *param) - { CPointerVector::Sort(compare, param); } - - static int CompareObjectItems(void *const *a1, void *const *a2, void * /* param */) - { return MyCompare(*(*((const T **)a1)), *(*((const T **)a2))); } - void Sort() { CPointerVector::Sort(CompareObjectItems, 0); } -}; - -#endif diff --git a/desmume/src/windows/7z/CPP/Common/MyWindows.h b/desmume/src/windows/7z/CPP/Common/MyWindows.h deleted file mode 100644 index 0329ff709..000000000 --- a/desmume/src/windows/7z/CPP/Common/MyWindows.h +++ /dev/null @@ -1,214 +0,0 @@ -// MyWindows.h - -#ifndef __MYWINDOWS_H -#define __MYWINDOWS_H - -#ifdef _WIN32 - -#include - -#define CHAR_PATH_SEPARATOR '\\' -#define WCHAR_PATH_SEPARATOR L'\\' -#define STRING_PATH_SEPARATOR "\\" -#define WSTRING_PATH_SEPARATOR L"\\" - -#else - -#define CHAR_PATH_SEPARATOR '/' -#define WCHAR_PATH_SEPARATOR L'/' -#define STRING_PATH_SEPARATOR "/" -#define WSTRING_PATH_SEPARATOR L"/" - -#include // for wchar_t -#include - -#include "MyGuidDef.h" - -typedef char CHAR; -typedef unsigned char UCHAR; - -#undef BYTE -typedef unsigned char BYTE; - -typedef short SHORT; -typedef unsigned short USHORT; - -#undef WORD -typedef unsigned short WORD; -typedef short VARIANT_BOOL; - -typedef int INT; -typedef Int32 INT32; -typedef unsigned int UINT; -typedef UInt32 UINT32; -typedef INT32 LONG; // LONG, ULONG and DWORD must be 32-bit -typedef UINT32 ULONG; - -#undef DWORD -typedef UINT32 DWORD; - -typedef Int64 LONGLONG; -typedef UInt64 ULONGLONG; - -typedef struct LARGE_INTEGER { LONGLONG QuadPart; }LARGE_INTEGER; -typedef struct _ULARGE_INTEGER { ULONGLONG QuadPart;} ULARGE_INTEGER; - -typedef const CHAR *LPCSTR; -typedef CHAR TCHAR; -typedef const TCHAR *LPCTSTR; -typedef wchar_t WCHAR; -typedef WCHAR OLECHAR; -typedef const WCHAR *LPCWSTR; -typedef OLECHAR *BSTR; -typedef const OLECHAR *LPCOLESTR; -typedef OLECHAR *LPOLESTR; - -typedef struct _FILETIME -{ - DWORD dwLowDateTime; - DWORD dwHighDateTime; -}FILETIME; - -#define HRESULT LONG -#define FAILED(Status) ((HRESULT)(Status)<0) -typedef ULONG PROPID; -typedef LONG SCODE; - -#define S_OK ((HRESULT)0x00000000L) -#define S_FALSE ((HRESULT)0x00000001L) -#define E_NOTIMPL ((HRESULT)0x80004001L) -#define E_NOINTERFACE ((HRESULT)0x80004002L) -#define E_ABORT ((HRESULT)0x80004004L) -#define E_FAIL ((HRESULT)0x80004005L) -#define STG_E_INVALIDFUNCTION ((HRESULT)0x80030001L) -#define E_OUTOFMEMORY ((HRESULT)0x8007000EL) -#define E_INVALIDARG ((HRESULT)0x80070057L) - -#ifdef _MSC_VER -#define STDMETHODCALLTYPE __stdcall -#else -#define STDMETHODCALLTYPE -#endif - -#define STDMETHOD_(t, f) virtual t STDMETHODCALLTYPE f -#define STDMETHOD(f) STDMETHOD_(HRESULT, f) -#define STDMETHODIMP_(type) type STDMETHODCALLTYPE -#define STDMETHODIMP STDMETHODIMP_(HRESULT) - -#define PURE = 0 - -#define MIDL_INTERFACE(x) struct - -#ifdef __cplusplus - -DEFINE_GUID(IID_IUnknown, -0x00000000, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46); -struct IUnknown -{ - STDMETHOD(QueryInterface) (REFIID iid, void **outObject) PURE; - STDMETHOD_(ULONG, AddRef)() PURE; - STDMETHOD_(ULONG, Release)() PURE; - #ifndef _WIN32 - virtual ~IUnknown() {} - #endif -}; - -typedef IUnknown *LPUNKNOWN; - -#endif - -#define VARIANT_TRUE ((VARIANT_BOOL)-1) -#define VARIANT_FALSE ((VARIANT_BOOL)0) - -enum VARENUM -{ - VT_EMPTY = 0, - VT_NULL = 1, - VT_I2 = 2, - VT_I4 = 3, - VT_R4 = 4, - VT_R8 = 5, - VT_CY = 6, - VT_DATE = 7, - VT_BSTR = 8, - VT_DISPATCH = 9, - VT_ERROR = 10, - VT_BOOL = 11, - VT_VARIANT = 12, - VT_UNKNOWN = 13, - VT_DECIMAL = 14, - VT_I1 = 16, - VT_UI1 = 17, - VT_UI2 = 18, - VT_UI4 = 19, - VT_I8 = 20, - VT_UI8 = 21, - VT_INT = 22, - VT_UINT = 23, - VT_VOID = 24, - VT_HRESULT = 25, - VT_FILETIME = 64 -}; - -typedef unsigned short VARTYPE; -typedef WORD PROPVAR_PAD1; -typedef WORD PROPVAR_PAD2; -typedef WORD PROPVAR_PAD3; - -#ifdef __cplusplus - -typedef struct tagPROPVARIANT -{ - VARTYPE vt; - PROPVAR_PAD1 wReserved1; - PROPVAR_PAD2 wReserved2; - PROPVAR_PAD3 wReserved3; - union - { - CHAR cVal; - UCHAR bVal; - SHORT iVal; - USHORT uiVal; - LONG lVal; - ULONG ulVal; - INT intVal; - UINT uintVal; - LARGE_INTEGER hVal; - ULARGE_INTEGER uhVal; - VARIANT_BOOL boolVal; - SCODE scode; - FILETIME filetime; - BSTR bstrVal; - }; -} PROPVARIANT; - -typedef PROPVARIANT tagVARIANT; -typedef tagVARIANT VARIANT; -typedef VARIANT VARIANTARG; - -MY_EXTERN_C HRESULT VariantClear(VARIANTARG *prop); -MY_EXTERN_C HRESULT VariantCopy(VARIANTARG *dest, VARIANTARG *src); - -#endif - -MY_EXTERN_C BSTR SysAllocStringByteLen(LPCSTR psz, UINT len); -MY_EXTERN_C BSTR SysAllocString(const OLECHAR *sz); -MY_EXTERN_C void SysFreeString(BSTR bstr); -MY_EXTERN_C UINT SysStringByteLen(BSTR bstr); -MY_EXTERN_C UINT SysStringLen(BSTR bstr); - -MY_EXTERN_C DWORD GetLastError(); -MY_EXTERN_C LONG CompareFileTime(const FILETIME* ft1, const FILETIME* ft2); - -#define CP_ACP 0 -#define CP_OEMCP 1 - -typedef enum tagSTREAM_SEEK -{ - STREAM_SEEK_SET = 0, - STREAM_SEEK_CUR = 1, - STREAM_SEEK_END = 2 -} STREAM_SEEK; - -#endif -#endif diff --git a/desmume/src/windows/7z/CPP/Common/MyXml.cpp b/desmume/src/windows/7z/CPP/Common/MyXml.cpp deleted file mode 100644 index c18570e93..000000000 --- a/desmume/src/windows/7z/CPP/Common/MyXml.cpp +++ /dev/null @@ -1,209 +0,0 @@ -// MyXml.cpp - -#include "StdAfx.h" - -#include "MyXml.h" - -static bool IsValidChar(char c) -{ - return - c >= 'a' && c <= 'z' || - c >= 'A' && c <= 'Z' || - c >= '0' && c <= '9' || - c == '-'; -} - -static bool IsSpaceChar(char c) -{ - return (c == ' ' || c == '\t' || c == 0x0D || c == 0x0A); -} - -#define SKEEP_SPACES(s, pos) while (IsSpaceChar(s[pos])) pos++; - -static bool ReadProperty(const AString &s, int &pos, CXmlProp &prop) -{ - prop.Name.Empty(); - prop.Value.Empty(); - for (; pos < s.Length(); pos++) - { - char c = s[pos]; - if (!IsValidChar(c)) - break; - prop.Name += c; - } - - if (prop.Name.IsEmpty()) - return false; - - SKEEP_SPACES(s, pos); - if (s[pos++] != '=') - return false; - - SKEEP_SPACES(s, pos); - if (s[pos++] != '\"') - return false; - - while (pos < s.Length()) - { - char c = s[pos++]; - if (c == '\"') - return true; - prop.Value += c; - } - return false; -} - -int CXmlItem::FindProperty(const AString &propName) const -{ - for (int i = 0; i < Props.Size(); i++) - if (Props[i].Name == propName) - return i; - return -1; -} - -AString CXmlItem::GetPropertyValue(const AString &propName) const -{ - int index = FindProperty(propName); - if (index >= 0) - return Props[index].Value; - return AString(); -} - -bool CXmlItem::IsTagged(const AString &tag) const -{ - return (IsTag && Name == tag); -} - -int CXmlItem::FindSubTag(const AString &tag) const -{ - for (int i = 0; i < SubItems.Size(); i++) - if (SubItems[i].IsTagged(tag)) - return i; - return -1; -} - -AString CXmlItem::GetSubString() const -{ - if (SubItems.Size() == 1) - { - const CXmlItem &item = SubItems[0]; - if (!item.IsTag) - return item.Name; - } - return AString(); -} - -AString CXmlItem::GetSubStringForTag(const AString &tag) const -{ - int index = FindSubTag(tag); - if (index >= 0) - return SubItems[index].GetSubString(); - return AString(); -} - -bool CXmlItem::ParseItems(const AString &s, int &pos, int numAllowedLevels) -{ - if (numAllowedLevels == 0) - return false; - SubItems.Clear(); - AString finishString = "'); - } - if (s[pos] == '>') - { - if (!ParseItems(s, ++pos, numAllowedLevels)) - return false; - AString finishString = AString(""); - if (s.Mid(pos, finishString.Length()) != finishString) - return false; - pos += finishString.Length(); - return true; - } - if (posTemp == pos) - return false; - - CXmlProp prop; - if (!ReadProperty(s, pos, prop)) - return false; - Props.Add(prop); - posTemp = pos; - } -} - -bool SkeepHeader(const AString &s, int &pos, const AString &startString, const AString &endString) -{ - SKEEP_SPACES(s, pos); - if (s.Mid(pos, startString.Length()) == startString) - { - pos = s.Find(endString, pos); - if (pos < 0) - return false; - pos += endString.Length(); - SKEEP_SPACES(s, pos); - } - return true; -} - -bool CXml::Parse(const AString &s) -{ - int pos = 0; - if (!SkeepHeader(s, pos, "")) - return false; - if (!SkeepHeader(s, pos, "")) - return false; - if (!Root.ParseItem(s, pos, 1000)) - return false; - SKEEP_SPACES(s, pos); - return (pos == s.Length() && Root.IsTag); -} diff --git a/desmume/src/windows/7z/CPP/Common/MyXml.h b/desmume/src/windows/7z/CPP/Common/MyXml.h deleted file mode 100644 index 52e23d19c..000000000 --- a/desmume/src/windows/7z/CPP/Common/MyXml.h +++ /dev/null @@ -1,40 +0,0 @@ -// MyXml.h - -#ifndef __MYXML_H -#define __MYXML_H - -#include "MyString.h" - -struct CXmlProp -{ - AString Name; - AString Value; -}; - -class CXmlItem -{ - bool ParseItems(const AString &s, int &pos, int numAllowedLevels); - -public: - AString Name; - bool IsTag; - CObjectVector Props; - CObjectVector SubItems; - - bool ParseItem(const AString &s, int &pos, int numAllowedLevels); - - bool IsTagged(const AString &tag) const; - int FindProperty(const AString &propName) const; - AString GetPropertyValue(const AString &propName) const; - AString GetSubString() const; - int FindSubTag(const AString &tag) const; - AString GetSubStringForTag(const AString &tag) const; -}; - -struct CXml -{ - CXmlItem Root; - bool Parse(const AString &s); -}; - -#endif diff --git a/desmume/src/windows/7z/CPP/Common/NewHandler.cpp b/desmume/src/windows/7z/CPP/Common/NewHandler.cpp deleted file mode 100644 index 611bbd8f5..000000000 --- a/desmume/src/windows/7z/CPP/Common/NewHandler.cpp +++ /dev/null @@ -1,116 +0,0 @@ -// NewHandler.cpp - -#include "StdAfx.h" - -#include - -#include "NewHandler.h" - -// #define DEBUG_MEMORY_LEAK - -#ifndef DEBUG_MEMORY_LEAK - -#ifdef _WIN32 -void * -#ifdef _MSC_VER -__cdecl -#endif -operator new(size_t size) -{ - // void *p = ::HeapAlloc(::GetProcessHeap(), 0, size); - void *p = ::malloc(size); - if (p == 0) - throw CNewException(); - return p; -} - -void -#ifdef _MSC_VER -__cdecl -#endif -operator delete(void *p) throw() -{ - /* - if (p == 0) - return; - ::HeapFree(::GetProcessHeap(), 0, p); - */ - ::free(p); -} -#endif - -#else - -#pragma init_seg(lib) -const int kDebugSize = 1000000; -static void *a[kDebugSize]; -static int index = 0; - -static int numAllocs = 0; -void * __cdecl operator new(size_t size) -{ - numAllocs++; - void *p = HeapAlloc(GetProcessHeap(), 0, size); - if (index == 40) - { - int t = 1; - } - if (index < kDebugSize) - { - a[index] = p; - index++; - } - if (p == 0) - throw CNewException(); - printf("Alloc %6d, size = %8d\n", numAllocs, size); - return p; -} - -class CC -{ -public: - CC() - { - for (int i = 0; i < kDebugSize; i++) - a[i] = 0; - } - ~CC() - { - for (int i = 0; i < kDebugSize; i++) - if (a[i] != 0) - return; - } -} g_CC; - - -void __cdecl operator delete(void *p) -{ - if (p == 0) - return; - /* - for (int i = 0; i < index; i++) - if (a[i] == p) - a[i] = 0; - */ - HeapFree(GetProcessHeap(), 0, p); - numAllocs--; - printf("Free %d\n", numAllocs); -} - -#endif - -/* -int MemErrorVC(size_t) -{ - throw CNewException(); - // return 1; -} -CNewHandlerSetter::CNewHandlerSetter() -{ - // MemErrorOldVCFunction = _set_new_handler(MemErrorVC); -} -CNewHandlerSetter::~CNewHandlerSetter() -{ - // _set_new_handler(MemErrorOldVCFunction); -} -*/ diff --git a/desmume/src/windows/7z/CPP/Common/NewHandler.h b/desmume/src/windows/7z/CPP/Common/NewHandler.h deleted file mode 100644 index 6f710cda1..000000000 --- a/desmume/src/windows/7z/CPP/Common/NewHandler.h +++ /dev/null @@ -1,16 +0,0 @@ -// Common/NewHandler.h - -#ifndef __COMMON_NEWHANDLER_H -#define __COMMON_NEWHANDLER_H - -class CNewException {}; - -#ifdef _WIN32 -void -#ifdef _MSC_VER -__cdecl -#endif -operator delete(void *p) throw(); -#endif - -#endif diff --git a/desmume/src/windows/7z/CPP/Common/StringConvert.cpp b/desmume/src/windows/7z/CPP/Common/StringConvert.cpp deleted file mode 100644 index ebd014831..000000000 --- a/desmume/src/windows/7z/CPP/Common/StringConvert.cpp +++ /dev/null @@ -1,102 +0,0 @@ -// Common/StringConvert.cpp - -#include "StdAfx.h" - -#include "StringConvert.h" - -#ifndef _WIN32 -#include -#endif - -#ifdef _WIN32 -UString MultiByteToUnicodeString(const AString &srcString, UINT codePage) -{ - UString resultString; - if (!srcString.IsEmpty()) - { - int numChars = MultiByteToWideChar(codePage, 0, srcString, - srcString.Length(), resultString.GetBuffer(srcString.Length()), - srcString.Length() + 1); - #ifndef _WIN32_WCE - if (numChars == 0) - throw 282228; - #endif - resultString.ReleaseBuffer(numChars); - } - return resultString; -} - -AString UnicodeStringToMultiByte(const UString &s, UINT codePage, char defaultChar, bool &defaultCharWasUsed) -{ - AString dest; - defaultCharWasUsed = false; - if (!s.IsEmpty()) - { - int numRequiredBytes = s.Length() * 2; - BOOL defUsed; - int numChars = WideCharToMultiByte(codePage, 0, s, s.Length(), - dest.GetBuffer(numRequiredBytes), numRequiredBytes + 1, - &defaultChar, &defUsed); - defaultCharWasUsed = (defUsed != FALSE); - #ifndef _WIN32_WCE - if (numChars == 0) - throw 282229; - #endif - dest.ReleaseBuffer(numChars); - } - return dest; -} - -AString UnicodeStringToMultiByte(const UString &srcString, UINT codePage) -{ - bool defaultCharWasUsed; - return UnicodeStringToMultiByte(srcString, codePage, '_', defaultCharWasUsed); -} - -#ifndef _WIN32_WCE -AString SystemStringToOemString(const CSysString &srcString) -{ - AString result; - CharToOem(srcString, result.GetBuffer(srcString.Length() * 2)); - result.ReleaseBuffer(); - return result; -} -#endif - -#else - -UString MultiByteToUnicodeString(const AString &srcString, UINT codePage) -{ - UString resultString; - for (int i = 0; i < srcString.Length(); i++) - resultString += wchar_t(srcString[i]); - /* - if (!srcString.IsEmpty()) - { - int numChars = mbstowcs(resultString.GetBuffer(srcString.Length()), srcString, srcString.Length() + 1); - if (numChars < 0) throw "Your environment does not support UNICODE"; - resultString.ReleaseBuffer(numChars); - } - */ - return resultString; -} - -AString UnicodeStringToMultiByte(const UString &srcString, UINT codePage) -{ - AString resultString; - for (int i = 0; i < srcString.Length(); i++) - resultString += char(srcString[i]); - /* - if (!srcString.IsEmpty()) - { - int numRequiredBytes = srcString.Length() * 6 + 1; - int numChars = wcstombs(resultString.GetBuffer(numRequiredBytes), srcString, numRequiredBytes); - if (numChars < 0) throw "Your environment does not support UNICODE"; - resultString.ReleaseBuffer(numChars); - } - */ - return resultString; -} - -#endif - diff --git a/desmume/src/windows/7z/CPP/Common/StringConvert.h b/desmume/src/windows/7z/CPP/Common/StringConvert.h deleted file mode 100644 index e0a2332c9..000000000 --- a/desmume/src/windows/7z/CPP/Common/StringConvert.h +++ /dev/null @@ -1,73 +0,0 @@ -// Common/StringConvert.h - -#ifndef __COMMON_STRINGCONVERT_H -#define __COMMON_STRINGCONVERT_H - -#include "MyWindows.h" -#include "MyString.h" -#include "Types.h" - -UString MultiByteToUnicodeString(const AString &srcString, UINT codePage = CP_ACP); -AString UnicodeStringToMultiByte(const UString &srcString, UINT codePage, char defaultChar, bool &defaultCharWasUsed); -AString UnicodeStringToMultiByte(const UString &srcString, UINT codePage = CP_ACP); - - -inline const wchar_t* GetUnicodeString(const wchar_t* unicodeString) - { return unicodeString; } -inline const UString& GetUnicodeString(const UString &unicodeString) - { return unicodeString; } -inline UString GetUnicodeString(const AString &ansiString) - { return MultiByteToUnicodeString(ansiString); } -inline UString GetUnicodeString(const AString &multiByteString, UINT codePage) - { return MultiByteToUnicodeString(multiByteString, codePage); } -inline const wchar_t* GetUnicodeString(const wchar_t* unicodeString, UINT) - { return unicodeString; } -inline const UString& GetUnicodeString(const UString &unicodeString, UINT) - { return unicodeString; } - -inline const char* GetAnsiString(const char* ansiString) - { return ansiString; } -inline const AString& GetAnsiString(const AString &ansiString) - { return ansiString; } -inline AString GetAnsiString(const UString &unicodeString) - { return UnicodeStringToMultiByte(unicodeString); } - -inline const char* GetOemString(const char* oemString) - { return oemString; } -inline const AString& GetOemString(const AString &oemString) - { return oemString; } -inline AString GetOemString(const UString &unicodeString) - { return UnicodeStringToMultiByte(unicodeString, CP_OEMCP); } - - -#ifdef _UNICODE - inline const wchar_t* GetSystemString(const wchar_t* unicodeString) - { return unicodeString;} - inline const UString& GetSystemString(const UString &unicodeString) - { return unicodeString;} - inline const wchar_t* GetSystemString(const wchar_t* unicodeString, UINT /* codePage */) - { return unicodeString;} - inline const UString& GetSystemString(const UString &unicodeString, UINT /* codePage */) - { return unicodeString;} - inline UString GetSystemString(const AString &multiByteString, UINT codePage) - { return MultiByteToUnicodeString(multiByteString, codePage);} - inline UString GetSystemString(const AString &multiByteString) - { return MultiByteToUnicodeString(multiByteString);} -#else - inline const char* GetSystemString(const char *ansiString) - { return ansiString; } - inline const AString& GetSystemString(const AString &multiByteString, UINT) - { return multiByteString; } - inline const char * GetSystemString(const char *multiByteString, UINT) - { return multiByteString; } - inline AString GetSystemString(const UString &unicodeString) - { return UnicodeStringToMultiByte(unicodeString); } - inline AString GetSystemString(const UString &unicodeString, UINT codePage) - { return UnicodeStringToMultiByte(unicodeString, codePage); } -#endif - -#ifndef _WIN32_WCE -AString SystemStringToOemString(const CSysString &srcString); -#endif - -#endif diff --git a/desmume/src/windows/7z/CPP/Common/StringToInt.cpp b/desmume/src/windows/7z/CPP/Common/StringToInt.cpp deleted file mode 100644 index 77ce7c50b..000000000 --- a/desmume/src/windows/7z/CPP/Common/StringToInt.cpp +++ /dev/null @@ -1,90 +0,0 @@ -// Common/StringToInt.cpp - -#include "StdAfx.h" - -#include "StringToInt.h" - -UInt64 ConvertStringToUInt64(const char *s, const char **end) -{ - UInt64 result = 0; - for (;;) - { - char c = *s; - if (c < '0' || c > '9') - { - if (end != NULL) - *end = s; - return result; - } - result *= 10; - result += (c - '0'); - s++; - } -} - -UInt64 ConvertOctStringToUInt64(const char *s, const char **end) -{ - UInt64 result = 0; - for (;;) - { - char c = *s; - if (c < '0' || c > '7') - { - if (end != NULL) - *end = s; - return result; - } - result <<= 3; - result += (c - '0'); - s++; - } -} - -UInt64 ConvertHexStringToUInt64(const char *s, const char **end) -{ - UInt64 result = 0; - for (;;) - { - char c = *s; - UInt32 v; - if (c >= '0' && c <= '9') v = (c - '0'); - else if (c >= 'A' && c <= 'F') v = 10 + (c - 'A'); - else if (c >= 'a' && c <= 'f') v = 10 + (c - 'a'); - else - { - if (end != NULL) - *end = s; - return result; - } - result <<= 4; - result |= v; - s++; - } -} - - -UInt64 ConvertStringToUInt64(const wchar_t *s, const wchar_t **end) -{ - UInt64 result = 0; - for (;;) - { - wchar_t c = *s; - if (c < '0' || c > '9') - { - if (end != NULL) - *end = s; - return result; - } - result *= 10; - result += (c - '0'); - s++; - } -} - - -Int64 ConvertStringToInt64(const char *s, const char **end) -{ - if (*s == '-') - return -(Int64)ConvertStringToUInt64(s + 1, end); - return ConvertStringToUInt64(s, end); -} diff --git a/desmume/src/windows/7z/CPP/Common/StringToInt.h b/desmume/src/windows/7z/CPP/Common/StringToInt.h deleted file mode 100644 index 16a1a4fc8..000000000 --- a/desmume/src/windows/7z/CPP/Common/StringToInt.h +++ /dev/null @@ -1,18 +0,0 @@ -// Common/StringToInt.h - -#ifndef __COMMON_STRINGTOINT_H -#define __COMMON_STRINGTOINT_H - -#include -#include "Types.h" - -UInt64 ConvertStringToUInt64(const char *s, const char **end); -UInt64 ConvertOctStringToUInt64(const char *s, const char **end); -UInt64 ConvertHexStringToUInt64(const char *s, const char **end); -UInt64 ConvertStringToUInt64(const wchar_t *s, const wchar_t **end); - -Int64 ConvertStringToInt64(const char *s, const char **end); - -#endif - - diff --git a/desmume/src/windows/7z/CPP/Common/Types.h b/desmume/src/windows/7z/CPP/Common/Types.h deleted file mode 100644 index ba696772d..000000000 --- a/desmume/src/windows/7z/CPP/Common/Types.h +++ /dev/null @@ -1,14 +0,0 @@ -// Common/Types.h - -#ifndef __COMMON_TYPES_H -#define __COMMON_TYPES_H - -extern "C" -{ -#include "../../C/Types.h" -} - -typedef int HRes; - -#endif - diff --git a/desmume/src/windows/7z/CPP/Common/UTFConvert.cpp b/desmume/src/windows/7z/CPP/Common/UTFConvert.cpp deleted file mode 100644 index dae8f551b..000000000 --- a/desmume/src/windows/7z/CPP/Common/UTFConvert.cpp +++ /dev/null @@ -1,145 +0,0 @@ -// UTFConvert.cpp - -#include "StdAfx.h" - -#include "UTFConvert.h" -#include "Types.h" - -static const Byte kUtf8Limits[5] = { 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; - -static Bool Utf8_To_Utf16(wchar_t *dest, size_t *destLen, const char *src, size_t srcLen) -{ - size_t destPos = 0, srcPos = 0; - for (;;) - { - Byte c; - int numAdds; - if (srcPos == srcLen) - { - *destLen = destPos; - return True; - } - c = (Byte)src[srcPos++]; - - if (c < 0x80) - { - if (dest) - dest[destPos] = (wchar_t)c; - destPos++; - continue; - } - if (c < 0xC0) - break; - for (numAdds = 1; numAdds < 5; numAdds++) - if (c < kUtf8Limits[numAdds]) - break; - UInt32 value = (c - kUtf8Limits[numAdds - 1]); - - do - { - Byte c2; - if (srcPos == srcLen) - break; - c2 = (Byte)src[srcPos++]; - if (c2 < 0x80 || c2 >= 0xC0) - break; - value <<= 6; - value |= (c2 - 0x80); - } - while (--numAdds != 0); - - if (value < 0x10000) - { - if (dest) - dest[destPos] = (wchar_t)value; - destPos++; - } - else - { - value -= 0x10000; - if (value >= 0x100000) - break; - if (dest) - { - dest[destPos + 0] = (wchar_t)(0xD800 + (value >> 10)); - dest[destPos + 1] = (wchar_t)(0xDC00 + (value & 0x3FF)); - } - destPos += 2; - } - } - *destLen = destPos; - return False; -} - -static Bool Utf16_To_Utf8(char *dest, size_t *destLen, const wchar_t *src, size_t srcLen) -{ - size_t destPos = 0, srcPos = 0; - for (;;) - { - unsigned numAdds; - UInt32 value; - if (srcPos == srcLen) - { - *destLen = destPos; - return True; - } - value = src[srcPos++]; - if (value < 0x80) - { - if (dest) - dest[destPos] = (char)value; - destPos++; - continue; - } - if (value >= 0xD800 && value < 0xE000) - { - UInt32 c2; - if (value >= 0xDC00 || srcPos == srcLen) - break; - c2 = src[srcPos++]; - if (c2 < 0xDC00 || c2 >= 0xE000) - break; - value = ((value - 0xD800) << 10) | (c2 - 0xDC00); - } - for (numAdds = 1; numAdds < 5; numAdds++) - if (value < (((UInt32)1) << (numAdds * 5 + 6))) - break; - if (dest) - dest[destPos] = (char)(kUtf8Limits[numAdds - 1] + (value >> (6 * numAdds))); - destPos++; - do - { - numAdds--; - if (dest) - dest[destPos] = (char)(0x80 + ((value >> (6 * numAdds)) & 0x3F)); - destPos++; - } - while (numAdds != 0); - } - *destLen = destPos; - return False; -} - -bool ConvertUTF8ToUnicode(const AString &src, UString &dest) -{ - dest.Empty(); - size_t destLen = 0; - Utf8_To_Utf16(NULL, &destLen, src, src.Length()); - wchar_t *p = dest.GetBuffer((int)destLen); - Bool res = Utf8_To_Utf16(p, &destLen, src, src.Length()); - p[destLen] = 0; - dest.ReleaseBuffer(); - return res ? true : false; -} - -bool ConvertUnicodeToUTF8(const UString &src, AString &dest) -{ - dest.Empty(); - size_t destLen = 0; - Utf16_To_Utf8(NULL, &destLen, src, src.Length()); - char *p = dest.GetBuffer((int)destLen); - Bool res = Utf16_To_Utf8(p, &destLen, src, src.Length()); - p[destLen] = 0; - dest.ReleaseBuffer(); - return res ? true : false; -} diff --git a/desmume/src/windows/7z/CPP/Common/UTFConvert.h b/desmume/src/windows/7z/CPP/Common/UTFConvert.h deleted file mode 100644 index d55310144..000000000 --- a/desmume/src/windows/7z/CPP/Common/UTFConvert.h +++ /dev/null @@ -1,11 +0,0 @@ -// Common/UTFConvert.h - -#ifndef __COMMON_UTFCONVERT_H -#define __COMMON_UTFCONVERT_H - -#include "MyString.h" - -bool ConvertUTF8ToUnicode(const AString &utfString, UString &resultString); -bool ConvertUnicodeToUTF8(const UString &unicodeString, AString &resultString); - -#endif diff --git a/desmume/src/windows/7z/CPP/Common/Wildcard.cpp b/desmume/src/windows/7z/CPP/Common/Wildcard.cpp deleted file mode 100644 index b4a86cadb..000000000 --- a/desmume/src/windows/7z/CPP/Common/Wildcard.cpp +++ /dev/null @@ -1,458 +0,0 @@ -// Common/Wildcard.cpp - -#include "StdAfx.h" - -#include "Wildcard.h" - -bool g_CaseSensitive = - #ifdef _WIN32 - false; - #else - true; - #endif - -static const wchar_t kAnyCharsChar = L'*'; -static const wchar_t kAnyCharChar = L'?'; - -#ifdef _WIN32 -static const wchar_t kDirDelimiter1 = L'\\'; -#endif -static const wchar_t kDirDelimiter2 = L'/'; - -static const UString kWildCardCharSet = L"?*"; - -static const UString kIllegalWildCardFileNameChars= - L"\x1\x2\x3\x4\x5\x6\x7\x8\x9\xA\xB\xC\xD\xE\xF" - L"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F" - L"\"/:<>\\|"; - - -static inline bool IsCharDirLimiter(wchar_t c) -{ - return ( - #ifdef _WIN32 - c == kDirDelimiter1 || - #endif - c == kDirDelimiter2); -} - -int CompareFileNames(const UString &s1, const UString &s2) -{ - if (g_CaseSensitive) - return s1.Compare(s2); - return s1.CompareNoCase(s2); -} - -// ----------------------------------------- -// this function compares name with mask -// ? - any char -// * - any char or empty - -static bool EnhancedMaskTest(const wchar_t *mask, const wchar_t *name) -{ - for (;;) - { - wchar_t m = *mask; - wchar_t c = *name; - if (m == 0) - return (c == 0); - if (m == kAnyCharsChar) - { - if (EnhancedMaskTest(mask + 1, name)) - return true; - if (c == 0) - return false; - } - else - { - if (m == kAnyCharChar) - { - if (c == 0) - return false; - } - else if (m != c) - if (g_CaseSensitive || MyCharUpper(m) != MyCharUpper(c)) - return false; - mask++; - } - name++; - } -} - -// -------------------------------------------------- -// Splits path to strings - -void SplitPathToParts(const UString &path, UStringVector &pathParts) -{ - pathParts.Clear(); - UString name; - int len = path.Length(); - if (len == 0) - return; - for (int i = 0; i < len; i++) - { - wchar_t c = path[i]; - if (IsCharDirLimiter(c)) - { - pathParts.Add(name); - name.Empty(); - } - else - name += c; - } - pathParts.Add(name); -} - -void SplitPathToParts(const UString &path, UString &dirPrefix, UString &name) -{ - int i; - for (i = path.Length() - 1; i >= 0; i--) - if (IsCharDirLimiter(path[i])) - break; - dirPrefix = path.Left(i + 1); - name = path.Mid(i + 1); -} - -UString ExtractDirPrefixFromPath(const UString &path) -{ - int i; - for (i = path.Length() - 1; i >= 0; i--) - if (IsCharDirLimiter(path[i])) - break; - return path.Left(i + 1); -} - -UString ExtractFileNameFromPath(const UString &path) -{ - int i; - for (i = path.Length() - 1; i >= 0; i--) - if (IsCharDirLimiter(path[i])) - break; - return path.Mid(i + 1); -} - - -bool CompareWildCardWithName(const UString &mask, const UString &name) -{ - return EnhancedMaskTest(mask, name); -} - -bool DoesNameContainWildCard(const UString &path) -{ - return (path.FindOneOf(kWildCardCharSet) >= 0); -} - - -// ----------------------------------------------------------' -// NWildcard - -namespace NWildcard { - - -/* -M = MaskParts.Size(); -N = TestNameParts.Size(); - - File Dir -ForFile req M<=N [N-M, N) - - nonreq M=N [0, M) - - -ForDir req M 1) - return true; - } - return false; -} - -bool CCensorNode::AreThereIncludeItems() const -{ - if (IncludeItems.Size() > 0) - return true; - for (int i = 0; i < SubNodes.Size(); i++) - if (SubNodes[i].AreThereIncludeItems()) - return true; - return false; -} - -bool CCensorNode::CheckPathCurrent(bool include, const UStringVector &pathParts, bool isFile) const -{ - const CObjectVector &items = include ? IncludeItems : ExcludeItems; - for (int i = 0; i < items.Size(); i++) - if (items[i].CheckPath(pathParts, isFile)) - return true; - return false; -} - -bool CCensorNode::CheckPath(UStringVector &pathParts, bool isFile, bool &include) const -{ - if (CheckPathCurrent(false, pathParts, isFile)) - { - include = false; - return true; - } - include = true; - bool finded = CheckPathCurrent(true, pathParts, isFile); - if (pathParts.Size() == 1) - return finded; - int index = FindSubNode(pathParts.Front()); - if (index >= 0) - { - UStringVector pathParts2 = pathParts; - pathParts2.Delete(0); - if (SubNodes[index].CheckPath(pathParts2, isFile, include)) - return true; - } - return finded; -} - -bool CCensorNode::CheckPath(const UString &path, bool isFile, bool &include) const -{ - UStringVector pathParts; - SplitPathToParts(path, pathParts); - return CheckPath(pathParts, isFile, include); -} - -bool CCensorNode::CheckPath(const UString &path, bool isFile) const -{ - bool include; - if (CheckPath(path, isFile, include)) - return include; - return false; -} - -bool CCensorNode::CheckPathToRoot(bool include, UStringVector &pathParts, bool isFile) const -{ - if (CheckPathCurrent(include, pathParts, isFile)) - return true; - if (Parent == 0) - return false; - pathParts.Insert(0, Name); - return Parent->CheckPathToRoot(include, pathParts, isFile); -} - -/* -bool CCensorNode::CheckPathToRoot(bool include, const UString &path, bool isFile) const -{ - UStringVector pathParts; - SplitPathToParts(path, pathParts); - return CheckPathToRoot(include, pathParts, isFile); -} -*/ - -void CCensorNode::AddItem2(bool include, const UString &path, bool recursive) -{ - if (path.IsEmpty()) - return; - bool forFile = true; - bool forFolder = true; - UString path2 = path; - if (IsCharDirLimiter(path[path.Length() - 1])) - { - path2.Delete(path.Length() - 1); - forFile = false; - } - AddItem(include, path2, recursive, forFile, forFolder); -} - -void CCensorNode::ExtendExclude(const CCensorNode &fromNodes) -{ - ExcludeItems += fromNodes.ExcludeItems; - for (int i = 0; i < fromNodes.SubNodes.Size(); i++) - { - const CCensorNode &node = fromNodes.SubNodes[i]; - int subNodeIndex = FindSubNode(node.Name); - if (subNodeIndex < 0) - subNodeIndex = SubNodes.Add(CCensorNode(node.Name, this)); - SubNodes[subNodeIndex].ExtendExclude(node); - } -} - -int CCensor::FindPrefix(const UString &prefix) const -{ - for (int i = 0; i < Pairs.Size(); i++) - if (CompareFileNames(Pairs[i].Prefix, prefix) == 0) - return i; - return -1; -} - -void CCensor::AddItem(bool include, const UString &path, bool recursive) -{ - UStringVector pathParts; - SplitPathToParts(path, pathParts); - bool forFile = true; - if (pathParts.Back().IsEmpty()) - { - forFile = false; - pathParts.DeleteBack(); - } - const UString &front = pathParts.Front(); - bool isAbs = false; - if (front.IsEmpty()) - isAbs = true; - else if (front.Length() == 2 && front[1] == L':') - isAbs = true; - else - { - for (int i = 0; i < pathParts.Size(); i++) - { - const UString &part = pathParts[i]; - if (part == L".." || part == L".") - { - isAbs = true; - break; - } - } - } - int numAbsParts = 0; - if (isAbs) - if (pathParts.Size() > 1) - numAbsParts = pathParts.Size() - 1; - else - numAbsParts = 1; - UString prefix; - for (int i = 0; i < numAbsParts; i++) - { - const UString &front = pathParts.Front(); - if (DoesNameContainWildCard(front)) - break; - prefix += front; - prefix += WCHAR_PATH_SEPARATOR; - pathParts.Delete(0); - } - int index = FindPrefix(prefix); - if (index < 0) - index = Pairs.Add(CPair(prefix)); - - CItem item; - item.PathParts = pathParts; - item.ForDir = true; - item.ForFile = forFile; - item.Recursive = recursive; - Pairs[index].Head.AddItem(include, item); -} - -bool CCensor::CheckPath(const UString &path, bool isFile) const -{ - bool finded = false; - for (int i = 0; i < Pairs.Size(); i++) - { - bool include; - if (Pairs[i].Head.CheckPath(path, isFile, include)) - { - if (!include) - return false; - finded = true; - } - } - return finded; -} - -void CCensor::ExtendExclude() -{ - int i; - for (i = 0; i < Pairs.Size(); i++) - if (Pairs[i].Prefix.IsEmpty()) - break; - if (i == Pairs.Size()) - return; - int index = i; - for (i = 0; i < Pairs.Size(); i++) - if (index != i) - Pairs[i].Head.ExtendExclude(Pairs[index].Head); -} - -} diff --git a/desmume/src/windows/7z/CPP/Common/Wildcard.h b/desmume/src/windows/7z/CPP/Common/Wildcard.h deleted file mode 100644 index e2a42c831..000000000 --- a/desmume/src/windows/7z/CPP/Common/Wildcard.h +++ /dev/null @@ -1,80 +0,0 @@ -// Common/Wildcard.h - -#ifndef __COMMON_WILDCARD_H -#define __COMMON_WILDCARD_H - -#include "MyString.h" - -int CompareFileNames(const UString &s1, const UString &s2); - -void SplitPathToParts(const UString &path, UStringVector &pathParts); -void SplitPathToParts(const UString &path, UString &dirPrefix, UString &name); -UString ExtractDirPrefixFromPath(const UString &path); -UString ExtractFileNameFromPath(const UString &path); -bool DoesNameContainWildCard(const UString &path); -bool CompareWildCardWithName(const UString &mask, const UString &name); - -namespace NWildcard { - -struct CItem -{ - UStringVector PathParts; - bool Recursive; - bool ForFile; - bool ForDir; - bool CheckPath(const UStringVector &pathParts, bool isFile) const; -}; - -class CCensorNode -{ - CCensorNode *Parent; - bool CheckPathCurrent(bool include, const UStringVector &pathParts, bool isFile) const; - void AddItemSimple(bool include, CItem &item); - bool CheckPath(UStringVector &pathParts, bool isFile, bool &include) const; -public: - CCensorNode(): Parent(0) { }; - CCensorNode(const UString &name, CCensorNode *parent): Name(name), Parent(parent) { }; - UString Name; - CObjectVector SubNodes; - CObjectVector IncludeItems; - CObjectVector ExcludeItems; - - int FindSubNode(const UString &path) const; - - void AddItem(bool include, CItem &item); - void AddItem(bool include, const UString &path, bool recursive, bool forFile, bool forDir); - void AddItem2(bool include, const UString &path, bool recursive); - - bool NeedCheckSubDirs() const; - bool AreThereIncludeItems() const; - - bool CheckPath(const UString &path, bool isFile, bool &include) const; - bool CheckPath(const UString &path, bool isFile) const; - - bool CheckPathToRoot(bool include, UStringVector &pathParts, bool isFile) const; - // bool CheckPathToRoot(const UString &path, bool isFile, bool include) const; - void ExtendExclude(const CCensorNode &fromNodes); -}; - -struct CPair -{ - UString Prefix; - CCensorNode Head; - CPair(const UString &prefix): Prefix(prefix) { }; -}; - -class CCensor -{ - int FindPrefix(const UString &prefix) const; -public: - CObjectVector Pairs; - bool AllAreRelative() const - { return (Pairs.Size() == 1 && Pairs.Front().Prefix.IsEmpty()); } - void AddItem(bool include, const UString &path, bool recursive); - bool CheckPath(const UString &path, bool isFile) const; - void ExtendExclude(); -}; - -} - -#endif diff --git a/desmume/src/windows/7z/CPP/Windows/Defs.h b/desmume/src/windows/7z/CPP/Windows/Defs.h deleted file mode 100644 index e8a655a4b..000000000 --- a/desmume/src/windows/7z/CPP/Windows/Defs.h +++ /dev/null @@ -1,23 +0,0 @@ -// Windows/Defs.h - -#ifndef __WINDOWS_DEFS_H -#define __WINDOWS_DEFS_H - -inline bool BOOLToBool(BOOL value) - { return (value != FALSE); } - -#ifdef _WIN32 -inline bool LRESULTToBool(LRESULT value) - { return (value != FALSE); } -#endif - -inline BOOL BoolToBOOL(bool value) - { return (value ? TRUE: FALSE); } - -inline VARIANT_BOOL BoolToVARIANT_BOOL(bool value) - { return (value ? VARIANT_TRUE: VARIANT_FALSE); } - -inline bool VARIANT_BOOLToBool(VARIANT_BOOL value) - { return (value != VARIANT_FALSE); } - -#endif diff --git a/desmume/src/windows/7z/CPP/Windows/FileDir.cpp b/desmume/src/windows/7z/CPP/Windows/FileDir.cpp deleted file mode 100644 index 38eb1083c..000000000 --- a/desmume/src/windows/7z/CPP/Windows/FileDir.cpp +++ /dev/null @@ -1,841 +0,0 @@ -// Windows/FileDir.cpp - -#include "StdAfx.h" - -#include "FileDir.h" -#include "FileName.h" -#include "FileFind.h" -#include "Defs.h" -#ifndef _UNICODE -#include "../Common/StringConvert.h" -#endif - -#ifndef _UNICODE -extern bool g_IsNT; -#endif - -namespace NWindows { -namespace NFile { - -#if defined(WIN_LONG_PATH) && defined(_UNICODE) -#define WIN_LONG_PATH2 -#endif - -// SetCurrentDirectory doesn't support \\?\ prefix - -#ifdef WIN_LONG_PATH -bool GetLongPathBase(LPCWSTR fileName, UString &res); -bool GetLongPath(LPCWSTR fileName, UString &res); -#endif - -namespace NDirectory { - -#ifndef _UNICODE -static inline UINT GetCurrentCodePage() { return ::AreFileApisANSI() ? CP_ACP : CP_OEMCP; } -static UString GetUnicodePath(const CSysString &sysPath) - { return MultiByteToUnicodeString(sysPath, GetCurrentCodePage()); } -static CSysString GetSysPath(LPCWSTR sysPath) - { return UnicodeStringToMultiByte(sysPath, GetCurrentCodePage()); } -#endif - -bool MyGetWindowsDirectory(CSysString &path) -{ - UINT needLength = ::GetWindowsDirectory(path.GetBuffer(MAX_PATH + 1), MAX_PATH + 1); - path.ReleaseBuffer(); - return (needLength > 0 && needLength <= MAX_PATH); -} - -bool MyGetSystemDirectory(CSysString &path) -{ - UINT needLength = ::GetSystemDirectory(path.GetBuffer(MAX_PATH + 1), MAX_PATH + 1); - path.ReleaseBuffer(); - return (needLength > 0 && needLength <= MAX_PATH); -} - -#ifndef _UNICODE -bool MyGetWindowsDirectory(UString &path) -{ - if (g_IsNT) - { - UINT needLength = ::GetWindowsDirectoryW(path.GetBuffer(MAX_PATH + 1), MAX_PATH + 1); - path.ReleaseBuffer(); - return (needLength > 0 && needLength <= MAX_PATH); - } - CSysString sysPath; - if (!MyGetWindowsDirectory(sysPath)) - return false; - path = GetUnicodePath(sysPath); - return true; -} - -bool MyGetSystemDirectory(UString &path) -{ - if (g_IsNT) - { - UINT needLength = ::GetSystemDirectoryW(path.GetBuffer(MAX_PATH + 1), MAX_PATH + 1); - path.ReleaseBuffer(); - return (needLength > 0 && needLength <= MAX_PATH); - } - CSysString sysPath; - if (!MyGetSystemDirectory(sysPath)) - return false; - path = GetUnicodePath(sysPath); - return true; -} -#endif - -bool SetDirTime(LPCWSTR fileName, const FILETIME *cTime, const FILETIME *aTime, const FILETIME *mTime) -{ - #ifndef _UNICODE - if (!g_IsNT) - { - ::SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return false; - } - #endif - HANDLE hDir = ::CreateFileW(fileName, GENERIC_WRITE, - FILE_SHARE_READ | FILE_SHARE_WRITE, - NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); - #ifdef WIN_LONG_PATH - if (hDir == INVALID_HANDLE_VALUE) - { - UString longPath; - if (GetLongPath(fileName, longPath)) - hDir = ::CreateFileW(longPath, GENERIC_WRITE, - FILE_SHARE_READ | FILE_SHARE_WRITE, - NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); - } - #endif - - bool res = false; - if (hDir != INVALID_HANDLE_VALUE) - { - res = BOOLToBool(::SetFileTime(hDir, cTime, aTime, mTime)); - ::CloseHandle(hDir); - } - return res; -} - -bool MySetFileAttributes(LPCTSTR fileName, DWORD fileAttributes) -{ - if (::SetFileAttributes(fileName, fileAttributes)) - return true; - #ifdef WIN_LONG_PATH2 - UString longPath; - if (GetLongPath(fileName, longPath)) - return BOOLToBool(::SetFileAttributesW(longPath, fileAttributes)); - #endif - return false; -} - -bool MyRemoveDirectory(LPCTSTR pathName) -{ - if (::RemoveDirectory(pathName)) - return true; - #ifdef WIN_LONG_PATH2 - UString longPath; - if (GetLongPath(pathName, longPath)) - return BOOLToBool(::RemoveDirectoryW(longPath)); - #endif - return false; -} - -#ifdef WIN_LONG_PATH -bool GetLongPaths(LPCWSTR s1, LPCWSTR s2, UString &d1, UString &d2) -{ - if (!GetLongPathBase(s1, d1) || !GetLongPathBase(s2, d2)) - return false; - if (d1.IsEmpty() && d2.IsEmpty()) return false; - if (d1.IsEmpty()) d1 = s1; - if (d2.IsEmpty()) d2 = s2; - return true; -} -#endif - -bool MyMoveFile(LPCTSTR existFileName, LPCTSTR newFileName) -{ - if (::MoveFile(existFileName, newFileName)) - return true; - #ifdef WIN_LONG_PATH2 - UString d1, d2; - if (GetLongPaths(existFileName, newFileName, d1, d2)) - return BOOLToBool(::MoveFileW(d1, d2)); - #endif - return false; -} - -#ifndef _UNICODE -bool MySetFileAttributes(LPCWSTR fileName, DWORD fileAttributes) -{ - if (!g_IsNT) - return MySetFileAttributes(GetSysPath(fileName), fileAttributes); - if (::SetFileAttributesW(fileName, fileAttributes)) - return true; - #ifdef WIN_LONG_PATH - UString longPath; - if (GetLongPath(fileName, longPath)) - return BOOLToBool(::SetFileAttributesW(longPath, fileAttributes)); - #endif - return false; -} - - -bool MyRemoveDirectory(LPCWSTR pathName) -{ - if (!g_IsNT) - return MyRemoveDirectory(GetSysPath(pathName)); - if (::RemoveDirectoryW(pathName)) - return true; - #ifdef WIN_LONG_PATH - UString longPath; - if (GetLongPath(pathName, longPath)) - return BOOLToBool(::RemoveDirectoryW(longPath)); - #endif - return false; -} - -bool MyMoveFile(LPCWSTR existFileName, LPCWSTR newFileName) -{ - if (!g_IsNT) - return MyMoveFile(GetSysPath(existFileName), GetSysPath(newFileName)); - if (::MoveFileW(existFileName, newFileName)) - return true; - #ifdef WIN_LONG_PATH - UString d1, d2; - if (GetLongPaths(existFileName, newFileName, d1, d2)) - return BOOLToBool(::MoveFileW(d1, d2)); - #endif - return false; -} -#endif - -bool MyCreateDirectory(LPCTSTR pathName) -{ - if (::CreateDirectory(pathName, NULL)) - return true; - #ifdef WIN_LONG_PATH2 - if (::GetLastError() != ERROR_ALREADY_EXISTS) - { - UString longPath; - if (GetLongPath(pathName, longPath)) - return BOOLToBool(::CreateDirectoryW(longPath, NULL)); - } - #endif - return false; -} - -#ifndef _UNICODE -bool MyCreateDirectory(LPCWSTR pathName) -{ - if (!g_IsNT) - return MyCreateDirectory(GetSysPath(pathName)); - if (::CreateDirectoryW(pathName, NULL)) - return true; - #ifdef WIN_LONG_PATH - if (::GetLastError() != ERROR_ALREADY_EXISTS) - { - UString longPath; - if (GetLongPath(pathName, longPath)) - return BOOLToBool(::CreateDirectoryW(longPath, NULL)); - } - #endif - return false; -} -#endif - -/* -bool CreateComplexDirectory(LPCTSTR pathName) -{ - NName::CParsedPath path; - path.ParsePath(pathName); - CSysString fullPath = path.Prefix; - DWORD errorCode = ERROR_SUCCESS; - for (int i = 0; i < path.PathParts.Size(); i++) - { - const CSysString &string = path.PathParts[i]; - if (string.IsEmpty()) - { - if (i != path.PathParts.Size() - 1) - return false; - return true; - } - fullPath += path.PathParts[i]; - if (!MyCreateDirectory(fullPath)) - { - DWORD errorCode = GetLastError(); - if (errorCode != ERROR_ALREADY_EXISTS) - return false; - } - fullPath += NName::kDirDelimiter; - } - return true; -} -*/ - -bool CreateComplexDirectory(LPCTSTR _aPathName) -{ - CSysString pathName = _aPathName; - int pos = pathName.ReverseFind(TEXT(CHAR_PATH_SEPARATOR)); - if (pos > 0 && pos == pathName.Length() - 1) - { - if (pathName.Length() == 3 && pathName[1] == ':') - return true; // Disk folder; - pathName.Delete(pos); - } - CSysString pathName2 = pathName; - pos = pathName.Length(); - for (;;) - { - if (MyCreateDirectory(pathName)) - break; - if (::GetLastError() == ERROR_ALREADY_EXISTS) - { - NFind::CFileInfo fileInfo; - if (!NFind::FindFile(pathName, fileInfo)) // For network folders - return true; - if (!fileInfo.IsDir()) - return false; - break; - } - pos = pathName.ReverseFind(TEXT(CHAR_PATH_SEPARATOR)); - if (pos < 0 || pos == 0) - return false; - if (pathName[pos - 1] == ':') - return false; - pathName = pathName.Left(pos); - } - pathName = pathName2; - while (pos < pathName.Length()) - { - pos = pathName.Find(TEXT(CHAR_PATH_SEPARATOR), pos + 1); - if (pos < 0) - pos = pathName.Length(); - if (!MyCreateDirectory(pathName.Left(pos))) - return false; - } - return true; -} - -#ifndef _UNICODE - -bool CreateComplexDirectory(LPCWSTR _aPathName) -{ - UString pathName = _aPathName; - int pos = pathName.ReverseFind(WCHAR_PATH_SEPARATOR); - if (pos > 0 && pos == pathName.Length() - 1) - { - if (pathName.Length() == 3 && pathName[1] == L':') - return true; // Disk folder; - pathName.Delete(pos); - } - UString pathName2 = pathName; - pos = pathName.Length(); - for (;;) - { - if (MyCreateDirectory(pathName)) - break; - if (::GetLastError() == ERROR_ALREADY_EXISTS) - { - NFind::CFileInfoW fileInfo; - if (!NFind::FindFile(pathName, fileInfo)) // For network folders - return true; - if (!fileInfo.IsDir()) - return false; - break; - } - pos = pathName.ReverseFind(WCHAR_PATH_SEPARATOR); - if (pos < 0 || pos == 0) - return false; - if (pathName[pos - 1] == L':') - return false; - pathName = pathName.Left(pos); - } - pathName = pathName2; - while (pos < pathName.Length()) - { - pos = pathName.Find(WCHAR_PATH_SEPARATOR, pos + 1); - if (pos < 0) - pos = pathName.Length(); - if (!MyCreateDirectory(pathName.Left(pos))) - return false; - } - return true; -} - -#endif - -bool DeleteFileAlways(LPCTSTR name) -{ - if (!MySetFileAttributes(name, 0)) - return false; - if (::DeleteFile(name)) - return true; - #ifdef WIN_LONG_PATH2 - UString longPath; - if (GetLongPath(name, longPath)) - return BOOLToBool(::DeleteFileW(longPath)); - #endif - return false; -} - -#ifndef _UNICODE -bool DeleteFileAlways(LPCWSTR name) -{ - if (!g_IsNT) - return DeleteFileAlways(GetSysPath(name)); - if (!MySetFileAttributes(name, 0)) - return false; - if (::DeleteFileW(name)) - return true; - #ifdef WIN_LONG_PATH - UString longPath; - if (GetLongPath(name, longPath)) - return BOOLToBool(::DeleteFileW(longPath)); - #endif - return false; -} -#endif - -static bool RemoveDirectorySubItems2(const CSysString pathPrefix, const NFind::CFileInfo &fileInfo) -{ - if (fileInfo.IsDir()) - return RemoveDirectoryWithSubItems(pathPrefix + fileInfo.Name); - return DeleteFileAlways(pathPrefix + fileInfo.Name); -} - -bool RemoveDirectoryWithSubItems(const CSysString &path) -{ - NFind::CFileInfo fileInfo; - CSysString pathPrefix = path + NName::kDirDelimiter; - { - NFind::CEnumerator enumerator(pathPrefix + TCHAR(NName::kAnyStringWildcard)); - while (enumerator.Next(fileInfo)) - if (!RemoveDirectorySubItems2(pathPrefix, fileInfo)) - return false; - } - if (!MySetFileAttributes(path, 0)) - return false; - return MyRemoveDirectory(path); -} - -#ifndef _UNICODE -static bool RemoveDirectorySubItems2(const UString pathPrefix, const NFind::CFileInfoW &fileInfo) -{ - if (fileInfo.IsDir()) - return RemoveDirectoryWithSubItems(pathPrefix + fileInfo.Name); - return DeleteFileAlways(pathPrefix + fileInfo.Name); -} -bool RemoveDirectoryWithSubItems(const UString &path) -{ - NFind::CFileInfoW fileInfo; - UString pathPrefix = path + UString(NName::kDirDelimiter); - { - NFind::CEnumeratorW enumerator(pathPrefix + UString(NName::kAnyStringWildcard)); - while (enumerator.Next(fileInfo)) - if (!RemoveDirectorySubItems2(pathPrefix, fileInfo)) - return false; - } - if (!MySetFileAttributes(path, 0)) - return false; - return MyRemoveDirectory(path); -} -#endif - -#ifndef _WIN32_WCE - -bool MyGetShortPathName(LPCTSTR longPath, CSysString &shortPath) -{ - DWORD needLength = ::GetShortPathName(longPath, shortPath.GetBuffer(MAX_PATH + 1), MAX_PATH + 1); - shortPath.ReleaseBuffer(); - return (needLength > 0 && needLength < MAX_PATH); -} - -bool MyGetFullPathName(LPCTSTR fileName, CSysString &resultPath, int &fileNamePartStartIndex) -{ - resultPath.Empty(); - LPTSTR fileNamePointer = 0; - LPTSTR buffer = resultPath.GetBuffer(MAX_PATH); - DWORD needLength = ::GetFullPathName(fileName, MAX_PATH + 1, buffer, &fileNamePointer); - resultPath.ReleaseBuffer(); - if (needLength == 0) - return false; - if (needLength >= MAX_PATH) - { - #ifdef WIN_LONG_PATH2 - needLength++; - buffer = resultPath.GetBuffer(needLength + 1); - DWORD needLength2 = ::GetFullPathNameW(fileName, needLength, buffer, &fileNamePointer); - resultPath.ReleaseBuffer(); - if (needLength2 == 0 || needLength2 > needLength) - #endif - return false; - } - if (fileNamePointer == 0) - fileNamePartStartIndex = lstrlen(fileName); - else - fileNamePartStartIndex = (int)(fileNamePointer - buffer); - return true; -} - -#ifndef _UNICODE -bool MyGetFullPathName(LPCWSTR fileName, UString &resultPath, int &fileNamePartStartIndex) -{ - resultPath.Empty(); - if (g_IsNT) - { - LPWSTR fileNamePointer = 0; - LPWSTR buffer = resultPath.GetBuffer(MAX_PATH); - DWORD needLength = ::GetFullPathNameW(fileName, MAX_PATH + 1, buffer, &fileNamePointer); - resultPath.ReleaseBuffer(); - if (needLength == 0) - return false; - if (needLength >= MAX_PATH) - { - #ifdef WIN_LONG_PATH - needLength++; - buffer = resultPath.GetBuffer(needLength + 1); - DWORD needLength2 = ::GetFullPathNameW(fileName, needLength, buffer, &fileNamePointer); - resultPath.ReleaseBuffer(); - if (needLength2 == 0 || needLength2 > needLength) - #endif - return false; - } - if (fileNamePointer == 0) - fileNamePartStartIndex = MyStringLen(fileName); - else - fileNamePartStartIndex = (int)(fileNamePointer - buffer); - } - else - { - CSysString sysPath; - if (!MyGetFullPathName(GetSysPath(fileName), sysPath, fileNamePartStartIndex)) - return false; - UString resultPath1 = GetUnicodePath(sysPath.Left(fileNamePartStartIndex)); - UString resultPath2 = GetUnicodePath(sysPath.Mid(fileNamePartStartIndex)); - fileNamePartStartIndex = resultPath1.Length(); - resultPath = resultPath1 + resultPath2; - } - return true; -} -#endif - - -bool MyGetFullPathName(LPCTSTR fileName, CSysString &path) -{ - int index; - return MyGetFullPathName(fileName, path, index); -} - -#ifndef _UNICODE -bool MyGetFullPathName(LPCWSTR fileName, UString &path) -{ - int index; - return MyGetFullPathName(fileName, path, index); -} -#endif - -bool GetOnlyName(LPCTSTR fileName, CSysString &resultName) -{ - int index; - if (!MyGetFullPathName(fileName, resultName, index)) - return false; - resultName = resultName.Mid(index); - return true; -} - -#ifndef _UNICODE -bool GetOnlyName(LPCWSTR fileName, UString &resultName) -{ - int index; - if (!MyGetFullPathName(fileName, resultName, index)) - return false; - resultName = resultName.Mid(index); - return true; -} -#endif - -bool GetOnlyDirPrefix(LPCTSTR fileName, CSysString &resultName) -{ - int index; - if (!MyGetFullPathName(fileName, resultName, index)) - return false; - resultName = resultName.Left(index); - return true; -} - -#ifndef _UNICODE -bool GetOnlyDirPrefix(LPCWSTR fileName, UString &resultName) -{ - int index; - if (!MyGetFullPathName(fileName, resultName, index)) - return false; - resultName = resultName.Left(index); - return true; -} -#endif - -bool MyGetCurrentDirectory(CSysString &path) -{ - DWORD needLength = ::GetCurrentDirectory(MAX_PATH + 1, path.GetBuffer(MAX_PATH + 1)); - path.ReleaseBuffer(); - return (needLength > 0 && needLength <= MAX_PATH); -} - -#ifndef _UNICODE -bool MySetCurrentDirectory(LPCWSTR path) -{ - if (g_IsNT) - return BOOLToBool(::SetCurrentDirectoryW(path)); - return MySetCurrentDirectory(GetSysPath(path)); -} -bool MyGetCurrentDirectory(UString &path) -{ - if (g_IsNT) - { - DWORD needLength = ::GetCurrentDirectoryW(MAX_PATH + 1, path.GetBuffer(MAX_PATH + 1)); - path.ReleaseBuffer(); - return (needLength > 0 && needLength <= MAX_PATH); - } - CSysString sysPath; - if (!MyGetCurrentDirectory(sysPath)) - return false; - path = GetUnicodePath(sysPath); - return true; -} -#endif -#endif - -bool MySearchPath(LPCTSTR path, LPCTSTR fileName, LPCTSTR extension, - CSysString &resultPath, UINT32 &filePart) -{ - LPTSTR filePartPointer; - DWORD value = ::SearchPath(path, fileName, extension, - MAX_PATH, resultPath.GetBuffer(MAX_PATH + 1), &filePartPointer); - filePart = (UINT32)(filePartPointer - (LPCTSTR)resultPath); - resultPath.ReleaseBuffer(); - return (value > 0 && value <= MAX_PATH); -} - -#ifndef _UNICODE -bool MySearchPath(LPCWSTR path, LPCWSTR fileName, LPCWSTR extension, - UString &resultPath, UINT32 &filePart) -{ - if (g_IsNT) - { - LPWSTR filePartPointer = 0; - DWORD value = ::SearchPathW(path, fileName, extension, - MAX_PATH, resultPath.GetBuffer(MAX_PATH + 1), &filePartPointer); - filePart = (UINT32)(filePartPointer - (LPCWSTR)resultPath); - resultPath.ReleaseBuffer(); - return (value > 0 && value <= MAX_PATH); - } - - CSysString sysPath; - if (!MySearchPath( - path != 0 ? (LPCTSTR)GetSysPath(path): 0, - fileName != 0 ? (LPCTSTR)GetSysPath(fileName): 0, - extension != 0 ? (LPCTSTR)GetSysPath(extension): 0, - sysPath, filePart)) - return false; - UString resultPath1 = GetUnicodePath(sysPath.Left(filePart)); - UString resultPath2 = GetUnicodePath(sysPath.Mid(filePart)); - filePart = resultPath1.Length(); - resultPath = resultPath1 + resultPath2; - return true; -} -#endif - -bool MyGetTempPath(CSysString &path) -{ - DWORD needLength = ::GetTempPath(MAX_PATH + 1, path.GetBuffer(MAX_PATH + 1)); - path.ReleaseBuffer(); - return (needLength > 0 && needLength <= MAX_PATH); -} - -#ifndef _UNICODE -bool MyGetTempPath(UString &path) -{ - path.Empty(); - if (g_IsNT) - { - DWORD needLength = ::GetTempPathW(MAX_PATH + 1, path.GetBuffer(MAX_PATH + 1)); - path.ReleaseBuffer(); - return (needLength > 0 && needLength <= MAX_PATH); - } - CSysString sysPath; - if (!MyGetTempPath(sysPath)) - return false; - path = GetUnicodePath(sysPath); - return true; -} -#endif - -UINT MyGetTempFileName(LPCTSTR dirPath, LPCTSTR prefix, CSysString &path) -{ - UINT number = ::GetTempFileName(dirPath, prefix, 0, path.GetBuffer(MAX_PATH + 1)); - path.ReleaseBuffer(); - return number; -} - -#ifndef _UNICODE -UINT MyGetTempFileName(LPCWSTR dirPath, LPCWSTR prefix, UString &path) -{ - if (g_IsNT) - { - UINT number = ::GetTempFileNameW(dirPath, prefix, 0, path.GetBuffer(MAX_PATH)); - path.ReleaseBuffer(); - return number; - } - CSysString sysPath; - UINT number = MyGetTempFileName( - dirPath ? (LPCTSTR)GetSysPath(dirPath): 0, - prefix ? (LPCTSTR)GetSysPath(prefix): 0, - sysPath); - path = GetUnicodePath(sysPath); - return number; -} -#endif - -UINT CTempFile::Create(LPCTSTR dirPath, LPCTSTR prefix, CSysString &resultPath) -{ - Remove(); - UINT number = MyGetTempFileName(dirPath, prefix, resultPath); - if (number != 0) - { - _fileName = resultPath; - _mustBeDeleted = true; - } - return number; -} - -bool CTempFile::Create(LPCTSTR prefix, CSysString &resultPath) -{ - CSysString tempPath; - if (!MyGetTempPath(tempPath)) - return false; - if (Create(tempPath, prefix, resultPath) != 0) - return true; - if (!MyGetWindowsDirectory(tempPath)) - return false; - return (Create(tempPath, prefix, resultPath) != 0); -} - -bool CTempFile::Remove() -{ - if (!_mustBeDeleted) - return true; - _mustBeDeleted = !DeleteFileAlways(_fileName); - return !_mustBeDeleted; -} - -#ifndef _UNICODE - -UINT CTempFileW::Create(LPCWSTR dirPath, LPCWSTR prefix, UString &resultPath) -{ - Remove(); - UINT number = MyGetTempFileName(dirPath, prefix, resultPath); - if (number != 0) - { - _fileName = resultPath; - _mustBeDeleted = true; - } - return number; -} - -bool CTempFileW::Create(LPCWSTR prefix, UString &resultPath) -{ - UString tempPath; - if (!MyGetTempPath(tempPath)) - return false; - if (Create(tempPath, prefix, resultPath) != 0) - return true; - if (!MyGetWindowsDirectory(tempPath)) - return false; - return (Create(tempPath, prefix, resultPath) != 0); -} - -bool CTempFileW::Remove() -{ - if (!_mustBeDeleted) - return true; - _mustBeDeleted = !DeleteFileAlways(_fileName); - return !_mustBeDeleted; -} - -#endif - -bool CreateTempDirectory(LPCTSTR prefix, CSysString &dirName) -{ - /* - CSysString prefix = tempPath + prefixChars; - CRandom random; - random.Init(); - */ - for (;;) - { - CTempFile tempFile; - if (!tempFile.Create(prefix, dirName)) - return false; - if (!::DeleteFile(dirName)) - return false; - /* - UINT32 randomNumber = random.Generate(); - TCHAR randomNumberString[32]; - _stprintf(randomNumberString, _T("%04X"), randomNumber); - dirName = prefix + randomNumberString; - */ - if (NFind::DoesFileExist(dirName)) - continue; - if (MyCreateDirectory(dirName)) - return true; - if (::GetLastError() != ERROR_ALREADY_EXISTS) - return false; - } -} - -bool CTempDirectory::Create(LPCTSTR prefix) -{ - Remove(); - return (_mustBeDeleted = CreateTempDirectory(prefix, _tempDir)); -} - -#ifndef _UNICODE - -bool CreateTempDirectory(LPCWSTR prefix, UString &dirName) -{ - /* - CSysString prefix = tempPath + prefixChars; - CRandom random; - random.Init(); - */ - for (;;) - { - CTempFileW tempFile; - if (!tempFile.Create(prefix, dirName)) - return false; - if (!DeleteFileAlways(dirName)) - return false; - /* - UINT32 randomNumber = random.Generate(); - TCHAR randomNumberString[32]; - _stprintf(randomNumberString, _T("%04X"), randomNumber); - dirName = prefix + randomNumberString; - */ - if (NFind::DoesFileExist(dirName)) - continue; - if (MyCreateDirectory(dirName)) - return true; - if (::GetLastError() != ERROR_ALREADY_EXISTS) - return false; - } -} - -bool CTempDirectoryW::Create(LPCWSTR prefix) -{ - Remove(); - return (_mustBeDeleted = CreateTempDirectory(prefix, _tempDir)); -} - -#endif - -}}} diff --git a/desmume/src/windows/7z/CPP/Windows/FileDir.h b/desmume/src/windows/7z/CPP/Windows/FileDir.h deleted file mode 100644 index ea49264b5..000000000 --- a/desmume/src/windows/7z/CPP/Windows/FileDir.h +++ /dev/null @@ -1,178 +0,0 @@ -// Windows/FileDir.h - -#ifndef __WINDOWS_FILEDIR_H -#define __WINDOWS_FILEDIR_H - -#include "../Common/MyString.h" -#include "Defs.h" - -namespace NWindows { -namespace NFile { -namespace NDirectory { - -#ifdef WIN_LONG_PATH -bool GetLongPaths(LPCWSTR s1, LPCWSTR s2, UString &d1, UString &d2); -#endif - -bool MyGetWindowsDirectory(CSysString &path); -bool MyGetSystemDirectory(CSysString &path); -#ifndef _UNICODE -bool MyGetWindowsDirectory(UString &path); -bool MyGetSystemDirectory(UString &path); -#endif - -bool SetDirTime(LPCWSTR fileName, const FILETIME *cTime, const FILETIME *aTime, const FILETIME *mTime); - -bool MySetFileAttributes(LPCTSTR fileName, DWORD fileAttributes); -bool MyMoveFile(LPCTSTR existFileName, LPCTSTR newFileName); -bool MyRemoveDirectory(LPCTSTR pathName); -bool MyCreateDirectory(LPCTSTR pathName); -bool CreateComplexDirectory(LPCTSTR pathName); -bool DeleteFileAlways(LPCTSTR name); -bool RemoveDirectoryWithSubItems(const CSysString &path); - -#ifndef _UNICODE -bool MySetFileAttributes(LPCWSTR fileName, DWORD fileAttributes); -bool MyMoveFile(LPCWSTR existFileName, LPCWSTR newFileName); -bool MyRemoveDirectory(LPCWSTR pathName); -bool MyCreateDirectory(LPCWSTR pathName); -bool CreateComplexDirectory(LPCWSTR pathName); -bool DeleteFileAlways(LPCWSTR name); -bool RemoveDirectoryWithSubItems(const UString &path); -#endif - -#ifndef _WIN32_WCE -bool MyGetShortPathName(LPCTSTR longPath, CSysString &shortPath); - -bool MyGetFullPathName(LPCTSTR fileName, CSysString &resultPath, - int &fileNamePartStartIndex); -bool MyGetFullPathName(LPCTSTR fileName, CSysString &resultPath); -bool GetOnlyName(LPCTSTR fileName, CSysString &resultName); -bool GetOnlyDirPrefix(LPCTSTR fileName, CSysString &resultName); -#ifndef _UNICODE -bool MyGetFullPathName(LPCWSTR fileName, UString &resultPath, - int &fileNamePartStartIndex); -bool MyGetFullPathName(LPCWSTR fileName, UString &resultPath); -bool GetOnlyName(LPCWSTR fileName, UString &resultName); -bool GetOnlyDirPrefix(LPCWSTR fileName, UString &resultName); -#endif - -inline bool MySetCurrentDirectory(LPCTSTR path) - { return BOOLToBool(::SetCurrentDirectory(path)); } -bool MyGetCurrentDirectory(CSysString &resultPath); -#ifndef _UNICODE -bool MySetCurrentDirectory(LPCWSTR path); -bool MyGetCurrentDirectory(UString &resultPath); -#endif -#endif - -bool MySearchPath(LPCTSTR path, LPCTSTR fileName, LPCTSTR extension, - CSysString &resultPath, UINT32 &filePart); -#ifndef _UNICODE -bool MySearchPath(LPCWSTR path, LPCWSTR fileName, LPCWSTR extension, - UString &resultPath, UINT32 &filePart); -#endif - -inline bool MySearchPath(LPCTSTR path, LPCTSTR fileName, LPCTSTR extension, - CSysString &resultPath) -{ - UINT32 value; - return MySearchPath(path, fileName, extension, resultPath, value); -} - -#ifndef _UNICODE -inline bool MySearchPath(LPCWSTR path, LPCWSTR fileName, LPCWSTR extension, - UString &resultPath) -{ - UINT32 value; - return MySearchPath(path, fileName, extension, resultPath, value); -} -#endif - -bool MyGetTempPath(CSysString &resultPath); -#ifndef _UNICODE -bool MyGetTempPath(UString &resultPath); -#endif - -UINT MyGetTempFileName(LPCTSTR dirPath, LPCTSTR prefix, CSysString &resultPath); -#ifndef _UNICODE -UINT MyGetTempFileName(LPCWSTR dirPath, LPCWSTR prefix, UString &resultPath); -#endif - -class CTempFile -{ - bool _mustBeDeleted; - CSysString _fileName; -public: - CTempFile(): _mustBeDeleted(false) {} - ~CTempFile() { Remove(); } - void DisableDeleting() { _mustBeDeleted = false; } - UINT Create(LPCTSTR dirPath, LPCTSTR prefix, CSysString &resultPath); - bool Create(LPCTSTR prefix, CSysString &resultPath); - bool Remove(); -}; - -#ifdef _UNICODE -typedef CTempFile CTempFileW; -#else -class CTempFileW -{ - bool _mustBeDeleted; - UString _fileName; -public: - CTempFileW(): _mustBeDeleted(false) {} - ~CTempFileW() { Remove(); } - void DisableDeleting() { _mustBeDeleted = false; } - UINT Create(LPCWSTR dirPath, LPCWSTR prefix, UString &resultPath); - bool Create(LPCWSTR prefix, UString &resultPath); - bool Remove(); -}; -#endif - -bool CreateTempDirectory(LPCTSTR prefixChars, CSysString &dirName); - -class CTempDirectory -{ - bool _mustBeDeleted; - CSysString _tempDir; -public: - const CSysString &GetPath() const { return _tempDir; } - CTempDirectory(): _mustBeDeleted(false) {} - ~CTempDirectory() { Remove(); } - bool Create(LPCTSTR prefix) ; - bool Remove() - { - if (!_mustBeDeleted) - return true; - _mustBeDeleted = !RemoveDirectoryWithSubItems(_tempDir); - return (!_mustBeDeleted); - } - void DisableDeleting() { _mustBeDeleted = false; } -}; - -#ifdef _UNICODE -typedef CTempDirectory CTempDirectoryW; -#else -class CTempDirectoryW -{ - bool _mustBeDeleted; - UString _tempDir; -public: - const UString &GetPath() const { return _tempDir; } - CTempDirectoryW(): _mustBeDeleted(false) {} - ~CTempDirectoryW() { Remove(); } - bool Create(LPCWSTR prefix) ; - bool Remove() - { - if (!_mustBeDeleted) - return true; - _mustBeDeleted = !RemoveDirectoryWithSubItems(_tempDir); - return (!_mustBeDeleted); - } - void DisableDeleting() { _mustBeDeleted = false; } -}; -#endif - -}}} - -#endif diff --git a/desmume/src/windows/7z/CPP/Windows/FileFind.cpp b/desmume/src/windows/7z/CPP/Windows/FileFind.cpp deleted file mode 100644 index 7e6b30a6b..000000000 --- a/desmume/src/windows/7z/CPP/Windows/FileFind.cpp +++ /dev/null @@ -1,402 +0,0 @@ -// Windows/FileFind.cpp - -#include "StdAfx.h" - -#include "FileFind.h" -#ifndef _UNICODE -#include "../Common/StringConvert.h" -#endif - -#ifndef _UNICODE -extern bool g_IsNT; -#endif - -namespace NWindows { -namespace NFile { - -#if defined(WIN_LONG_PATH) && defined(_UNICODE) -#define WIN_LONG_PATH2 -#endif - -bool GetLongPath(LPCWSTR fileName, UString &res); - -namespace NFind { - -static const TCHAR kDot = TEXT('.'); - -bool CFileInfo::IsDots() const -{ - if (!IsDir() || Name.IsEmpty()) - return false; - if (Name[0] != kDot) - return false; - return Name.Length() == 1 || (Name[1] == kDot && Name.Length() == 2); -} - -#ifndef _UNICODE -bool CFileInfoW::IsDots() const -{ - if (!IsDir() || Name.IsEmpty()) - return false; - if (Name[0] != kDot) - return false; - return Name.Length() == 1 || (Name[1] == kDot && Name.Length() == 2); -} -#endif - -static void ConvertWIN32_FIND_DATA_To_FileInfo(const WIN32_FIND_DATA &fd, CFileInfo &fi) -{ - fi.Attrib = fd.dwFileAttributes; - fi.CTime = fd.ftCreationTime; - fi.ATime = fd.ftLastAccessTime; - fi.MTime = fd.ftLastWriteTime; - fi.Size = (((UInt64)fd.nFileSizeHigh) << 32) + fd.nFileSizeLow; - fi.Name = fd.cFileName; - #ifndef _WIN32_WCE - fi.ReparseTag = fd.dwReserved0; - #else - fi.ObjectID = fd.dwOID; - #endif -} - -#ifndef _UNICODE - -static inline UINT GetCurrentCodePage() { return ::AreFileApisANSI() ? CP_ACP : CP_OEMCP; } - -static void ConvertWIN32_FIND_DATA_To_FileInfo(const WIN32_FIND_DATAW &fd, CFileInfoW &fi) -{ - fi.Attrib = fd.dwFileAttributes; - fi.CTime = fd.ftCreationTime; - fi.ATime = fd.ftLastAccessTime; - fi.MTime = fd.ftLastWriteTime; - fi.Size = (((UInt64)fd.nFileSizeHigh) << 32) + fd.nFileSizeLow; - fi.Name = fd.cFileName; - #ifndef _WIN32_WCE - fi.ReparseTag = fd.dwReserved0; - #else - fi.ObjectID = fd.dwOID; - #endif -} - -static void ConvertWIN32_FIND_DATA_To_FileInfo(const WIN32_FIND_DATA &fd, CFileInfoW &fi) -{ - fi.Attrib = fd.dwFileAttributes; - fi.CTime = fd.ftCreationTime; - fi.ATime = fd.ftLastAccessTime; - fi.MTime = fd.ftLastWriteTime; - fi.Size = (((UInt64)fd.nFileSizeHigh) << 32) + fd.nFileSizeLow; - fi.Name = GetUnicodeString(fd.cFileName, GetCurrentCodePage()); - #ifndef _WIN32_WCE - fi.ReparseTag = fd.dwReserved0; - #else - fi.ObjectID = fd.dwOID; - #endif -} -#endif - -//////////////////////////////// -// CFindFile - -bool CFindFile::Close() -{ - if (_handle == INVALID_HANDLE_VALUE) - return true; - if (!::FindClose(_handle)) - return false; - _handle = INVALID_HANDLE_VALUE; - return true; -} - - -bool CFindFile::FindFirst(LPCTSTR wildcard, CFileInfo &fileInfo) -{ - if (!Close()) - return false; - WIN32_FIND_DATA fd; - _handle = ::FindFirstFile(wildcard, &fd); - #ifdef WIN_LONG_PATH2 - if (_handle == INVALID_HANDLE_VALUE) - { - UString longPath; - if (GetLongPath(wildcard, longPath)) - _handle = ::FindFirstFileW(longPath, &fd); - } - #endif - if (_handle == INVALID_HANDLE_VALUE) - return false; - ConvertWIN32_FIND_DATA_To_FileInfo(fd, fileInfo); - return true; -} - -#ifndef _UNICODE -bool CFindFile::FindFirst(LPCWSTR wildcard, CFileInfoW &fileInfo) -{ - if (!Close()) - return false; - if (g_IsNT) - { - WIN32_FIND_DATAW fd; - _handle = ::FindFirstFileW(wildcard, &fd); - #ifdef WIN_LONG_PATH - if (_handle == INVALID_HANDLE_VALUE) - { - UString longPath; - if (GetLongPath(wildcard, longPath)) - _handle = ::FindFirstFileW(longPath, &fd); - } - #endif - if (_handle != INVALID_HANDLE_VALUE) - ConvertWIN32_FIND_DATA_To_FileInfo(fd, fileInfo); - } - else - { - WIN32_FIND_DATAA fd; - _handle = ::FindFirstFileA(UnicodeStringToMultiByte(wildcard, - GetCurrentCodePage()), &fd); - if (_handle != INVALID_HANDLE_VALUE) - ConvertWIN32_FIND_DATA_To_FileInfo(fd, fileInfo); - } - return (_handle != INVALID_HANDLE_VALUE); -} -#endif - -bool CFindFile::FindNext(CFileInfo &fileInfo) -{ - WIN32_FIND_DATA fd; - bool result = BOOLToBool(::FindNextFile(_handle, &fd)); - if (result) - ConvertWIN32_FIND_DATA_To_FileInfo(fd, fileInfo); - return result; -} - -#ifndef _UNICODE -bool CFindFile::FindNext(CFileInfoW &fileInfo) -{ - if (g_IsNT) - { - WIN32_FIND_DATAW fd; - if (!::FindNextFileW(_handle, &fd)) - return false; - ConvertWIN32_FIND_DATA_To_FileInfo(fd, fileInfo); - } - else - { - WIN32_FIND_DATAA fd; - if (!::FindNextFileA(_handle, &fd)) - return false; - ConvertWIN32_FIND_DATA_To_FileInfo(fd, fileInfo); - } - return true; -} -#endif - -bool FindFile(LPCTSTR wildcard, CFileInfo &fileInfo) -{ - CFindFile finder; - return finder.FindFirst(wildcard, fileInfo); -} - -#ifndef _UNICODE -bool FindFile(LPCWSTR wildcard, CFileInfoW &fileInfo) -{ - CFindFile finder; - return finder.FindFirst(wildcard, fileInfo); -} -#endif - -bool DoesFileExist(LPCTSTR name) -{ - CFileInfo fileInfo; - return FindFile(name, fileInfo); -} - -#ifndef _UNICODE -bool DoesFileExist(LPCWSTR name) -{ - CFileInfoW fileInfo; - return FindFile(name, fileInfo); -} -#endif - -///////////////////////////////////// -// CEnumerator - -bool CEnumerator::NextAny(CFileInfo &fileInfo) -{ - if (_findFile.IsHandleAllocated()) - return _findFile.FindNext(fileInfo); - else - return _findFile.FindFirst(_wildcard, fileInfo); -} - -bool CEnumerator::Next(CFileInfo &fileInfo) -{ - for (;;) - { - if (!NextAny(fileInfo)) - return false; - if (!fileInfo.IsDots()) - return true; - } -} - -bool CEnumerator::Next(CFileInfo &fileInfo, bool &found) -{ - if (Next(fileInfo)) - { - found = true; - return true; - } - found = false; - return (::GetLastError() == ERROR_NO_MORE_FILES); -} - -#ifndef _UNICODE -bool CEnumeratorW::NextAny(CFileInfoW &fileInfo) -{ - if (_findFile.IsHandleAllocated()) - return _findFile.FindNext(fileInfo); - else - return _findFile.FindFirst(_wildcard, fileInfo); -} - -bool CEnumeratorW::Next(CFileInfoW &fileInfo) -{ - for (;;) - { - if (!NextAny(fileInfo)) - return false; - if (!fileInfo.IsDots()) - return true; - } -} - -bool CEnumeratorW::Next(CFileInfoW &fileInfo, bool &found) -{ - if (Next(fileInfo)) - { - found = true; - return true; - } - found = false; - return (::GetLastError() == ERROR_NO_MORE_FILES); -} - -#endif - -//////////////////////////////// -// CFindChangeNotification -// FindFirstChangeNotification can return 0. MSDN doesn't tell about it. - -bool CFindChangeNotification::Close() -{ - if (!IsHandleAllocated()) - return true; - if (!::FindCloseChangeNotification(_handle)) - return false; - _handle = INVALID_HANDLE_VALUE; - return true; -} - -HANDLE CFindChangeNotification::FindFirst(LPCTSTR pathName, bool watchSubtree, DWORD notifyFilter) -{ - _handle = ::FindFirstChangeNotification(pathName, BoolToBOOL(watchSubtree), notifyFilter); - #ifdef WIN_LONG_PATH2 - if (!IsHandleAllocated()) - { - UString longPath; - if (GetLongPath(pathName, longPath)) - _handle = ::FindFirstChangeNotificationW(longPath, BoolToBOOL(watchSubtree), notifyFilter); - } - #endif - return _handle; -} - -#ifndef _UNICODE -HANDLE CFindChangeNotification::FindFirst(LPCWSTR pathName, bool watchSubtree, DWORD notifyFilter) -{ - if (!g_IsNT) - return FindFirst(UnicodeStringToMultiByte(pathName, GetCurrentCodePage()), watchSubtree, notifyFilter); - _handle = ::FindFirstChangeNotificationW(pathName, BoolToBOOL(watchSubtree), notifyFilter); - #ifdef WIN_LONG_PATH - if (!IsHandleAllocated()) - { - UString longPath; - if (GetLongPath(pathName, longPath)) - _handle = ::FindFirstChangeNotificationW(longPath, BoolToBOOL(watchSubtree), notifyFilter); - } - #endif - return _handle; -} -#endif - -#ifndef _WIN32_WCE -bool MyGetLogicalDriveStrings(CSysStringVector &driveStrings) -{ - driveStrings.Clear(); - UINT32 size = GetLogicalDriveStrings(0, NULL); - if (size == 0) - return false; - CSysString buffer; - UINT32 newSize = GetLogicalDriveStrings(size, buffer.GetBuffer(size)); - if (newSize == 0) - return false; - if (newSize > size) - return false; - CSysString string; - for (UINT32 i = 0; i < newSize; i++) - { - TCHAR c = buffer[i]; - if (c == TEXT('\0')) - { - driveStrings.Add(string); - string.Empty(); - } - else - string += c; - } - if (!string.IsEmpty()) - return false; - return true; -} - -#ifndef _UNICODE -bool MyGetLogicalDriveStrings(UStringVector &driveStrings) -{ - driveStrings.Clear(); - if (g_IsNT) - { - UINT32 size = GetLogicalDriveStringsW(0, NULL); - if (size == 0) - return false; - UString buffer; - UINT32 newSize = GetLogicalDriveStringsW(size, buffer.GetBuffer(size)); - if (newSize == 0) - return false; - if (newSize > size) - return false; - UString string; - for (UINT32 i = 0; i < newSize; i++) - { - WCHAR c = buffer[i]; - if (c == L'\0') - { - driveStrings.Add(string); - string.Empty(); - } - else - string += c; - } - return string.IsEmpty(); - } - CSysStringVector driveStringsA; - bool res = MyGetLogicalDriveStrings(driveStringsA); - for (int i = 0; i < driveStringsA.Size(); i++) - driveStrings.Add(GetUnicodeString(driveStringsA[i])); - return res; -} -#endif - -#endif - -}}} diff --git a/desmume/src/windows/7z/CPP/Windows/FileFind.h b/desmume/src/windows/7z/CPP/Windows/FileFind.h deleted file mode 100644 index f01c1357e..000000000 --- a/desmume/src/windows/7z/CPP/Windows/FileFind.h +++ /dev/null @@ -1,153 +0,0 @@ -// Windows/FileFind.h - -#ifndef __WINDOWS_FILEFIND_H -#define __WINDOWS_FILEFIND_H - -#include "../Common/MyString.h" -#include "../Common/Types.h" -#include "FileName.h" -#include "Defs.h" - -namespace NWindows { -namespace NFile { -namespace NFind { - -namespace NAttributes -{ - inline bool IsReadOnly(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_READONLY) != 0; } - inline bool IsHidden(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_HIDDEN) != 0; } - inline bool IsSystem(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_SYSTEM) != 0; } - inline bool IsDir(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_DIRECTORY) != 0; } - inline bool IsArchived(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_ARCHIVE) != 0; } - inline bool IsCompressed(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_COMPRESSED) != 0; } - inline bool IsEncrypted(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_ENCRYPTED) != 0; } -} - -class CFileInfoBase -{ - bool MatchesMask(UINT32 mask) const { return ((Attrib & mask) != 0); } -public: - UInt64 Size; - FILETIME CTime; - FILETIME ATime; - FILETIME MTime; - DWORD Attrib; - - #ifndef _WIN32_WCE - UINT32 ReparseTag; - #else - DWORD ObjectID; - #endif - - bool IsArchived() const { return MatchesMask(FILE_ATTRIBUTE_ARCHIVE); } - bool IsCompressed() const { return MatchesMask(FILE_ATTRIBUTE_COMPRESSED); } - bool IsDir() const { return MatchesMask(FILE_ATTRIBUTE_DIRECTORY); } - bool IsEncrypted() const { return MatchesMask(FILE_ATTRIBUTE_ENCRYPTED); } - bool IsHidden() const { return MatchesMask(FILE_ATTRIBUTE_HIDDEN); } - bool IsNormal() const { return MatchesMask(FILE_ATTRIBUTE_NORMAL); } - bool IsOffline() const { return MatchesMask(FILE_ATTRIBUTE_OFFLINE); } - bool IsReadOnly() const { return MatchesMask(FILE_ATTRIBUTE_READONLY); } - bool HasReparsePoint() const { return MatchesMask(FILE_ATTRIBUTE_REPARSE_POINT); } - bool IsSparse() const { return MatchesMask(FILE_ATTRIBUTE_SPARSE_FILE); } - bool IsSystem() const { return MatchesMask(FILE_ATTRIBUTE_SYSTEM); } - bool IsTemporary() const { return MatchesMask(FILE_ATTRIBUTE_TEMPORARY); } -}; - -class CFileInfo: public CFileInfoBase -{ -public: - CSysString Name; - bool IsDots() const; -}; - -#ifdef _UNICODE -typedef CFileInfo CFileInfoW; -#else -class CFileInfoW: public CFileInfoBase -{ -public: - UString Name; - bool IsDots() const; -}; -#endif - -class CFindFile -{ - friend class CEnumerator; - HANDLE _handle; -public: - bool IsHandleAllocated() const { return _handle != INVALID_HANDLE_VALUE; } - CFindFile(): _handle(INVALID_HANDLE_VALUE) {} - ~CFindFile() { Close(); } - bool FindFirst(LPCTSTR wildcard, CFileInfo &fileInfo); - bool FindNext(CFileInfo &fileInfo); - #ifndef _UNICODE - bool FindFirst(LPCWSTR wildcard, CFileInfoW &fileInfo); - bool FindNext(CFileInfoW &fileInfo); - #endif - bool Close(); -}; - -bool FindFile(LPCTSTR wildcard, CFileInfo &fileInfo); - -bool DoesFileExist(LPCTSTR name); -#ifndef _UNICODE -bool FindFile(LPCWSTR wildcard, CFileInfoW &fileInfo); -bool DoesFileExist(LPCWSTR name); -#endif - -class CEnumerator -{ - CFindFile _findFile; - CSysString _wildcard; - bool NextAny(CFileInfo &fileInfo); -public: - CEnumerator(): _wildcard(NName::kAnyStringWildcard) {} - CEnumerator(const CSysString &wildcard): _wildcard(wildcard) {} - bool Next(CFileInfo &fileInfo); - bool Next(CFileInfo &fileInfo, bool &found); -}; - -#ifdef _UNICODE -typedef CEnumerator CEnumeratorW; -#else -class CEnumeratorW -{ - CFindFile _findFile; - UString _wildcard; - bool NextAny(CFileInfoW &fileInfo); -public: - CEnumeratorW(): _wildcard(NName::kAnyStringWildcard) {} - CEnumeratorW(const UString &wildcard): _wildcard(wildcard) {} - bool Next(CFileInfoW &fileInfo); - bool Next(CFileInfoW &fileInfo, bool &found); -}; -#endif - -class CFindChangeNotification -{ - HANDLE _handle; -public: - operator HANDLE () { return _handle; } - bool IsHandleAllocated() const { return _handle != INVALID_HANDLE_VALUE && _handle != 0; } - CFindChangeNotification(): _handle(INVALID_HANDLE_VALUE) {} - ~CFindChangeNotification() { Close(); } - bool Close(); - HANDLE FindFirst(LPCTSTR pathName, bool watchSubtree, DWORD notifyFilter); - #ifndef _UNICODE - HANDLE FindFirst(LPCWSTR pathName, bool watchSubtree, DWORD notifyFilter); - #endif - bool FindNext() { return BOOLToBool(::FindNextChangeNotification(_handle)); } -}; - -#ifndef _WIN32_WCE -bool MyGetLogicalDriveStrings(CSysStringVector &driveStrings); -#ifndef _UNICODE -bool MyGetLogicalDriveStrings(UStringVector &driveStrings); -#endif -#endif - -}}} - -#endif - diff --git a/desmume/src/windows/7z/CPP/Windows/FileIO.cpp b/desmume/src/windows/7z/CPP/Windows/FileIO.cpp deleted file mode 100644 index 520d9a2ba..000000000 --- a/desmume/src/windows/7z/CPP/Windows/FileIO.cpp +++ /dev/null @@ -1,317 +0,0 @@ -// Windows/FileIO.cpp - -#include "StdAfx.h" - -#include "FileIO.h" -#include "Defs.h" -#ifdef WIN_LONG_PATH -#include "../Common/MyString.h" -#endif -#ifndef _UNICODE -#include "../Common/StringConvert.h" -#endif - -#ifndef _UNICODE -extern bool g_IsNT; -#endif - -namespace NWindows { -namespace NFile { - -#if defined(WIN_LONG_PATH) && defined(_UNICODE) -#define WIN_LONG_PATH2 -#endif - -#ifdef WIN_LONG_PATH -bool GetLongPathBase(LPCWSTR s, UString &res) -{ - res.Empty(); - int len = MyStringLen(s); - wchar_t c = s[0]; - if (len < 1 || c == L'\\' || c == L'.' && (len == 1 || len == 2 && s[1] == L'.')) - return true; - UString curDir; - bool isAbs = false; - if (len > 3) - isAbs = (s[1] == L':' && s[2] == L'\\' && (c >= L'a' && c <= L'z' || c >= L'A' && c <= L'Z')); - - if (!isAbs) - { - DWORD needLength = ::GetCurrentDirectoryW(MAX_PATH + 1, curDir.GetBuffer(MAX_PATH + 1)); - curDir.ReleaseBuffer(); - if (needLength == 0 || needLength > MAX_PATH) - return false; - if (curDir[curDir.Length() - 1] != L'\\') - curDir += L'\\'; - } - res = UString(L"\\\\?\\") + curDir + s; - return true; -} - -bool GetLongPath(LPCWSTR path, UString &longPath) -{ - if (GetLongPathBase(path, longPath)) - return !longPath.IsEmpty(); - return false; -} -#endif - -namespace NIO { - -CFileBase::~CFileBase() { Close(); } - -bool CFileBase::Create(LPCTSTR fileName, DWORD desiredAccess, - DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes) -{ - if (!Close()) - return false; - _handle = ::CreateFile(fileName, desiredAccess, shareMode, - (LPSECURITY_ATTRIBUTES)NULL, creationDisposition, - flagsAndAttributes, (HANDLE)NULL); - #ifdef WIN_LONG_PATH2 - if (_handle == INVALID_HANDLE_VALUE) - { - UString longPath; - if (GetLongPath(fileName, longPath)) - _handle = ::CreateFileW(longPath, desiredAccess, shareMode, - (LPSECURITY_ATTRIBUTES)NULL, creationDisposition, - flagsAndAttributes, (HANDLE)NULL); - } - #endif - return (_handle != INVALID_HANDLE_VALUE); -} - -#ifndef _UNICODE -bool CFileBase::Create(LPCWSTR fileName, DWORD desiredAccess, - DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes) -{ - if (!g_IsNT) - return Create(UnicodeStringToMultiByte(fileName, ::AreFileApisANSI() ? CP_ACP : CP_OEMCP), - desiredAccess, shareMode, creationDisposition, flagsAndAttributes); - if (!Close()) - return false; - _handle = ::CreateFileW(fileName, desiredAccess, shareMode, - (LPSECURITY_ATTRIBUTES)NULL, creationDisposition, - flagsAndAttributes, (HANDLE)NULL); - #ifdef WIN_LONG_PATH - if (_handle == INVALID_HANDLE_VALUE) - { - UString longPath; - if (GetLongPath(fileName, longPath)) - _handle = ::CreateFileW(longPath, desiredAccess, shareMode, - (LPSECURITY_ATTRIBUTES)NULL, creationDisposition, - flagsAndAttributes, (HANDLE)NULL); - } - #endif - return (_handle != INVALID_HANDLE_VALUE); -} -#endif - -bool CFileBase::Close() -{ - if (_handle == INVALID_HANDLE_VALUE) - return true; - if (!::CloseHandle(_handle)) - return false; - _handle = INVALID_HANDLE_VALUE; - return true; -} - -bool CFileBase::GetPosition(UInt64 &position) const -{ - return Seek(0, FILE_CURRENT, position); -} - -bool CFileBase::GetLength(UInt64 &length) const -{ - DWORD sizeHigh; - DWORD sizeLow = ::GetFileSize(_handle, &sizeHigh); - if (sizeLow == 0xFFFFFFFF) - if (::GetLastError() != NO_ERROR) - return false; - length = (((UInt64)sizeHigh) << 32) + sizeLow; - return true; -} - -bool CFileBase::Seek(Int64 distanceToMove, DWORD moveMethod, UInt64 &newPosition) const -{ - LARGE_INTEGER value; - value.QuadPart = distanceToMove; - value.LowPart = ::SetFilePointer(_handle, value.LowPart, &value.HighPart, moveMethod); - if (value.LowPart == 0xFFFFFFFF) - if (::GetLastError() != NO_ERROR) - return false; - newPosition = value.QuadPart; - return true; -} - -bool CFileBase::Seek(UInt64 position, UInt64 &newPosition) -{ - return Seek(position, FILE_BEGIN, newPosition); -} - -bool CFileBase::SeekToBegin() -{ - UInt64 newPosition; - return Seek(0, newPosition); -} - -bool CFileBase::SeekToEnd(UInt64 &newPosition) -{ - return Seek(0, FILE_END, newPosition); -} - -bool CFileBase::GetFileInformation(CByHandleFileInfo &fileInfo) const -{ - BY_HANDLE_FILE_INFORMATION winFileInfo; - if (!::GetFileInformationByHandle(_handle, &winFileInfo)) - return false; - fileInfo.Attributes = winFileInfo.dwFileAttributes; - fileInfo.CTime = winFileInfo.ftCreationTime; - fileInfo.ATime = winFileInfo.ftLastAccessTime; - fileInfo.MTime = winFileInfo.ftLastWriteTime; - fileInfo.VolumeSerialNumber = winFileInfo.dwFileAttributes; - fileInfo.Size = (((UInt64)winFileInfo.nFileSizeHigh) << 32) + winFileInfo.nFileSizeLow; - fileInfo.NumberOfLinks = winFileInfo.nNumberOfLinks; - fileInfo.FileIndex = (((UInt64)winFileInfo.nFileIndexHigh) << 32) + winFileInfo.nFileIndexLow; - return true; -} - -///////////////////////// -// CInFile - -bool CInFile::Open(LPCTSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes) - { return Create(fileName, GENERIC_READ, shareMode, creationDisposition, flagsAndAttributes); } - -bool CInFile::OpenShared(LPCTSTR fileName, bool shareForWrite) -{ return Open(fileName, FILE_SHARE_READ | (shareForWrite ? FILE_SHARE_WRITE : 0), OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL); } - -bool CInFile::Open(LPCTSTR fileName) - { return OpenShared(fileName, false); } - -#ifndef _UNICODE -bool CInFile::Open(LPCWSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes) - { return Create(fileName, GENERIC_READ, shareMode, creationDisposition, flagsAndAttributes); } - -bool CInFile::OpenShared(LPCWSTR fileName, bool shareForWrite) -{ return Open(fileName, FILE_SHARE_READ | (shareForWrite ? FILE_SHARE_WRITE : 0), OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL); } - -bool CInFile::Open(LPCWSTR fileName) - { return OpenShared(fileName, false); } -#endif - -// ReadFile and WriteFile functions in Windows have BUG: -// If you Read or Write 64MB or more (probably min_failure_size = 64MB - 32KB + 1) -// from/to Network file, it returns ERROR_NO_SYSTEM_RESOURCES -// (Insufficient system resources exist to complete the requested service). - -// Probably in some version of Windows there are problems with other sizes: -// for 32 MB (maybe also for 16 MB). -// And message can be "Network connection was lost" - -static UInt32 kChunkSizeMax = (1 << 22); - -bool CInFile::ReadPart(void *data, UInt32 size, UInt32 &processedSize) -{ - if (size > kChunkSizeMax) - size = kChunkSizeMax; - DWORD processedLoc = 0; - bool res = BOOLToBool(::ReadFile(_handle, data, size, &processedLoc, NULL)); - processedSize = (UInt32)processedLoc; - return res; -} - -bool CInFile::Read(void *data, UInt32 size, UInt32 &processedSize) -{ - processedSize = 0; - do - { - UInt32 processedLoc = 0; - bool res = ReadPart(data, size, processedLoc); - processedSize += processedLoc; - if (!res) - return false; - if (processedLoc == 0) - return true; - data = (void *)((unsigned char *)data + processedLoc); - size -= processedLoc; - } - while (size > 0); - return true; -} - -///////////////////////// -// COutFile - -bool COutFile::Open(LPCTSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes) - { return CFileBase::Create(fileName, GENERIC_WRITE, shareMode, creationDisposition, flagsAndAttributes); } - -static inline DWORD GetCreationDisposition(bool createAlways) - { return createAlways? CREATE_ALWAYS: CREATE_NEW; } - -bool COutFile::Open(LPCTSTR fileName, DWORD creationDisposition) - { return Open(fileName, FILE_SHARE_READ, creationDisposition, FILE_ATTRIBUTE_NORMAL); } - -bool COutFile::Create(LPCTSTR fileName, bool createAlways) - { return Open(fileName, GetCreationDisposition(createAlways)); } - -#ifndef _UNICODE - -bool COutFile::Open(LPCWSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes) - { return CFileBase::Create(fileName, GENERIC_WRITE, shareMode, creationDisposition, flagsAndAttributes); } - -bool COutFile::Open(LPCWSTR fileName, DWORD creationDisposition) - { return Open(fileName, FILE_SHARE_READ, creationDisposition, FILE_ATTRIBUTE_NORMAL); } - -bool COutFile::Create(LPCWSTR fileName, bool createAlways) - { return Open(fileName, GetCreationDisposition(createAlways)); } - -#endif - -bool COutFile::SetTime(const FILETIME *cTime, const FILETIME *aTime, const FILETIME *mTime) - { return BOOLToBool(::SetFileTime(_handle, cTime, aTime, mTime)); } - -bool COutFile::SetMTime(const FILETIME *mTime) { return SetTime(NULL, NULL, mTime); } - -bool COutFile::WritePart(const void *data, UInt32 size, UInt32 &processedSize) -{ - if (size > kChunkSizeMax) - size = kChunkSizeMax; - DWORD processedLoc = 0; - bool res = BOOLToBool(::WriteFile(_handle, data, size, &processedLoc, NULL)); - processedSize = (UInt32)processedLoc; - return res; -} - -bool COutFile::Write(const void *data, UInt32 size, UInt32 &processedSize) -{ - processedSize = 0; - do - { - UInt32 processedLoc = 0; - bool res = WritePart(data, size, processedLoc); - processedSize += processedLoc; - if (!res) - return false; - if (processedLoc == 0) - return true; - data = (const void *)((const unsigned char *)data + processedLoc); - size -= processedLoc; - } - while (size > 0); - return true; -} - -bool COutFile::SetEndOfFile() { return BOOLToBool(::SetEndOfFile(_handle)); } - -bool COutFile::SetLength(UInt64 length) -{ - UInt64 newPosition; - if (!Seek(length, newPosition)) - return false; - if (newPosition != length) - return false; - return SetEndOfFile(); -} - -}}} diff --git a/desmume/src/windows/7z/CPP/Windows/FileIO.h b/desmume/src/windows/7z/CPP/Windows/FileIO.h deleted file mode 100644 index 930a13d94..000000000 --- a/desmume/src/windows/7z/CPP/Windows/FileIO.h +++ /dev/null @@ -1,99 +0,0 @@ -// Windows/FileIO.h - -#ifndef __WINDOWS_FILEIO_H -#define __WINDOWS_FILEIO_H - -#include "../Common/Types.h" - -namespace NWindows { -namespace NFile { -namespace NIO { - -struct CByHandleFileInfo -{ - DWORD Attributes; - FILETIME CTime; - FILETIME ATime; - FILETIME MTime; - DWORD VolumeSerialNumber; - UInt64 Size; - DWORD NumberOfLinks; - UInt64 FileIndex; -}; - -class CFileBase -{ -protected: - HANDLE _handle; - bool Create(LPCTSTR fileName, DWORD desiredAccess, - DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes); - #ifndef _UNICODE - bool Create(LPCWSTR fileName, DWORD desiredAccess, - DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes); - #endif - -public: - CFileBase(): _handle(INVALID_HANDLE_VALUE){}; - ~CFileBase(); - - bool Close(); - - bool GetPosition(UInt64 &position) const; - bool GetLength(UInt64 &length) const; - - bool Seek(Int64 distanceToMove, DWORD moveMethod, UInt64 &newPosition) const; - bool Seek(UInt64 position, UInt64 &newPosition); - bool SeekToBegin(); - bool SeekToEnd(UInt64 &newPosition); - - bool GetFileInformation(CByHandleFileInfo &fileInfo) const; -}; - -class CInFile: public CFileBase -{ -public: - bool Open(LPCTSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes); - bool OpenShared(LPCTSTR fileName, bool shareForWrite); - bool Open(LPCTSTR fileName); - #ifndef _UNICODE - bool Open(LPCWSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes); - bool OpenShared(LPCWSTR fileName, bool shareForWrite); - bool Open(LPCWSTR fileName); - #endif - bool ReadPart(void *data, UInt32 size, UInt32 &processedSize); - bool Read(void *data, UInt32 size, UInt32 &processedSize); -}; - -class COutFile: public CFileBase -{ - // DWORD m_CreationDisposition; -public: - // COutFile(): m_CreationDisposition(CREATE_NEW){}; - bool Open(LPCTSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes); - bool Open(LPCTSTR fileName, DWORD creationDisposition); - bool Create(LPCTSTR fileName, bool createAlways); - - #ifndef _UNICODE - bool Open(LPCWSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes); - bool Open(LPCWSTR fileName, DWORD creationDisposition); - bool Create(LPCWSTR fileName, bool createAlways); - #endif - - /* - void SetOpenCreationDisposition(DWORD creationDisposition) - { m_CreationDisposition = creationDisposition; } - void SetOpenCreationDispositionCreateAlways() - { m_CreationDisposition = CREATE_ALWAYS; } - */ - - bool SetTime(const FILETIME *cTime, const FILETIME *aTime, const FILETIME *mTime); - bool SetMTime(const FILETIME *mTime); - bool WritePart(const void *data, UInt32 size, UInt32 &processedSize); - bool Write(const void *data, UInt32 size, UInt32 &processedSize); - bool SetEndOfFile(); - bool SetLength(UInt64 length); -}; - -}}} - -#endif diff --git a/desmume/src/windows/7z/CPP/Windows/FileName.h b/desmume/src/windows/7z/CPP/Windows/FileName.h deleted file mode 100644 index 02dba3b69..000000000 --- a/desmume/src/windows/7z/CPP/Windows/FileName.h +++ /dev/null @@ -1,25 +0,0 @@ -// Windows/FileName.h - -#ifndef __WINDOWS_FILENAME_H -#define __WINDOWS_FILENAME_H - -#include "../Common/MyString.h" - -namespace NWindows { -namespace NFile { -namespace NName { - -const TCHAR kDirDelimiter = CHAR_PATH_SEPARATOR; -const TCHAR kAnyStringWildcard = '*'; - -void NormalizeDirPathPrefix(CSysString &dirPath); // ensures that it ended with '\\' -#ifndef _UNICODE -void NormalizeDirPathPrefix(UString &dirPath); // ensures that it ended with '\\' -#endif - -void SplitNameToPureNameAndExtension(const UString &fullName, - UString &pureName, UString &extensionDelimiter, UString &extension); - -}}} - -#endif diff --git a/desmume/src/windows/7z/CPP/Windows/Handle.h b/desmume/src/windows/7z/CPP/Windows/Handle.h deleted file mode 100644 index 16546079d..000000000 --- a/desmume/src/windows/7z/CPP/Windows/Handle.h +++ /dev/null @@ -1,37 +0,0 @@ -// Windows/Handle.h - -#ifndef __WINDOWS_HANDLE_H -#define __WINDOWS_HANDLE_H - -namespace NWindows { - -class CHandle -{ -protected: - HANDLE _handle; -public: - operator HANDLE() { return _handle; } - CHandle(): _handle(NULL) {} - ~CHandle() { Close(); } - bool Close() - { - if (_handle == NULL) - return true; - if (!::CloseHandle(_handle)) - return false; - _handle = NULL; - return true; - } - void Attach(HANDLE handle) - { _handle = handle; } - HANDLE Detach() - { - HANDLE handle = _handle; - _handle = NULL; - return handle; - } -}; - -} - -#endif diff --git a/desmume/src/windows/7z/CPP/Windows/PropVariant.cpp b/desmume/src/windows/7z/CPP/Windows/PropVariant.cpp deleted file mode 100644 index fff513d18..000000000 --- a/desmume/src/windows/7z/CPP/Windows/PropVariant.cpp +++ /dev/null @@ -1,312 +0,0 @@ -// Windows/PropVariant.cpp - -#include "StdAfx.h" - -#include "PropVariant.h" - -#include "../Common/Defs.h" - -namespace NWindows { -namespace NCOM { - -CPropVariant::CPropVariant(const PROPVARIANT& varSrc) -{ - vt = VT_EMPTY; - InternalCopy(&varSrc); -} - -CPropVariant::CPropVariant(const CPropVariant& varSrc) -{ - vt = VT_EMPTY; - InternalCopy(&varSrc); -} - -CPropVariant::CPropVariant(BSTR bstrSrc) -{ - vt = VT_EMPTY; - *this = bstrSrc; -} - -CPropVariant::CPropVariant(LPCOLESTR lpszSrc) -{ - vt = VT_EMPTY; - *this = lpszSrc; -} - -CPropVariant& CPropVariant::operator=(const CPropVariant& varSrc) -{ - InternalCopy(&varSrc); - return *this; -} -CPropVariant& CPropVariant::operator=(const PROPVARIANT& varSrc) -{ - InternalCopy(&varSrc); - return *this; -} - -CPropVariant& CPropVariant::operator=(BSTR bstrSrc) -{ - *this = (LPCOLESTR)bstrSrc; - return *this; -} - -CPropVariant& CPropVariant::operator=(LPCOLESTR lpszSrc) -{ - InternalClear(); - vt = VT_BSTR; - wReserved1 = 0; - bstrVal = ::SysAllocString(lpszSrc); - if (bstrVal == NULL && lpszSrc != NULL) - { - vt = VT_ERROR; - scode = E_OUTOFMEMORY; - } - return *this; -} - - -CPropVariant& CPropVariant::operator=(bool bSrc) -{ - if (vt != VT_BOOL) - { - InternalClear(); - vt = VT_BOOL; - } - boolVal = bSrc ? VARIANT_TRUE : VARIANT_FALSE; - return *this; -} - -CPropVariant& CPropVariant::operator=(UInt32 value) -{ - if (vt != VT_UI4) - { - InternalClear(); - vt = VT_UI4; - } - ulVal = value; - return *this; -} - -CPropVariant& CPropVariant::operator=(UInt64 value) -{ - if (vt != VT_UI8) - { - InternalClear(); - vt = VT_UI8; - } - uhVal.QuadPart = value; - return *this; -} - -CPropVariant& CPropVariant::operator=(const FILETIME &value) -{ - if (vt != VT_FILETIME) - { - InternalClear(); - vt = VT_FILETIME; - } - filetime = value; - return *this; -} - -CPropVariant& CPropVariant::operator=(Int32 value) -{ - if (vt != VT_I4) - { - InternalClear(); - vt = VT_I4; - } - lVal = value; - - return *this; -} - -CPropVariant& CPropVariant::operator=(Byte value) -{ - if (vt != VT_UI1) - { - InternalClear(); - vt = VT_UI1; - } - bVal = value; - return *this; -} - -CPropVariant& CPropVariant::operator=(Int16 value) -{ - if (vt != VT_I2) - { - InternalClear(); - vt = VT_I2; - } - iVal = value; - return *this; -} - -/* -CPropVariant& CPropVariant::operator=(LONG value) -{ - if (vt != VT_I4) - { - InternalClear(); - vt = VT_I4; - } - lVal = value; - return *this; -} -*/ - -static HRESULT MyPropVariantClear(PROPVARIANT *propVariant) -{ - switch(propVariant->vt) - { - case VT_UI1: - case VT_I1: - case VT_I2: - case VT_UI2: - case VT_BOOL: - case VT_I4: - case VT_UI4: - case VT_R4: - case VT_INT: - case VT_UINT: - case VT_ERROR: - case VT_FILETIME: - case VT_UI8: - case VT_R8: - case VT_CY: - case VT_DATE: - propVariant->vt = VT_EMPTY; - propVariant->wReserved1 = 0; - return S_OK; - } - return ::VariantClear((VARIANTARG *)propVariant); -} - -HRESULT CPropVariant::Clear() -{ - return MyPropVariantClear(this); -} - -HRESULT CPropVariant::Copy(const PROPVARIANT* pSrc) -{ - ::VariantClear((tagVARIANT *)this); - switch(pSrc->vt) - { - case VT_UI1: - case VT_I1: - case VT_I2: - case VT_UI2: - case VT_BOOL: - case VT_I4: - case VT_UI4: - case VT_R4: - case VT_INT: - case VT_UINT: - case VT_ERROR: - case VT_FILETIME: - case VT_UI8: - case VT_R8: - case VT_CY: - case VT_DATE: - memmove((PROPVARIANT*)this, pSrc, sizeof(PROPVARIANT)); - return S_OK; - } - return ::VariantCopy((tagVARIANT *)this, (tagVARIANT *)(pSrc)); -} - - -HRESULT CPropVariant::Attach(PROPVARIANT* pSrc) -{ - HRESULT hr = Clear(); - if (FAILED(hr)) - return hr; - memcpy(this, pSrc, sizeof(PROPVARIANT)); - pSrc->vt = VT_EMPTY; - return S_OK; -} - -HRESULT CPropVariant::Detach(PROPVARIANT* pDest) -{ - HRESULT hr = MyPropVariantClear(pDest); - if (FAILED(hr)) - return hr; - memcpy(pDest, this, sizeof(PROPVARIANT)); - vt = VT_EMPTY; - return S_OK; -} - -HRESULT CPropVariant::InternalClear() -{ - HRESULT hr = Clear(); - if (FAILED(hr)) - { - vt = VT_ERROR; - scode = hr; - } - return hr; -} - -void CPropVariant::InternalCopy(const PROPVARIANT* pSrc) -{ - HRESULT hr = Copy(pSrc); - if (FAILED(hr)) - { - vt = VT_ERROR; - scode = hr; - } -} - -int CPropVariant::Compare(const CPropVariant &a) -{ - if (vt != a.vt) - return 0; // it's mean some bug - switch (vt) - { - case VT_EMPTY: - return 0; - - /* - case VT_I1: - return MyCompare(cVal, a.cVal); - */ - case VT_UI1: - return MyCompare(bVal, a.bVal); - - case VT_I2: - return MyCompare(iVal, a.iVal); - case VT_UI2: - return MyCompare(uiVal, a.uiVal); - - case VT_I4: - return MyCompare(lVal, a.lVal); - /* - case VT_INT: - return MyCompare(intVal, a.intVal); - */ - case VT_UI4: - return MyCompare(ulVal, a.ulVal); - /* - case VT_UINT: - return MyCompare(uintVal, a.uintVal); - */ - case VT_I8: - return MyCompare(hVal.QuadPart, a.hVal.QuadPart); - case VT_UI8: - return MyCompare(uhVal.QuadPart, a.uhVal.QuadPart); - - case VT_BOOL: - return -MyCompare(boolVal, a.boolVal); - - case VT_FILETIME: - return ::CompareFileTime(&filetime, &a.filetime); - case VT_BSTR: - return 0; // Not implemented - // return MyCompare(aPropVarint.cVal); - - default: - return 0; - } -} - -}} diff --git a/desmume/src/windows/7z/CPP/Windows/PropVariant.h b/desmume/src/windows/7z/CPP/Windows/PropVariant.h deleted file mode 100644 index 85284e030..000000000 --- a/desmume/src/windows/7z/CPP/Windows/PropVariant.h +++ /dev/null @@ -1,57 +0,0 @@ -// Windows/PropVariant.h - -#ifndef __WINDOWS_PROPVARIANT_H -#define __WINDOWS_PROPVARIANT_H - -#include "../Common/MyWindows.h" -#include "../Common/Types.h" - -namespace NWindows { -namespace NCOM { - -class CPropVariant : public tagPROPVARIANT -{ -public: - CPropVariant() { vt = VT_EMPTY; wReserved1 = 0; } - ~CPropVariant() { Clear(); } - CPropVariant(const PROPVARIANT& varSrc); - CPropVariant(const CPropVariant& varSrc); - CPropVariant(BSTR bstrSrc); - CPropVariant(LPCOLESTR lpszSrc); - CPropVariant(bool bSrc) { vt = VT_BOOL; wReserved1 = 0; boolVal = (bSrc ? VARIANT_TRUE : VARIANT_FALSE); }; - CPropVariant(UInt32 value) { vt = VT_UI4; wReserved1 = 0; ulVal = value; } - CPropVariant(UInt64 value) { vt = VT_UI8; wReserved1 = 0; uhVal = *(ULARGE_INTEGER*)&value; } - CPropVariant(const FILETIME &value) { vt = VT_FILETIME; wReserved1 = 0; filetime = value; } - CPropVariant(Int32 value) { vt = VT_I4; wReserved1 = 0; lVal = value; } - CPropVariant(Byte value) { vt = VT_UI1; wReserved1 = 0; bVal = value; } - CPropVariant(Int16 value) { vt = VT_I2; wReserved1 = 0; iVal = value; } - // CPropVariant(LONG value, VARTYPE vtSrc = VT_I4) { vt = vtSrc; lVal = value; } - - CPropVariant& operator=(const CPropVariant& varSrc); - CPropVariant& operator=(const PROPVARIANT& varSrc); - CPropVariant& operator=(BSTR bstrSrc); - CPropVariant& operator=(LPCOLESTR lpszSrc); - CPropVariant& operator=(bool bSrc); - CPropVariant& operator=(UInt32 value); - CPropVariant& operator=(UInt64 value); - CPropVariant& operator=(const FILETIME &value); - - CPropVariant& operator=(Int32 value); - CPropVariant& operator=(Byte value); - CPropVariant& operator=(Int16 value); - // CPropVariant& operator=(LONG value); - - HRESULT Clear(); - HRESULT Copy(const PROPVARIANT* pSrc); - HRESULT Attach(PROPVARIANT* pSrc); - HRESULT Detach(PROPVARIANT* pDest); - - HRESULT InternalClear(); - void InternalCopy(const PROPVARIANT* pSrc); - - int Compare(const CPropVariant &a1); -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/Windows/StdAfx.h b/desmume/src/windows/7z/CPP/Windows/StdAfx.h deleted file mode 100644 index 5308d632d..000000000 --- a/desmume/src/windows/7z/CPP/Windows/StdAfx.h +++ /dev/null @@ -1,9 +0,0 @@ -// StdAfx.h - -#ifndef __STDAFX_H -#define __STDAFX_H - -#include "../Common/MyWindows.h" -#include "../Common/NewHandler.h" - -#endif diff --git a/desmume/src/windows/7z/CPP/Windows/Synchronization.h b/desmume/src/windows/7z/CPP/Windows/Synchronization.h deleted file mode 100644 index 1aeb91a6e..000000000 --- a/desmume/src/windows/7z/CPP/Windows/Synchronization.h +++ /dev/null @@ -1,168 +0,0 @@ -// Windows/Synchronization.h - -#ifndef __WINDOWS_SYNCHRONIZATION_H -#define __WINDOWS_SYNCHRONIZATION_H - -#include "Defs.h" - -extern "C" -{ -#include "../../C/Threads.h" -} - -#ifdef _WIN32 -#include "Handle.h" -#endif - -namespace NWindows { -namespace NSynchronization { - -class CBaseEvent -{ -protected: - ::CEvent _object; -public: - bool IsCreated() { return Event_IsCreated(&_object) != 0; } - operator HANDLE() { return _object.handle; } - CBaseEvent() { Event_Construct(&_object); } - ~CBaseEvent() { Close(); } - WRes Close() { return Event_Close(&_object); } - #ifdef _WIN32 - WRes Create(bool manualReset, bool initiallyOwn, LPCTSTR name = NULL, - LPSECURITY_ATTRIBUTES securityAttributes = NULL) - { - _object.handle = ::CreateEvent(securityAttributes, BoolToBOOL(manualReset), - BoolToBOOL(initiallyOwn), name); - if (_object.handle != 0) - return 0; - return ::GetLastError(); - } - WRes Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name) - { - _object.handle = ::OpenEvent(desiredAccess, BoolToBOOL(inheritHandle), name); - if (_object.handle != 0) - return 0; - return ::GetLastError(); - } - #endif - - WRes Set() { return Event_Set(&_object); } - // bool Pulse() { return BOOLToBool(::PulseEvent(_handle)); } - WRes Reset() { return Event_Reset(&_object); } - WRes Lock() { return Event_Wait(&_object); } -}; - -class CManualResetEvent: public CBaseEvent -{ -public: - WRes Create(bool initiallyOwn = false) - { - return ManualResetEvent_Create(&_object, initiallyOwn ? 1: 0); - } - WRes CreateIfNotCreated() - { - if (IsCreated()) - return 0; - return ManualResetEvent_CreateNotSignaled(&_object); - } - #ifdef _WIN32 - WRes CreateWithName(bool initiallyOwn, LPCTSTR name) - { - return CBaseEvent::Create(true, initiallyOwn, name); - } - #endif -}; - -class CAutoResetEvent: public CBaseEvent -{ -public: - WRes Create() - { - return AutoResetEvent_CreateNotSignaled(&_object); - } - WRes CreateIfNotCreated() - { - if (IsCreated()) - return 0; - return AutoResetEvent_CreateNotSignaled(&_object); - } -}; - -#ifdef _WIN32 -class CObject: public CHandle -{ -public: - WRes Lock(DWORD timeoutInterval = INFINITE) - { return (::WaitForSingleObject(_handle, timeoutInterval) == WAIT_OBJECT_0 ? 0 : ::GetLastError()); } -}; -class CMutex: public CObject -{ -public: - WRes Create(bool initiallyOwn, LPCTSTR name = NULL, - LPSECURITY_ATTRIBUTES securityAttributes = NULL) - { - _handle = ::CreateMutex(securityAttributes, BoolToBOOL(initiallyOwn), name); - if (_handle != 0) - return 0; - return ::GetLastError(); - } - WRes Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name) - { - _handle = ::OpenMutex(desiredAccess, BoolToBOOL(inheritHandle), name); - if (_handle != 0) - return 0; - return ::GetLastError(); - } - WRes Release() - { - return ::ReleaseMutex(_handle) ? 0 : ::GetLastError(); - } -}; -class CMutexLock -{ - CMutex *_object; -public: - CMutexLock(CMutex &object): _object(&object) { _object->Lock(); } - ~CMutexLock() { _object->Release(); } -}; -#endif - -class CSemaphore -{ - ::CSemaphore _object; -public: - CSemaphore() { Semaphore_Construct(&_object); } - ~CSemaphore() { Close(); } - WRes Close() { return Semaphore_Close(&_object); } - operator HANDLE() { return _object.handle; } - WRes Create(UInt32 initiallyCount, UInt32 maxCount) - { - return Semaphore_Create(&_object, initiallyCount, maxCount); - } - WRes Release() { return Semaphore_Release1(&_object); } - WRes Release(UInt32 releaseCount) { return Semaphore_ReleaseN(&_object, releaseCount); } - WRes Lock() { return Semaphore_Wait(&_object); } -}; - -class CCriticalSection -{ - ::CCriticalSection _object; -public: - CCriticalSection() { CriticalSection_Init(&_object); } - ~CCriticalSection() { CriticalSection_Delete(&_object); } - void Enter() { CriticalSection_Enter(&_object); } - void Leave() { CriticalSection_Leave(&_object); } -}; - -class CCriticalSectionLock -{ - CCriticalSection *_object; - void Unlock() { _object->Leave(); } -public: - CCriticalSectionLock(CCriticalSection &object): _object(&object) {_object->Enter(); } - ~CCriticalSectionLock() { Unlock(); } -}; - -}} - -#endif diff --git a/desmume/src/windows/7z/CPP/Windows/Thread.h b/desmume/src/windows/7z/CPP/Windows/Thread.h deleted file mode 100644 index 6a1e63f23..000000000 --- a/desmume/src/windows/7z/CPP/Windows/Thread.h +++ /dev/null @@ -1,38 +0,0 @@ -// Windows/Thread.h - -#ifndef __WINDOWS_THREAD_H -#define __WINDOWS_THREAD_H - -#include "Defs.h" - -extern "C" -{ -#include "../../C/Threads.h" -} - -namespace NWindows { - -class CThread -{ - ::CThread thread; -public: - CThread() { Thread_Construct(&thread); } - ~CThread() { Close(); } - bool IsCreated() { return Thread_WasCreated(&thread) != 0; } - WRes Close() { return Thread_Close(&thread); } - WRes Create(THREAD_FUNC_RET_TYPE (THREAD_FUNC_CALL_TYPE *startAddress)(void *), LPVOID parameter) - { return Thread_Create(&thread, startAddress, parameter); } - WRes Wait() { return Thread_Wait(&thread); } - - #ifdef _WIN32 - DWORD Resume() { return ::ResumeThread(thread.handle); } - DWORD Suspend() { return ::SuspendThread(thread.handle); } - bool Terminate(DWORD exitCode) { return BOOLToBool(::TerminateThread(thread.handle, exitCode)); } - int GetPriority() { return ::GetThreadPriority(thread.handle); } - bool SetPriority(int priority) { return BOOLToBool(::SetThreadPriority(thread.handle, priority)); } - #endif -}; - -} - -#endif diff --git a/desmume/src/windows/7z/CPP/Windows/Time.cpp b/desmume/src/windows/7z/CPP/Windows/Time.cpp deleted file mode 100644 index ff49803ab..000000000 --- a/desmume/src/windows/7z/CPP/Windows/Time.cpp +++ /dev/null @@ -1,86 +0,0 @@ -// Windows/Time.cpp - -#include "StdAfx.h" - -#include "Time.h" -#include "Windows/Defs.h" - -namespace NWindows { -namespace NTime { - -bool DosTimeToFileTime(UInt32 dosTime, FILETIME &fileTime) -{ - return BOOLToBool(::DosDateTimeToFileTime((UInt16)(dosTime >> 16), (UInt16)(dosTime & 0xFFFF), &fileTime)); -} - -static const UInt32 kHighDosTime = 0xFF9FBF7D; -static const UInt32 kLowDosTime = 0x210000; - -bool FileTimeToDosTime(const FILETIME &fileTime, UInt32 &dosTime) -{ - WORD datePart, timePart; - if (!::FileTimeToDosDateTime(&fileTime, &datePart, &timePart)) - { - dosTime = (fileTime.dwHighDateTime >= 0x01C00000) ? kHighDosTime : kLowDosTime; - return false; - } - dosTime = (((UInt32)datePart) << 16) + timePart; - return true; -} - -static const UInt32 kNumTimeQuantumsInSecond = 10000000; -static const UInt64 kUnixTimeStartValue = ((UInt64)kNumTimeQuantumsInSecond) * 60 * 60 * 24 * 134774; - -void UnixTimeToFileTime(UInt32 unixTime, FILETIME &fileTime) -{ - UInt64 v = kUnixTimeStartValue + ((UInt64)unixTime) * kNumTimeQuantumsInSecond; - fileTime.dwLowDateTime = (DWORD)v; - fileTime.dwHighDateTime = (DWORD)(v >> 32); -} - -bool FileTimeToUnixTime(const FILETIME &fileTime, UInt32 &unixTime) -{ - UInt64 winTime = (((UInt64)fileTime.dwHighDateTime) << 32) + fileTime.dwLowDateTime; - if (winTime < kUnixTimeStartValue) - { - unixTime = 0; - return false; - } - winTime = (winTime - kUnixTimeStartValue) / kNumTimeQuantumsInSecond; - if (winTime > 0xFFFFFFFF) - { - unixTime = 0xFFFFFFFF; - return false; - } - unixTime = (UInt32)winTime; - return true; -} - -bool GetSecondsSince1601(unsigned year, unsigned month, unsigned day, - unsigned hour, unsigned min, unsigned sec, UInt64 &resSeconds) -{ - resSeconds = 0; - if (year < 1601 || year >= 10000 || month < 1 || month > 12 || - day < 1 || day > 31 || hour > 23 || min > 59 || sec > 59) - return false; - UInt32 numYears = year - 1601; - UInt32 numDays = numYears * 365 + numYears / 4 - numYears / 100 + numYears / 400; - Byte ms[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; - if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) - ms[1] = 29; - month--; - for (unsigned i = 0; i < month; i++) - numDays += ms[i]; - numDays += day - 1; - resSeconds = ((UInt64)(numDays * 24 + hour) * 60 + min) * 60 + sec; - return true; -} - -void GetCurUtcFileTime(FILETIME &ft) -{ - SYSTEMTIME st; - GetSystemTime(&st); - SystemTimeToFileTime(&st, &ft); -} - -}} diff --git a/desmume/src/windows/7z/CPP/Windows/Time.h b/desmume/src/windows/7z/CPP/Windows/Time.h deleted file mode 100644 index 7ecb204b2..000000000 --- a/desmume/src/windows/7z/CPP/Windows/Time.h +++ /dev/null @@ -1,21 +0,0 @@ -// Windows/Time.h - -#ifndef __WINDOWS_TIME_H -#define __WINDOWS_TIME_H - -#include "Common/Types.h" - -namespace NWindows { -namespace NTime { - -bool DosTimeToFileTime(UInt32 dosTime, FILETIME &fileTime); -bool FileTimeToDosTime(const FILETIME &fileTime, UInt32 &dosTime); -void UnixTimeToFileTime(UInt32 unixTime, FILETIME &fileTime); -bool FileTimeToUnixTime(const FILETIME &fileTime, UInt32 &unixTime); -bool GetSecondsSince1601(unsigned year, unsigned month, unsigned day, - unsigned hour, unsigned min, unsigned sec, UInt64 &resSeconds); -void GetCurUtcFileTime(FILETIME &ft); - -}} - -#endif diff --git a/desmume/src/windows/7z/DOC/License.txt b/desmume/src/windows/7z/DOC/License.txt deleted file mode 100644 index b472b97a8..000000000 --- a/desmume/src/windows/7z/DOC/License.txt +++ /dev/null @@ -1,57 +0,0 @@ -NOTE: The 7-zip library source is available under the LGPL, -however, this copy of it is distributed under the GPL 2.0. -This license has been modified accordingly. - - - 7-Zip source code - ~~~~~~~~~~~~~~~~~ - License for use and distribution - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - 7-Zip Copyright (C) 1999-2009 Igor Pavlov. - - Licenses for files are: - - 1) The 8 files in CPP/7zip/Compress/Rar*: GNU GPL 2.0 + unRAR restriction - 2) All other files: GNU GPL 2.0 - - The GNU GPL + unRAR restriction means that you must follow both - GNU GPL rules and unRAR restriction rules. - - - GNU GPL information - -------------------- - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - - - unRAR restriction - ----------------- - - The decompression engine for RAR archives was developed using source - code of unRAR program. - All copyrights to original unRAR code are owned by Alexander Roshal. - - The license for original unRAR code has the following restriction: - - The unRAR sources cannot be used to re-create the RAR compression algorithm, - which is proprietary. Distribution of modified unRAR sources in separate form - or as a part of other software is permitted, provided that it is clearly - stated in the documentation and source comments that the code may - not be used to develop a RAR (WinRAR) compatible archiver. - - - -- - Igor Pavlov diff --git a/desmume/src/windows/7z/DOC/gpl.txt b/desmume/src/windows/7z/DOC/gpl.txt deleted file mode 100644 index 82fa1daad..000000000 --- a/desmume/src/windows/7z/DOC/gpl.txt +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/desmume/src/windows/7z/DOC/readme.txt b/desmume/src/windows/7z/DOC/readme.txt deleted file mode 100644 index d7de5c264..000000000 --- a/desmume/src/windows/7z/DOC/readme.txt +++ /dev/null @@ -1,48 +0,0 @@ -This copy of the 7-zip source code has been modified as follows: -- Encoding support has been disabled, so only archive extraction is supported. -- Some archive formats have been removed, so only 7z, bzip2, gzip, lzh, lzma, rar, split, tar, and zip are supported. -- Support for using it as a static library has been added. (specifically, a file called InitializeStaticLib.h) -- Occasional minor fixes/customization not really worth describing in detail. -- The LGPL part of the 7-zip library source license has been upgraded to GPL 2.0 (as per condition 3 of the LGPL 2.1) - -You can find most of the files in this library in the "7-Zip Source code" download at http://www.7-zip.org/ distributed under the LGPL 2.1. A small subset of them are in the LZMA SDK which is public domain and can be found at http://www.7-zip.org/sdk.html - - - -7-Zip 4.64 Sources ------------------- - -7-Zip is a file archiver for Windows 95/98/ME/NT/2000/2003/XP/Vista. - -7-Zip Copyright (C) 1999-2009 Igor Pavlov. - - -License Info ------------- - -This copy of 7-Zip is free software distributed under the GNU GPL 2.0 -(with an additional restriction that has always applied to the unRar code). -read License.txt for more infomation about license. - -Notes about unRAR license: - -Please check main restriction from unRar license: - - 2. The unRAR sources may be used in any software to handle RAR - archives without limitations free of charge, but cannot be used - to re-create the RAR compression algorithm, which is proprietary. - Distribution of modified unRAR sources in separate form or as a - part of other software is permitted, provided that it is clearly - stated in the documentation and source comments that the code may - not be used to develop a RAR (WinRAR) compatible archiver. - -In brief it means: -1) You can compile and use compiled files under GNU GPL rules, since - unRAR license almost has no restrictions for compiled files. - You can link these compiled files to GPL programs. -2) You can fix bugs in source code and use compiled fixed version. -3) You can not use unRAR sources to re-create the RAR compression algorithm. - ---- -Igor Pavlov -http://www.7-zip.org diff --git a/desmume/src/windows/7z/DOC/unRarLicense.txt b/desmume/src/windows/7z/DOC/unRarLicense.txt deleted file mode 100644 index 5f78b728d..000000000 --- a/desmume/src/windows/7z/DOC/unRarLicense.txt +++ /dev/null @@ -1,41 +0,0 @@ - ****** ***** ****** unRAR - free utility for RAR archives - ** ** ** ** ** ** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ****** ******* ****** License for use and distribution of - ** ** ** ** ** ** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ** ** ** ** ** ** FREE portable version - ~~~~~~~~~~~~~~~~~~~~~ - - The source code of unRAR utility is freeware. This means: - - 1. All copyrights to RAR and the utility unRAR are exclusively - owned by the author - Alexander Roshal. - - 2. The unRAR sources may be used in any software to handle RAR - archives without limitations free of charge, but cannot be used - to re-create the RAR compression algorithm, which is proprietary. - Distribution of modified unRAR sources in separate form or as a - part of other software is permitted, provided that it is clearly - stated in the documentation and source comments that the code may - not be used to develop a RAR (WinRAR) compatible archiver. - - 3. The unRAR utility may be freely distributed. No person or company - may charge a fee for the distribution of unRAR without written - permission from the copyright holder. - - 4. THE RAR ARCHIVER AND THE UNRAR UTILITY ARE DISTRIBUTED "AS IS". - NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED. YOU USE AT - YOUR OWN RISK. THE AUTHOR WILL NOT BE LIABLE FOR DATA LOSS, - DAMAGES, LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING - OR MISUSING THIS SOFTWARE. - - 5. Installing and using the unRAR utility signifies acceptance of - these terms and conditions of the license. - - 6. If you don't agree with terms of the license you must remove - unRAR files from your storage devices and cease to use the - utility. - - Thank you for your interest in RAR and unRAR. - - - Alexander L. Roshal \ No newline at end of file diff --git a/desmume/src/windows/CWindow.cpp b/desmume/src/windows/CWindow.cpp index e6581e5bd..d8535577c 100644 --- a/desmume/src/windows/CWindow.cpp +++ b/desmume/src/windows/CWindow.cpp @@ -1,6 +1,5 @@ /* Copyright (C) 2006 yopyop - yopyop156@ifrance.com - yopyop156.ifrance.com + Copyright (C) 2006-2009 DeSmuME team This file is part of DeSmuME diff --git a/desmume/src/windows/CWindow.h b/desmume/src/windows/CWindow.h index 96640a260..c30de934d 100644 --- a/desmume/src/windows/CWindow.h +++ b/desmume/src/windows/CWindow.h @@ -1,6 +1,5 @@ /* Copyright (C) 2006 yopyop - yopyop156@ifrance.com - yopyop156.ifrance.com + Copyright (C) 2006-2009 DeSmuME team This file is part of DeSmuME diff --git a/desmume/src/windows/DeSmuME_2005.vcproj b/desmume/src/windows/DeSmuME_2005.vcproj index 8f599c4b4..76581a658 100644 --- a/desmume/src/windows/DeSmuME_2005.vcproj +++ b/desmume/src/windows/DeSmuME_2005.vcproj @@ -78,7 +78,7 @@ />