56 cf2_arrstack_init( CF2_ArrStack arrstack,
61 FT_ASSERT( arrstack );
64 arrstack->memory = memory;
65 arrstack->error = error;
66 arrstack->sizeItem = sizeItem;
67 arrstack->allocated = 0;
69 arrstack->totalSize = 0;
75 cf2_arrstack_finalize( CF2_ArrStack arrstack )
77 FT_Memory memory = arrstack->memory;
80 FT_ASSERT( arrstack );
82 arrstack->allocated = 0;
84 arrstack->totalSize = 0;
87 FT_FREE( arrstack->ptr );
94 cf2_arrstack_setNumElements( CF2_ArrStack arrstack,
97 FT_ASSERT( arrstack );
100 FT_Error error = FT_Err_Ok;
101 FT_Memory memory = arrstack->memory;
103 size_t newSize = numElements * arrstack->sizeItem;
106 if ( numElements > FT_LONG_MAX / arrstack->sizeItem )
110 FT_ASSERT( newSize > 0 );
112 if ( !FT_QREALLOC( arrstack->ptr, arrstack->totalSize, newSize ) )
114 arrstack->allocated = numElements;
115 arrstack->totalSize = newSize;
117 if ( arrstack->count > numElements )
120 CF2_SET_ERROR( arrstack->error, Stack_Overflow );
121 arrstack->count = numElements;
131 CF2_SET_ERROR( arrstack->error, Out_Of_Memory );
139 cf2_arrstack_setCount( CF2_ArrStack arrstack,
142 FT_ASSERT( arrstack );
144 if ( numElements > arrstack->allocated )
147 if ( !cf2_arrstack_setNumElements( arrstack, numElements ) )
151 arrstack->count = numElements;
157 cf2_arrstack_clear( CF2_ArrStack arrstack )
159 FT_ASSERT( arrstack );
166 FT_LOCAL_DEF(
size_t )
167 cf2_arrstack_size(
const CF2_ArrStack arrstack )
169 FT_ASSERT( arrstack );
171 return arrstack->count;
175 FT_LOCAL_DEF(
void* )
176 cf2_arrstack_getBuffer(
const CF2_ArrStack arrstack )
178 FT_ASSERT( arrstack );
180 return arrstack->ptr;
185 FT_LOCAL_DEF(
void* )
186 cf2_arrstack_getPointer(
const CF2_ArrStack arrstack,
192 FT_ASSERT( arrstack );
194 if ( idx >= arrstack->count )
197 CF2_SET_ERROR( arrstack->error, Stack_Overflow );
201 newPtr = (FT_Byte*)arrstack->ptr + idx * arrstack->sizeItem;
211 cf2_arrstack_push( CF2_ArrStack arrstack,
214 FT_ASSERT( arrstack );
216 if ( arrstack->count == arrstack->allocated )
219 if ( !cf2_arrstack_setNumElements(
220 arrstack, arrstack->allocated * 2 + 16 ) )
230 size_t offset = arrstack->count * arrstack->sizeItem;
231 void* newPtr = (FT_Byte*)arrstack->ptr + offset;
234 FT_MEM_COPY( newPtr, ptr, arrstack->sizeItem );
235 arrstack->count += 1;