janwas
836cd08d5e
also: - renamed wdll to delay_load, and wdll_ver to dll_ver - removed empty wcpu This was SVN commit r3751.
91 lines
3.5 KiB
C
91 lines
3.5 KiB
C
/**
|
|
* =========================================================================
|
|
* File : compression.h
|
|
* Project : 0 A.D.
|
|
* Description : interface for compressing/decompressing data streams.
|
|
* : currently implements "deflate" (RFC1951).
|
|
*
|
|
* @author Jan.Wassenberg@stud.uni-karlsruhe.de
|
|
* =========================================================================
|
|
*/
|
|
|
|
/*
|
|
* Copyright (c) 2003-2005 Jan Wassenberg
|
|
*
|
|
* Redistribution and/or modification are also permitted under the
|
|
* terms of the GNU General Public License as published by the
|
|
* Free Software Foundation (version 2 or later, at your option).
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
*/
|
|
|
|
#ifndef COMPRESSION_H__
|
|
#define COMPRESSION_H__
|
|
|
|
enum ContextType
|
|
{
|
|
CT_COMPRESSION,
|
|
CT_DECOMPRESSION
|
|
};
|
|
|
|
enum CompressionMethod
|
|
{
|
|
CM_NONE,
|
|
|
|
// zlib "deflate" - see RFC 1750, 1751.
|
|
CM_DEFLATE,
|
|
|
|
CM_UNSUPPORTED
|
|
};
|
|
|
|
extern uintptr_t comp_alloc(ContextType type, CompressionMethod method);
|
|
|
|
// set output buffer. all subsequent comp_feed() calls will write into it.
|
|
// should only be called once (*) due to the comp_finish() interface - since
|
|
// that allows querying the output buffer, it must not be fragmented.
|
|
// * the previous output buffer is wiped out by comp_reset, so
|
|
// setting it again (once!) after that is allowed and required.
|
|
extern void comp_set_output(uintptr_t ctx, void* out, size_t out_size);
|
|
|
|
// [compression contexts only:] allocate an output buffer big enough to
|
|
// hold worst_case_compression_ratio*in_size bytes.
|
|
// rationale: this interface is useful because callers cannot
|
|
// reliably estimate how much output space is needed.
|
|
// raises a warning for decompression contexts because this operation
|
|
// does not make sense there:
|
|
// - decompression ratio is quite large - ballpark 1000x;
|
|
// - exact uncompressed size is known to caller (via archive file header).
|
|
// note: buffer is held until comp_free; it can be reused after a
|
|
// comp_reset. this reduces malloc/free calls.
|
|
extern LibError comp_alloc_output(uintptr_t ctx, size_t in_size);
|
|
|
|
// get current position in output buffer.
|
|
// precondition: valid calls to EITHER comp_alloc_output OR comp_set_output.
|
|
extern void* comp_get_output(uintptr_t ctx);
|
|
|
|
// 'feed' the given buffer to the compressor/decompressor.
|
|
// returns number of output bytes produced (*), or a negative LibError code.
|
|
// * 0 is a legitimate return value - this happens if the input buffer is
|
|
// small and the codec hasn't produced any output.
|
|
// note: the buffer may be overwritten or freed immediately after - we take
|
|
// care of copying and queuing any data that remains (e.g. due to
|
|
// lack of output buffer space).
|
|
extern ssize_t comp_feed(uintptr_t ctx, const void* in, size_t in_size);
|
|
|
|
// feed any remaining queued input data, finish the compress/decompress and
|
|
// pass back the output buffer.
|
|
extern LibError comp_finish(uintptr_t ctx, void** out, size_t* out_size);
|
|
|
|
// prepare this context for reuse. the effect is similar to freeing this
|
|
// context and creating another.
|
|
// rationale: this API avoids reallocating a considerable amount of
|
|
// memory (ballbark 200KB LZ window plus output buffer).
|
|
extern LibError comp_reset(uintptr_t ctx);
|
|
|
|
// free this context and all associated memory.
|
|
extern void comp_free(uintptr_t ctx);
|
|
|
|
#endif // #ifndef COMPRESSION_H__
|