universe@20: /* universe@20: * bfile_heuristics.c universe@20: * universe@20: * Created on: 20.10.2011 universe@20: * Author: Mike universe@20: */ universe@20: universe@20: #include "bfile_heuristics.h" universe@22: #include universe@20: universe@21: bfile_heuristics_t *new_bfile_heuristics_t() { universe@21: bfile_heuristics_t *ret = malloc(sizeof(bfile_heuristics_t)); universe@21: ret->level = BFILE_MEDIUM_ACCURACY; universe@22: bfile_reset(ret); universe@21: return ret; universe@20: } universe@20: universe@21: void destroy_bfile_heuristics_t(bfile_heuristics_t *def) { universe@21: free(def); universe@20: } universe@21: universe@22: void bfile_reset(bfile_heuristics_t *def) { universe@22: def->bcount = 0; universe@22: def->tcount = 0; universe@22: } universe@22: universe@21: bool bfile_check(bfile_heuristics_t *def, int next_char) { universe@21: bool ret = false; universe@22: if (def->level != BFILE_IGNORE) { universe@22: def->tcount++; universe@22: if (!isprint(next_char) && !isspace(next_char)) { universe@22: def->bcount++; universe@22: } universe@22: universe@22: switch (def->level) { universe@22: case BFILE_LOW_ACCURACY: universe@22: if (def->tcount > 15 || next_char == EOF) { universe@22: ret = (1.0*def->bcount)/def->tcount > 0.32; universe@22: } universe@22: break; universe@22: case BFILE_HIGH_ACCURACY: universe@22: if (def->tcount > 500 || next_char == EOF) { universe@22: ret = (1.0*def->bcount)/def->tcount > 0.1; universe@22: } universe@22: break; universe@22: default: /* BFILE_MEDIUM_ACCURACY */ universe@22: if (def->tcount > 100 || next_char == EOF) { universe@22: ret = (1.0*def->bcount)/def->tcount > 0.1; universe@22: } universe@22: } universe@22: } universe@21: universe@21: return ret; universe@21: }