#ifndef __FT_CORE_H__ #define __FT_CORE_H__ #include #include FT_TYPES_H #include FT_SYSTEM_MEMORY_H FT_BEGIN_HEADER /**************************************************************************/ /**************************************************************************/ /***** *****/ /***** C L E A N U P S T A C K *****/ /***** *****/ /**************************************************************************/ /**************************************************************************/ /************************************************************************ * * @functype: FT_CleanupFunc * * @description: * a function used to cleanup a given item on the cleanup stack * * @input: * item :: target item pointer * item_data :: optional argument to cleanup routine */ typedef void (*FT_CleanupFunc)( FT_Pointer item, FT_Pointer item_data ); /************************************************************************ * * @type: FT_XHandler * * @description: * handle to an exception-handler structure for the FreeType * exception sub-system * * @note: * exception handlers are allocated on the stack within a * @FT_XTRY macro. Do not try to access them directly. */ typedef struct FT_XHandlerRec_* FT_XHandler; /* the size of a cleanup chunk in bytes is FT_CLEANUP_CHUNK_SIZE*12 + 4 */ /* this must be a small power of 2 whenever possible.. */ /* */ /* with a value of 5, we have a byte size of 64 bytes per chunk.. */ /* */ #define FT_CLEANUP_CHUNK_SIZE 5 typedef struct FT_CleanupItemRec_ { FT_Pointer item; FT_CleanupFunc item_func; FT_Pointer item_data; } FT_CleanupItemRec; typedef struct FT_CleanupChunkRec_* FT_CleanupChunk; typedef struct FT_CleanupChunkRec_ { FT_CleanupChunk link; FT_CleanupItemRec items[ FT_CLEANUP_CHUNK_SIZE ]; } FT_CleanupChunkRec; typedef struct FT_CleanupStackRec_ { FT_CleanupItem top; FT_CleanupItem limit; FT_CleanupChunk chunk; FT_CleanupChunkRec chunk_0; /* avoids stupid dynamic allocation */ FT_Memory memory; } FT_CleanupStackRec, *FT_CleanupStack; FT_BASE( void ) ft_cleanup_stack_push( FT_CleanupStack stack, FT_Pointer item, FT_CleanupFunc item_func, FT_Pointer item_data ); FT_BASE( void ) ft_cleanup_stack_pop( FT_CleanupStack stack, FT_Int destroy ); FT_BASE( FT_CleanupItem ) ft_cleanup_stack_peek( FT_CleanupStack stack ); FT_BASE( void ) ft_cleanup_throw( FT_CleanupStack stack, FT_Error error ); /**************************************************************************/ /**************************************************************************/ /***** *****/ /***** M E M O R Y M A N A G E R *****/ /***** *****/ /**************************************************************************/ /**************************************************************************/ typedef struct FT_MemoryRec_ { FT_Memory_AllocFunc mem_alloc; /* shortcut to funcs->mem_alloc */ FT_Memory_FreeFunc mem_free; /* shortcut to funcs->mem_free */ FT_Pointer mem_data; const FT_Memory_Funcs mem_funcs; FT_CleanupStackRec cleanup_stack; FT_Pointer meta_class; } FT_MemoryRec; #define FT_MEMORY(x) ((FT_Memory)(x)) #define FT_MEMORY__ALLOC(x) FT_MEMORY(x)->mem_alloc #define FT_MEMORY__FREE(x) FT_MEMORY(x)->mem_free #define FT_MEMORY__REALLOC(x) FT_MEMORY(x)->mem_funcs->mem_realloc #define FT_MEMORY__CLEANUP(x) (&FT_MEMORY(x)->cleanup_stack) #define FT_MEMORY__META_CLASS(x) ((FT_MetaClass)(FT_MEMORY(x)->meta_class)) /**************************************************************************/ /**************************************************************************/ /***** *****/ /***** E X C E P T I O N H A N D L I N G *****/ /***** *****/ /**************************************************************************/ /**************************************************************************/ /************************************************************************ * * @struct: FT_XHandlerRec * * @description: * exception handler structure * * @fields: * previous :: previous handler in chain. * jum_buffer :: processor state used by setjmp/longjmp to implement * exception control transfer * error :: exception error code * mark :: top of cleanup stack when @FT_XTRY is used */ typedef struct FT_XHandlerRec_ { FT_XHandler previous; ft_jmp_buf jump_buffer; volatile FT_Error error; FT_Pointer mark; } FT_XHandlerRec; FT_BASE( void ) ft_xhandler_enter( FT_XHandler xhandler, FT_Memory memory ); FT_BASE( void ) ft_xhandler_exit( FT_XHandler xhandler ); FT_END_HEADER #endif /* __FT_CORE_H__ */