void BetterVariety::set_cur_rank() { if (strlen(cur) == 0) { cur_rank = 2; } else { StringListEnumeration es = list.elements_obj(); const char * m; cur_rank = 3; unsigned list_size = 0, num = 0; while ( (m = es.next()) != 0 ) { ++list_size; unsigned s = strlen(m); const char * c = cur; unsigned p; bool match = false; num = 0; for (; *c != '\0'; c += p) { ++num; p = strcspn(c, "-"); if (p == s && memcmp(m, c, s) == 0) {match = true; break;} if (c[p] == '-') p++; } if (!match) goto fail; cur_rank = 0; } if (cur_rank == 0 && num != list_size) cur_rank = 1; } return; fail: cur_rank = 3; }
void BetterList::init() { StringListEnumeration es = list.elements_obj(); worst_rank = 0; while ( (es.next()) != 0) ++worst_rank; best_rank = worst_rank; }
void BetterList::set_cur_rank() { StringListEnumeration es = list.elements_obj(); const char * m; cur_rank = 0; while ( (m = es.next()) != 0 && strcmp(m, cur) != 0) ++cur_rank; }
PosibErr<void> setup_filter(Filter & filter, Config * config, bool use_decoder, bool use_filter, bool use_encoder) { StringList sl; config->retrieve_list("filter", &sl); StringListEnumeration els = sl.elements_obj(); const char * filter_name; String fun; StackPtr<IndividualFilter> ifilter; filter.clear(); while ((filter_name = els.next()) != 0) { //fprintf(stderr, "Loading %s ... \n", filter_name); FilterEntry * f = get_standard_filter(filter_name); // In case libdl is not available a filter is only available if made // one of the standard filters. This is done by statically linking // the filter sources. // On systems providing libdl or in case libtool mimics libdl // The following code parts assure that all filters needed and requested // by user are loaded properly or be reported to be missing. // FilterHandle decoder_handle, filter_handle, encoder_handle; #ifdef HAVE_LIBDL FilterEntry dynamic_filter; if (!f) { RET_ON_ERR_SET(get_dynamic_filter(config, filter_name), const ConfigModule *, module); if (!(decoder_handle = dlopen(module->file,RTLD_NOW)) || !(encoder_handle = dlopen(module->file,RTLD_NOW)) || !(filter_handle = dlopen(module->file,RTLD_NOW))) return make_err(cant_dlopen_file,dlerror()).with_file(filter_name); fun = "new_aspell_"; fun += filter_name; fun += "_decoder"; dynamic_filter.decoder = (FilterFun *)dlsym(decoder_handle.get(), fun.str()); fun = "new_aspell_"; fun += filter_name; fun += "_encoder"; dynamic_filter.encoder = (FilterFun *)dlsym(encoder_handle.get(), fun.str()); fun = "new_aspell_"; fun += filter_name; fun += "_filter"; dynamic_filter.filter = (FilterFun *)dlsym(filter_handle.get(), fun.str()); if (!dynamic_filter.decoder && !dynamic_filter.encoder && !dynamic_filter.filter) return make_err(empty_filter,filter_name); dynamic_filter.name = filter_name; f = &dynamic_filter; } #else if (!f) return make_err(no_such_filter, filter_name); #endif if (use_decoder && f->decoder && (ifilter = f->decoder())) { RET_ON_ERR_SET(ifilter->setup(config), bool, keep); ifilter->handle = decoder_handle.release(); if (!keep) { ifilter.del(); } else { filter.add_filter(ifilter.release()); } } if (use_filter && f->filter && (ifilter = f->filter())) { RET_ON_ERR_SET(ifilter->setup(config), bool, keep); ifilter->handle = filter_handle.release(); if (!keep) { ifilter.del(); } else { filter.add_filter(ifilter.release()); } }