1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ftsystem.c */ 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ANSI-specific FreeType low-level system interface (body). */ 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/* Copyright 1996-2015 by */ 8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* David Turner, Robert Wilhelm, and Werner Lemberg. */ 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* This file is part of the FreeType project, and may only be used, */ 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* modified, and distributed under the terms of the FreeType project */ 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* this file you indicate that you have read the license and */ 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* understand and accept it fully. */ 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* This file contains the default interface used by FreeType to access */ 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* low-level, i.e. memory management, i/o access as well as thread */ 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* synchronisation. It can be replaced by user-specific routines if */ 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* necessary. */ 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 27e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 28e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <ft2build.h> 29e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_CONFIG_CONFIG_H 30e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_INTERNAL_DEBUG_H 31e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_INTERNAL_STREAM_H 32e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SYSTEM_H 33e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_ERRORS_H 34e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_TYPES_H 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* MEMORY MANAGEMENT INTERFACE */ 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* It is not necessary to do any error checking for the */ 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* allocation-related functions. This will be done by the higher level */ 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* routines like ft_mem_alloc() or ft_mem_realloc(). */ 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Function> */ 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* ft_alloc */ 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Description> */ 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The memory allocation function. */ 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Input> */ 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* memory :: A pointer to the memory object. */ 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* size :: The requested size in bytes. */ 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Return> */ 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The address of newly allocated block. */ 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( void* ) 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_alloc( FT_Memory memory, 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov long size ) 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( memory ); 73e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return ft_smalloc( (size_t)size ); 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 76e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Function> */ 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* ft_realloc */ 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Description> */ 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The memory reallocation function. */ 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Input> */ 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* memory :: A pointer to the memory object. */ 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* cur_size :: The current size of the allocated memory block. */ 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* new_size :: The newly requested size in bytes. */ 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* block :: The current address of the block in memory. */ 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Return> */ 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The address of the reallocated memory block. */ 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( void* ) 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_realloc( FT_Memory memory, 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov long cur_size, 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov long new_size, 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* block ) 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( memory ); 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( cur_size ); 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return ft_srealloc( block, (size_t)new_size ); 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Function> */ 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* ft_free */ 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Description> */ 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The memory release function. */ 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Input> */ 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* memory :: A pointer to the memory object. */ 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* block :: The address of block in memory to be freed. */ 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( void ) 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_free( FT_Memory memory, 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* block ) 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UNUSED( memory ); 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_sfree( block ); 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* RESOURCE MANAGEMENT INTERFACE */ 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* messages during execution. */ 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#undef FT_COMPONENT 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_COMPONENT trace_io 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* We use the macro STREAM_FILE for convenience to extract the */ 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* system-specific stream handle from a given FreeType stream object */ 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define STREAM_FILE( stream ) ( (FT_FILE*)stream->descriptor.pointer ) 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Function> */ 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* ft_ansi_stream_close */ 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Description> */ 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The function to close a stream. */ 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Input> */ 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* stream :: A pointer to the stream object. */ 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( void ) 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_ansi_stream_close( FT_Stream stream ) 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_fclose( STREAM_FILE( stream ) ); 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov stream->descriptor.pointer = NULL; 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov stream->size = 0; 174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann stream->base = NULL; 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Function> */ 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* ft_ansi_stream_io */ 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Description> */ 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The function to open a stream. */ 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Input> */ 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* stream :: A pointer to the stream object. */ 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* offset :: The position in the data stream to start reading. */ 190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* buffer :: The address of buffer to store the read data. */ 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* count :: The number of bytes to read from the stream. */ 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Return> */ 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The number of bytes actually read. If `count' is zero (this is, */ 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* the function is used for seeking), a non-zero return value */ 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* indicates an error. */ 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( unsigned long ) 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_ansi_stream_io( FT_Stream stream, 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned long offset, 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned char* buffer, 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned long count ) 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FILE* file; 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !count && offset > stream->size ) 210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1; 211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov file = STREAM_FILE( stream ); 213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( stream->pos != offset ) 215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ft_fseek( file, (long)offset, SEEK_SET ); 216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (unsigned long)ft_fread( buffer, 1, count, file ); 218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* documentation is in ftstream.h */ 222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_BASE_DEF( FT_Error ) 224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream_Open( FT_Stream stream, 225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const char* filepathname ) 226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FILE* file; 228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !stream ) 231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Invalid_Stream_Handle ); 232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov stream->descriptor.pointer = NULL; 234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov stream->pathname.pointer = (char*)filepathname; 235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann stream->base = NULL; 236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov stream->pos = 0; 237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov stream->read = NULL; 238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov stream->close = NULL; 239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov file = ft_fopen( filepathname, "rb" ); 241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !file ) 242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ERROR(( "FT_Stream_Open:" 244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov " could not open `%s'\n", filepathname )); 245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Cannot_Open_Resource ); 247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 249e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ft_fseek( file, 0, SEEK_END ); 250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann stream->size = (unsigned long)ft_ftell( file ); 251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !stream->size ) 252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ERROR(( "FT_Stream_Open:" )); 254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ERROR(( " opened `%s' but zero-sized\n", filepathname )); 255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_fclose( file ); 256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Cannot_Open_Stream ); 257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 258e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ft_fseek( file, 0, SEEK_SET ); 259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov stream->descriptor.pointer = file; 261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov stream->read = ft_ansi_stream_io; 262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov stream->close = ft_ansi_stream_close; 263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_TRACE1(( "FT_Stream_Open:" )); 265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_TRACE1(( " opened `%s' (%d bytes) successfully\n", 266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov filepathname, stream->size )); 267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* !FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */ 272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef FT_DEBUG_MEMORY 274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov extern FT_Int 276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_mem_debug_init( FT_Memory memory ); 277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov extern void 279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_mem_debug_done( FT_Memory memory ); 280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* documentation is in ftobjs.h */ 285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_BASE_DEF( FT_Memory ) 287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_New_Memory( void ) 288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Memory memory; 290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 292e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov memory = (FT_Memory)ft_smalloc( sizeof ( *memory ) ); 293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( memory ) 294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann memory->user = NULL; 296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memory->alloc = ft_alloc; 297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memory->realloc = ft_realloc; 298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memory->free = ft_free; 299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef FT_DEBUG_MEMORY 300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_mem_debug_init( memory ); 301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return memory; 305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* documentation is in ftobjs.h */ 309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_BASE_DEF( void ) 311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Done_Memory( FT_Memory memory ) 312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef FT_DEBUG_MEMORY 314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_mem_debug_done( memory ); 315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 316e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ft_sfree( memory ); 317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* END */ 321