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