1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  ftsystem.c                                                             */
4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*    ANSI-specific FreeType low-level system interface (body).            */
6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
7a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang/*  Copyright 1996-2002, 2006, 2008-2011, 2013 by                          */
8049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  This file is part of the FreeType project, and may only be used,       */
11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  modified, and distributed under the terms of the FreeType project      */
12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  this file you indicate that you have read the license and              */
14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  understand and accept it fully.                                        */
15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
19049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
20049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* This file contains the default interface used by FreeType to access   */
21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* low-level, i.e. memory management, i/o access as well as thread       */
22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* synchronisation.  It can be replaced by user-specific routines if     */
23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* necessary.                                                            */
24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <ft2build.h>
29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_CONFIG_CONFIG_H
30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_DEBUG_H
31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_STREAM_H
32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_SYSTEM_H
33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_ERRORS_H
34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_TYPES_H
35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                       MEMORY MANAGEMENT INTERFACE                     */
40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* It is not necessary to do any error checking for the                  */
46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* allocation-related functions.  This will be done by the higher level  */
47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* routines like ft_mem_alloc() or ft_mem_realloc().                     */
48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    ft_alloc                                                           */
56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The memory allocation function.                                    */
59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    memory :: A pointer to the memory object.                          */
62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    size   :: The requested size in bytes.                             */
64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The address of newly allocated block.                              */
67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( void* )
69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  ft_alloc( FT_Memory  memory,
70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            long       size )
71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( memory );
73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return ft_smalloc( size );
75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    ft_realloc                                                         */
82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The memory reallocation function.                                  */
85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    memory   :: A pointer to the memory object.                        */
88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    cur_size :: The current size of the allocated memory block.        */
90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    new_size :: The newly requested size in bytes.                     */
92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    block    :: The current address of the block in memory.            */
94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The address of the reallocated memory block.                       */
97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( void* )
99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  ft_realloc( FT_Memory  memory,
100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              long       cur_size,
101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              long       new_size,
102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              void*      block )
103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( memory );
105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( cur_size );
106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return ft_srealloc( block, new_size );
108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    ft_free                                                            */
115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The memory release function.                                       */
118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    memory  :: A pointer to the memory object.                         */
121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    block   :: The address of block in memory to be freed.             */
123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( void )
125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  ft_free( FT_Memory  memory,
126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project           void*      block )
127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( memory );
129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ft_sfree( block );
131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                     RESOURCE MANAGEMENT INTERFACE                     */
137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
140c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner#ifndef FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT
141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* messages during execution.                                            */
147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef  FT_COMPONENT
149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_COMPONENT  trace_io
150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* We use the macro STREAM_FILE for convenience to extract the       */
152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* system-specific stream handle from a given FreeType stream object */
153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define STREAM_FILE( stream )  ( (FT_FILE*)stream->descriptor.pointer )
154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    ft_ansi_stream_close                                               */
160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The function to close a stream.                                    */
163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    stream :: A pointer to the stream object.                          */
166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( void )
168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  ft_ansi_stream_close( FT_Stream  stream )
169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ft_fclose( STREAM_FILE( stream ) );
171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    stream->descriptor.pointer = NULL;
173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    stream->size               = 0;
174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    stream->base               = 0;
175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    ft_ansi_stream_io                                                  */
182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The function to open a stream.                                     */
185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    stream :: A pointer to the stream object.                          */
188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    offset :: The position in the data stream to start reading.        */
190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    buffer :: The address of buffer to store the read data.            */
192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    count  :: The number of bytes to read from the stream.             */
194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
196aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  /*    The number of bytes actually read.  If `count' is zero (this is,   */
197aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  /*    the function is used for seeking), a non-zero return value         */
198aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  /*    indicates an error.                                                */
199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( unsigned long )
201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  ft_ansi_stream_io( FT_Stream       stream,
202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     unsigned long   offset,
203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     unsigned char*  buffer,
204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     unsigned long   count )
205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_FILE*  file;
207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
209aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    if ( !count && offset > stream->size )
210aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich      return 1;
211aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    file = STREAM_FILE( stream );
213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
214295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    if ( stream->pos != offset )
215295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      ft_fseek( file, offset, SEEK_SET );
216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return (unsigned long)ft_fread( buffer, 1, count, file );
218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* documentation is in ftstream.h */
222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_BASE_DEF( FT_Error )
224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_Stream_Open( FT_Stream    stream,
225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                  const char*  filepathname )
226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_FILE*  file;
228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !stream )
231a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      return FT_THROW( Invalid_Stream_Handle );
232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2338583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner    stream->descriptor.pointer = NULL;
2348583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner    stream->pathname.pointer   = (char*)filepathname;
2358583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner    stream->base               = 0;
2368583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner    stream->pos                = 0;
2378583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner    stream->read               = NULL;
2388583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner    stream->close              = NULL;
2398583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner
240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    file = ft_fopen( filepathname, "rb" );
241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !file )
242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
243295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      FT_ERROR(( "FT_Stream_Open:"
244295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                 " could not open `%s'\n", filepathname ));
245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
246a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      return FT_THROW( Cannot_Open_Resource );
247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ft_fseek( file, 0, SEEK_END );
250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    stream->size = ft_ftell( file );
2518583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner    if ( !stream->size )
2528583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner    {
2538583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner      FT_ERROR(( "FT_Stream_Open:" ));
2548583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner      FT_ERROR(( " opened `%s' but zero-sized\n", filepathname ));
2558583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner      ft_fclose( file );
256a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      return FT_THROW( Cannot_Open_Stream );
2578583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner    }
258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ft_fseek( file, 0, SEEK_SET );
259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    stream->descriptor.pointer = file;
261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    stream->read  = ft_ansi_stream_io;
262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    stream->close = ft_ansi_stream_close;
263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_TRACE1(( "FT_Stream_Open:" ));
265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_TRACE1(( " opened `%s' (%d bytes) successfully\n",
266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                filepathname, stream->size ));
267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return FT_Err_Ok;
269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
271c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner#endif /* !FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */
272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_DEBUG_MEMORY
274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  extern FT_Int
276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  ft_mem_debug_init( FT_Memory  memory );
277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  extern void
279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  ft_mem_debug_done( FT_Memory  memory );
280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* documentation is in ftobjs.h */
285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_BASE_DEF( FT_Memory )
287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_New_Memory( void )
288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Memory  memory;
290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    memory = (FT_Memory)ft_smalloc( sizeof ( *memory ) );
293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( memory )
294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      memory->user    = 0;
296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      memory->alloc   = ft_alloc;
297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      memory->realloc = ft_realloc;
298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      memory->free    = ft_free;
299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_DEBUG_MEMORY
300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ft_mem_debug_init( memory );
301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return memory;
305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* documentation is in ftobjs.h */
309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_BASE_DEF( void )
311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_Done_Memory( FT_Memory  memory )
312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_DEBUG_MEMORY
314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ft_mem_debug_done( memory );
315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
3160a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    ft_sfree( memory );
317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */
321