123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 |
- package vendor_zlib
- import "core:c"
- when ODIN_OS == .Windows {
- foreign import zlib "libz.lib"
- } else when ODIN_OS == .Linux {
- foreign import zlib "system:z"
- } else {
- foreign import zlib "system:z"
- }
- VERSION :: "1.2.12"
- VERNUM :: 0x12c0
- VER_MAJOR :: 1
- VER_MINOR :: 2
- VER_REVISION :: 12
- VER_SUBREVISION :: 0
- voidp :: rawptr
- voidpf :: rawptr
- voidpc :: rawptr
- Byte :: c.uchar
- Bytef :: c.uchar
- uInt :: c.uint
- uIntf :: c.uint
- uLong :: c.ulong
- uLongf :: c.ulong
- size_t :: c.size_t
- off_t :: c.long
- off64_t :: i64
- crc_t :: u32
- alloc_func :: proc "c" (opaque: voidp, items: uInt, size: uInt) -> voidpf
- free_func :: proc "c" (opaque: voidp, address: voidpf)
- in_func :: proc "c" (rawptr, [^][^]c.uchar) -> c.uint
- out_func :: proc "c" (rawptr, [^]c.uchar, c.uint) -> c.int
- gzFile_s :: struct {
- have: c.uint,
- next: [^]c.uchar,
- pos: off64_t,
- }
- gzFile :: ^gzFile_s
- z_stream_s :: struct {
- next_in: ^Bytef,
- avail_in: uInt,
- total_in: uLong,
- next_out: ^Bytef,
- avail_out: uInt,
- total_out: uLong,
- msg: [^]c.char,
- state: rawptr,
- zalloc: alloc_func,
- zfree: free_func,
- opaque: voidpf,
- data_type: c.int,
- adler: uLong,
- reserved: uLong,
- }
- z_stream :: z_stream_s
- z_streamp :: ^z_stream
- gz_header_s :: struct {
- text: c.int,
- time: uLong,
- xflags: c.int,
- os: c.int,
- extra: [^]Bytef,
- extra_len: uInt,
- extra_max: uInt,
- name: [^]Bytef,
- name_max: uInt,
- comment: [^]Bytef,
- comm_max: uInt,
- hcrc: c.int,
- done: c.int,
- }
- gz_header :: gz_header_s
- gz_headerp :: ^gz_header
- // Allowed flush values; see deflate() and inflate() below for details
- NO_FLUSH :: 0
- PARTIAL_FLUSH :: 1
- SYNC_FLUSH :: 2
- FULL_FLUSH :: 3
- FINISH :: 4
- BLOCK :: 5
- TREES :: 6
- // Return codes for the compression/decompression functions. Negative values are
- // errors, positive values are used for special but normal events.
- OK :: 0
- STREAM_END :: 1
- NEED_DICT :: 2
- ERRNO :: -1
- STREAM_ERROR :: -2
- DATA_ERROR :: -3
- MEM_ERROR :: -4
- BUF_ERROR :: -5
- VERSION_ERROR :: -6
- // compression levels
- NO_COMPRESSION :: 0
- BEST_SPEED :: 1
- BEST_COMPRESSION :: 9
- DEFAULT_COMPRESSION :: -1
- // compression strategy; see deflateInit2() below for details
- FILTERED :: 1
- HUFFMAN_ONLY :: 2
- RLE :: 3
- FIXED :: 4
- DEFAULT_STRATEGY :: 0
- // Possible values of the data_type field for deflate()
- BINARY :: 0
- TEXT :: 1
- ASCII :: TEXT // for compatibility with 1.2.2 and earlier
- UNKNOWN :: 2
- // The deflate compression method (the only one supported in this version)
- DEFLATED :: 8
- NULL :: 0 // for initializing zalloc, zfree, opaque
- version :: Version // for compatibility with versions < 1.0.2
- @(default_calling_convention="c")
- foreign zlib {
- // becase zlib.zlibVersion would be silly to write
- @(link_prefix="zlib")
- Version :: proc() -> cstring ---
- deflate :: proc(strm: z_streamp, flush: c.int) -> c.int ---
- deflateEnd :: proc(strm: z_streamp) -> c.int ---
- inflate :: proc(strm: z_streamp, flush: c.int) -> c.int ---
- inflateEnd :: proc(strm: z_streamp) -> c.int ---
- deflateSetDictionary :: proc(strm: z_streamp, dictionary: [^]Bytef, dictLength: uInt) -> c.int ---
- deflateGetDictionary :: proc(strm: z_streamp, dictionary: [^]Bytef, dictLength: ^uInt) -> c.int ---
- deflateCopy :: proc(dest, source: z_streamp) -> c.int ---
- deflateReset :: proc(strm: z_streamp) -> c.int ---
- deflateParams :: proc(strm: z_streamp, level, strategy: c.int) -> c.int ---
- deflateTune :: proc(strm: z_streamp, good_length, max_lazy, nice_length, max_chain: c.int) -> c.int ---
- deflateBound :: proc(strm: z_streamp, sourceLen: uLong) -> uLong ---
- deflatePending :: proc(strm: z_streamp, pending: [^]c.uint, bits: [^]c.int) -> c.int ---
- deflatePrime :: proc(strm: z_streamp, bits, value: c.int) -> c.int ---
- deflateSetHeader :: proc(strm: z_streamp, head: gz_headerp) -> c.int ---
- inflateSetDictionary :: proc(strm: z_streamp, dictionary: [^]Bytef, dictLength: uInt) -> c.int ---
- inflateGetDictionary :: proc(strm: z_streamp, dictionary: [^]Bytef, dictLength: ^uInt) -> c.int ---
- inflateSync :: proc(strm: z_streamp) -> c.int ---
- inflateCopy :: proc(dest, source: z_streamp) -> c.int ---
- inflateReset :: proc(strm: z_streamp) -> c.int ---
- inflateReset2 :: proc(strm: z_streamp, windowBits: c.int) -> c.int ---
- inflatePrime :: proc(strm: z_streamp, bits, value: c.int) -> c.int ---
- inflateMark :: proc(strm: z_streamp) -> c.long ---
- inflateGetHeader :: proc(strm: z_streamp, head: gz_headerp) -> c.int ---
- inflateBack :: proc(strm: z_streamp, _in: in_func, in_desc: rawptr, out: out_func, out_desc: rawptr) -> c.int ---
- inflateBackEnd :: proc(strm: z_streamp) -> c.int ---
- zlibCompileFlags :: proc() -> uLong ---
- compress :: proc(dest: [^]Bytef, destLen: ^uLongf, source: [^]Bytef, sourceLen: uLong) -> c.int ---
- compress2 :: proc(dest: [^]Bytef, destLen: ^uLongf, source: [^]Bytef, sourceLen: uLong, level: c.int) -> c.int ---
- compressBound :: proc(sourceLen: uLong) -> uLong ---
- uncompress :: proc(dest: [^]Bytef, destLen: ^uLongf, source: [^]Bytef, sourceLen: uLong) -> c.int ---
- uncompress2 :: proc(dest: [^]Bytef, destLen: ^uLongf, source: [^]Bytef, sourceLen: ^uLong) -> c.int ---
- gzdopen :: proc(fd: c.int, mode: cstring) -> gzFile ---
- gzbuffer :: proc(file: gzFile, size: c.uint) -> c.int ---
- gzsetparams :: proc(file: gzFile, level, strategy: c.int) -> c.int ---
- gzread :: proc(file: gzFile, buf: voidp, len: c.uint) -> c.int ---
- gzfread :: proc(buf: voidp, size, nitems: size_t, file: gzFile) -> size_t ---
- gzwrite :: proc(file: gzFile, buf: voidpc, len: c.uint) -> c.int ---
- gzfwrite :: proc(buf: voidpc, size, nitems: size_t, file: gzFile) -> size_t ---
- gzprintf :: proc(file: gzFile, format: cstring, #c_vararg args: ..any) -> c.int ---
- gzputs :: proc(file: gzFile, s: cstring) -> c.int ---
- gzgets :: proc(file: gzFile, buf: [^]c.char, len: c.int) -> [^]c.char ---
- gzputc :: proc(file: gzFile, ch: c.int) -> c.int ---
- gzgetc_ :: proc(file: gzFile) -> c.int --- // backwards compat, not the same as gzget
- gzungetc :: proc(ch: c.int, file: gzFile) -> c.int ---
- gzflush :: proc(file: gzFile, flush: c.int) -> c.int ---
- gzrewind :: proc(file: gzFile) -> c.int ---
- gzeof :: proc(file: gzFile) -> c.int ---
- gzdirect :: proc(file: gzFile) -> c.int ---
- gzclose :: proc(file: gzFile) -> c.int ---
- gzclose_r :: proc(file: gzFile) -> c.int ---
- gzclose_w :: proc(file: gzFile) -> c.int ---
- gzerror :: proc(file: gzFile, errnum: ^c.int) -> cstring ---
- gzclearerr :: proc(file: gzFile) ---
- adler32 :: proc(adler: uLong, buf: [^]Bytef, len: uInt) -> uLong ---
- adler32_z :: proc(adler: uLong, buf: [^]Bytef, len: size_t) -> uLong ---
- crc32 :: proc(crc: uLong, buf: [^]Bytef, len: uInt) -> uLong ---
- crc32_z :: proc(crc: uLong, buf: [^]Bytef, len: size_t) -> uLong ---
- crc32_combine_op :: proc(crc1, crc2, op: uLong) -> uLong ---
- gzopen64 :: proc(cstring, cstring) -> gzFile ---
- gzseek64 :: proc(gzFile, off64_t, c.int) -> off64_t ---
- gztell64 :: proc(gzFile) -> off64_t ---
- gzoffset64 :: proc(gzFile) -> off64_t ---
- adler32_combine64 :: proc(uLong, uLong, off64_t) -> uLong ---
- crc32_combine64 :: proc(uLong, uLong, off64_t) -> uLong ---
- crc32_combine_gen64 :: proc(off64_t) -> uLong ---
- adler32_combine :: proc(uLong, uLong, off_t) -> uLong ---
- crc32_combine :: proc(uLong, uLong, off_t) -> uLong ---
- crc32_combine_gen :: proc(off_t) -> uLong ---
- zError :: proc(c.int) -> cstring ---
- inflateSyncPoint :: proc(z_streamp) -> c.int ---
- get_crc_table :: proc() -> [^]crc_t ---
- inflateUndermine :: proc(z_streamp, c.int) -> c.int ---
- inflateValidate :: proc(z_streamp, c.int) -> c.int ---
- inflateCodesUsed :: proc(z_streamp) -> c.ulong ---
- inflateResetKeep :: proc(z_streamp) -> c.int ---
- deflateResetKeep :: proc(z_streamp) -> c.int ---
- }
- // Make these private since we create wrappers below passing in version and size
- // of the stream structure like zlib.h does
- @(private)
- @(default_calling_convention="c")
- foreign zlib {
- deflateInit_ :: proc(strm: z_streamp, level: c.int, version: cstring, stream_size: c.int) -> c.int ---
- inflateInit_ :: proc(strm: z_streamp, level: c.int, version: cstring, stream_size: c.int) -> c.int ---
- deflateInit2_ :: proc(strm: z_streamp, level, method, windowBits, memLevel, strategy: c.int, version: cstring, stream_size: c.int) -> c.int ---
- inflateInit2_ :: proc(strm: z_streamp, windowBits: c.int, version: cstring, stream_size: c.int) -> c.int ---
- inflateBackInit_ :: proc(strm: z_streamp, windowBits: c.int, window: [^]c.uchar, version: cstring, stream_size: c.int) -> c.int ---
- // see below for explanation
- @(link_name="gzgetc")
- gzgetc_unique :: proc(file: gzFile) -> c.int ---
- }
- deflateInit :: #force_inline proc "c" (strm: z_streamp, level: c.int) -> c.int {
- return deflateInit_(strm, level, VERSION, c.int(size_of(z_stream)))
- }
- inflateInit :: #force_inline proc "c" (strm: z_streamp, level: c.int) -> c.int {
- return inflateInit_(strm, level, VERSION, c.int(size_of(z_stream)))
- }
- deflateInit2 :: #force_inline proc "c" (strm: z_streamp, level, method, windowBits, memLevel, strategy: c.int) -> c.int {
- return deflateInit2_(strm, level, method, windowBits, memLevel, strategy, VERSION, c.int(size_of(z_stream)))
- }
- inflateInit2 :: #force_inline proc "c" (strm: z_streamp, windowBits: c.int) -> c.int {
- return inflateInit2_(strm, windowBits, VERSION, c.int(size_of(z_stream)))
- }
- inflateBackInit :: #force_inline proc "c" (strm: z_streamp, windowBits: c.int, window: [^]c.uchar) -> c.int {
- return inflateBackInit_(strm, windowBits, window, VERSION, c.int(size_of(z_stream)))
- }
- // zlib.h redefines gzgetc with a macro and uses (gzgetc)(g) to invoke it from
- // inside the same macro (preventing macro expansion), in Odin we give that a
- // unique name using link_prefix then implement the body of the macro in our own
- // procedure calling the unique named gzgetc instead.
- gzgetc :: #force_inline proc(file: gzFile) -> c.int {
- if file.have != 0 {
- file.have -= 1
- file.pos += 1
- ch := c.int(file.next[0])
- file.next = &file.next[1]
- return ch
- }
- return gzgetc_unique(file)
- }
|