xref: /inferno-os/libfreetype/ftexcept.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1 #include <ft2build.h>
2 #include FT_EXCEPT_H
3 
4 
5   FT_BASE_DEF( void )
ft_cleanup_stack_init(FT_CleanupStack stack,FT_Memory memory)6   ft_cleanup_stack_init( FT_CleanupStack  stack,
7                          FT_Memory        memory )
8   {
9     stack->chunk = &stack->chunk_0;
10     stack->top   = stack->chunk->items;
11     stack->limit = stack->top + FT_CLEANUP_CHUNK_SIZE;
12     stack->chunk_0.link = NULL;
13 
14     stack->memory = memory;
15   }
16 
17 
18 
19   FT_BASE_DEF( void )
ft_cleanup_stack_done(FT_CleanupStack stack)20   ft_cleanup_stack_done( FT_CleanupStack  stack )
21   {
22     FT_Memory        memory = stack->memory;
23     FT_CleanupChunk  chunk, next;
24 
25     for (;;)
26     {
27       chunk = stack->chunk;
28       if ( chunk == &stack->chunk_0 )
29         break;
30 
31       stack->chunk = chunk->link;
32 
33       FT_Free( chunk, memory );
34     }
35 
36     stack->memory = NULL;
37   }
38 
39 
40 
41   FT_BASE_DEF( void )
ft_cleanup_stack_push(FT_CleanupStack stack,FT_Pointer item,FT_CleanupFunc item_func,FT_Pointer item_data)42   ft_cleanup_stack_push( FT_CleanupStack  stack,
43                          FT_Pointer       item,
44                          FT_CleanupFunc   item_func,
45                          FT_Pointer       item_data )
46   {
47     FT_CleanupItem  top;
48 
49 
50     FT_ASSERT( stack && stack->chunk && stack->top );
51     FT_ASSERT( item  && item_func );
52 
53     top = stack->top;
54 
55     top->item      = item;
56     top->item_func = item_func;
57     top->item_data = item_data;
58 
59     top ++;
60 
61     if ( top == stack->limit )
62     {
63       FT_CleanupChunk  chunk;
64 
65       chunk = FT_QAlloc( sizeof(*chunk), stack->memory );
66 
67       chunk->link  = stack->chunk;
68       stack->chunk = chunk;
69       stack->limit = chunk->items + FT_CLEANUP_CHUNK_SIZE;
70       top          = chunk->items;
71     }
72 
73     stack->top = top;
74   }
75 
76 
77 
78   FT_BASE_DEF( void )
ft_cleanup_stack_pop(FT_CleanupStack stack,FT_Int destroy)79   ft_cleanup_stack_pop( FT_CleanupStack   stack,
80                         FT_Int            destroy )
81   {
82     FT_CleanupItem  top;
83 
84 
85     FT_ASSERT( stack && stack->chunk && stack->top );
86     top = stack->top;
87 
88     if ( top == stack->chunk->items )
89     {
90       FT_CleanupChunk  chunk;
91 
92       chunk = stack->chunk;
93 
94       if ( chunk == &stack->chunk_0 )
95       {
96         FT_ERROR(( "cleanup.pop: empty cleanup stack !!\n" ));
97         ft_cleanup_throw( stack, FT_Err_EmptyCleanupStack );
98       }
99 
100       chunk = chunk->link;
101       FT_QFree( stack->chunk, stack->memory );
102 
103       stack->chunk = chunk;
104       stack->limit = chunk->items + FT_CLEANUP_CHUNK_SIZE;
105       top          = stack->limit;
106     }
107 
108     top --;
109 
110     if ( destroy )
111       top->item_func( top->item, top->item_data );
112 
113     top->item      = NULL;
114     top->item_func = NULL;
115     top->item_data = NULL;
116 
117     stack->top = top;
118   }
119 
120 
121 
122   FT_BASE_DEF( FT_CleanupItem )
ft_cleanup_stack_peek(FT_CleanupStack stack)123   ft_cleanup_stack_peek( FT_CleanupStack  stack )
124   {
125     FT_CleanupItem   top;
126     FT_CleanupChunk  chunk;
127 
128 
129     FT_ASSERT( stack && stack->chunk && stack->top );
130 
131     top   = stack->top;
132     chunk = stack->chunk;
133 
134     if ( top > chunk->items )
135       top--;
136     else
137     {
138       chunk = chunk->link;
139       top   = NULL;
140       if ( chunk != NULL )
141         top = chunk->items + FT_CLEANUP_CHUNK_SIZE - 1;
142     }
143     return top;
144   }
145 
146 
147 
148   FT_BASE_DEF( void )
ft_xhandler_enter(FT_XHandler xhandler,FT_Memory memory)149   ft_xhandler_enter( FT_XHandler  xhandler,
150                      FT_Memory    memory )
151   {
152     FT_CleanupStack  stack = FT_MEMORY__CLEANUP(memory);
153 
154     xhandler->previous = stack->xhandler;
155     xhandler->cleanup  = stack->top;
156     xhandler->error    = 0;
157     stack->xhandler    = xhandler;
158   }
159 
160 
161 
162   FT_BASE_DEF( void )
ft_xhandler_exit(FT_XHandler xhandler)163   ft_xhandler_exit( FT_XHandler  xhandler )
164   {
165     FT_CleanupStack  stack = FT_MEMORY__CLEANUP(memory);
166 
167     stack->xhandler    = xhandler->previous;
168     xhandler->previous = NULL;
169     xhandler->error    = error;
170     xhandler->cleanup  = NULL;
171   }
172 
173 
174 
175   FT_BASE_DEF( void )
ft_cleanup_throw(FT_CleanupStack stack,FT_Error error)176   ft_cleanup_throw( FT_CleanupStack  stack,
177                     FT_Error         error )
178   {
179     FT_XHandler  xhandler = stack->xhandler;
180 
181     if ( xhandler == NULL )
182     {
183       /* no exception handler was registered. this  */
184       /* means that we have an un-handled exception */
185       /* the only thing we can do is _PANIC_ and    */
186       /* halt the current program..                 */
187       /*                                            */
188       FT_ERROR(( "FREETYPE PANIC: An un-handled exception occured. Program aborted" ));
189       ft_exit(1);
190     }
191 
192     /* cleanup the stack until we reach the handler's */
193     /* starting stack location..                      */
194 
195     xhandler->error = error;
196     longmp( xhandler->jump_buffer, 1 );
197   }