Ticket #917: navit_4710_ticket_917.patch

File navit_4710_ticket_917.patch, 3.7 KB (added by mvglasow (2), 10 years ago)

binfile.c: Handle diacritics in town, district and all street name searches

  • binfile.c

     
    19921992                return g_ascii_strcasecmp(name, match);
    19931993}
    19941994
     1995static int
     1996fuzzy_cmp(char *name, char *match, int partial)
     1997{
     1998        int i=0;
     1999        int ret=-1;
     2000        char *str=g_strdup(name);
     2001        char *word=str;
     2002        do {
     2003                for (i = 0 ; i < 3 ; i++) {
     2004                        char *exp_name=linguistics_expand_special(word,i);
     2005                        if (exp_name && !ascii_cmp(exp_name, match, partial))
     2006                                ret=0;
     2007                        g_free(exp_name);
     2008                        if (!ret)
     2009                                break;
     2010                }
     2011                if (!ret)
     2012                        break;
     2013                word=linguistics_next_word(word);
     2014        } while (word);
     2015        g_free(str);
     2016        return ret;
     2017}
     2018
    19952019struct duplicate
    19962020{
    19972021        struct coord c;
     
    20572081                        case attr_town_or_district_name:
    20582082                                if (map_search->mr->tile_depth > 1 && item_is_town(*it) && !item_is_district(*it) && map_search->search->type != attr_district_name) {
    20592083                                        if (binfile_attr_get(it->priv_data, attr_town_name_match, &at) || binfile_attr_get(it->priv_data, attr_town_name, &at)) {
    2060                                                 if (!ascii_cmp(at.u.str, map_search->search->u.str, map_search->partial) && !duplicate(map_search, it, attr_town_name))
     2084                                                if (!fuzzy_cmp(at.u.str, map_search->search->u.str, map_search->partial) && !duplicate(map_search, it, attr_town_name))
    20612085                                                        return it;
    20622086                                        }
    20632087                                }
    20642088                                if (map_search->mr->tile_depth > 1 && item_is_district(*it) && map_search->search->type != attr_town_name) {
    20652089                                        if (binfile_attr_get(it->priv_data, attr_district_name_match, &at) || binfile_attr_get(it->priv_data, attr_district_name, &at)) {
    2066                                                 if (!ascii_cmp(at.u.str, map_search->search->u.str, map_search->partial) && !duplicate(map_search, it, attr_town_name))
     2090                                                if (!fuzzy_cmp(at.u.str, map_search->search->u.str, map_search->partial) && !duplicate(map_search, it, attr_town_name))
    20672091                                                        return it;
    20682092                                        }
    20692093                                }
     
    20712095                        case attr_street_name:
    20722096                                if (map_search->mode == 1) {
    20732097                                        if (binfile_attr_get(it->priv_data, attr_street_name_match, &at) || binfile_attr_get(it->priv_data, attr_street_name, &at)) {
    2074                                                 if (!ascii_cmp(at.u.str, map_search->search->u.str, map_search->partial) && !duplicate(map_search, it, attr_street_name)) {
     2098                                                if (!fuzzy_cmp(at.u.str, map_search->search->u.str, map_search->partial) && !duplicate(map_search, it, attr_street_name)) {
    20752099                                                        return it;
    20762100                                                }
    20772101                                        }
     
    20802104                                if (item_is_street(*it)) {
    20812105                                        struct attr at;
    20822106                                        if (map_selection_contains_item_rect(map_search->mr->sel, it) && binfile_attr_get(it->priv_data, attr_label, &at)) {
    2083                                                 int i,match=0;
    2084                                                 char *str=g_strdup(at.u.str);
    2085                                                 char *word=str;
    2086                                                 do {
    2087                                                         for (i = 0 ; i < 3 ; i++) {
    2088                                                                 char *name=linguistics_expand_special(word,i);
    2089                                                                 if (name && !ascii_cmp(name, map_search->search->u.str, map_search->partial))
    2090                                                                         match=1;
    2091                                                                 g_free(name);
    2092                                                                 if (match)
    2093                                                                         break;
    2094                                                         }
    2095                                                         if (match)
    2096                                                                 break;
    2097                                                         word=linguistics_next_word(word);
    2098                                                 } while (word);
    2099                                                 g_free(str);
    2100                                                 if (match && !duplicate(map_search, it, attr_label)) {
     2107                                                if (!fuzzy_cmp(at.u.str, map_search->search->u.str, map_search->partial) && !duplicate(map_search, it, attr_label)) {
    21012108                                                        item_coord_rewind(it);
    21022109                                                        return it;
    21032110                                                }
     
    21152122                                        if (binfile_attr_get(it->priv_data, attr_house_number, &at))
    21162123                                        {
    21172124                                                // match housenumber to our string
    2118                                                 if (!ascii_cmp(at.u.str, map_search->search->u.str, map_search->partial))
     2125                                                if (!fuzzy_cmp(at.u.str, map_search->search->u.str, map_search->partial))
    21192126                                                {
    21202127                                                        //binfile_attr_get(it->priv_data, attr_street_name, &at);
    21212128                                                        //dbg(0,"hnnn B1 street_name=%s",at.u.str);