Autonomy Software C++ 24.5.1
Welcome to the Autonomy Software repository of the Mars Rover Design Team (MRDT) at Missouri University of Science and Technology (Missouri S&T)! API reference contains the source code and other resources for the development of the autonomy software for our Mars rover. The Autonomy Software project aims to compete in the University Rover Challenge (URC) by demonstrating advanced autonomous capabilities and robust navigation algorithms.
Loading...
Searching...
No Matches
duckdb::MiniZStream Struct Reference
Collaboration diagram for duckdb::MiniZStream:

Public Member Functions

void FormatException (const std::string &error_msg)
 
void FormatException (const char *error_msg, int mz_ret)
 
void Decompress (const char *compressed_data, size_t compressed_size, char *out_data, size_t out_size)
 
void Compress (const char *uncompressed_data, size_t uncompressed_size, char *out_data, size_t *out_size)
 

Static Public Member Functions

static size_t MaxCompressedLength (size_t input_size)
 
static void InitializeGZIPHeader (unsigned char *gzip_header)
 
static void InitializeGZIPFooter (unsigned char *gzip_footer, duckdb_miniz::mz_ulong crc, idx_t uncompressed_size)
 

Static Public Attributes

static constexpr uint8_t GZIP_HEADER_MINSIZE = 10
 
static constexpr uint8_t GZIP_FOOTER_SIZE = 8
 
static constexpr uint8_t GZIP_COMPRESSION_DEFLATE = 0x08
 
static constexpr unsigned char GZIP_FLAG_UNSUPPORTED = 0x1 | 0x2 | 0x4 | 0x10 | 0x20
 

Private Member Functions

void ResetStreamInternal ()
 

Private Attributes

duckdb_miniz::mz_stream stream
 
MiniZStreamType type
 

Constructor & Destructor Documentation

◆ MiniZStream()

duckdb::MiniZStream::MiniZStream ( )
inline
77147 : type(MiniZStreamType::MINIZ_TYPE_NONE) {
77148 ResetStreamInternal();
77149 }

◆ ~MiniZStream()

duckdb::MiniZStream::~MiniZStream ( )
inline
77151 {
77152 switch (type) {
77153 case MiniZStreamType::MINIZ_TYPE_INFLATE:
77154 duckdb_miniz::mz_inflateEnd(&stream);
77155 break;
77156 case MiniZStreamType::MINIZ_TYPE_DEFLATE:
77157 duckdb_miniz::mz_deflateEnd(&stream);
77158 break;
77159 default:
77160 break;
77161 }
77162 }

Member Function Documentation

◆ FormatException() [1/2]

void duckdb::MiniZStream::FormatException ( const std::string &  error_msg)
inline
77164 {
77165 throw std::runtime_error(error_msg);
77166 }

◆ FormatException() [2/2]

void duckdb::MiniZStream::FormatException ( const char error_msg,
int  mz_ret 
)
inline
77168 {
77169 auto err = duckdb_miniz::mz_error(mz_ret);
77170 FormatException(error_msg + std::string(": ") + (err ? err : "Unknown error code"));
77171 }

◆ Decompress()

void duckdb::MiniZStream::Decompress ( const char compressed_data,
size_t  compressed_size,
char out_data,
size_t  out_size 
)
inline
77173 {
77174 type = MiniZStreamType::MINIZ_TYPE_INFLATE;
77175
77176 // Loop over blocks
77177 while (compressed_size > 0) {
77178 // Read block header
77179 if (compressed_size < GZIP_HEADER_MINSIZE) {
77180 FormatException("Failed to decompress GZIP block: compressed size is less than gzip header size");
77181 }
77182 auto gzip_hdr = reinterpret_cast<const unsigned char *>(compressed_data);
77183 if (gzip_hdr[0] != 0x1F || gzip_hdr[1] != 0x8B || gzip_hdr[2] != GZIP_COMPRESSION_DEFLATE ||
77184 gzip_hdr[3] & GZIP_FLAG_UNSUPPORTED) {
77185 FormatException("Input is invalid/unsupported GZIP stream");
77186 }
77187 compressed_data += GZIP_HEADER_MINSIZE;
77188 compressed_size -= GZIP_HEADER_MINSIZE;
77189
77190 // Initialize stream
77191 auto mz_ret = mz_inflateInit2(&stream, -MZ_DEFAULT_WINDOW_BITS);
77192 if (mz_ret != duckdb_miniz::MZ_OK) {
77193 FormatException("Failed to initialize miniz", mz_ret);
77194 }
77195
77196 // Set up in/out
77197 stream.next_in = reinterpret_cast<const unsigned char *>(compressed_data);
77198 stream.avail_in = static_cast<unsigned int>(compressed_size);
77199 stream.next_out = reinterpret_cast<unsigned char *>(out_data);
77200 stream.avail_out = static_cast<unsigned int>(out_size);
77201
77202 // Decompress and uninitialize stream
77203 mz_ret = mz_inflate(&stream, duckdb_miniz::MZ_FINISH);
77204 if (mz_ret != duckdb_miniz::MZ_OK && mz_ret != duckdb_miniz::MZ_STREAM_END) {
77205 FormatException("Failed to decompress GZIP block", mz_ret);
77206 }
77207 mz_inflateEnd(&stream);
77208
77209 // Update indices
77210 compressed_data += GZIP_FOOTER_SIZE + stream.total_in;
77211 compressed_size -= GZIP_FOOTER_SIZE + stream.total_in;
77212 out_data += stream.total_out;
77213 out_size -= stream.total_out;
77214
77215 ResetStreamInternal();
77216 }
77217 }

