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,171 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "stringio"
|
|
4
|
+
require "tmpdir"
|
|
5
|
+
|
|
6
|
+
module Omnizip
|
|
7
|
+
module Buffer
|
|
8
|
+
# Bridges the in-memory Buffer API onto the file-based 7z
|
|
9
|
+
# reader/writer through a temporary file, since the 7z format has
|
|
10
|
+
# no in-memory stream implementation.
|
|
11
|
+
module SevenZipBridge
|
|
12
|
+
class << self
|
|
13
|
+
# Create a 7z archive in memory
|
|
14
|
+
#
|
|
15
|
+
# @param buffer [StringIO] Destination buffer
|
|
16
|
+
# @param options [Hash] Writer options
|
|
17
|
+
# @yield [WriteProxy] Block adding entries
|
|
18
|
+
def create(buffer, options = {}, &block)
|
|
19
|
+
Dir.mktmpdir("omnizip_buffer_7z") do |tmp|
|
|
20
|
+
archive_path = File.join(tmp, "buffer.7z")
|
|
21
|
+
writer = Formats::SevenZip::Writer.new(archive_path, options)
|
|
22
|
+
block&.call(WriteProxy.new(writer))
|
|
23
|
+
writer.write
|
|
24
|
+
|
|
25
|
+
buffer.write(File.binread(archive_path))
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Read a 7z archive from memory
|
|
30
|
+
#
|
|
31
|
+
# @param buffer [StringIO] Archive bytes
|
|
32
|
+
# @yield [ReadProxy] Block reading entries
|
|
33
|
+
# @return [ReadProxy, Object] Proxy or block result
|
|
34
|
+
def open(buffer, &block)
|
|
35
|
+
Dir.mktmpdir("omnizip_buffer_7z") do |tmp|
|
|
36
|
+
archive_path = File.join(tmp, "buffer.7z")
|
|
37
|
+
File.binwrite(archive_path, buffer.string)
|
|
38
|
+
|
|
39
|
+
reader = Formats::SevenZip::Reader.new(archive_path)
|
|
40
|
+
reader.open
|
|
41
|
+
proxy = ReadProxy.new(reader, tmp)
|
|
42
|
+
|
|
43
|
+
block ? yield(proxy) : proxy
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Mirrors the MemoryArchive write interface onto a 7z writer
|
|
49
|
+
class WriteProxy
|
|
50
|
+
# @param writer [Formats::SevenZip::Writer]
|
|
51
|
+
def initialize(writer)
|
|
52
|
+
@writer = writer
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Add an entry; a trailing slash with empty content adds a
|
|
56
|
+
# directory entry
|
|
57
|
+
#
|
|
58
|
+
# @param name [String] Entry name
|
|
59
|
+
# @param data [String] Entry content
|
|
60
|
+
# @return [self]
|
|
61
|
+
def add(name, data, **_options)
|
|
62
|
+
if name.end_with?("/") && data.to_s.empty?
|
|
63
|
+
@writer.add_directory_entry(name)
|
|
64
|
+
else
|
|
65
|
+
@writer.add_data(name, data)
|
|
66
|
+
end
|
|
67
|
+
self
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Mirrors the MemoryArchive read interface onto a 7z reader
|
|
72
|
+
class ReadProxy
|
|
73
|
+
# @param reader [Formats::SevenZip::Reader] opened reader
|
|
74
|
+
# @param tmp [String] Scratch directory for extraction
|
|
75
|
+
def initialize(reader, tmp)
|
|
76
|
+
@reader = reader
|
|
77
|
+
@tmp = tmp
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Yield an Entry wrapper per archive entry
|
|
81
|
+
def each_entry
|
|
82
|
+
@reader.list_files.each do |entry|
|
|
83
|
+
yield Entry.new(entry, @reader, @tmp)
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Filename => content for every file entry
|
|
88
|
+
#
|
|
89
|
+
# @return [Hash<String, String>]
|
|
90
|
+
def extract_all_to_memory
|
|
91
|
+
result = {}
|
|
92
|
+
each_entry do |entry|
|
|
93
|
+
result[entry.name] = entry.read unless entry.directory?
|
|
94
|
+
end
|
|
95
|
+
result
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Entry names; directories keep a trailing slash like the ZIP
|
|
99
|
+
# listing convention
|
|
100
|
+
#
|
|
101
|
+
# @return [Array<String>]
|
|
102
|
+
def entry_names
|
|
103
|
+
@reader.list_files.map do |entry|
|
|
104
|
+
entry.is_dir ? "#{entry.name}/" : entry.name
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# Read-only access to the underlying entries
|
|
109
|
+
#
|
|
110
|
+
# @return [Array<Formats::SevenZip::Models::FileEntry>]
|
|
111
|
+
def raw_entries
|
|
112
|
+
@reader.list_files
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Content of a single named file entry, or nil when absent
|
|
116
|
+
# (directories carry no content). Extracts just that entry —
|
|
117
|
+
# not the whole archive.
|
|
118
|
+
#
|
|
119
|
+
# @param name [String] Entry name
|
|
120
|
+
# @return [String, nil]
|
|
121
|
+
def read_entry(name)
|
|
122
|
+
entry = raw_entries.find { |e| e.name == name && !e.is_dir }
|
|
123
|
+
return nil unless entry
|
|
124
|
+
|
|
125
|
+
Entry.new(entry, @reader, @tmp).read
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# Entry wrapper matching MemoryArchive::Entry's surface
|
|
129
|
+
class Entry
|
|
130
|
+
attr_reader :name, :size
|
|
131
|
+
|
|
132
|
+
# @param entry [Formats::SevenZip::Models::FileEntry]
|
|
133
|
+
# @param reader [Formats::SevenZip::Reader]
|
|
134
|
+
# @param tmp [String] Scratch directory
|
|
135
|
+
def initialize(entry, reader, tmp)
|
|
136
|
+
@entry = entry
|
|
137
|
+
@reader = reader
|
|
138
|
+
@tmp = tmp
|
|
139
|
+
@name = if entry.is_dir
|
|
140
|
+
entry.name.end_with?("/") ? entry.name : "#{entry.name}/"
|
|
141
|
+
else
|
|
142
|
+
entry.name
|
|
143
|
+
end
|
|
144
|
+
@size = entry.size
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# @return [Boolean]
|
|
148
|
+
def directory?
|
|
149
|
+
@entry.is_dir
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# @return [Time, nil]
|
|
153
|
+
def time
|
|
154
|
+
@entry.mtime
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# Extract and return this entry's content
|
|
158
|
+
#
|
|
159
|
+
# @return [String]
|
|
160
|
+
def read(_size = nil)
|
|
161
|
+
return "" if directory? || @entry.has_stream == false
|
|
162
|
+
|
|
163
|
+
dest = File.join(@tmp, "entry", @entry.name)
|
|
164
|
+
@reader.extract_entry(@entry.name, dest)
|
|
165
|
+
File.binread(dest)
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
end
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "stringio"
|
|
4
|
+
require "tmpdir"
|
|
5
|
+
|
|
6
|
+
module Omnizip
|
|
7
|
+
# In-memory archive operations without filesystem I/O
|
|
8
|
+
#
|
|
9
|
+
# This module provides methods for creating and reading archives
|
|
10
|
+
# entirely in memory using StringIO, enabling web applications,
|
|
11
|
+
# testing, and API responses without temporary files.
|
|
12
|
+
#
|
|
13
|
+
# @example Create archive in memory
|
|
14
|
+
# zip_data = Omnizip::Buffer.create(:zip) do |archive|
|
|
15
|
+
# archive.add('readme.txt', 'Hello World')
|
|
16
|
+
# archive.add('data.json', '{"key": "value"}')
|
|
17
|
+
# end
|
|
18
|
+
# # => Returns StringIO with complete ZIP archive
|
|
19
|
+
#
|
|
20
|
+
# @example Extract from memory
|
|
21
|
+
# contents = Omnizip::Buffer.extract_to_memory(zip_data)
|
|
22
|
+
# # => {"readme.txt" => "Hello World", "data.json" => '{"key": "value"}'}
|
|
23
|
+
#
|
|
24
|
+
# @example From Hash
|
|
25
|
+
# archive_data = {
|
|
26
|
+
# 'file1.txt' => 'content1',
|
|
27
|
+
# 'file2.txt' => 'content2'
|
|
28
|
+
# }
|
|
29
|
+
# zip_buffer = Omnizip::Buffer.create_from_hash(archive_data, :zip)
|
|
30
|
+
module Buffer
|
|
31
|
+
# Nested classes - autoloaded
|
|
32
|
+
autoload :MemoryArchive, "omnizip/buffer/memory_archive"
|
|
33
|
+
autoload :MemoryExtractor, "omnizip/buffer/memory_extractor"
|
|
34
|
+
autoload :SevenZipBridge, "omnizip/buffer/seven_zip_bridge"
|
|
35
|
+
|
|
36
|
+
class << self
|
|
37
|
+
# Create archive in memory
|
|
38
|
+
#
|
|
39
|
+
# @param format [Symbol] Archive format (:zip, :seven_zip)
|
|
40
|
+
# @param options [Hash] Format-specific options
|
|
41
|
+
# @yield [archive] Block to populate archive
|
|
42
|
+
# @yieldparam archive [MemoryArchive] Archive object to add entries to
|
|
43
|
+
# @return [StringIO] Complete archive in memory, rewound to start
|
|
44
|
+
#
|
|
45
|
+
# @example Create ZIP in memory
|
|
46
|
+
# buffer = Omnizip::Buffer.create(:zip) do |archive|
|
|
47
|
+
# archive.add('file.txt', 'content')
|
|
48
|
+
# archive.add('dir/file2.txt', 'more content')
|
|
49
|
+
# end
|
|
50
|
+
# File.binwrite('output.zip', buffer.string)
|
|
51
|
+
# rubocop:disable-next Naming/BlockForwarding, Style/ArgumentsForwarding -- Ruby 3.0 compatibility
|
|
52
|
+
def create(format = :zip, **options, &block)
|
|
53
|
+
buffer = StringIO.new(String.new(encoding: Encoding::BINARY))
|
|
54
|
+
|
|
55
|
+
case format
|
|
56
|
+
when :zip
|
|
57
|
+
create_zip(buffer, options, &block)
|
|
58
|
+
when :seven_zip, :"7z"
|
|
59
|
+
SevenZipBridge.create(buffer, options, &block)
|
|
60
|
+
else
|
|
61
|
+
raise ArgumentError, "Unsupported format: #{format}"
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
buffer.tap(&:rewind)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Open archive from memory
|
|
68
|
+
#
|
|
69
|
+
# @param data [String, StringIO] Archive data
|
|
70
|
+
# @param format [Symbol, nil] Archive format (auto-detected if nil)
|
|
71
|
+
# @yield [archive] Block to read from archive
|
|
72
|
+
# @yieldparam archive [MemoryArchive] Archive object to read entries from
|
|
73
|
+
# @return [MemoryArchive, Object] Archive object or block return value
|
|
74
|
+
#
|
|
75
|
+
# @example Read entries
|
|
76
|
+
# Omnizip::Buffer.open(zip_data) do |archive|
|
|
77
|
+
# archive.each_entry do |entry|
|
|
78
|
+
# puts "#{entry.name}: #{entry.size} bytes"
|
|
79
|
+
# end
|
|
80
|
+
# end
|
|
81
|
+
def open(data, format: nil, &block)
|
|
82
|
+
buffer = data.is_a?(StringIO) ? data : StringIO.new(data.b)
|
|
83
|
+
format ||= detect_format(buffer)
|
|
84
|
+
|
|
85
|
+
case format
|
|
86
|
+
when :zip
|
|
87
|
+
open_zip(buffer, &block)
|
|
88
|
+
when :seven_zip, :"7z"
|
|
89
|
+
SevenZipBridge.open(buffer, &block)
|
|
90
|
+
else
|
|
91
|
+
raise ArgumentError, "Unsupported format: #{format}"
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Extract all entries to memory
|
|
96
|
+
#
|
|
97
|
+
# @param data [String, StringIO] Archive data
|
|
98
|
+
# @param format [Symbol, nil] Archive format (auto-detected if nil)
|
|
99
|
+
# @return [Hash<String, String>] Filename => content mapping
|
|
100
|
+
#
|
|
101
|
+
# @example Extract to Hash
|
|
102
|
+
# files = Omnizip::Buffer.extract_to_memory(zip_data)
|
|
103
|
+
# files.each do |name, content|
|
|
104
|
+
# puts "#{name}: #{content.bytesize} bytes"
|
|
105
|
+
# end
|
|
106
|
+
def extract_to_memory(data, format: nil)
|
|
107
|
+
extractor = Buffer::MemoryExtractor.new(data, format: format)
|
|
108
|
+
extractor.extract_all
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Detect archive format from magic bytes. THE buffer-side
|
|
112
|
+
# sniffer — in-memory data has no extension to route by, so
|
|
113
|
+
# every consumer delegates here.
|
|
114
|
+
#
|
|
115
|
+
# @param buffer [StringIO] Buffer containing archive data
|
|
116
|
+
# @return [Symbol] Detected format
|
|
117
|
+
# @raise [Omnizip::FormatError] If format cannot be detected
|
|
118
|
+
def detect_format(buffer)
|
|
119
|
+
magic = buffer.read(4).to_s.b
|
|
120
|
+
buffer.rewind
|
|
121
|
+
|
|
122
|
+
case magic
|
|
123
|
+
when "PK\x03\x04".b, "PK\x05\x06".b, "PK\x07\x08".b
|
|
124
|
+
# ZIP signatures: local file header, EOCD, data descriptor
|
|
125
|
+
:zip
|
|
126
|
+
when "7z\xBC\xAF".b
|
|
127
|
+
:seven_zip
|
|
128
|
+
else
|
|
129
|
+
raise Omnizip::FormatError,
|
|
130
|
+
"Unknown archive format (magic: #{magic.inspect})"
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Create archive from Hash of filename => content
|
|
135
|
+
#
|
|
136
|
+
# @param hash [Hash<String, String>] Filename => content mapping
|
|
137
|
+
# @param format [Symbol] Archive format
|
|
138
|
+
# @param options [Hash] Format-specific options
|
|
139
|
+
# @return [StringIO] Complete archive in memory
|
|
140
|
+
#
|
|
141
|
+
# @example Create from Hash
|
|
142
|
+
# data = {'file1.txt' => 'content1', 'file2.txt' => 'content2'}
|
|
143
|
+
# zip = Omnizip::Buffer.create_from_hash(data, :zip)
|
|
144
|
+
def create_from_hash(hash, format = :zip, **options)
|
|
145
|
+
create(format, **options) do |archive|
|
|
146
|
+
hash.each do |name, content|
|
|
147
|
+
archive.add(name, content)
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
private
|
|
153
|
+
|
|
154
|
+
# Create ZIP archive in buffer through the native writer
|
|
155
|
+
#
|
|
156
|
+
# @param buffer [StringIO] Buffer to write to
|
|
157
|
+
# @param options [Hash] ZIP-specific options
|
|
158
|
+
# @yield [archive] Block to populate archive
|
|
159
|
+
def create_zip(buffer, _options, &block)
|
|
160
|
+
writer = Formats::Zip::Writer.new(nil)
|
|
161
|
+
archive = Buffer::MemoryArchive.new(writer, :zip)
|
|
162
|
+
block&.call(archive)
|
|
163
|
+
writer.write_to_io(buffer)
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
# Open ZIP archive from buffer through the native reader.
|
|
167
|
+
# The reader parses from a path, so the buffer spills to a
|
|
168
|
+
# temporary file (same pattern as the 7z bridge).
|
|
169
|
+
#
|
|
170
|
+
# @param buffer [StringIO] Buffer containing ZIP data
|
|
171
|
+
# @yield [archive] Block to read from archive
|
|
172
|
+
# @return [MemoryArchive, Object] Archive or block return value
|
|
173
|
+
def open_zip(buffer, &block)
|
|
174
|
+
result = nil
|
|
175
|
+
Dir.mktmpdir("omnizip_buffer_zip") do |tmp|
|
|
176
|
+
path = File.join(tmp, "buffer.zip")
|
|
177
|
+
File.binwrite(path, buffer.string)
|
|
178
|
+
|
|
179
|
+
archive = Buffer::MemoryArchive.new(Formats::Zip::Reader.new(path),
|
|
180
|
+
:zip)
|
|
181
|
+
result = block ? yield(archive) : archive
|
|
182
|
+
end
|
|
183
|
+
result
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Omnizip
|
|
4
|
+
class ChecksumRegistry < Omnizip::Registry
|
|
5
|
+
BUILTIN_CHECKSUMS = {
|
|
6
|
+
crc32: "Omnizip::Checksums::Crc32",
|
|
7
|
+
crc64: "Omnizip::Checksums::Crc64",
|
|
8
|
+
}.freeze
|
|
9
|
+
|
|
10
|
+
class << self
|
|
11
|
+
def not_found_error_class
|
|
12
|
+
Omnizip::UnknownChecksumError
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def label
|
|
16
|
+
"Checksum"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def register(name, checksum_class)
|
|
20
|
+
key = normalize_key(name)
|
|
21
|
+
existing = storage[key]
|
|
22
|
+
if existing && existing != checksum_class
|
|
23
|
+
raise ArgumentError, "Checksum '#{key}' is already registered"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
synchronize { storage[key] = checksum_class }
|
|
27
|
+
checksum_class
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def available
|
|
31
|
+
super.sort
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
Omnizip::ChecksumRegistry::BUILTIN_CHECKSUMS.each do |name, const_path|
|
|
38
|
+
Omnizip::ChecksumRegistry.register_lazy(name) do
|
|
39
|
+
Omnizip::ChecksumRegistry.register(name, Object.const_get(const_path))
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
#
|
|
4
|
+
# Copyright (C) 2024 Ribose Inc.
|
|
5
|
+
#
|
|
6
|
+
# This file is part of Omnizip.
|
|
7
|
+
#
|
|
8
|
+
# Omnizip is a pure Ruby port of 7-Zip compression algorithms.
|
|
9
|
+
# Based on the 7-Zip LZMA SDK by Igor Pavlov.
|
|
10
|
+
#
|
|
11
|
+
# This library is free software; you can redistribute it and/or
|
|
12
|
+
# modify it under the terms of the GNU Lesser General Public
|
|
13
|
+
# License as published by the Free Software Foundation; either
|
|
14
|
+
# version 2.1 of the License, or (at your option) any later version.
|
|
15
|
+
#
|
|
16
|
+
# See the COPYING file for the complete text of the license.
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
module Omnizip
|
|
20
|
+
module Checksums
|
|
21
|
+
# CRC32 checksum implementation using IEEE 802.3 polynomial.
|
|
22
|
+
#
|
|
23
|
+
# This implementation uses the standard CRC32 polynomial (0xEDB88320)
|
|
24
|
+
# as used in 7-Zip, ZIP archives, PNG files, and Ethernet frames.
|
|
25
|
+
#
|
|
26
|
+
# The algorithm uses a 256-entry pre-computed lookup table for
|
|
27
|
+
# efficient O(1) per-byte processing, making it suitable for
|
|
28
|
+
# high-performance checksum calculation.
|
|
29
|
+
#
|
|
30
|
+
# Polynomial: 0xEDB88320 (reversed IEEE 802.3)
|
|
31
|
+
# Initial value: 0xFFFFFFFF
|
|
32
|
+
# Final XOR: 0xFFFFFFFF
|
|
33
|
+
# Bit width: 32
|
|
34
|
+
#
|
|
35
|
+
# @example One-shot calculation
|
|
36
|
+
# checksum = Omnizip::Checksums::Crc32.calculate("abc")
|
|
37
|
+
# # => 0x352441C2
|
|
38
|
+
#
|
|
39
|
+
# @example Incremental calculation
|
|
40
|
+
# crc = Omnizip::Checksums::Crc32.new
|
|
41
|
+
# crc.update("Hello, ")
|
|
42
|
+
# crc.update("world!")
|
|
43
|
+
# result = crc.finalize
|
|
44
|
+
class Crc32 < CrcBase
|
|
45
|
+
# IEEE 802.3 polynomial (reversed representation)
|
|
46
|
+
# This is the standard polynomial used in 7-Zip and ZIP files
|
|
47
|
+
POLYNOMIAL = 0xEDB88320
|
|
48
|
+
|
|
49
|
+
# 32-bit mask for truncating values
|
|
50
|
+
MASK_32 = 0xFFFFFFFF
|
|
51
|
+
|
|
52
|
+
# Pre-computed lookup table for CRC32 calculation
|
|
53
|
+
# Generated using the IEEE 802.3 polynomial
|
|
54
|
+
# This table is computed once at class load time for performance
|
|
55
|
+
TABLE = generate_table(POLYNOMIAL, 32).freeze
|
|
56
|
+
|
|
57
|
+
# Process a single byte through the CRC32 algorithm.
|
|
58
|
+
#
|
|
59
|
+
# Uses the lookup table for efficient computation:
|
|
60
|
+
# new_crc = (old_crc >> 8) ^ table[(old_crc ^ byte) & 0xFF]
|
|
61
|
+
#
|
|
62
|
+
# @param crc [Integer] current CRC value
|
|
63
|
+
# @param byte [Integer] byte to process (0-255)
|
|
64
|
+
# @return [Integer] updated CRC value
|
|
65
|
+
def process_byte(crc, byte)
|
|
66
|
+
index = (crc ^ byte) & 0xFF
|
|
67
|
+
(crc >> 8) ^ TABLE[index]
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Get the initial CRC32 value.
|
|
71
|
+
#
|
|
72
|
+
# CRC32 starts with all bits set to 1, which helps detect
|
|
73
|
+
# leading zeros in the data stream.
|
|
74
|
+
#
|
|
75
|
+
# @return [Integer] 0xFFFFFFFF
|
|
76
|
+
def initial_value
|
|
77
|
+
MASK_32
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Get the final XOR value for CRC32.
|
|
81
|
+
#
|
|
82
|
+
# The final result is XORed with all 1s to invert the bits,
|
|
83
|
+
# which is part of the CRC32 standard.
|
|
84
|
+
#
|
|
85
|
+
# @return [Integer] 0xFFFFFFFF
|
|
86
|
+
def final_xor
|
|
87
|
+
MASK_32
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Get the lookup table for CRC32.
|
|
91
|
+
#
|
|
92
|
+
# @return [Array<Integer>] 256-entry lookup table
|
|
93
|
+
def self.lookup_table
|
|
94
|
+
TABLE
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Self-register with checksum registry
|
|
101
|
+
Omnizip::ChecksumRegistry.register(:crc32, Omnizip::Checksums::Crc32)
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
#
|
|
4
|
+
# Copyright (C) 2024 Ribose Inc.
|
|
5
|
+
#
|
|
6
|
+
# This file is part of Omnizip.
|
|
7
|
+
#
|
|
8
|
+
# Omnizip is a pure Ruby port of 7-Zip compression algorithms.
|
|
9
|
+
# Based on the 7-Zip LZMA SDK by Igor Pavlov.
|
|
10
|
+
#
|
|
11
|
+
# This library is free software; you can redistribute it and/or
|
|
12
|
+
# modify it under the terms of the GNU Lesser General Public
|
|
13
|
+
# License as published by the Free Software Foundation; either
|
|
14
|
+
# version 2.1 of the License, or (at your option) any later version.
|
|
15
|
+
#
|
|
16
|
+
# See the COPYING file for the complete text of the license.
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
module Omnizip
|
|
20
|
+
module Checksums
|
|
21
|
+
# CRC64 checksum implementation using ECMA-182 polynomial.
|
|
22
|
+
#
|
|
23
|
+
# This implementation uses the ECMA-182 polynomial for CRC64 calculation
|
|
24
|
+
# as used in the XZ file format and 7-Zip archives. This is the standard
|
|
25
|
+
# 64-bit CRC polynomial for data integrity verification in compressed
|
|
26
|
+
# archives.
|
|
27
|
+
#
|
|
28
|
+
# The algorithm uses a 256-entry pre-computed lookup table with 64-bit
|
|
29
|
+
# values for efficient O(1) per-byte processing.
|
|
30
|
+
#
|
|
31
|
+
# Polynomial: 0xC96C5795D7870F42 (ECMA-182)
|
|
32
|
+
# Initial value: 0xFFFFFFFFFFFFFFFF
|
|
33
|
+
# Final XOR: 0xFFFFFFFFFFFFFFFF
|
|
34
|
+
# Bit width: 64
|
|
35
|
+
#
|
|
36
|
+
# @example One-shot calculation
|
|
37
|
+
# checksum = Omnizip::Checksums::Crc64.calculate("123456789")
|
|
38
|
+
# # => 0x995DC9BBDF1939FA
|
|
39
|
+
#
|
|
40
|
+
# @example Incremental calculation
|
|
41
|
+
# crc = Omnizip::Checksums::Crc64.new
|
|
42
|
+
# crc.update("Hello, ")
|
|
43
|
+
# crc.update("world!")
|
|
44
|
+
# result = crc.finalize
|
|
45
|
+
class Crc64 < CrcBase
|
|
46
|
+
# ECMA-182 polynomial (reversed representation)
|
|
47
|
+
# This is the standard polynomial used in XZ format
|
|
48
|
+
POLYNOMIAL = 0xC96C5795D7870F42
|
|
49
|
+
|
|
50
|
+
# 64-bit mask for truncating values
|
|
51
|
+
MASK_64 = 0xFFFFFFFFFFFFFFFF
|
|
52
|
+
|
|
53
|
+
# Pre-computed lookup table for CRC64 calculation
|
|
54
|
+
# Generated using the ECMA-182 polynomial
|
|
55
|
+
# This table is computed once at class load time for performance
|
|
56
|
+
TABLE = generate_table(POLYNOMIAL, 64).freeze
|
|
57
|
+
|
|
58
|
+
# Process a single byte through the CRC64 algorithm.
|
|
59
|
+
#
|
|
60
|
+
# Uses the lookup table for efficient computation:
|
|
61
|
+
# new_crc = (old_crc >> 8) ^ table[(old_crc ^ byte) & 0xFF]
|
|
62
|
+
#
|
|
63
|
+
# @param crc [Integer] current CRC value
|
|
64
|
+
# @param byte [Integer] byte to process (0-255)
|
|
65
|
+
# @return [Integer] updated CRC value
|
|
66
|
+
def process_byte(crc, byte)
|
|
67
|
+
index = (crc ^ byte) & 0xFF
|
|
68
|
+
(crc >> 8) ^ TABLE[index]
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Get the initial CRC64 value.
|
|
72
|
+
#
|
|
73
|
+
# CRC64 starts with all bits set to 1, which helps detect
|
|
74
|
+
# leading zeros in the data stream.
|
|
75
|
+
#
|
|
76
|
+
# @return [Integer] 0xFFFFFFFFFFFFFFFF
|
|
77
|
+
def initial_value
|
|
78
|
+
MASK_64
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Get the final XOR value for CRC64.
|
|
82
|
+
#
|
|
83
|
+
# The final result is XORed with all 1s to invert the bits,
|
|
84
|
+
# which is part of the CRC64 standard.
|
|
85
|
+
#
|
|
86
|
+
# @return [Integer] 0xFFFFFFFFFFFFFFFF
|
|
87
|
+
def final_xor
|
|
88
|
+
MASK_64
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Get the lookup table for CRC64.
|
|
92
|
+
#
|
|
93
|
+
# @return [Array<Integer>] 256-entry lookup table
|
|
94
|
+
def self.lookup_table
|
|
95
|
+
TABLE
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Self-register with checksum registry
|
|
102
|
+
Omnizip::ChecksumRegistry.register(:crc64, Omnizip::Checksums::Crc64)
|