Beispiel #1
0
static void
search_by_ullmann(struct State * state, struct Query * query, struct Target * target){
  int k;
  // Idea for optimization
  //show(state->mat, query->len, target->n_bits);
  if(state->depth == state->height - 1){
    //printf("FOUND!\n");
    state_push_result(state);
    //show(state->mat, query->len, target->n_bits);
  }else{
    for(k = 0 ; k < target->n_bits ; k++){
      if(has_bit(state->mat,
		 state->depth + 1,
		 k,
		 target->n_bytes)){
	state_push(state);
	state_clear_bits(state->mat, state->depth, k, target->n_bytes, query->len);
	//show(state->mat, query->len, target->n_bits);
	refine(state, query, target);
	//show(state->mat, query->len, target->n_bits);
	if(state_is_valid(state) == TRUE){
	  //show(state->mat, query->len, target->n_bits);
	  search_by_ullmann(state, query, target);
	}
	state_pop(state);
      }
    }
  }
}
Beispiel #2
0
// phase 13: backtrack when all possibilities in an entry have been exhausted without success
static int searchbacktrack(void) {
state_pop();
if(sdep==-1) {rcode=1;return 15;} // all done, no solution found
return 12; // try next possibility at level above
}
Beispiel #3
0
// clear state stacks and free allocated memory
static void state_finit(void) {while(sdep>=0) state_pop();}