◆ MaxCompressedLength()

static size_t duckdb::MiniZStream::MaxCompressedLength ( size_t  input_size)
inlinestatic
77219 {
77220 return duckdb_miniz::mz_compressBound(input_size) + GZIP_HEADER_MINSIZE + GZIP_FOOTER_SIZE;
77221 }

◆ InitializeGZIPHeader()

static void duckdb::MiniZStream::InitializeGZIPHeader ( unsigned char gzip_header)
inlinestatic
77223 {
77224 memset(gzip_header, 0, GZIP_HEADER_MINSIZE);
77225 gzip_header[0] = 0x1F;
77226 gzip_header[1] = 0x8B;
77227 gzip_header[2] = GZIP_COMPRESSION_DEFLATE;
77228 gzip_header[3] = 0;
77229 gzip_header[4] = 0;
77230 gzip_header[5] = 0;
77231 gzip_header[6] = 0;
77232 gzip_header[7] = 0;
77233 gzip_header[8] = 0;
77234 gzip_header[9] = 0xFF;
77235 }

◆ InitializeGZIPFooter()

static void duckdb::MiniZStream::InitializeGZIPFooter ( unsigned char gzip_footer,
duckdb_miniz::mz_ulong  crc,
idx_t  uncompressed_size 
)
inlinestatic
77237 {
77238 gzip_footer[0] = crc & 0xFF;
77239 gzip_footer[1] = (crc >> 8) & 0xFF;
77240 gzip_footer[2] = (crc >> 16) & 0xFF;
77241 gzip_footer[3] = (crc >> 24) & 0xFF;
77242 gzip_footer[4] = uncompressed_size & 0xFF;
77243 gzip_footer[5] = (uncompressed_size >> 8) & 0xFF;
77244 gzip_footer[6] = (uncompressed_size >> 16) & 0xFF;
77245 gzip_footer[7] = (uncompressed_size >> 24) & 0xFF;
77246 }

◆ Compress()

void duckdb::MiniZStream::Compress ( const char uncompressed_data,
size_t  uncompressed_size,
char out_data,
size_t out_size 
)
inline
77248 {
77249 auto mz_ret =
77250 mz_deflateInit2(&stream, duckdb_miniz::MZ_DEFAULT_LEVEL, MZ_DEFLATED, -MZ_DEFAULT_WINDOW_BITS, 1, 0);
77251 if (mz_ret != duckdb_miniz::MZ_OK) {
77252 FormatException("Failed to initialize miniz", mz_ret);
77253 }
77254 type = MiniZStreamType::MINIZ_TYPE_DEFLATE;
77255
77256 auto gzip_header = reinterpret_cast<unsigned char *>(out_data);
77257 InitializeGZIPHeader(gzip_header);
77258
77259 auto gzip_body = gzip_header + GZIP_HEADER_MINSIZE;
77260
77261 stream.next_in = reinterpret_cast<const unsigned char *>(uncompressed_data);
77262 stream.avail_in = static_cast<unsigned int>(uncompressed_size);
77263 stream.next_out = gzip_body;
77264 stream.avail_out = static_cast<unsigned int>(*out_size - GZIP_HEADER_MINSIZE);
77265
77266 mz_ret = mz_deflate(&stream, duckdb_miniz::MZ_FINISH);
77267 if (mz_ret != duckdb_miniz::MZ_OK && mz_ret != duckdb_miniz::MZ_STREAM_END) {
77268 FormatException("Failed to compress GZIP block", mz_ret);
77269 }
77270 auto gzip_footer = gzip_body + stream.total_out;
77271 auto crc = duckdb_miniz::mz_crc32(MZ_CRC32_INIT, reinterpret_cast<const unsigned char *>(uncompressed_data),
77272 uncompressed_size);
77273 InitializeGZIPFooter(gzip_footer, crc, uncompressed_size);
77274
77275 *out_size = stream.total_out + GZIP_HEADER_MINSIZE + GZIP_FOOTER_SIZE;
77276 }

◆ ResetStreamInternal()

void duckdb::MiniZStream::ResetStreamInternal ( )
inlineprivate
77279 {
77280 memset(&stream, 0, sizeof(duckdb_miniz::mz_stream));
77281 }
Definition duckdb.cpp:76083

The documentation for this struct was generated from the following file: