Program Listing for File common.cc

Return to documentation for file (common.cc)

// SPDX-License-Identifier: LGPL-3.0-or-later
/* common.cc - Common templates and type definitions */

#include <cstddef>
#include <cstdint>
#include <algorithm>

#include <libnokogiri/common.hh>

namespace libnokogiri::internal {
    [[nodiscard]]
    capture_compression_t detect_captrue_compression(fd_t& file) {
        constexpr static std::array<uint8_t, 2> gzip_header{0x1FU, 0x8BU};
        std::array<uint8_t, 2> read_bytes{};
        const auto res{file.read<2>(read_bytes)};
        [[maybe_unused]]
        const auto _ = file.head();

        if (!res) {
            return capture_compression_t::Unknown;
        }

        const auto is_gzip = std::equal(
            gzip_header.begin(), gzip_header.end(),
            read_bytes.begin(), read_bytes.end()
        );

        return is_gzip ? capture_compression_t::Compressed : capture_compression_t::Uncompressed;
    }
}