/** * Find deepest level of the match that has a queue * @param m the first in a chain of matches * @return the topmost match with a queue */ static match *match_deepest_queued( match *m ) { int i; if ( m->next != NULL ) { dyn_array *da = dyn_array_create( 5 ); if ( da != NULL ) { match *temp = m; while ( temp != NULL ) { dyn_array_add( da, temp ); temp = temp->next; } for ( i=dyn_array_size(da)-1;i>=0;i-- ) { match *n = dyn_array_get(da,i); if ( n->queue != NULL ) { m = n; // clean up any non-queued matches if ( m->next != NULL ) match_dispose( m->next ); m->next = NULL; break; } } dyn_array_dispose( da ); } } return m; }
static void dyn_array_ptr_add (DynPtrArray *da, void *ptr) { void **p; if (da->array.capacity == 0) { da->array.capacity = 1; da->array.size = 1; p = (void**)&da->array.data; } else if (da->array.capacity == 1) { void *ptr0 = da->array.data; void **p0; dyn_array_init (&da->array); p0 = dyn_array_add (&da->array, sizeof (void*)); *p0 = ptr0; p = dyn_array_add (&da->array, sizeof (void*)); } else { p = dyn_array_add (&da->array, sizeof (void*)); } *p = ptr; }
/** * Convert a list of cards to a standard pair array * @param c the head of the card list * @return an allocated dynamic array of pairs or NULL */ dyn_array *card_to_pairs( card *c ) { int npairs = card_list_len(c); dyn_array *da = dyn_array_create( npairs ); if ( da != NULL ) { while ( c != NULL ) { dyn_array_add( da, c->p ); c = c->right; } } return da; }
static void dyn_array_ptr_add (DynPtrArray *da, void *ptr) { void **p; #ifdef OPTIMIZATION_SINGLETON_DYN_ARRAY if (da->array.capacity == 0) { da->array.capacity = 1; da->array.size = 1; p = (void**)&da->array.data; } else if (da->array.capacity == 1) { void *ptr0 = da->array.data; void **p0; dyn_array_init (&da->array); p0 = dyn_array_add (&da->array, sizeof (void*)); *p0 = ptr0; p = dyn_array_add (&da->array, sizeof (void*)); } else #endif { p = dyn_array_add (&da->array, sizeof (void*)); } *p = ptr; }
static void dyn_array_int_add (DynArray *da, int x) { int *p = dyn_array_add (da); *p = x; }
static void dyn_array_ptr_add (DynArray *da, void *ptr) { void **p = dyn_array_add (da); *p = ptr; }
static SCC* dyn_array_scc_add (DynSCCArray *da) { return dyn_array_add (&da->array, sizeof (SCC)); }
static void dyn_array_ptr_add (DynPtrArray *da, void *ptr) { void **p = dyn_array_add (&da->array, sizeof (void*)); *p = ptr; }
static void dyn_array_int_add (DynIntArray *da, int x) { int *p = dyn_array_add (&da->array, sizeof (int)); *p = x; }