Example #1
0
 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;
 }
Example #2
0
 void BetterList::init() {
   StringListEnumeration es = list.elements_obj();
   worst_rank = 0;
   while ( (es.next()) != 0)
     ++worst_rank;
   best_rank = worst_rank;
 }
Example #3
0
 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());
        }
      }