1*37da2899SCharles.Forsyth #include <ft2build.h> 2*37da2899SCharles.Forsyth #include FT_SYSTEM_STREAM_H 3*37da2899SCharles.Forsyth 4*37da2899SCharles.Forsyth #include <stdio.h> 5*37da2899SCharles.Forsyth 6*37da2899SCharles.Forsyth /* the ISO/ANSI standard stream object */ 7*37da2899SCharles.Forsyth typedef struct FT_StdStreamRec_ 8*37da2899SCharles.Forsyth { 9*37da2899SCharles.Forsyth FT_StreamRec stream; 10*37da2899SCharles.Forsyth FILE* file; 11*37da2899SCharles.Forsyth const char* pathname; 12*37da2899SCharles.Forsyth 13*37da2899SCharles.Forsyth } FT_StdStreamRec, *FT_StdStream; 14*37da2899SCharles.Forsyth 15*37da2899SCharles.Forsyth 16*37da2899SCharles.Forsyth 17*37da2899SCharles.Forsyth /* read bytes from a standard stream */ 18*37da2899SCharles.Forsyth static FT_ULong ft_std_stream_read(FT_StdStream stream,FT_Byte * buffer,FT_ULong size)19*37da2899SCharles.Forsyth ft_std_stream_read( FT_StdStream stream, 20*37da2899SCharles.Forsyth FT_Byte* buffer, 21*37da2899SCharles.Forsyth FT_ULong size ) 22*37da2899SCharles.Forsyth { 23*37da2899SCharles.Forsyth long read_bytes; 24*37da2899SCharles.Forsyth 25*37da2899SCharles.Forsyth read_bytes = fread( buffer, 1, size, stream->file ); 26*37da2899SCharles.Forsyth if ( read_bytes < 0 ) 27*37da2899SCharles.Forsyth read_bytes = 0; 28*37da2899SCharles.Forsyth 29*37da2899SCharles.Forsyth return (FT_ULong) read_bytes; 30*37da2899SCharles.Forsyth } 31*37da2899SCharles.Forsyth 32*37da2899SCharles.Forsyth 33*37da2899SCharles.Forsyth /* seek the standard stream to a new position */ 34*37da2899SCharles.Forsyth static FT_Error ft_std_stream_seek(FT_StdStream stream,FT_ULong pos)35*37da2899SCharles.Forsyth ft_std_stream_seek( FT_StdStream stream, 36*37da2899SCharles.Forsyth FT_ULong pos ) 37*37da2899SCharles.Forsyth { 38*37da2899SCharles.Forsyth return ( fseek( stream->file, pos, SEEK_SET ) < 0 ) 39*37da2899SCharles.Forsyth ? FT_Err_Stream_Seek 40*37da2899SCharles.Forsyth : FT_Err_Ok; 41*37da2899SCharles.Forsyth } 42*37da2899SCharles.Forsyth 43*37da2899SCharles.Forsyth 44*37da2899SCharles.Forsyth /* close a standard stream */ 45*37da2899SCharles.Forsyth static void ft_std_stream_done(FT_StdStream stream)46*37da2899SCharles.Forsyth ft_std_stream_done( FT_StdStream stream ) 47*37da2899SCharles.Forsyth { 48*37da2899SCharles.Forsyth fclose( stream->file ); 49*37da2899SCharles.Forsyth stream->file = NULL; 50*37da2899SCharles.Forsyth stream->pathname = NULL; 51*37da2899SCharles.Forsyth } 52*37da2899SCharles.Forsyth 53*37da2899SCharles.Forsyth 54*37da2899SCharles.Forsyth /* open a standard stream from a given pathname */ 55*37da2899SCharles.Forsyth static void ft_std_stream_init(FT_StdStream stream,const char * pathname)56*37da2899SCharles.Forsyth ft_std_stream_init( FT_StdStream stream, 57*37da2899SCharles.Forsyth const char* pathname ) 58*37da2899SCharles.Forsyth { 59*37da2899SCharles.Forsyth FT_ASSERT( pathname != NULL ); 60*37da2899SCharles.Forsyth 61*37da2899SCharles.Forsyth stream->file = fopen( pathname, "rb" ); 62*37da2899SCharles.Forsyth if ( stream->file == NULL ) 63*37da2899SCharles.Forsyth { 64*37da2899SCharles.Forsyth FT_ERROR(( "iso.stream.init: could not open '%s'\n", pathname )); 65*37da2899SCharles.Forsyth FT_XTHROW( FT_Err_Stream_Open ); 66*37da2899SCharles.Forsyth } 67*37da2899SCharles.Forsyth 68*37da2899SCharles.Forsyth /* compute total size in bytes */ 69*37da2899SCharles.Forsyth fseek( file, 0, SEEK_END ); 70*37da2899SCharles.Forsyth FT_STREAM__SIZE(stream) = ftell( file ); 71*37da2899SCharles.Forsyth fseek( file, 0, SEEK_SET ); 72*37da2899SCharles.Forsyth 73*37da2899SCharles.Forsyth stream->pathname = pathname; 74*37da2899SCharles.Forsyth stream->pos = 0; 75*37da2899SCharles.Forsyth 76*37da2899SCharles.Forsyth FT_TRACE1(( "iso.stream.init: opened '%s' (%ld bytes) succesfully\n", 77*37da2899SCharles.Forsyth pathname, FT_STREAM__SIZE(stream) )); 78*37da2899SCharles.Forsyth } 79*37da2899SCharles.Forsyth 80*37da2899SCharles.Forsyth 81*37da2899SCharles.Forsyth static void ft_std_stream_class_init(FT_ClassRec * _clazz)82*37da2899SCharles.Forsyth ft_std_stream_class_init( FT_ClassRec* _clazz ) 83*37da2899SCharles.Forsyth { 84*37da2899SCharles.Forsyth FT_StreamClassRec* clazz = FT_STREAM_CLASS(_clazz); 85*37da2899SCharles.Forsyth 86*37da2899SCharles.Forsyth clazz->stream_read = (FT_Stream_ReadFunc) ft_std_stream_read; 87*37da2899SCharles.Forsyth clazz->stream_seek = (FT_Stream_SeekFunc) ft_std_stream_seek; 88*37da2899SCharles.Forsyth } 89*37da2899SCharles.Forsyth 90*37da2899SCharles.Forsyth 91*37da2899SCharles.Forsyth static const FT_TypeRec ft_std_stream_type; 92*37da2899SCharles.Forsyth { 93*37da2899SCharles.Forsyth "StreamClass", 94*37da2899SCharles.Forsyth NULL, 95*37da2899SCharles.Forsyth 96*37da2899SCharles.Forsyth sizeof( FT_ClassRec ), 97*37da2899SCharles.Forsyth ft_stream_class_init, 98*37da2899SCharles.Forsyth NULL, 99*37da2899SCharles.Forsyth 100*37da2899SCharles.Forsyth sizeof( FT_StdStreamRec ), 101*37da2899SCharles.Forsyth ft_std_stream_init, 102*37da2899SCharles.Forsyth ft_std_stream_done, 103*37da2899SCharles.Forsyth NULL, 104*37da2899SCharles.Forsyth }; 105*37da2899SCharles.Forsyth 106*37da2899SCharles.Forsyth 107*37da2899SCharles.Forsyth 108*37da2899SCharles.Forsyth FT_EXPORT_DEF( FT_Stream ) ft_std_stream_new(FT_Memory memory,const char * pathname)109*37da2899SCharles.Forsyth ft_std_stream_new( FT_Memory memory, 110*37da2899SCharles.Forsyth const char* pathname ) 111*37da2899SCharles.Forsyth { 112*37da2899SCharles.Forsyth FT_Class clazz; 113*37da2899SCharles.Forsyth 114*37da2899SCharles.Forsyth clazz = ft_class_from_type( memory, &ft_std_stream_type ); 115*37da2899SCharles.Forsyth 116*37da2899SCharles.Forsyth return (FT_Stream) ft_object_new( clazz, pathname ); 117*37da2899SCharles.Forsyth } 118*37da2899SCharles.Forsyth 119*37da2899SCharles.Forsyth 120*37da2899SCharles.Forsyth FT_EXPORT_DEF( void ) ft_std_stream_create(FT_Memory memory,const char * pathname,FT_Stream * astream)121*37da2899SCharles.Forsyth ft_std_stream_create( FT_Memory memory, 122*37da2899SCharles.Forsyth const char* pathname, 123*37da2899SCharles.Forsyth FT_Stream* astream ) 124*37da2899SCharles.Forsyth { 125*37da2899SCharles.Forsyth FT_Class clazz; 126*37da2899SCharles.Forsyth 127*37da2899SCharles.Forsyth clazz = ft_class_from_type( memory, &ft_std_stream_type ); 128*37da2899SCharles.Forsyth 129*37da2899SCharles.Forsyth ft_object_create( clazz, pathname, FT_OBJECT_P(astream) ); 130*37da2899SCharles.Forsyth } 131*37da2899SCharles.Forsyth 132