Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
3918 | Serge | 1 | /***************************************************************************/ |
2 | /* */ |
||
3 | /* ftsystem.c */ |
||
4 | /* */ |
||
5 | /* VMS-specific FreeType low-level system interface (body). */ |
||
6 | /* */ |
||
7 | /* Copyright 1996-2002, 2005, 2010, 2013 by */ |
||
8 | /* David Turner, Robert Wilhelm, and Werner Lemberg. */ |
||
9 | /* */ |
||
10 | /* This file is part of the FreeType project, and may only be used, */ |
||
11 | /* modified, and distributed under the terms of the FreeType project */ |
||
12 | /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
||
13 | /* this file you indicate that you have read the license and */ |
||
14 | /* understand and accept it fully. */ |
||
15 | /* */ |
||
16 | /***************************************************************************/ |
||
17 | |||
18 | |||
19 | #include |
||
20 | /* we use our special ftconfig.h file, not the standard one */ |
||
21 | #include |
||
22 | #include FT_INTERNAL_DEBUG_H |
||
23 | #include FT_SYSTEM_H |
||
24 | #include FT_ERRORS_H |
||
25 | #include FT_TYPES_H |
||
26 | #include FT_INTERNAL_OBJECTS_H |
||
27 | |||
28 | /* memory-mapping includes and definitions */ |
||
29 | #ifdef HAVE_UNISTD_H |
||
30 | #include |
||
31 | #endif |
||
32 | |||
33 | #include |
||
34 | #ifndef MAP_FILE |
||
35 | #define MAP_FILE 0x00 |
||
36 | #endif |
||
37 | |||
38 | #ifdef MUNMAP_USES_VOIDP |
||
39 | #define MUNMAP_ARG_CAST void * |
||
40 | #else |
||
41 | #define MUNMAP_ARG_CAST char * |
||
42 | #endif |
||
43 | |||
44 | #ifdef NEED_MUNMAP_DECL |
||
45 | |||
46 | #ifdef __cplusplus |
||
47 | extern "C" |
||
48 | #else |
||
49 | extern |
||
50 | #endif |
||
51 | int |
||
52 | munmap( char* addr, |
||
53 | int len ); |
||
54 | |||
55 | #define MUNMAP_ARG_CAST char * |
||
56 | |||
57 | #endif /* NEED_DECLARATION_MUNMAP */ |
||
58 | |||
59 | |||
60 | #include |
||
61 | #include |
||
62 | |||
63 | #ifdef HAVE_FCNTL_H |
||
64 | #include |
||
65 | #endif |
||
66 | |||
67 | #include |
||
68 | #include |
||
69 | #include |
||
70 | |||
71 | |||
72 | /*************************************************************************/ |
||
73 | /* */ |
||
74 | /* MEMORY MANAGEMENT INTERFACE */ |
||
75 | /* */ |
||
76 | /*************************************************************************/ |
||
77 | |||
78 | |||
79 | /*************************************************************************/ |
||
80 | /* */ |
||
81 | /* |
||
82 | /* ft_alloc */ |
||
83 | /* */ |
||
84 | /* |
||
85 | /* The memory allocation function. */ |
||
86 | /* */ |
||
87 | /* */ |
||
88 | /* memory :: A pointer to the memory object. */ |
||
89 | /* */ |
||
90 | /* size :: The requested size in bytes. */ |
||
91 | /* */ |
||
92 | /* |
||
93 | /* The address of newly allocated block. */ |
||
94 | /* */ |
||
95 | FT_CALLBACK_DEF( void* ) |
||
96 | ft_alloc( FT_Memory memory, |
||
97 | long size ) |
||
98 | { |
||
99 | FT_UNUSED( memory ); |
||
100 | |||
101 | return malloc( size ); |
||
102 | } |
||
103 | |||
104 | |||
105 | /*************************************************************************/ |
||
106 | /* */ |
||
107 | /* |
||
108 | /* ft_realloc */ |
||
109 | /* */ |
||
110 | /* |
||
111 | /* The memory reallocation function. */ |
||
112 | /* */ |
||
113 | /* */ |
||
114 | /* memory :: A pointer to the memory object. */ |
||
115 | /* */ |
||
116 | /* cur_size :: The current size of the allocated memory block. */ |
||
117 | /* */ |
||
118 | /* new_size :: The newly requested size in bytes. */ |
||
119 | /* */ |
||
120 | /* block :: The current address of the block in memory. */ |
||
121 | /* */ |
||
122 | /* |
||
123 | /* The address of the reallocated memory block. */ |
||
124 | /* */ |
||
125 | FT_CALLBACK_DEF( void* ) |
||
126 | ft_realloc( FT_Memory memory, |
||
127 | long cur_size, |
||
128 | long new_size, |
||
129 | void* block ) |
||
130 | { |
||
131 | FT_UNUSED( memory ); |
||
132 | FT_UNUSED( cur_size ); |
||
133 | |||
134 | return realloc( block, new_size ); |
||
135 | } |
||
136 | |||
137 | |||
138 | /*************************************************************************/ |
||
139 | /* */ |
||
140 | /* |
||
141 | /* ft_free */ |
||
142 | /* */ |
||
143 | /* |
||
144 | /* The memory release function. */ |
||
145 | /* */ |
||
146 | /* */ |
||
147 | /* memory :: A pointer to the memory object. */ |
||
148 | /* */ |
||
149 | /* block :: The address of block in memory to be freed. */ |
||
150 | /* */ |
||
151 | FT_CALLBACK_DEF( void ) |
||
152 | ft_free( FT_Memory memory, |
||
153 | void* block ) |
||
154 | { |
||
155 | FT_UNUSED( memory ); |
||
156 | |||
157 | free( block ); |
||
158 | } |
||
159 | |||
160 | |||
161 | /*************************************************************************/ |
||
162 | /* */ |
||
163 | /* RESOURCE MANAGEMENT INTERFACE */ |
||
164 | /* */ |
||
165 | /*************************************************************************/ |
||
166 | |||
167 | |||
168 | /*************************************************************************/ |
||
169 | /* */ |
||
170 | /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ |
||
171 | /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ |
||
172 | /* messages during execution. */ |
||
173 | /* */ |
||
174 | #undef FT_COMPONENT |
||
175 | #define FT_COMPONENT trace_io |
||
176 | |||
177 | /* We use the macro STREAM_FILE for convenience to extract the */ |
||
178 | /* system-specific stream handle from a given FreeType stream object */ |
||
179 | #define STREAM_FILE( stream ) ( (FILE*)stream->descriptor.pointer ) |
||
180 | |||
181 | |||
182 | /*************************************************************************/ |
||
183 | /* */ |
||
184 | /* |
||
185 | /* ft_close_stream */ |
||
186 | /* */ |
||
187 | /* |
||
188 | /* The function to close a stream. */ |
||
189 | /* */ |
||
190 | /* */ |
||
191 | /* stream :: A pointer to the stream object. */ |
||
192 | /* */ |
||
193 | FT_CALLBACK_DEF( void ) |
||
194 | ft_close_stream( FT_Stream stream ) |
||
195 | { |
||
196 | munmap( (MUNMAP_ARG_CAST)stream->descriptor.pointer, stream->size ); |
||
197 | |||
198 | stream->descriptor.pointer = NULL; |
||
199 | stream->size = 0; |
||
200 | stream->base = 0; |
||
201 | } |
||
202 | |||
203 | |||
204 | /* documentation is in ftobjs.h */ |
||
205 | |||
206 | FT_BASE_DEF( FT_Error ) |
||
207 | FT_Stream_Open( FT_Stream stream, |
||
208 | const char* filepathname ) |
||
209 | { |
||
210 | int file; |
||
211 | struct stat stat_buf; |
||
212 | |||
213 | |||
214 | if ( !stream ) |
||
215 | return FT_THROW( Invalid_Stream_Handle ); |
||
216 | |||
217 | /* open the file */ |
||
218 | file = open( filepathname, O_RDONLY ); |
||
219 | if ( file < 0 ) |
||
220 | { |
||
221 | FT_ERROR(( "FT_Stream_Open:" )); |
||
222 | FT_ERROR(( " could not open `%s'\n", filepathname )); |
||
223 | return FT_THROW( Cannot_Open_Resource ); |
||
224 | } |
||
225 | |||
226 | if ( fstat( file, &stat_buf ) < 0 ) |
||
227 | { |
||
228 | FT_ERROR(( "FT_Stream_Open:" )); |
||
229 | FT_ERROR(( " could not `fstat' file `%s'\n", filepathname )); |
||
230 | goto Fail_Map; |
||
231 | } |
||
232 | |||
233 | stream->size = stat_buf.st_size; |
||
234 | if ( !stream->size ) |
||
235 | { |
||
236 | FT_ERROR(( "FT_Stream_Open:" )); |
||
237 | FT_ERROR(( " opened `%s' but zero-sized\n", filepathname )); |
||
238 | goto Fail_Map; |
||
239 | } |
||
240 | |||
241 | stream->pos = 0; |
||
242 | stream->base = (unsigned char *)mmap( NULL, |
||
243 | stream->size, |
||
244 | PROT_READ, |
||
245 | MAP_FILE | MAP_PRIVATE, |
||
246 | file, |
||
247 | |||
248 | |||
249 | if ( (long)stream->base == -1 ) |
||
250 | { |
||
251 | FT_ERROR(( "FT_Stream_Open:" )); |
||
252 | FT_ERROR(( " could not `mmap' file `%s'\n", filepathname )); |
||
253 | goto Fail_Map; |
||
254 | } |
||
255 | |||
256 | close( file ); |
||
257 | |||
258 | stream->descriptor.pointer = stream->base; |
||
259 | stream->pathname.pointer = (char*)filepathname; |
||
260 | |||
261 | stream->close = ft_close_stream; |
||
262 | stream->read = 0; |
||
263 | |||
264 | FT_TRACE1(( "FT_Stream_Open:" )); |
||
265 | FT_TRACE1(( " opened `%s' (%d bytes) successfully\n", |
||
266 | filepathname, stream->size )); |
||
267 | |||
268 | return FT_Err_Ok; |
||
269 | |||
270 | Fail_Map: |
||
271 | close( file ); |
||
272 | |||
273 | stream->base = NULL; |
||
274 | stream->size = 0; |
||
275 | stream->pos = 0; |
||
276 | |||
277 | return FT_THROW( Cannot_Open_Stream ); |
||
278 | } |
||
279 | |||
280 | |||
281 | #ifdef FT_DEBUG_MEMORY |
||
282 | |||
283 | extern FT_Int |
||
284 | ft_mem_debug_init( FT_Memory memory ); |
||
285 | |||
286 | extern void |
||
287 | ft_mem_debug_done( FT_Memory memory ); |
||
288 | |||
289 | #endif |
||
290 | |||
291 | |||
292 | /* documentation is in ftobjs.h */ |
||
293 | |||
294 | FT_BASE_DEF( FT_Memory ) |
||
295 | FT_New_Memory( void ) |
||
296 | { |
||
297 | FT_Memory memory; |
||
298 | |||
299 | |||
300 | memory = (FT_Memory)malloc( sizeof ( *memory ) ); |
||
301 | if ( memory ) |
||
302 | { |
||
303 | memory->user = 0; |
||
304 | memory->alloc = ft_alloc; |
||
305 | memory->realloc = ft_realloc; |
||
306 | memory->free = ft_free; |
||
307 | #ifdef FT_DEBUG_MEMORY |
||
308 | ft_mem_debug_init( memory ); |
||
309 | #endif |
||
310 | } |
||
311 | |||
312 | return memory; |
||
313 | } |
||
314 | |||
315 | |||
316 | /* documentation is in ftobjs.h */ |
||
317 | |||
318 | FT_BASE_DEF( void ) |
||
319 | FT_Done_Memory( FT_Memory memory ) |
||
320 | { |
||
321 | #ifdef FT_DEBUG_MEMORY |
||
322 | ft_mem_debug_done( memory ); |
||
323 | #endif |
||
324 | memory->free( memory, memory ); |
||
325 | } |
||
326 | |||
327 | |||
328 | /* END */>> |