xref: /inferno-os/libfreetype/ftsysio.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
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