| /* |
| * Copyright (c) Meta Platforms, Inc. and affiliates. |
| * All rights reserved. |
| * |
| * This source code is licensed under both the BSD-style license (found in the |
| * LICENSE file in the root directory of this source tree) and the GPLv2 (found |
| * in the COPYING file in the root directory of this source tree). |
| */ |
| #pragma once |
| |
| #include "Options.h" |
| #include "Pzstd.h" |
| #include "utils/ScopeGuard.h" |
| |
| #include <cstdio> |
| #include <string> |
| #include <cstdint> |
| #include <memory> |
| |
| namespace pzstd { |
| |
| inline bool check(std::string source, std::string decompressed) { |
| std::unique_ptr<std::uint8_t[]> sBuf(new std::uint8_t[1024]); |
| std::unique_ptr<std::uint8_t[]> dBuf(new std::uint8_t[1024]); |
| |
| auto sFd = std::fopen(source.c_str(), "rb"); |
| auto dFd = std::fopen(decompressed.c_str(), "rb"); |
| auto guard = makeScopeGuard([&] { |
| std::fclose(sFd); |
| std::fclose(dFd); |
| }); |
| |
| size_t sRead, dRead; |
| |
| do { |
| sRead = std::fread(sBuf.get(), 1, 1024, sFd); |
| dRead = std::fread(dBuf.get(), 1, 1024, dFd); |
| if (std::ferror(sFd) || std::ferror(dFd)) { |
| return false; |
| } |
| if (sRead != dRead) { |
| return false; |
| } |
| |
| for (size_t i = 0; i < sRead; ++i) { |
| if (sBuf.get()[i] != dBuf.get()[i]) { |
| return false; |
| } |
| } |
| } while (sRead == 1024); |
| if (!std::feof(sFd) || !std::feof(dFd)) { |
| return false; |
| } |
| return true; |
| } |
| |
| inline bool roundTrip(Options& options) { |
| if (options.inputFiles.size() != 1) { |
| return false; |
| } |
| std::string source = options.inputFiles.front(); |
| std::string compressedFile = std::tmpnam(nullptr); |
| std::string decompressedFile = std::tmpnam(nullptr); |
| auto guard = makeScopeGuard([&] { |
| std::remove(compressedFile.c_str()); |
| std::remove(decompressedFile.c_str()); |
| }); |
| |
| { |
| options.outputFile = compressedFile; |
| options.decompress = false; |
| if (pzstdMain(options) != 0) { |
| return false; |
| } |
| } |
| { |
| options.decompress = true; |
| options.inputFiles.front() = compressedFile; |
| options.outputFile = decompressedFile; |
| if (pzstdMain(options) != 0) { |
| return false; |
| } |
| } |
| return check(source, decompressedFile); |
| } |
| } |