1ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/***************************************************************************/ 2ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* */ 3ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* ftgzip.c */ 4ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* */ 5ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* FreeType support for .gz compressed files. */ 6ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* */ 7ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* This optional component relies on zlib. It should mainly be used to */ 8ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* parse compressed PCF fonts, as found with many X11 server */ 9ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* distributions. */ 10ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* */ 11ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki/* Copyright 2002-2015 by */ 12ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* David Turner, Robert Wilhelm, and Werner Lemberg. */ 13ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* */ 14ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* This file is part of the FreeType project, and may only be used, */ 15ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* modified, and distributed under the terms of the FreeType project */ 16ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 17ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* this file you indicate that you have read the license and */ 18ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* understand and accept it fully. */ 19ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* */ 20ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/***************************************************************************/ 21ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 22ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 23ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include <ft2build.h> 24ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include FT_INTERNAL_MEMORY_H 25ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include FT_INTERNAL_STREAM_H 26ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include FT_INTERNAL_DEBUG_H 27ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include FT_GZIP_H 28ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include FT_CONFIG_STANDARD_LIBRARY_H 29ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 30ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 31ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include FT_MODULE_ERRORS_H 32ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 33ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#undef __FTERRORS_H__ 34ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 35ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#undef FT_ERR_PREFIX 36ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define FT_ERR_PREFIX Gzip_Err_ 37ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define FT_ERR_BASE FT_Mod_Err_Gzip 38ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 39ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include FT_ERRORS_H 40ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 41ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 42ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#ifdef FT_CONFIG_OPTION_USE_ZLIB 43ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 44ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#ifdef FT_CONFIG_OPTION_PIC 45ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#error "gzip code does not support PIC yet" 46ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif 47ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 48ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#ifdef FT_CONFIG_OPTION_SYSTEM_ZLIB 49ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 50ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include <zlib.h> 51ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 52ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#else /* !FT_CONFIG_OPTION_SYSTEM_ZLIB */ 53ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 54ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* In this case, we include our own modified sources of the ZLib */ 55ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* within the "ftgzip" component. The modifications were necessary */ 56ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* to #include all files without conflicts, as well as preventing */ 57ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* the definition of "extern" functions that may cause linking */ 58ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* conflicts when a program is linked with both FreeType and the */ 59ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* original ZLib. */ 60ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 61ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#ifndef USE_ZLIB_ZCALLOC 62ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define MY_ZCALLOC /* prevent all zcalloc() & zfree() in zutils.c */ 63ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif 64ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 65ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "zlib.h" 66ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 67ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#undef SLOW 68ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define SLOW 1 /* we can't use asm-optimized sources here! */ 69ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 70ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ 71ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* We disable the warning `conversion from XXX to YYY, */ 72ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* possible loss of data' in order to compile cleanly with */ 73ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* the maximum level of warnings: zlib is non-FreeType */ 74ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* code. */ 75ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#pragma warning( push ) 76ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#pragma warning( disable : 4244 ) 77ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif /* _MSC_VER */ 78ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 79ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* Urgh. `inflate_mask' must not be declared twice -- C++ doesn't like 80ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease this. We temporarily disable it and load all necessary header files. */ 81ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define NO_INFLATE_MASK 82ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "zutil.h" 83ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "inftrees.h" 84ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "infblock.h" 85ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "infcodes.h" 86ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "infutil.h" 87ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#undef NO_INFLATE_MASK 88ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 89ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* infutil.c must be included before infcodes.c */ 90ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "zutil.c" 91ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "inftrees.c" 92ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "infutil.c" 93ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "infcodes.c" 94ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "infblock.c" 95ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "inflate.c" 96ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "adler32.c" 97ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 98ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#if defined( _MSC_VER ) 99ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#pragma warning( pop ) 100ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif 101ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 102ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif /* !FT_CONFIG_OPTION_SYSTEM_ZLIB */ 103ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 104ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 105ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/***************************************************************************/ 106ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/***************************************************************************/ 107ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/***** *****/ 108ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/***** Z L I B M E M O R Y M A N A G E M E N T *****/ 109ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/***** *****/ 110ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/***************************************************************************/ 111ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/***************************************************************************/ 112ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 113ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* it is better to use FreeType memory routines instead of raw 114ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 'malloc/free' */ 115ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 116ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease static voidpf 117ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ft_gzip_alloc( FT_Memory memory, 118ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt items, 119ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt size ) 120ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 121ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_ULong sz = (FT_ULong)size * items; 122ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Error error; 123ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Pointer p = NULL; 124ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 125ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 126ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease (void)FT_ALLOC( p, sz ); 127ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return p; 128ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 129ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 130ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 131ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease static void 132ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ft_gzip_free( FT_Memory memory, 133ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease voidpf address ) 134ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 135ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_MEM_FREE( address ); 136ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 137ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 138ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 139ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#if !defined( FT_CONFIG_OPTION_SYSTEM_ZLIB ) && !defined( USE_ZLIB_ZCALLOC ) 140ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 141ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease local voidpf 142ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zcalloc ( voidpf opaque, 143ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease unsigned items, 144ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease unsigned size ) 145ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 146ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return ft_gzip_alloc( (FT_Memory)opaque, items, size ); 147ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 148ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 149ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease local void 150ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zcfree( voidpf opaque, 151ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease voidpf ptr ) 152ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 153ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ft_gzip_free( (FT_Memory)opaque, ptr ); 154ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 155ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 156ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif /* !SYSTEM_ZLIB && !USE_ZLIB_ZCALLOC */ 157ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 158ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 159ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/***************************************************************************/ 160ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/***************************************************************************/ 161ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/***** *****/ 162ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/***** Z L I B F I L E D E S C R I P T O R *****/ 163ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/***** *****/ 164ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/***************************************************************************/ 165ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/***************************************************************************/ 166ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 167ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define FT_GZIP_BUFFER_SIZE 4096 168ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 169ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease typedef struct FT_GZipFileRec_ 170ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 171ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Stream source; /* parent/source stream */ 172ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Stream stream; /* embedding stream */ 173ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Memory memory; /* memory allocator */ 174ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z_stream zstream; /* zlib input stream */ 175ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 176ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_ULong start; /* starting position, after .gz header */ 177ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Byte input[FT_GZIP_BUFFER_SIZE]; /* input read buffer */ 178ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 179ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Byte buffer[FT_GZIP_BUFFER_SIZE]; /* output buffer */ 180ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_ULong pos; /* position in output */ 181ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Byte* cursor; 182ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Byte* limit; 183ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 184ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } FT_GZipFileRec, *FT_GZipFile; 185ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 186ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 187ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* gzip flag byte */ 188ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define FT_GZIP_ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ 189ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define FT_GZIP_HEAD_CRC 0x02 /* bit 1 set: header CRC present */ 190ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define FT_GZIP_EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ 191ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define FT_GZIP_ORIG_NAME 0x08 /* bit 3 set: original file name present */ 192ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define FT_GZIP_COMMENT 0x10 /* bit 4 set: file comment present */ 193ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define FT_GZIP_RESERVED 0xE0 /* bits 5..7: reserved */ 194ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 195ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 196ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* check and skip .gz header - we don't support `transparent' compression */ 197ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease static FT_Error 198ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ft_gzip_check_header( FT_Stream stream ) 199ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 200ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Error error; 201ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Byte head[4]; 202ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 203ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 204ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( FT_STREAM_SEEK( 0 ) || 205ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_STREAM_READ( head, 4 ) ) 206ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease goto Exit; 207ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 208ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* head[0] && head[1] are the magic numbers; */ 209ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* head[2] is the method, and head[3] the flags */ 210ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki if ( head[0] != 0x1F || 211ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki head[1] != 0x8B || 212ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease head[2] != Z_DEFLATED || 213ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease (head[3] & FT_GZIP_RESERVED) ) 214ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 215ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease error = FT_THROW( Invalid_File_Format ); 216ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease goto Exit; 217ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 218ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 219ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* skip time, xflags and os code */ 220ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease (void)FT_STREAM_SKIP( 6 ); 221ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 222ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* skip the extra field */ 223ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( head[3] & FT_GZIP_EXTRA_FIELD ) 224ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 225ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_UInt len; 226ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 227ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 228ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( FT_READ_USHORT_LE( len ) || 229ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_STREAM_SKIP( len ) ) 230ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease goto Exit; 231ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 232ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 233ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* skip original file name */ 234ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( head[3] & FT_GZIP_ORIG_NAME ) 235ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease for (;;) 236ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 237ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_UInt c; 238ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 239ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 240ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( FT_READ_BYTE( c ) ) 241ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease goto Exit; 242ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 243ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( c == 0 ) 244ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease break; 245ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 246ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 247ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* skip .gz comment */ 248ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( head[3] & FT_GZIP_COMMENT ) 249ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease for (;;) 250ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 251ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_UInt c; 252ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 253ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 254ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( FT_READ_BYTE( c ) ) 255ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease goto Exit; 256ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 257ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( c == 0 ) 258ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease break; 259ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 260ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 261ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* skip CRC */ 262ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( head[3] & FT_GZIP_HEAD_CRC ) 263ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( FT_STREAM_SKIP( 2 ) ) 264ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease goto Exit; 265ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 266ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease Exit: 267ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return error; 268ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 269ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 270ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 271ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease static FT_Error 272ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ft_gzip_file_init( FT_GZipFile zip, 273ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Stream stream, 274ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Stream source ) 275ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 276ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z_stream* zstream = &zip->zstream; 277ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Error error = FT_Err_Ok; 278ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 279ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 280ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zip->stream = stream; 281ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zip->source = source; 282ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zip->memory = stream->memory; 283ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 284ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zip->limit = zip->buffer + FT_GZIP_BUFFER_SIZE; 285ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zip->cursor = zip->limit; 286ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zip->pos = 0; 287ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 288ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* check and skip .gz header */ 289ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 290ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease stream = source; 291ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 292ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease error = ft_gzip_check_header( stream ); 293ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( error ) 294ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease goto Exit; 295ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 296ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zip->start = FT_STREAM_POS(); 297ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 298ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 299ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* initialize zlib -- there is no zlib header in the compressed stream */ 300ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zstream->zalloc = (alloc_func)ft_gzip_alloc; 301ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zstream->zfree = (free_func) ft_gzip_free; 302ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zstream->opaque = stream->memory; 303ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 304ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zstream->avail_in = 0; 305ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zstream->next_in = zip->buffer; 306ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 307ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( inflateInit2( zstream, -MAX_WBITS ) != Z_OK || 308ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zstream->next_in == NULL ) 309ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease error = FT_THROW( Invalid_File_Format ); 310ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 311ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease Exit: 312ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return error; 313ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 314ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 315ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 316ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease static void 317ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ft_gzip_file_done( FT_GZipFile zip ) 318ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 319ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z_stream* zstream = &zip->zstream; 320ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 321ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 322ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease inflateEnd( zstream ); 323ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 324ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* clear the rest */ 325ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zstream->zalloc = NULL; 326ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zstream->zfree = NULL; 327ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zstream->opaque = NULL; 328ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zstream->next_in = NULL; 329ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zstream->next_out = NULL; 330ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zstream->avail_in = 0; 331ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zstream->avail_out = 0; 332ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 333ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zip->memory = NULL; 334ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zip->source = NULL; 335ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zip->stream = NULL; 336ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 337ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 338ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 339ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease static FT_Error 340ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ft_gzip_file_reset( FT_GZipFile zip ) 341ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 342ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Stream stream = zip->source; 343ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Error error; 344ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 345ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 346ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( !FT_STREAM_SEEK( zip->start ) ) 347ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 348ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z_stream* zstream = &zip->zstream; 349ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 350ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 351ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease inflateReset( zstream ); 352ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 353ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zstream->avail_in = 0; 354ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zstream->next_in = zip->input; 355ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zstream->avail_out = 0; 356ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zstream->next_out = zip->buffer; 357ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 358ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zip->limit = zip->buffer + FT_GZIP_BUFFER_SIZE; 359ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zip->cursor = zip->limit; 360ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zip->pos = 0; 361ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 362ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 363ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return error; 364ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 365ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 366ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 367ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease static FT_Error 368ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ft_gzip_file_fill_input( FT_GZipFile zip ) 369ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 370ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z_stream* zstream = &zip->zstream; 371ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Stream stream = zip->source; 372ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_ULong size; 373ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 374ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 375ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( stream->read ) 376ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 377ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease size = stream->read( stream, stream->pos, zip->input, 378ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_GZIP_BUFFER_SIZE ); 379ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( size == 0 ) 380ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return FT_THROW( Invalid_Stream_Operation ); 381ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 382ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease else 383ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 384ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease size = stream->size - stream->pos; 385ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( size > FT_GZIP_BUFFER_SIZE ) 386ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease size = FT_GZIP_BUFFER_SIZE; 387ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 388ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( size == 0 ) 389ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return FT_THROW( Invalid_Stream_Operation ); 390ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 391ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_MEM_COPY( zip->input, stream->base + stream->pos, size ); 392ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 393ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease stream->pos += size; 394ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 395ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zstream->next_in = zip->input; 396ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zstream->avail_in = size; 397ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 398ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return FT_Err_Ok; 399ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 400ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 401ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 402ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease static FT_Error 403ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ft_gzip_file_fill_output( FT_GZipFile zip ) 404ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 405ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z_stream* zstream = &zip->zstream; 406ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Error error = FT_Err_Ok; 407ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 408ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 409ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zip->cursor = zip->buffer; 410ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zstream->next_out = zip->cursor; 411ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zstream->avail_out = FT_GZIP_BUFFER_SIZE; 412ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 413ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease while ( zstream->avail_out > 0 ) 414ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 415ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease int err; 416ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 417ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 418ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( zstream->avail_in == 0 ) 419ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 420ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease error = ft_gzip_file_fill_input( zip ); 421ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( error ) 422ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease break; 423ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 424ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 425ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease err = inflate( zstream, Z_NO_FLUSH ); 426ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 427ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( err == Z_STREAM_END ) 428ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 429ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zip->limit = zstream->next_out; 430ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( zip->limit == zip->cursor ) 431ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease error = FT_THROW( Invalid_Stream_Operation ); 432ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease break; 433ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 434ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease else if ( err != Z_OK ) 435ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 436ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease error = FT_THROW( Invalid_Stream_Operation ); 437ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease break; 438ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 439ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 440ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 441ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return error; 442ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 443ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 444ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 445ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* fill output buffer; `count' must be <= FT_GZIP_BUFFER_SIZE */ 446ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease static FT_Error 447ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ft_gzip_file_skip_output( FT_GZipFile zip, 448ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_ULong count ) 449ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 450ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Error error = FT_Err_Ok; 451ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_ULong delta; 452ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 453ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 454ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease for (;;) 455ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 456ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease delta = (FT_ULong)( zip->limit - zip->cursor ); 457ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( delta >= count ) 458ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease delta = count; 459ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 460ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zip->cursor += delta; 461ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zip->pos += delta; 462ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 463ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease count -= delta; 464ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( count == 0 ) 465ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease break; 466ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 467ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease error = ft_gzip_file_fill_output( zip ); 468ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( error ) 469ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease break; 470ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 471ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 472ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return error; 473ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 474ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 475ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 476ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease static FT_ULong 477ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ft_gzip_file_io( FT_GZipFile zip, 478ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_ULong pos, 479ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Byte* buffer, 480ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_ULong count ) 481ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 482ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_ULong result = 0; 483ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Error error; 484ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 485ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 486ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* Reset inflate stream if we're seeking backwards. */ 487ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* Yes, that is not too efficient, but it saves memory :-) */ 488ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( pos < zip->pos ) 489ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 490ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease error = ft_gzip_file_reset( zip ); 491ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( error ) 492ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease goto Exit; 493ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 494ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 495ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* skip unwanted bytes */ 496ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( pos > zip->pos ) 497ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 498ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease error = ft_gzip_file_skip_output( zip, (FT_ULong)( pos - zip->pos ) ); 499ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( error ) 500ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease goto Exit; 501ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 502ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 503ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( count == 0 ) 504ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease goto Exit; 505ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 506ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* now read the data */ 507ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease for (;;) 508ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 509ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_ULong delta; 510ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 511ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 512ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease delta = (FT_ULong)( zip->limit - zip->cursor ); 513ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( delta >= count ) 514ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease delta = count; 515ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 516ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_MEM_COPY( buffer, zip->cursor, delta ); 517ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease buffer += delta; 518ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease result += delta; 519ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zip->cursor += delta; 520ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease zip->pos += delta; 521ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 522ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease count -= delta; 523ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( count == 0 ) 524ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease break; 525ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 526ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease error = ft_gzip_file_fill_output( zip ); 527ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( error ) 528ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease break; 529ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 530ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 531ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease Exit: 532ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return result; 533ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 534ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 535ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 536ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/***************************************************************************/ 537ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/***************************************************************************/ 538ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/***** *****/ 539ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/***** G Z E M B E D D I N G S T R E A M *****/ 540ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/***** *****/ 541ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/***************************************************************************/ 542ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/***************************************************************************/ 543ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 544ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease static void 545ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ft_gzip_stream_close( FT_Stream stream ) 546ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 547ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_GZipFile zip = (FT_GZipFile)stream->descriptor.pointer; 548ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Memory memory = stream->memory; 549ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 550ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 551ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( zip ) 552ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 553ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* finalize gzip file descriptor */ 554ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ft_gzip_file_done( zip ); 555ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 556ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_FREE( zip ); 557ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 558ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease stream->descriptor.pointer = NULL; 559ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 560ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 561ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 562ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 563ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease static FT_ULong 564ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ft_gzip_stream_io( FT_Stream stream, 565ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_ULong pos, 566ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Byte* buffer, 567ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_ULong count ) 568ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 569ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_GZipFile zip = (FT_GZipFile)stream->descriptor.pointer; 570ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 571ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 572ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return ft_gzip_file_io( zip, pos, buffer, count ); 573ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 574ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 575ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 576ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease static FT_ULong 577ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ft_gzip_get_uncompressed_size( FT_Stream stream ) 578ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 579ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Error error; 580ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_ULong old_pos; 581ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_ULong result = 0; 582ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 583ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 584ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease old_pos = stream->pos; 585ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( !FT_Stream_Seek( stream, stream->size - 4 ) ) 586ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 587ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease result = FT_Stream_ReadULong( stream, &error ); 588ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( error ) 589ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease result = 0; 590ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 591ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease (void)FT_Stream_Seek( stream, old_pos ); 592ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 593ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 594ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return result; 595ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 596ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 597ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 598ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* documentation is in ftgzip.h */ 599ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 600ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_EXPORT_DEF( FT_Error ) 601ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Stream_OpenGzip( FT_Stream stream, 602ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Stream source ) 603ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 604ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Error error; 605ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki FT_Memory memory; 606ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_GZipFile zip = NULL; 607ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 608ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 609ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki if ( !stream || !source ) 610ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki { 611ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki error = FT_THROW( Invalid_Stream_Handle ); 612ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki goto Exit; 613ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki } 614ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki 615ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki memory = source->memory; 616ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki 617ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* 618ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * check the header right now; this prevents allocating un-necessary 619ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * objects when we don't need them 620ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease */ 621ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease error = ft_gzip_check_header( source ); 622ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( error ) 623ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease goto Exit; 624ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 625ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_ZERO( stream ); 626ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease stream->memory = memory; 627ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 628ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( !FT_QNEW( zip ) ) 629ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 630ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease error = ft_gzip_file_init( zip, stream, source ); 631ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( error ) 632ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 633ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_FREE( zip ); 634ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease goto Exit; 635ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 636ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 637ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease stream->descriptor.pointer = zip; 638ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 639ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 640ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* 641ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * We use the following trick to try to dramatically improve the 642ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * performance while dealing with small files. If the original stream 643ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * size is less than a certain threshold, we try to load the whole font 644ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * file into memory. This saves us from using the 32KB buffer needed 645ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * to inflate the file, plus the two 4KB intermediate input/output 646ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * buffers used in the `FT_GZipFile' structure. 647ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease */ 648ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 649ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_ULong zip_size = ft_gzip_get_uncompressed_size( source ); 650ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 651ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 652ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( zip_size != 0 && zip_size < 40 * 1024 ) 653ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 654ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Byte* zip_buff = NULL; 655ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 656ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 657ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( !FT_ALLOC( zip_buff, zip_size ) ) 658ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 659ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_ULong count; 660ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 661ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 662ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease count = ft_gzip_file_io( zip, 0, zip_buff, zip_size ); 663ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( count == zip_size ) 664ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 665ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ft_gzip_file_done( zip ); 666ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_FREE( zip ); 667ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 668ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease stream->descriptor.pointer = NULL; 669ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 670ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease stream->size = zip_size; 671ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease stream->pos = 0; 672ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease stream->base = zip_buff; 673ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease stream->read = NULL; 674ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease stream->close = ft_gzip_stream_close; 675ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 676ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease goto Exit; 677ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 678ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 679ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ft_gzip_file_io( zip, 0, NULL, 0 ); 680ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_FREE( zip_buff ); 681ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 682ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease error = FT_Err_Ok; 683ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 684ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 685ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 686ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease stream->size = 0x7FFFFFFFL; /* don't know the real size! */ 687ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease stream->pos = 0; 688ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease stream->base = 0; 689ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease stream->read = ft_gzip_stream_io; 690ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease stream->close = ft_gzip_stream_close; 691ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 692ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease Exit: 693ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return error; 694ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 695ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 696ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 697ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* documentation is in ftgzip.h */ 698ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 699ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_EXPORT_DEF( FT_Error ) 700ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Gzip_Uncompress( FT_Memory memory, 701ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Byte* output, 702ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_ULong* output_len, 703ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease const FT_Byte* input, 704ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_ULong input_len ) 705ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 706ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z_stream stream; 707ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease int err; 708ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 709ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 710ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki /* check for `input' delayed to `inflate' */ 711ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki 712ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki if ( !memory || ! output_len || !output ) 713ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki return FT_THROW( Invalid_Argument ); 714ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki 715ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* this function is modeled after zlib's `uncompress' function */ 716ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 717ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease stream.next_in = (Bytef*)input; 718ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease stream.avail_in = (uInt)input_len; 719ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 720ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease stream.next_out = output; 721ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease stream.avail_out = (uInt)*output_len; 722ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 723ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease stream.zalloc = (alloc_func)ft_gzip_alloc; 724ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease stream.zfree = (free_func) ft_gzip_free; 725ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease stream.opaque = memory; 726ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 727ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease err = inflateInit2( &stream, MAX_WBITS ); 728ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( err != Z_OK ) 729ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return FT_THROW( Invalid_Argument ); 730ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 731ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease err = inflate( &stream, Z_FINISH ); 732ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( err != Z_STREAM_END ) 733ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 734ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease inflateEnd( &stream ); 735ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( err == Z_OK ) 736ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease err = Z_BUF_ERROR; 737ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 738ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease else 739ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 740ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease *output_len = stream.total_out; 741ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 742ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease err = inflateEnd( &stream ); 743ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 744ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 745ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( err == Z_MEM_ERROR ) 746ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return FT_THROW( Out_Of_Memory ); 747ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 748ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( err == Z_BUF_ERROR ) 749ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return FT_THROW( Array_Too_Large ); 750ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 751ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( err == Z_DATA_ERROR ) 752ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return FT_THROW( Invalid_Table ); 753ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 754ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return FT_Err_Ok; 755ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 756ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 757ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 758ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#else /* !FT_CONFIG_OPTION_USE_ZLIB */ 759ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 760ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_EXPORT_DEF( FT_Error ) 761ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Stream_OpenGzip( FT_Stream stream, 762ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Stream source ) 763ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 764ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_UNUSED( stream ); 765ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_UNUSED( source ); 766ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 767ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return FT_THROW( Unimplemented_Feature ); 768ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 769ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 770ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 771ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_EXPORT_DEF( FT_Error ) 772ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Gzip_Uncompress( FT_Memory memory, 773ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Byte* output, 774ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_ULong* output_len, 775ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease const FT_Byte* input, 776ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_ULong input_len ) 777ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 778ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_UNUSED( memory ); 779ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_UNUSED( output ); 780ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_UNUSED( output_len ); 781ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_UNUSED( input ); 782ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_UNUSED( input_len ); 783ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 784ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return FT_THROW( Unimplemented_Feature ); 785ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 786ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 787ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif /* !FT_CONFIG_OPTION_USE_ZLIB */ 788ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 789ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 790ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* END */ 791