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