omnizip 0.4.7-aarch64-linux
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +32 -0
- data/.rubocop_todo.yml +293 -0
- data/CHANGELOG.md +1647 -0
- data/CONTEXT.md +68 -0
- data/COPYING +502 -0
- data/Gemfile +19 -0
- data/LICENSE +12 -0
- data/README.adoc +1327 -0
- data/Rakefile +15 -0
- data/TODO.refactor/00-overview.md +67 -0
- data/TODO.refactor/01-registry-base-class.md +81 -0
- data/TODO.refactor/02-error-hierarchy.md +57 -0
- data/TODO.refactor/03-autoload-entry-point.md +69 -0
- data/TODO.refactor/04-filter-base-consolidation.md +49 -0
- data/TODO.refactor/05-send-private-methods.md +64 -0
- data/TODO.refactor/06-instance-variable-access.md +69 -0
- data/TODO.refactor/07-respond-to-replacement.md +237 -0
- data/TODO.refactor/08-spec-doubles.md +27 -0
- data/TODO.refactor/09-cli-shared-module.md +35 -0
- data/TODO.refactor/10-format-detector-ocp.md +34 -0
- data/TODO.refactor/11-convenience-decoupling.md +38 -0
- data/TODO.refactor/12-thread-safety.md +8 -0
- data/TODO.refactor/13-lutaml-model-migration.md +158 -0
- data/TODO.refactor/14-add-missing-specs.md +25 -0
- data/benchmark/README.md +260 -0
- data/benchmark/benchmark_suite.rb +125 -0
- data/benchmark/compression_bench.rb +181 -0
- data/benchmark/filter_bench.rb +180 -0
- data/benchmark/models/benchmark_result.rb +59 -0
- data/benchmark/models/comparison_result.rb +69 -0
- data/benchmark/profile_suite.rb +167 -0
- data/benchmark/reporter.rb +150 -0
- data/benchmark/run_benchmarks.rb +66 -0
- data/benchmark/test_data.rb +137 -0
- data/config/formats/rar3_spec.yml +92 -0
- data/config/formats/rar5_spec.yml +102 -0
- data/docs/.github/workflows/docs.yml +142 -0
- data/docs/.gitignore +21 -0
- data/docs/.lychee.toml +67 -0
- data/docs/Gemfile +13 -0
- data/docs/RAR_WRITE_SUPPORT.md +26 -0
- data/docs/README.md +101 -0
- data/docs/_config.yml +112 -0
- data/docs/assets/logo.svg +1 -0
- data/docs/assets/omnizip-logo.pdf +1540 -11
- data/docs/comparison/feature-matrix.adoc +694 -0
- data/docs/comparison/index.adoc +113 -0
- data/docs/comparison/vs-7zip.adoc +309 -0
- data/docs/comparison/vs-peazip.adoc +77 -0
- data/docs/comparison/vs-rubyzip.adoc +342 -0
- data/docs/comparison/vs-winrar.adoc +100 -0
- data/docs/compatibility.adoc +579 -0
- data/docs/concepts/index.adoc +129 -0
- data/docs/developer/architecture.adoc +256 -0
- data/docs/developer/contributing.adoc +158 -0
- data/docs/developer/index.adoc +25 -0
- data/docs/developer/testing.adoc +212 -0
- data/docs/getting-started/basic-usage.adoc +263 -0
- data/docs/getting-started/index.adoc +42 -0
- data/docs/getting-started/installation.adoc +138 -0
- data/docs/getting-started/quick-start.adoc +183 -0
- data/docs/getting-started/your-first-archive.adoc +219 -0
- data/docs/guides/advanced-features/encryption.adoc +277 -0
- data/docs/guides/advanced-features/index.adoc +59 -0
- data/docs/guides/advanced-features/parallel-processing.adoc +144 -0
- data/docs/guides/advanced-features/progress-tracking.adoc +124 -0
- data/docs/guides/advanced-features/streaming.adoc +142 -0
- data/docs/guides/archive-formats/gzip-format.adoc +105 -0
- data/docs/guides/archive-formats/index.adoc +160 -0
- data/docs/guides/archive-formats/ole-format.adoc +151 -0
- data/docs/guides/archive-formats/rar-format.adoc +104 -0
- data/docs/guides/archive-formats/rar5.adoc +521 -0
- data/docs/guides/archive-formats/rpm-format.adoc +108 -0
- data/docs/guides/archive-formats/seven-zip-format.adoc +35 -0
- data/docs/guides/archive-formats/tar-format.adoc +106 -0
- data/docs/guides/archive-formats/xz-format.adoc +118 -0
- data/docs/guides/archive-formats/zip-format.adoc +35 -0
- data/docs/guides/compression-algorithms/bzip2.adoc +114 -0
- data/docs/guides/compression-algorithms/deflate.adoc +313 -0
- data/docs/guides/compression-algorithms/index.adoc +190 -0
- data/docs/guides/compression-algorithms/lzma.adoc +394 -0
- data/docs/guides/compression-algorithms/lzma2.adoc +244 -0
- data/docs/guides/compression-algorithms/ppmd.adoc +313 -0
- data/docs/guides/compression-algorithms/zstandard.adoc +296 -0
- data/docs/guides/creating-archives.adoc +348 -0
- data/docs/guides/extracting-archives.adoc +53 -0
- data/docs/guides/format-conversion.adoc +64 -0
- data/docs/guides/index.adoc +49 -0
- data/docs/guides/migration-rubyzip.adoc +217 -0
- data/docs/guides/parity-archives.adoc +605 -0
- data/docs/guides/performance-tuning.adoc +88 -0
- data/docs/index.adoc +228 -0
- data/docs/lychee.toml +67 -0
- data/docs/reference/api/overview.adoc +187 -0
- data/docs/reference/cli/compress-command.adoc +114 -0
- data/docs/reference/cli/overview.adoc +140 -0
- data/docs/reference/index.adoc +26 -0
- data/docs/resources/faq.adoc +185 -0
- data/docs/resources/quick-reference.adoc +222 -0
- data/docs/rust-backend.md +0 -0
- data/docs/troubleshooting/index.adoc +207 -0
- data/docs/xar_format.md +216 -0
- data/examples/api_comparison.rb +205 -0
- data/examples/deflate64_example.rb +96 -0
- data/examples/par2_demo.rb +121 -0
- data/examples/quick_start_native.rb +150 -0
- data/examples/quick_start_rubyzip.rb +115 -0
- data/examples/rubyzip_compatibility_demo.rb +194 -0
- data/exe/omnizip +27 -0
- data/lib/omnizip/algorithm.rb +176 -0
- data/lib/omnizip/algorithm_registry.rb +65 -0
- data/lib/omnizip/algorithms/.keep +0 -0
- data/lib/omnizip/algorithms/bzip2/bwt.rb +236 -0
- data/lib/omnizip/algorithms/bzip2/bz2.rb +687 -0
- data/lib/omnizip/algorithms/bzip2/rle.rb +146 -0
- data/lib/omnizip/algorithms/bzip2.rb +108 -0
- data/lib/omnizip/algorithms/deflate/constants.rb +28 -0
- data/lib/omnizip/algorithms/deflate/decoder.rb +37 -0
- data/lib/omnizip/algorithms/deflate/encoder.rb +45 -0
- data/lib/omnizip/algorithms/deflate.rb +135 -0
- data/lib/omnizip/algorithms/deflate64/constants.rb +45 -0
- data/lib/omnizip/algorithms/deflate64/decoder.rb +151 -0
- data/lib/omnizip/algorithms/deflate64/encoder.rb +95 -0
- data/lib/omnizip/algorithms/deflate64/huffman_coder.rb +352 -0
- data/lib/omnizip/algorithms/deflate64/lz77_encoder.rb +140 -0
- data/lib/omnizip/algorithms/deflate64.rb +118 -0
- data/lib/omnizip/algorithms/lzma/bit_model.rb +120 -0
- data/lib/omnizip/algorithms/lzma/constants.rb +112 -0
- data/lib/omnizip/algorithms/lzma/decoder.rb +146 -0
- data/lib/omnizip/algorithms/lzma/dictionary.rb +70 -0
- data/lib/omnizip/algorithms/lzma/distance_coder.rb +326 -0
- data/lib/omnizip/algorithms/lzma/encoder.rb +139 -0
- data/lib/omnizip/algorithms/lzma/length_coder.rb +172 -0
- data/lib/omnizip/algorithms/lzma/literal_decoder.rb +204 -0
- data/lib/omnizip/algorithms/lzma/literal_encoder.rb +208 -0
- data/lib/omnizip/algorithms/lzma/lzip_decoder.rb +368 -0
- data/lib/omnizip/algorithms/lzma/lzma1_encoder.rb +105 -0
- data/lib/omnizip/algorithms/lzma/lzma_alone_decoder.rb +194 -0
- data/lib/omnizip/algorithms/lzma/lzma_state.rb +128 -0
- data/lib/omnizip/algorithms/lzma/match.rb +32 -0
- data/lib/omnizip/algorithms/lzma/match_finder.rb +233 -0
- data/lib/omnizip/algorithms/lzma/match_finder_config.rb +142 -0
- data/lib/omnizip/algorithms/lzma/match_finder_factory.rb +84 -0
- data/lib/omnizip/algorithms/lzma/optimal_encoder.rb +159 -0
- data/lib/omnizip/algorithms/lzma/probability_models.rb +72 -0
- data/lib/omnizip/algorithms/lzma/range_coder.rb +82 -0
- data/lib/omnizip/algorithms/lzma/range_decoder.rb +274 -0
- data/lib/omnizip/algorithms/lzma/range_encoder.rb +202 -0
- data/lib/omnizip/algorithms/lzma/state.rb +127 -0
- data/lib/omnizip/algorithms/lzma/xz_buffered_range_encoder.rb +323 -0
- data/lib/omnizip/algorithms/lzma/xz_encoder.rb +420 -0
- data/lib/omnizip/algorithms/lzma/xz_encoder_fast.rb +640 -0
- data/lib/omnizip/algorithms/lzma/xz_match_finder_adapter.rb +224 -0
- data/lib/omnizip/algorithms/lzma/xz_price_calculator.rb +167 -0
- data/lib/omnizip/algorithms/lzma/xz_probability_models.rb +258 -0
- data/lib/omnizip/algorithms/lzma/xz_range_encoder.rb +223 -0
- data/lib/omnizip/algorithms/lzma/xz_range_encoder_exact.rb +314 -0
- data/lib/omnizip/algorithms/lzma/xz_state.rb +108 -0
- data/lib/omnizip/algorithms/lzma/xz_utils_decoder.rb +1311 -0
- data/lib/omnizip/algorithms/lzma.rb +266 -0
- data/lib/omnizip/algorithms/lzma2/chunk_manager.rb +180 -0
- data/lib/omnizip/algorithms/lzma2/constants.rb +38 -0
- data/lib/omnizip/algorithms/lzma2/encoder.rb +145 -0
- data/lib/omnizip/algorithms/lzma2/lzma2_chunk.rb +165 -0
- data/lib/omnizip/algorithms/lzma2/properties.rb +179 -0
- data/lib/omnizip/algorithms/lzma2/simple_lzma2_encoder.rb +122 -0
- data/lib/omnizip/algorithms/lzma2/xz_encoder_adapter.rb +85 -0
- data/lib/omnizip/algorithms/lzma2.rb +133 -0
- data/lib/omnizip/algorithms/ppmd7/constants.rb +74 -0
- data/lib/omnizip/algorithms/ppmd7/context.rb +151 -0
- data/lib/omnizip/algorithms/ppmd7/decoder.rb +127 -0
- data/lib/omnizip/algorithms/ppmd7/encoder.rb +153 -0
- data/lib/omnizip/algorithms/ppmd7/model.rb +245 -0
- data/lib/omnizip/algorithms/ppmd7/symbol_state.rb +57 -0
- data/lib/omnizip/algorithms/ppmd7.rb +146 -0
- data/lib/omnizip/algorithms/ppmd8/constants.rb +61 -0
- data/lib/omnizip/algorithms/ppmd8/context.rb +32 -0
- data/lib/omnizip/algorithms/ppmd8/decoder.rb +104 -0
- data/lib/omnizip/algorithms/ppmd8/encoder.rb +135 -0
- data/lib/omnizip/algorithms/ppmd8/model.rb +246 -0
- data/lib/omnizip/algorithms/ppmd8/restoration_method.rb +78 -0
- data/lib/omnizip/algorithms/ppmd8.rb +122 -0
- data/lib/omnizip/algorithms/ppmd_base.rb +142 -0
- data/lib/omnizip/algorithms/registration.rb +28 -0
- data/lib/omnizip/algorithms/zstandard/constants.rb +158 -0
- data/lib/omnizip/algorithms/zstandard/decoder.rb +249 -0
- data/lib/omnizip/algorithms/zstandard/dictionary.rb +73 -0
- data/lib/omnizip/algorithms/zstandard/encoder.rb +294 -0
- data/lib/omnizip/algorithms/zstandard/frame/block.rb +143 -0
- data/lib/omnizip/algorithms/zstandard/frame/header.rb +233 -0
- data/lib/omnizip/algorithms/zstandard/frame.rb +33 -0
- data/lib/omnizip/algorithms/zstandard/fse/bitstream.rb +183 -0
- data/lib/omnizip/algorithms/zstandard/fse/encoder.rb +534 -0
- data/lib/omnizip/algorithms/zstandard/fse/interleaved.rb +92 -0
- data/lib/omnizip/algorithms/zstandard/fse/table.rb +188 -0
- data/lib/omnizip/algorithms/zstandard/fse/table_description.rb +203 -0
- data/lib/omnizip/algorithms/zstandard/fse.rb +53 -0
- data/lib/omnizip/algorithms/zstandard/huffman.rb +276 -0
- data/lib/omnizip/algorithms/zstandard/huffman_encoder.rb +327 -0
- data/lib/omnizip/algorithms/zstandard/ldm.rb +121 -0
- data/lib/omnizip/algorithms/zstandard/literals.rb +241 -0
- data/lib/omnizip/algorithms/zstandard/literals_encoder.rb +96 -0
- data/lib/omnizip/algorithms/zstandard/match_finder.rb +483 -0
- data/lib/omnizip/algorithms/zstandard/sequences.rb +350 -0
- data/lib/omnizip/algorithms/zstandard/sequences_encoder.rb +333 -0
- data/lib/omnizip/algorithms/zstandard/xxhash.rb +159 -0
- data/lib/omnizip/algorithms/zstandard.rb +210 -0
- data/lib/omnizip/algorithms.rb +35 -0
- data/lib/omnizip/archive/builder.rb +48 -0
- data/lib/omnizip/archive/reader_session.rb +67 -0
- data/lib/omnizip/archive.rb +86 -0
- data/lib/omnizip/archive_handler.rb +82 -0
- data/lib/omnizip/archive_handlers/cpio_handler.rb +47 -0
- data/lib/omnizip/archive_handlers/iso_handler.rb +54 -0
- data/lib/omnizip/archive_handlers/ole_handler.rb +37 -0
- data/lib/omnizip/archive_handlers/rar_handler.rb +96 -0
- data/lib/omnizip/archive_handlers/rpm_handler.rb +45 -0
- data/lib/omnizip/archive_handlers/seven_zip_handler.rb +89 -0
- data/lib/omnizip/archive_handlers/tar_handler.rb +75 -0
- data/lib/omnizip/archive_handlers/xar_handler.rb +49 -0
- data/lib/omnizip/archive_handlers/zip_handler.rb +115 -0
- data/lib/omnizip/archive_handlers.rb +18 -0
- data/lib/omnizip/backends.rb +160 -0
- data/lib/omnizip/buffer/memory_archive.rb +246 -0
- data/lib/omnizip/buffer/memory_extractor.rb +234 -0
- data/lib/omnizip/buffer/seven_zip_bridge.rb +171 -0
- data/lib/omnizip/buffer.rb +187 -0
- data/lib/omnizip/checksum_registry.rb +41 -0
- data/lib/omnizip/checksums/crc32.rb +101 -0
- data/lib/omnizip/checksums/crc64.rb +102 -0
- data/lib/omnizip/checksums/crc_base.rb +158 -0
- data/lib/omnizip/checksums/registration.rb +16 -0
- data/lib/omnizip/checksums/verifier.rb +130 -0
- data/lib/omnizip/checksums.rb +11 -0
- data/lib/omnizip/chunked/memory_manager.rb +194 -0
- data/lib/omnizip/chunked/reader.rb +78 -0
- data/lib/omnizip/chunked/writer.rb +123 -0
- data/lib/omnizip/chunked.rb +123 -0
- data/lib/omnizip/cli/output_formatter.rb +112 -0
- data/lib/omnizip/cli.rb +604 -0
- data/lib/omnizip/commands/.keep +0 -0
- data/lib/omnizip/commands/archive_create_command.rb +245 -0
- data/lib/omnizip/commands/archive_extract_command.rb +231 -0
- data/lib/omnizip/commands/archive_list_command.rb +204 -0
- data/lib/omnizip/commands/archive_repair_command.rb +129 -0
- data/lib/omnizip/commands/archive_verify_command.rb +115 -0
- data/lib/omnizip/commands/compress_command.rb +115 -0
- data/lib/omnizip/commands/decompress_command.rb +149 -0
- data/lib/omnizip/commands/list_command.rb +51 -0
- data/lib/omnizip/commands/metadata_command.rb +215 -0
- data/lib/omnizip/commands/parity_create_command.rb +114 -0
- data/lib/omnizip/commands/parity_repair_command.rb +120 -0
- data/lib/omnizip/commands/parity_verify_command.rb +122 -0
- data/lib/omnizip/commands/profile_list_command.rb +54 -0
- data/lib/omnizip/commands/profile_show_command.rb +44 -0
- data/lib/omnizip/commands.rb +21 -0
- data/lib/omnizip/convenience.rb +389 -0
- data/lib/omnizip/converter/conversion_registry.rb +50 -0
- data/lib/omnizip/converter/conversion_strategy.rb +108 -0
- data/lib/omnizip/converter/extract_repack_strategy.rb +51 -0
- data/lib/omnizip/converter/seven_zip_to_zip_strategy.rb +43 -0
- data/lib/omnizip/converter/zip_to_seven_zip_strategy.rb +54 -0
- data/lib/omnizip/converter.rb +124 -0
- data/lib/omnizip/crypto/aes256/cipher.rb +104 -0
- data/lib/omnizip/crypto/aes256/constants.rb +28 -0
- data/lib/omnizip/crypto/aes256/key_derivation.rb +100 -0
- data/lib/omnizip/crypto/aes256.rb +102 -0
- data/lib/omnizip/crypto.rb +11 -0
- data/lib/omnizip/entry.rb +44 -0
- data/lib/omnizip/error.rb +110 -0
- data/lib/omnizip/eta/exponential_smoothing_estimator.rb +95 -0
- data/lib/omnizip/eta/moving_average_estimator.rb +96 -0
- data/lib/omnizip/eta/rate_calculator.rb +104 -0
- data/lib/omnizip/eta/sample_history.rb +143 -0
- data/lib/omnizip/eta/time_estimator.rb +106 -0
- data/lib/omnizip/eta.rb +68 -0
- data/lib/omnizip/extraction/filter_chain.rb +179 -0
- data/lib/omnizip/extraction/glob_pattern.rb +140 -0
- data/lib/omnizip/extraction/pattern_matcher.rb +66 -0
- data/lib/omnizip/extraction/predicate_pattern.rb +52 -0
- data/lib/omnizip/extraction/regex_pattern.rb +50 -0
- data/lib/omnizip/extraction/selective_extractor.rb +247 -0
- data/lib/omnizip/extraction.rb +115 -0
- data/lib/omnizip/file_type/mime_classifier.rb +144 -0
- data/lib/omnizip/file_type.rb +117 -0
- data/lib/omnizip/filter.rb +141 -0
- data/lib/omnizip/filter_pipeline.rb +108 -0
- data/lib/omnizip/filter_registry.rb +113 -0
- data/lib/omnizip/filters/bcj.rb +277 -0
- data/lib/omnizip/filters/bcj2/constants.rb +53 -0
- data/lib/omnizip/filters/bcj2/decoder.rb +263 -0
- data/lib/omnizip/filters/bcj2/encoder.rb +58 -0
- data/lib/omnizip/filters/bcj2/stream_data.rb +91 -0
- data/lib/omnizip/filters/bcj2.rb +93 -0
- data/lib/omnizip/filters/bcj_arm.rb +174 -0
- data/lib/omnizip/filters/bcj_arm64.rb +242 -0
- data/lib/omnizip/filters/bcj_ia64.rb +194 -0
- data/lib/omnizip/filters/bcj_ppc.rb +188 -0
- data/lib/omnizip/filters/bcj_sparc.rb +174 -0
- data/lib/omnizip/filters/bcj_x86.rb +191 -0
- data/lib/omnizip/filters/delta.rb +195 -0
- data/lib/omnizip/filters/xz_delta.rb +258 -0
- data/lib/omnizip/filters.rb +20 -0
- data/lib/omnizip/format_detector.rb +166 -0
- data/lib/omnizip/formats/.keep +0 -0
- data/lib/omnizip/formats/bzip2_file.rb +159 -0
- data/lib/omnizip/formats/cpio/bounded_io.rb +66 -0
- data/lib/omnizip/formats/cpio/constants.rb +55 -0
- data/lib/omnizip/formats/cpio/entry.rb +389 -0
- data/lib/omnizip/formats/cpio/reader.rb +194 -0
- data/lib/omnizip/formats/cpio/writer.rb +232 -0
- data/lib/omnizip/formats/cpio.rb +132 -0
- data/lib/omnizip/formats/format_spec_loader.rb +228 -0
- data/lib/omnizip/formats/gzip.rb +236 -0
- data/lib/omnizip/formats/iso/directory_builder.rb +321 -0
- data/lib/omnizip/formats/iso/directory_record.rb +162 -0
- data/lib/omnizip/formats/iso/joliet.rb +204 -0
- data/lib/omnizip/formats/iso/path_table.rb +125 -0
- data/lib/omnizip/formats/iso/reader.rb +194 -0
- data/lib/omnizip/formats/iso/rock_ridge.rb +349 -0
- data/lib/omnizip/formats/iso/volume_builder.rb +319 -0
- data/lib/omnizip/formats/iso/volume_descriptor.rb +168 -0
- data/lib/omnizip/formats/iso/writer.rb +543 -0
- data/lib/omnizip/formats/iso.rb +133 -0
- data/lib/omnizip/formats/lzip.rb +161 -0
- data/lib/omnizip/formats/lzma_alone.rb +149 -0
- data/lib/omnizip/formats/msi/cab_extractor.rb +181 -0
- data/lib/omnizip/formats/msi/constants.rb +157 -0
- data/lib/omnizip/formats/msi/directory_resolver.rb +188 -0
- data/lib/omnizip/formats/msi/entry.rb +134 -0
- data/lib/omnizip/formats/msi/reader.rb +301 -0
- data/lib/omnizip/formats/msi/string_pool.rb +246 -0
- data/lib/omnizip/formats/msi/table_parser.rb +244 -0
- data/lib/omnizip/formats/msi.rb +73 -0
- data/lib/omnizip/formats/ole/allocation_table.rb +263 -0
- data/lib/omnizip/formats/ole/constants.rb +61 -0
- data/lib/omnizip/formats/ole/dirent.rb +439 -0
- data/lib/omnizip/formats/ole/header.rb +199 -0
- data/lib/omnizip/formats/ole/ranges_io.rb +347 -0
- data/lib/omnizip/formats/ole/storage.rb +482 -0
- data/lib/omnizip/formats/ole/types/variant.rb +338 -0
- data/lib/omnizip/formats/ole.rb +143 -0
- data/lib/omnizip/formats/rar/archive_repairer.rb +240 -0
- data/lib/omnizip/formats/rar/archive_verifier.rb +192 -0
- data/lib/omnizip/formats/rar/block_parser.rb +282 -0
- data/lib/omnizip/formats/rar/compression/bit_stream.rb +180 -0
- data/lib/omnizip/formats/rar/compression/dispatcher.rb +210 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/decoder.rb +212 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/encoder.rb +154 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/huffman_builder.rb +217 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/huffman_coder.rb +189 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/match_finder.rb +135 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/sliding_window.rb +165 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman.rb +25 -0
- data/lib/omnizip/formats/rar/compression/ppmd/context.rb +103 -0
- data/lib/omnizip/formats/rar/compression/ppmd/decoder.rb +238 -0
- data/lib/omnizip/formats/rar/compression/ppmd/encoder.rb +250 -0
- data/lib/omnizip/formats/rar/compression/ppmd.rb +16 -0
- data/lib/omnizip/formats/rar/compression.rb +17 -0
- data/lib/omnizip/formats/rar/compression_method_registry.rb +106 -0
- data/lib/omnizip/formats/rar/constants.rb +88 -0
- data/lib/omnizip/formats/rar/decompressor.rb +316 -0
- data/lib/omnizip/formats/rar/external_writer.rb +311 -0
- data/lib/omnizip/formats/rar/header.rb +209 -0
- data/lib/omnizip/formats/rar/license_validator.rb +111 -0
- data/lib/omnizip/formats/rar/models/rar_archive.rb +77 -0
- data/lib/omnizip/formats/rar/models/rar_entry.rb +65 -0
- data/lib/omnizip/formats/rar/models/rar_volume.rb +56 -0
- data/lib/omnizip/formats/rar/models.rb +14 -0
- data/lib/omnizip/formats/rar/parity_handler.rb +299 -0
- data/lib/omnizip/formats/rar/rar5/compression/lzma.rb +200 -0
- data/lib/omnizip/formats/rar/rar5/compression/lzss.rb +584 -0
- data/lib/omnizip/formats/rar/rar5/compression/store.rb +60 -0
- data/lib/omnizip/formats/rar/rar5/crc32.rb +39 -0
- data/lib/omnizip/formats/rar/rar5/encryption/aes256_cbc.rb +96 -0
- data/lib/omnizip/formats/rar/rar5/encryption/encryption_header.rb +114 -0
- data/lib/omnizip/formats/rar/rar5/encryption/encryption_manager.rb +162 -0
- data/lib/omnizip/formats/rar/rar5/encryption/key_derivation.rb +97 -0
- data/lib/omnizip/formats/rar/rar5/header.rb +208 -0
- data/lib/omnizip/formats/rar/rar5/models/encryption_options.rb +74 -0
- data/lib/omnizip/formats/rar/rar5/models/recovery_options.rb +63 -0
- data/lib/omnizip/formats/rar/rar5/models/solid_options.rb +63 -0
- data/lib/omnizip/formats/rar/rar5/models/volume_options.rb +74 -0
- data/lib/omnizip/formats/rar/rar5/multi_volume/ARCHITECTURE.md +290 -0
- data/lib/omnizip/formats/rar/rar5/multi_volume/volume_manager.rb +260 -0
- data/lib/omnizip/formats/rar/rar5/multi_volume/volume_splitter.rb +155 -0
- data/lib/omnizip/formats/rar/rar5/multi_volume/volume_writer.rb +176 -0
- data/lib/omnizip/formats/rar/rar5/solid/solid_encoder.rb +108 -0
- data/lib/omnizip/formats/rar/rar5/solid/solid_manager.rb +139 -0
- data/lib/omnizip/formats/rar/rar5/solid/solid_stream.rb +121 -0
- data/lib/omnizip/formats/rar/rar5/vint.rb +53 -0
- data/lib/omnizip/formats/rar/rar5/writer.rb +540 -0
- data/lib/omnizip/formats/rar/rar_format_base.rb +239 -0
- data/lib/omnizip/formats/rar/reader.rb +377 -0
- data/lib/omnizip/formats/rar/recovery_record.rb +245 -0
- data/lib/omnizip/formats/rar/volume_manager.rb +166 -0
- data/lib/omnizip/formats/rar/writer.rb +437 -0
- data/lib/omnizip/formats/rar.rb +193 -0
- data/lib/omnizip/formats/rar3/compressor.rb +71 -0
- data/lib/omnizip/formats/rar3/decompressor.rb +64 -0
- data/lib/omnizip/formats/rar3/reader.rb +107 -0
- data/lib/omnizip/formats/rar3/writer.rb +220 -0
- data/lib/omnizip/formats/rar3.rb +15 -0
- data/lib/omnizip/formats/rar5/compressor.rb +71 -0
- data/lib/omnizip/formats/rar5/decompressor.rb +64 -0
- data/lib/omnizip/formats/rar5/reader.rb +130 -0
- data/lib/omnizip/formats/rar5/writer.rb +65 -0
- data/lib/omnizip/formats/rar5.rb +15 -0
- data/lib/omnizip/formats/rpm/constants.rb +58 -0
- data/lib/omnizip/formats/rpm/entry.rb +106 -0
- data/lib/omnizip/formats/rpm/header.rb +106 -0
- data/lib/omnizip/formats/rpm/lead.rb +132 -0
- data/lib/omnizip/formats/rpm/tag.rb +228 -0
- data/lib/omnizip/formats/rpm/writer.rb +652 -0
- data/lib/omnizip/formats/rpm.rb +458 -0
- data/lib/omnizip/formats/seven_zip/bcj2_stream_decompressor.rb +274 -0
- data/lib/omnizip/formats/seven_zip/coder_chain.rb +169 -0
- data/lib/omnizip/formats/seven_zip/constants.rb +126 -0
- data/lib/omnizip/formats/seven_zip/encoded_header.rb +110 -0
- data/lib/omnizip/formats/seven_zip/encrypted_header.rb +139 -0
- data/lib/omnizip/formats/seven_zip/file_collector.rb +143 -0
- data/lib/omnizip/formats/seven_zip/header.rb +102 -0
- data/lib/omnizip/formats/seven_zip/header_encryptor.rb +132 -0
- data/lib/omnizip/formats/seven_zip/header_writer.rb +425 -0
- data/lib/omnizip/formats/seven_zip/models/coder_info.rb +30 -0
- data/lib/omnizip/formats/seven_zip/models/file_entry.rb +65 -0
- data/lib/omnizip/formats/seven_zip/models/folder.rb +67 -0
- data/lib/omnizip/formats/seven_zip/models/stream_info.rb +42 -0
- data/lib/omnizip/formats/seven_zip/models.rb +20 -0
- data/lib/omnizip/formats/seven_zip/parser.rb +671 -0
- data/lib/omnizip/formats/seven_zip/reader.rb +626 -0
- data/lib/omnizip/formats/seven_zip/split_archive_reader.rb +611 -0
- data/lib/omnizip/formats/seven_zip/split_archive_writer.rb +308 -0
- data/lib/omnizip/formats/seven_zip/stream_compressor.rb +151 -0
- data/lib/omnizip/formats/seven_zip/stream_decompressor.rb +166 -0
- data/lib/omnizip/formats/seven_zip/writer.rb +801 -0
- data/lib/omnizip/formats/seven_zip.rb +179 -0
- data/lib/omnizip/formats/tar/constants.rb +73 -0
- data/lib/omnizip/formats/tar/entry.rb +98 -0
- data/lib/omnizip/formats/tar/header.rb +206 -0
- data/lib/omnizip/formats/tar/reader.rb +119 -0
- data/lib/omnizip/formats/tar/writer.rb +212 -0
- data/lib/omnizip/formats/tar.rb +74 -0
- data/lib/omnizip/formats/xar/constants.rb +119 -0
- data/lib/omnizip/formats/xar/entry.rb +268 -0
- data/lib/omnizip/formats/xar/header.rb +223 -0
- data/lib/omnizip/formats/xar/reader.rb +400 -0
- data/lib/omnizip/formats/xar/toc.rb +570 -0
- data/lib/omnizip/formats/xar/writer.rb +461 -0
- data/lib/omnizip/formats/xar.rb +145 -0
- data/lib/omnizip/formats/xz/reader.rb +121 -0
- data/lib/omnizip/formats/xz/writer.rb +416 -0
- data/lib/omnizip/formats/xz.rb +210 -0
- data/lib/omnizip/formats/xz_const.rb +49 -0
- data/lib/omnizip/formats/xz_impl/block_decoder.rb +761 -0
- data/lib/omnizip/formats/xz_impl/block_encoder.rb +304 -0
- data/lib/omnizip/formats/xz_impl/block_header.rb +210 -0
- data/lib/omnizip/formats/xz_impl/block_header_parser.rb +182 -0
- data/lib/omnizip/formats/xz_impl/index_decoder.rb +174 -0
- data/lib/omnizip/formats/xz_impl/index_encoder.rb +120 -0
- data/lib/omnizip/formats/xz_impl/stream_decoder.rb +470 -0
- data/lib/omnizip/formats/xz_impl/stream_encoder.rb +95 -0
- data/lib/omnizip/formats/xz_impl/stream_footer.rb +79 -0
- data/lib/omnizip/formats/xz_impl/stream_footer_parser.rb +115 -0
- data/lib/omnizip/formats/xz_impl/stream_header.rb +53 -0
- data/lib/omnizip/formats/xz_impl/stream_header_parser.rb +106 -0
- data/lib/omnizip/formats/xz_impl/vli.rb +128 -0
- data/lib/omnizip/formats/xz_impl.rb +52 -0
- data/lib/omnizip/formats/zip/central_directory_header.rb +223 -0
- data/lib/omnizip/formats/zip/constants.rb +69 -0
- data/lib/omnizip/formats/zip/end_of_central_directory.rb +132 -0
- data/lib/omnizip/formats/zip/local_file_header.rb +136 -0
- data/lib/omnizip/formats/zip/reader.rb +376 -0
- data/lib/omnizip/formats/zip/unix_extra_field.rb +153 -0
- data/lib/omnizip/formats/zip/writer.rb +489 -0
- data/lib/omnizip/formats/zip/zip64_end_of_central_directory.rb +102 -0
- data/lib/omnizip/formats/zip/zip64_end_of_central_directory_locator.rb +64 -0
- data/lib/omnizip/formats/zip/zip64_extra_field.rb +112 -0
- data/lib/omnizip/formats/zip.rb +50 -0
- data/lib/omnizip/formats.rb +29 -0
- data/lib/omnizip/implementations/base/lzma2_decoder_base.rb +75 -0
- data/lib/omnizip/implementations/base/lzma2_encoder_base.rb +128 -0
- data/lib/omnizip/implementations/base/lzma_decoder_base.rb +83 -0
- data/lib/omnizip/implementations/base/lzma_encoder_base.rb +108 -0
- data/lib/omnizip/implementations/base/state_machine_base.rb +182 -0
- data/lib/omnizip/implementations/base.rb +19 -0
- data/lib/omnizip/implementations/rust/archive.rb +93 -0
- data/lib/omnizip/implementations/rust/library.rb +221 -0
- data/lib/omnizip/implementations/rust.rb +26 -0
- data/lib/omnizip/implementations/seven_zip/lzma/decoder.rb +428 -0
- data/lib/omnizip/implementations/seven_zip/lzma/encoder.rb +456 -0
- data/lib/omnizip/implementations/seven_zip/lzma/match_finder.rb +285 -0
- data/lib/omnizip/implementations/seven_zip/lzma/range_decoder.rb +197 -0
- data/lib/omnizip/implementations/seven_zip/lzma/range_encoder.rb +194 -0
- data/lib/omnizip/implementations/seven_zip/lzma/state_machine.rb +139 -0
- data/lib/omnizip/implementations/seven_zip/lzma.rb +21 -0
- data/lib/omnizip/implementations/seven_zip/lzma2/encoder.rb +56 -0
- data/lib/omnizip/implementations/seven_zip/lzma2.rb +12 -0
- data/lib/omnizip/implementations/seven_zip.rb +11 -0
- data/lib/omnizip/implementations/xz_utils/lzma2/decoder.rb +547 -0
- data/lib/omnizip/implementations/xz_utils/lzma2/encoder.rb +748 -0
- data/lib/omnizip/implementations/xz_utils/lzma2.rb +13 -0
- data/lib/omnizip/implementations/xz_utils.rb +10 -0
- data/lib/omnizip/implementations.rb +25 -0
- data/lib/omnizip/io/buffered_input.rb +147 -0
- data/lib/omnizip/io/buffered_output.rb +106 -0
- data/lib/omnizip/io/source.rb +143 -0
- data/lib/omnizip/io/stream_manager.rb +117 -0
- data/lib/omnizip/io.rb +15 -0
- data/lib/omnizip/link_handler/hard_link.rb +79 -0
- data/lib/omnizip/link_handler/symbolic_link.rb +74 -0
- data/lib/omnizip/link_handler.rb +129 -0
- data/lib/omnizip/metadata/archive_metadata.rb +114 -0
- data/lib/omnizip/metadata/entry_metadata.rb +153 -0
- data/lib/omnizip/metadata/metadata_editor.rb +169 -0
- data/lib/omnizip/metadata/metadata_registry.rb +71 -0
- data/lib/omnizip/metadata/metadata_validator.rb +101 -0
- data/lib/omnizip/metadata.rb +58 -0
- data/lib/omnizip/models/.keep +0 -0
- data/lib/omnizip/models/algorithm_metadata.rb +41 -0
- data/lib/omnizip/models/attribute_apply.rb +40 -0
- data/lib/omnizip/models/compression_options.rb +53 -0
- data/lib/omnizip/models/conversion_options.rb +79 -0
- data/lib/omnizip/models/conversion_result.rb +141 -0
- data/lib/omnizip/models/eta_result.rb +45 -0
- data/lib/omnizip/models/extraction_rule.rb +115 -0
- data/lib/omnizip/models/filter_chain.rb +142 -0
- data/lib/omnizip/models/filter_config.rb +148 -0
- data/lib/omnizip/models/match_result.rb +141 -0
- data/lib/omnizip/models/optimization_suggestion.rb +95 -0
- data/lib/omnizip/models/parallel_options.rb +116 -0
- data/lib/omnizip/models/performance_result.rb +85 -0
- data/lib/omnizip/models/profile_report.rb +116 -0
- data/lib/omnizip/models/progress_options.rb +39 -0
- data/lib/omnizip/models/split_options.rb +116 -0
- data/lib/omnizip/optimization_registry.rb +45 -0
- data/lib/omnizip/parallel/engine.rb +52 -0
- data/lib/omnizip/parallel/job_queue.rb +209 -0
- data/lib/omnizip/parallel/job_scheduler.rb +225 -0
- data/lib/omnizip/parallel/parallel_compressor.rb +326 -0
- data/lib/omnizip/parallel/parallel_extractor.rb +238 -0
- data/lib/omnizip/parallel/thread_pool.rb +60 -0
- data/lib/omnizip/parallel/worker_pool.rb +227 -0
- data/lib/omnizip/parallel.rb +156 -0
- data/lib/omnizip/parity/chunked_block_processor.rb +194 -0
- data/lib/omnizip/parity/galois16.rb +145 -0
- data/lib/omnizip/parity/models/creator_packet.rb +71 -0
- data/lib/omnizip/parity/models/file_description_packet.rb +131 -0
- data/lib/omnizip/parity/models/ifsc_packet.rb +111 -0
- data/lib/omnizip/parity/models/main_packet.rb +126 -0
- data/lib/omnizip/parity/models/packet.rb +156 -0
- data/lib/omnizip/parity/models/packet_registry.rb +102 -0
- data/lib/omnizip/parity/models/recovery_slice_packet.rb +76 -0
- data/lib/omnizip/parity/models.rb +27 -0
- data/lib/omnizip/parity/par2_creator.rb +496 -0
- data/lib/omnizip/parity/par2_repairer.rb +409 -0
- data/lib/omnizip/parity/par2_verifier.rb +373 -0
- data/lib/omnizip/parity/par2cmdline_algorithm.rb +108 -0
- data/lib/omnizip/parity/par2cmdline_coefficients.rb +78 -0
- data/lib/omnizip/parity/reed_solomon_decoder.rb +263 -0
- data/lib/omnizip/parity/reed_solomon_encoder.rb +108 -0
- data/lib/omnizip/parity/reed_solomon_matrix.rb +339 -0
- data/lib/omnizip/parity.rb +207 -0
- data/lib/omnizip/password/encryption_registry.rb +26 -0
- data/lib/omnizip/password/encryption_strategy.rb +96 -0
- data/lib/omnizip/password/password_validator.rb +129 -0
- data/lib/omnizip/password/winzip_aes_strategy.rb +190 -0
- data/lib/omnizip/password/zip_crypto_strategy.rb +135 -0
- data/lib/omnizip/password.rb +88 -0
- data/lib/omnizip/pipe/stream_compressor.rb +124 -0
- data/lib/omnizip/pipe/stream_decompressor.rb +173 -0
- data/lib/omnizip/pipe.rb +120 -0
- data/lib/omnizip/platform/ntfs_streams.rb +200 -0
- data/lib/omnizip/platform.rb +189 -0
- data/lib/omnizip/profile/archive_profile.rb +36 -0
- data/lib/omnizip/profile/balanced_profile.rb +31 -0
- data/lib/omnizip/profile/binary_profile.rb +33 -0
- data/lib/omnizip/profile/compression_profile.rb +157 -0
- data/lib/omnizip/profile/custom_profile.rb +155 -0
- data/lib/omnizip/profile/fast_profile.rb +31 -0
- data/lib/omnizip/profile/maximum_profile.rb +31 -0
- data/lib/omnizip/profile/profile_detector.rb +108 -0
- data/lib/omnizip/profile/profile_registry.rb +160 -0
- data/lib/omnizip/profile/text_profile.rb +33 -0
- data/lib/omnizip/profile.rb +261 -0
- data/lib/omnizip/profiler/memory_profiler.rb +66 -0
- data/lib/omnizip/profiler/method_profiler.rb +49 -0
- data/lib/omnizip/profiler/report_generator.rb +158 -0
- data/lib/omnizip/profiler.rb +192 -0
- data/lib/omnizip/progress/callback_reporter.rb +34 -0
- data/lib/omnizip/progress/console_reporter.rb +59 -0
- data/lib/omnizip/progress/log_reporter.rb +89 -0
- data/lib/omnizip/progress/operation_progress.rb +118 -0
- data/lib/omnizip/progress/progress_bar.rb +156 -0
- data/lib/omnizip/progress/progress_reporter.rb +40 -0
- data/lib/omnizip/progress/progress_tracker.rb +215 -0
- data/lib/omnizip/progress/silent_reporter.rb +22 -0
- data/lib/omnizip/progress.rb +131 -0
- data/lib/omnizip/registry.rb +111 -0
- data/lib/omnizip/rubyzip_compat.rb +61 -0
- data/lib/omnizip/temp/safe_extract.rb +124 -0
- data/lib/omnizip/temp/temp_file.rb +123 -0
- data/lib/omnizip/temp/temp_file_pool.rb +109 -0
- data/lib/omnizip/temp.rb +184 -0
- data/lib/omnizip/version.rb +5 -0
- data/lib/omnizip/zip/entry.rb +160 -0
- data/lib/omnizip/zip/file.rb +485 -0
- data/lib/omnizip/zip/input_stream.rb +270 -0
- data/lib/omnizip/zip/output_stream.rb +320 -0
- data/lib/omnizip/zip.rb +23 -0
- data/lib/omnizip.rb +157 -0
- data/lib/tasks/msi_test_files.rake +66 -0
- data/lib/tasks/platform_gems.rake +147 -0
- data/lib/tasks/rust_backend.rake +48 -0
- data/readme-docs/advanced-features.adoc +514 -0
- data/readme-docs/api-usage.adoc +445 -0
- data/readme-docs/architecture.adoc +450 -0
- data/readme-docs/archive-formats.adoc +479 -0
- data/readme-docs/cli-usage.adoc +222 -0
- data/readme-docs/compression-algorithms.adoc +446 -0
- data/readme-docs/compression-profiles.adoc +247 -0
- data/readme-docs/encryption-checksums.adoc +328 -0
- data/readme-docs/format-converter.adoc +316 -0
- data/readme-docs/installation.adoc +228 -0
- data/readme-docs/par2-archives.adoc +608 -0
- data/readme-docs/performance-profiler.adoc +389 -0
- data/readme-docs/preprocessing-filters.adoc +280 -0
- data/vendor/libomnizip_ffi.so +0 -0
- data/xz-file-format-1.2.1.txt +1174 -0
- metadata +768 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Copyright (C) 2025 Ribose Inc.
|
|
4
|
+
#
|
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a
|
|
6
|
+
# copy of this software and associated documentation files (the "Software"),
|
|
7
|
+
# to deal in the Software without restriction, including without limitation
|
|
8
|
+
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
9
|
+
# and/or sell copies of the Software, and to permit persons to whom the
|
|
10
|
+
# Software is furnished to do so, subject to the following conditions:
|
|
11
|
+
#
|
|
12
|
+
# The above copyright notice and this permission notice shall be included in
|
|
13
|
+
# all copies or substantial portions of the Software.
|
|
14
|
+
#
|
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
20
|
+
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
21
|
+
# DEALINGS IN THE SOFTWARE.
|
|
22
|
+
|
|
23
|
+
module Omnizip
|
|
24
|
+
module Implementations
|
|
25
|
+
module Base
|
|
26
|
+
# Abstract base class for LZMA state machines.
|
|
27
|
+
#
|
|
28
|
+
# Both XZ Utils and 7-Zip use a 12-state finite state machine (FSM)
|
|
29
|
+
# for tracking the encoding context. However, they have different
|
|
30
|
+
# transition tables between states.
|
|
31
|
+
#
|
|
32
|
+
# The 12 states are:
|
|
33
|
+
# - States 0-6: Literal mode (last symbol was a literal)
|
|
34
|
+
# - States 7-9: Match mode (last symbol was a match)
|
|
35
|
+
# - States 10-11: Short rep match mode (last symbol was a rep match of length 1)
|
|
36
|
+
#
|
|
37
|
+
# State transitions depend on whether the current symbol is:
|
|
38
|
+
# - A literal (byte)
|
|
39
|
+
# - A match (length + distance)
|
|
40
|
+
# - A repeated match (using rep0-rep3)
|
|
41
|
+
#
|
|
42
|
+
# Subclasses must provide their specific transition table via
|
|
43
|
+
# the {#update!} method.
|
|
44
|
+
#
|
|
45
|
+
# @abstract Subclasses must implement {#update!}
|
|
46
|
+
class StateMachineBase
|
|
47
|
+
# All valid LZMA states (0-11)
|
|
48
|
+
STATES = (0..11)
|
|
49
|
+
|
|
50
|
+
# States where literal encoding should use matched literal mode
|
|
51
|
+
# (i.e., compare with match byte at rep0)
|
|
52
|
+
LITERAL_MATCHED_STATES = [7, 8, 9, 10, 11].freeze
|
|
53
|
+
|
|
54
|
+
attr_reader :state
|
|
55
|
+
|
|
56
|
+
# Initialize the state machine.
|
|
57
|
+
#
|
|
58
|
+
# @param initial_state [Integer] Initial state value (default: 0)
|
|
59
|
+
def initialize(initial_state = 0)
|
|
60
|
+
unless STATES.include?(initial_state)
|
|
61
|
+
raise ArgumentError,
|
|
62
|
+
"Invalid initial state: #{initial_state}, must be 0-11"
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
@state = initial_state
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Reset to initial state.
|
|
69
|
+
#
|
|
70
|
+
# @return [void]
|
|
71
|
+
def reset!
|
|
72
|
+
@state = 0
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Update state based on encoding decision.
|
|
76
|
+
#
|
|
77
|
+
# Both XZ Utils and 7-Zip use different transition tables.
|
|
78
|
+
# Subclasses must implement this with their specific table.
|
|
79
|
+
#
|
|
80
|
+
# @param is_match [Boolean] true if last symbol was a match, false if literal
|
|
81
|
+
# @param is_short_rep [Boolean] true if last symbol was a short rep (length=1)
|
|
82
|
+
# @raise [NotImplementedError] Always raised in base class
|
|
83
|
+
# @return [void]
|
|
84
|
+
def update!(is_match, is_short_rep: false)
|
|
85
|
+
raise NotImplementedError,
|
|
86
|
+
"#{self.class} must implement #update!"
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Update state for literal encoding.
|
|
90
|
+
#
|
|
91
|
+
# This is a convenience method that calls {#update!} with is_match=false.
|
|
92
|
+
#
|
|
93
|
+
# @return [void]
|
|
94
|
+
def update_literal!
|
|
95
|
+
update!(false)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Update state for match encoding.
|
|
99
|
+
#
|
|
100
|
+
# This is a convenience method that calls {#update!} with is_match=true.
|
|
101
|
+
#
|
|
102
|
+
# @return [void]
|
|
103
|
+
def update_match!(_distance = nil)
|
|
104
|
+
update!(true)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Update state for short rep match (length=1).
|
|
108
|
+
#
|
|
109
|
+
# This is a convenience method that calls {#update!} with appropriate params.
|
|
110
|
+
#
|
|
111
|
+
# @return [void]
|
|
112
|
+
def update_short_rep!
|
|
113
|
+
update!(true, is_short_rep: true)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Update state for long rep match (length>1).
|
|
117
|
+
#
|
|
118
|
+
# This is a convenience method that calls {#update!} with appropriate params.
|
|
119
|
+
#
|
|
120
|
+
# @return [void]
|
|
121
|
+
def update_long_rep!
|
|
122
|
+
update!(true, is_short_rep: false)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# Check if currently in literal mode.
|
|
126
|
+
#
|
|
127
|
+
# States 0-6 are considered "literal mode" where the last symbol
|
|
128
|
+
# was a literal byte.
|
|
129
|
+
#
|
|
130
|
+
# @return [Boolean] true if in literal mode (states 0-6)
|
|
131
|
+
def literal_mode?
|
|
132
|
+
@state < 7
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# Check if currently in match mode.
|
|
136
|
+
#
|
|
137
|
+
# States 7-11 are considered "match mode" where the last symbol
|
|
138
|
+
# was a match of some kind.
|
|
139
|
+
#
|
|
140
|
+
# @return [Boolean] true if in match mode (states 7-11)
|
|
141
|
+
def match_mode?
|
|
142
|
+
@state >= 7
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# Check if matched literal encoding should be used.
|
|
146
|
+
#
|
|
147
|
+
# In states 7-11, literal encoding should compare with the match byte
|
|
148
|
+
# at rep0 for better compression.
|
|
149
|
+
#
|
|
150
|
+
# @return [Boolean] true if matched literal should be used
|
|
151
|
+
def use_matched_literal?
|
|
152
|
+
LITERAL_MATCHED_STATES.include?(@state)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# Get state as integer.
|
|
156
|
+
#
|
|
157
|
+
# This is used for probability model indexing.
|
|
158
|
+
#
|
|
159
|
+
# @return [Integer] Current state value (0-11)
|
|
160
|
+
def value
|
|
161
|
+
@state
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
# Set state directly.
|
|
165
|
+
#
|
|
166
|
+
# This is useful for initialization or testing.
|
|
167
|
+
#
|
|
168
|
+
# @param new_state [Integer] New state value (0-11)
|
|
169
|
+
# @raise [ArgumentError] If state is invalid
|
|
170
|
+
# @return [void]
|
|
171
|
+
def state=(new_state)
|
|
172
|
+
unless STATES.include?(new_state)
|
|
173
|
+
raise ArgumentError,
|
|
174
|
+
"Invalid state: #{new_state}, must be 0-11"
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
@state = new_state
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Omnizip
|
|
4
|
+
module Implementations
|
|
5
|
+
# Base classes for implementation inheritance
|
|
6
|
+
module Base
|
|
7
|
+
autoload :LZMADecoderBase,
|
|
8
|
+
"omnizip/implementations/base/lzma_decoder_base"
|
|
9
|
+
autoload :LZMAEncoderBase,
|
|
10
|
+
"omnizip/implementations/base/lzma_encoder_base"
|
|
11
|
+
autoload :LZMA2DecoderBase,
|
|
12
|
+
"omnizip/implementations/base/lzma2_decoder_base"
|
|
13
|
+
autoload :LZMA2EncoderBase,
|
|
14
|
+
"omnizip/implementations/base/lzma2_encoder_base"
|
|
15
|
+
autoload :StateMachineBase,
|
|
16
|
+
"omnizip/implementations/base/state_machine_base"
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Omnizip
|
|
4
|
+
module Implementations
|
|
5
|
+
module Rust
|
|
6
|
+
# Whole-archive acceleration over the cdylib: open any supported
|
|
7
|
+
# format (auto-detected), list entries, read entry bytes. This is
|
|
8
|
+
# the archive-level tier surface — the Ruby core remains the
|
|
9
|
+
# fallback (the cdylib unavailable ⇒ these raise LibraryMissing
|
|
10
|
+
# and callers fall back).
|
|
11
|
+
class Archive
|
|
12
|
+
class LibraryMissing < StandardError; end
|
|
13
|
+
|
|
14
|
+
# Built lazily inside #initialize: the Fiddle::TYPE_* constants
|
|
15
|
+
# only resolve after a successful require, and Ruby 4.0 moved
|
|
16
|
+
# fiddle out of the default gems (same reason
|
|
17
|
+
# Library.function_table is a method, not a constant).
|
|
18
|
+
def initialize(data, password: nil)
|
|
19
|
+
lib = Library.instance
|
|
20
|
+
raise LibraryMissing, "omnizip-ffi cdylib not loaded" unless lib
|
|
21
|
+
|
|
22
|
+
@lib = lib
|
|
23
|
+
funcs = function_table
|
|
24
|
+
@funcs = funcs.each_with_object({}) do |(key, (name, args, ret)), h|
|
|
25
|
+
h[key] = lib.bind(name, args, ret)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
pw = password&.to_s
|
|
29
|
+
pw_ptr = pw && !pw.empty? ? Fiddle::Pointer[pw] : nil
|
|
30
|
+
@handle = @funcs[:arch_open].call(Fiddle::Pointer[data], data.bytesize, pw_ptr)
|
|
31
|
+
return unless @handle.null?
|
|
32
|
+
|
|
33
|
+
raise Error, @lib.last_error
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def entry_count
|
|
37
|
+
@funcs[:arch_count].call(@handle)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def entry_names
|
|
41
|
+
(0...entry_count).map do |i|
|
|
42
|
+
ptr = @funcs[:arch_entry_name].call(@handle, i)
|
|
43
|
+
next nil if ptr.null?
|
|
44
|
+
|
|
45
|
+
ptr.to_s
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def entry_size(index)
|
|
50
|
+
@funcs[:arch_entry_size].call(@handle, index)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Read one entry's uncompressed bytes.
|
|
54
|
+
#
|
|
55
|
+
# @return [String] binary
|
|
56
|
+
def read_entry(index)
|
|
57
|
+
out_len = [0].pack("Q")
|
|
58
|
+
ptr = @funcs[:arch_read_entry].call(@handle, index, out_len)
|
|
59
|
+
raise Error, @lib.last_error if ptr.null?
|
|
60
|
+
|
|
61
|
+
@lib.take_buffer(ptr, out_len.unpack1("Q"))
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def close
|
|
65
|
+
return unless @handle
|
|
66
|
+
|
|
67
|
+
@funcs[:arch_close].call(@handle)
|
|
68
|
+
@handle = nil
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def self.open(data, password: nil)
|
|
72
|
+
archive = new(data, password: password)
|
|
73
|
+
yield archive
|
|
74
|
+
ensure
|
|
75
|
+
archive&.close
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
private
|
|
79
|
+
|
|
80
|
+
def function_table
|
|
81
|
+
{
|
|
82
|
+
arch_open: ["ozip_arch_open", %i[voidp size_t voidp], Fiddle::TYPE_VOIDP],
|
|
83
|
+
arch_count: ["ozip_arch_count", [:voidp], Fiddle::TYPE_SIZE_T],
|
|
84
|
+
arch_entry_name: ["ozip_arch_entry_name", %i[voidp size_t], Fiddle::TYPE_VOIDP],
|
|
85
|
+
arch_entry_size: ["ozip_arch_entry_size", %i[voidp size_t], Fiddle::TYPE_VOIDP],
|
|
86
|
+
arch_read_entry: ["ozip_arch_read_entry", %i[voidp size_t voidp], Fiddle::TYPE_VOIDP],
|
|
87
|
+
arch_close: ["ozip_arch_close", [:voidp], Fiddle::TYPE_VOID],
|
|
88
|
+
}
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
begin
|
|
4
|
+
# Ruby 4.0 moved fiddle out of the default gems.
|
|
5
|
+
require "fiddle"
|
|
6
|
+
require "pathname"
|
|
7
|
+
rescue LoadError
|
|
8
|
+
# :nocov:
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
module Omnizip
|
|
12
|
+
module Implementations
|
|
13
|
+
module Rust
|
|
14
|
+
# The loaded cdylib: one handle, lazily opened, thread-safe
|
|
15
|
+
# after initialization (Fiddle::Function is immutable once
|
|
16
|
+
# built; compress/decompress are pure C calls).
|
|
17
|
+
class Library
|
|
18
|
+
# Codecs the cdylib dispatches by name.
|
|
19
|
+
# Names the cdylib dispatches: the codec-level acceleration
|
|
20
|
+
# surface (both directions by default — Rust is the
|
|
21
|
+
# authority; Ruby is the fallback).
|
|
22
|
+
CODECS = %w[
|
|
23
|
+
bzip2 zstd lzma xz lzma-alone lzip
|
|
24
|
+
deflate deflate64 zlib gzip ppmd7 ppmd8
|
|
25
|
+
].freeze
|
|
26
|
+
|
|
27
|
+
class << self
|
|
28
|
+
# The shared handle, or nil when the cdylib cannot load.
|
|
29
|
+
# Load failures are cached: a missing library is a stable
|
|
30
|
+
# condition, not something to re-attempt per call.
|
|
31
|
+
def instance
|
|
32
|
+
return @instance if defined?(@instance)
|
|
33
|
+
|
|
34
|
+
@instance = open
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def available?
|
|
38
|
+
!instance.nil?
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Whether the cdylib dispatches this codec name — exact, or
|
|
42
|
+
# a param-carrying prefix ("ppmd7:o6:m16777216" under
|
|
43
|
+
# "ppmd7").
|
|
44
|
+
def supports?(name)
|
|
45
|
+
CODECS.any? { |c| name == c || name.start_with?("#{c}:") }
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Drop the cached handle so resolution reruns (test seam:
|
|
49
|
+
# specs exercising fallback/absence paths need a clean
|
|
50
|
+
# slate; production never calls this).
|
|
51
|
+
def forget!
|
|
52
|
+
# Remove the ivar entirely: assigning nil would leave it
|
|
53
|
+
# defined, and `instance`'s `defined?` guard would return
|
|
54
|
+
# the nil forever without ever re-opening the library.
|
|
55
|
+
remove_instance_variable(:@instance) if defined?(@instance)
|
|
56
|
+
nil
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Built lazily: the Fiddle::TYPE_* constants only resolve
|
|
60
|
+
# after a successful require; environments without fiddle
|
|
61
|
+
# (Ruby 4.0 without the gem) never touch this table.
|
|
62
|
+
def function_table
|
|
63
|
+
{
|
|
64
|
+
last_error: ["ozip_last_error", [], Fiddle::TYPE_VOIDP],
|
|
65
|
+
free: ["ozip_free", %i[voidp size_t], Fiddle::TYPE_VOID],
|
|
66
|
+
compress: [
|
|
67
|
+
"ozip_compress",
|
|
68
|
+
%i[voidp voidp size_t int voidp],
|
|
69
|
+
Fiddle::TYPE_VOIDP,
|
|
70
|
+
],
|
|
71
|
+
decompress: [
|
|
72
|
+
"ozip_decompress",
|
|
73
|
+
%i[voidp voidp size_t size_t voidp],
|
|
74
|
+
Fiddle::TYPE_VOIDP,
|
|
75
|
+
],
|
|
76
|
+
}
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# The Rust release the loaded cdylib was built from (e.g.
|
|
80
|
+
# "0.21.108"), read through the ozip_version symbol — the
|
|
81
|
+
# platform-gem smoke gate asserts it matches. nil when the
|
|
82
|
+
# library is absent or predates the symbol.
|
|
83
|
+
def dylib_version
|
|
84
|
+
handle = instance&.instance_handle
|
|
85
|
+
return nil if handle.nil?
|
|
86
|
+
|
|
87
|
+
func = Fiddle::Function.new(handle["ozip_version"], [], Fiddle::TYPE_VOIDP)
|
|
88
|
+
ptr = func.call
|
|
89
|
+
ptr.null? ? nil : ptr.to_s
|
|
90
|
+
rescue StandardError
|
|
91
|
+
nil
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# Resolve the cdylib path. Precedence:
|
|
95
|
+
#
|
|
96
|
+
# 1. OMNIZIP_NO_RUST=1 — hard kill switch (always nil, so
|
|
97
|
+
# the pure-Ruby core handles everything; also the smoke
|
|
98
|
+
# gate for "works without Rust").
|
|
99
|
+
# 2. OMNIZIP_FFI_DYLIB — explicit path (developer override).
|
|
100
|
+
# 3. vendor/ — the prebuilt cdylib. Platform gems ship it
|
|
101
|
+
# here and `rake rust:build` writes here; rubygems
|
|
102
|
+
# already matched the platform at install time, so no
|
|
103
|
+
# runtime architecture probing is needed and the wrong
|
|
104
|
+
# arch cannot be picked.
|
|
105
|
+
# 4. ext/ (legacy location).
|
|
106
|
+
# 5. A sibling omnizip-rs checkout.
|
|
107
|
+
#
|
|
108
|
+
# `dirs` overrides 3-5 (spec seam: staged candidate paths).
|
|
109
|
+
def resolve_path(dirs = nil)
|
|
110
|
+
return nil if ENV.fetch("OMNIZIP_NO_RUST", nil) == "1"
|
|
111
|
+
|
|
112
|
+
explicit = ENV.fetch("OMNIZIP_FFI_DYLIB", nil)
|
|
113
|
+
return Pathname.new(explicit) if explicit && File.file?(explicit)
|
|
114
|
+
|
|
115
|
+
candidates = dirs || [
|
|
116
|
+
Pathname.new(__dir__).join("../../../../vendor"),
|
|
117
|
+
Pathname.new(__dir__).join("../../../../ext/libomnizip_ffi"),
|
|
118
|
+
*sibling_checkout,
|
|
119
|
+
]
|
|
120
|
+
|
|
121
|
+
%w[.dylib .so .dll].each do |ext|
|
|
122
|
+
candidates.each do |dir|
|
|
123
|
+
path = dir.join("libomnizip_ffi#{ext}")
|
|
124
|
+
return path if path.file?
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
nil
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
private
|
|
131
|
+
|
|
132
|
+
def open
|
|
133
|
+
path = resolve_path
|
|
134
|
+
return nil if path.nil?
|
|
135
|
+
|
|
136
|
+
handle = Fiddle.dlopen(path.to_s)
|
|
137
|
+
funcs = function_table.each_with_object({}) do |(key, (name, args, ret)), h|
|
|
138
|
+
h[key] = Fiddle::Function.new(handle[name], args, ret)
|
|
139
|
+
end
|
|
140
|
+
new(funcs, handle)
|
|
141
|
+
rescue StandardError => e # includes Fiddle::DLError
|
|
142
|
+
warn "omnizip: rust backend unavailable (#{e.message}); using pure Ruby" if ENV["OMNIZIP_BACKEND"] == "rust"
|
|
143
|
+
nil
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
# A sibling omnizip-rs checkout: ../omnizip-rs relative to
|
|
147
|
+
# this gem's repository root.
|
|
148
|
+
def sibling_checkout
|
|
149
|
+
gem_root = Pathname.new(__dir__).join("../../../../..")
|
|
150
|
+
%w[omnizip-rs target/release].map do |rel|
|
|
151
|
+
gem_root.join(rel, "target/release")
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def initialize(functions, handle = nil)
|
|
157
|
+
@functions = functions.freeze
|
|
158
|
+
@handle = handle
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def compress(codec, data, level)
|
|
162
|
+
out_len = [0].pack("Q")
|
|
163
|
+
ptr = call(:compress, codec, data, data.bytesize, level, out_len)
|
|
164
|
+
take(ptr, out_len.unpack1("Q"))
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def decompress(codec, data, expected_len)
|
|
168
|
+
out_len = [0].pack("Q")
|
|
169
|
+
ptr = call(:decompress, codec, data, data.bytesize, expected_len, out_len)
|
|
170
|
+
take(ptr, out_len.unpack1("Q"))
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
# Bind one extra C symbol from the loaded cdylib (the archive
|
|
174
|
+
# surface uses this; Fiddle::Function is immutable once built).
|
|
175
|
+
def bind(symbol, args, ret)
|
|
176
|
+
handle = instance_handle
|
|
177
|
+
raise Error, "cdylib not loaded" if handle.nil?
|
|
178
|
+
|
|
179
|
+
Fiddle::Function.new(handle[symbol.to_s], args, ret)
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def last_error
|
|
183
|
+
ptr = @functions[:last_error].call
|
|
184
|
+
ptr.null? ? "unknown error" : ptr.to_s
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
# The raw Fiddle::Handle (for extra symbol binds).
|
|
188
|
+
def instance_handle
|
|
189
|
+
@handle
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
# Copy out + free one returned buffer (public seam for the
|
|
193
|
+
# archive surface).
|
|
194
|
+
def take_buffer(ptr, len)
|
|
195
|
+
take(ptr, len)
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
private
|
|
199
|
+
|
|
200
|
+
def call(name, codec, input, input_len, a, out_len)
|
|
201
|
+
ptr = @functions[name].call(codec, input, input_len, a, out_len)
|
|
202
|
+
raise Error, last_error if ptr.null?
|
|
203
|
+
|
|
204
|
+
ptr
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
# Copy out + free in one breath: the buffer belongs to the
|
|
208
|
+
# Rust allocator and must never outlive ozip_free.
|
|
209
|
+
def take(ptr, len)
|
|
210
|
+
string = ptr.to_s(len)
|
|
211
|
+
@functions[:free].call(ptr, len)
|
|
212
|
+
string
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
# Raised when a codec call fails; #message carries the Rust
|
|
217
|
+
# side's last_error text.
|
|
218
|
+
class Error < StandardError; end
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Omnizip
|
|
4
|
+
module Implementations
|
|
5
|
+
# Rust-accelerated codec backend (TODO.ref-parity/62).
|
|
6
|
+
#
|
|
7
|
+
# Loads the omnizip-ffi cdylib through stdlib Fiddle — no
|
|
8
|
+
# compiled Ruby extension, no rake-compiler. When the library
|
|
9
|
+
# is unavailable the gem transparently stays on the pure-Ruby
|
|
10
|
+
# path; nothing about the fallback is an error.
|
|
11
|
+
#
|
|
12
|
+
# Library resolution order:
|
|
13
|
+
# 1. ENV['OMNIZIP_FFI_DYLIB'] (explicit path)
|
|
14
|
+
# 2. ../target/release/ inside a sibling omnizip-rs checkout
|
|
15
|
+
#
|
|
16
|
+
# Tier policy (see Omnizip::Backends): Rust is the authority —
|
|
17
|
+
# validated against the reference C/C++ implementations and
|
|
18
|
+
# determinism-contracted — so `auto` routes BOTH directions
|
|
19
|
+
# through Rust whenever the library loads, with Ruby-core
|
|
20
|
+
# fallback on any Rust error.
|
|
21
|
+
module Rust
|
|
22
|
+
autoload :Library, "omnizip/implementations/rust/library"
|
|
23
|
+
autoload :Archive, "omnizip/implementations/rust/archive"
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|