diff options
Diffstat (limited to 'src/navigation/patches/search_list_get_unique.diff')
-rw-r--r-- | src/navigation/patches/search_list_get_unique.diff | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/src/navigation/patches/search_list_get_unique.diff b/src/navigation/patches/search_list_get_unique.diff new file mode 100644 index 0000000..650c481 --- /dev/null +++ b/src/navigation/patches/search_list_get_unique.diff @@ -0,0 +1,143 @@ +Index: navit/navit/search.c +=================================================================== +--- navit/navit/search.c (revision 5827) ++++ navit/navit/search.c (working copy) +@@ -1043,3 +1043,138 @@ + search_init(void) + { + } ++ ++// The following code has been removed into the release 5549 ++// It's used by the Spell function of location input ++// So a patch is necessary ++static char * ++search_list_get_unique_truncate(char *common, char *result) ++{ ++ dbg(1,"%s vs %s\n",common,result); ++ while (*common) { ++ if (g_utf8_get_char(common) != g_utf8_get_char(result)) { ++ dbg(1,"truncating at %s vs %s\n",common,result); ++ return common; ++ } ++ result=g_utf8_next_char(result); ++ common=g_utf8_next_char(common); ++ } ++ return common; ++} ++ ++static char * ++search_list_get_unique_append(char *list, char *append) ++{ ++ char *c=list; ++ int llen=list?strlen(list):0; ++ int len=g_utf8_next_char(append)-append; ++ gunichar a=g_utf8_get_char(append); ++ while(c && *c) { ++ if (g_utf8_get_char(c) == a) ++ return list; ++ c=g_utf8_next_char(c); ++ } ++ list=g_renew(char, list, llen+len+1); ++ strncpy(list+llen,append,len); ++ list[llen+len]='\0'; ++ return list; ++} ++ ++char * ++search_list_get_unique(struct search_list *this_, char *unique) ++{ ++ int level=this_->level; ++ struct search_list_level *le=&this_->levels[level]; ++ struct search_list_country *slc; ++ struct search_list_town *slt; ++ struct search_list_street *sls; ++ struct search_list_house_number *slh; ++ char *retf=NULL,*ret=NULL; ++ char *strings[4]={NULL,}; ++ char *search=g_utf8_casefold(unique?unique:le->attr->u.str,-1); ++ char *name,*max; ++ int search_len=strlen(search); ++ int i,count=sizeof(strings)/sizeof(char *); ++ GList *l; ++ ++ //dbg(0,"enter level=%d %s %s\n",level,search,unique); ++ l=le->list; ++ while (l) { ++ switch (level) { ++ case 0: ++ slc=l->data; ++ strings[0]=g_strdup(slc->name); ++ strings[1]=g_strdup(slc->car); ++ strings[2]=g_strdup(slc->iso2); ++ strings[3]=g_strdup(slc->iso3); ++ break; ++ case 1: ++ slt=l->data; ++ name=slt->common.town_name; ++ for (i = 0 ; i < 3 ; i++) ++ strings[i]=linguistics_expand_special(name, i); ++ break; ++ case 2: ++ sls=l->data; ++ name=sls->name; ++ for (i = 0 ; i < 3 ; i++) ++ strings[i]=linguistics_expand_special(name, i); ++ break; ++ case 3: ++ slh=l->data; ++ name=slh->house_number; ++ for (i = 0 ; i < 3 ; i++) ++ strings[i]=linguistics_expand_special(name, i); ++ break; ++ default: ++ dbg(0,"entry\n"); ++ } ++ dbg(1,"entry %s %s %s %s\n",strings[0],strings[1],strings[2],strings[3]); ++ max=NULL; ++ for (i = 0 ; i < count ; i++) { ++ char *str=strings[i]; ++ while (str) { ++ char *strf=g_utf8_casefold(str,-1); ++ dbg(1,"word %s\n",strf); ++ if (!strncmp(strf, search, search_len)) { ++ dbg(1,"match\n"); ++ if (unique) { ++ dbg(1,"possible next %s %s ret %s\n",strf+search_len,str+search_len,ret); ++ ret=search_list_get_unique_append(ret, strf+search_len); ++ ret=search_list_get_unique_append(ret, str+search_len); ++ dbg(1,"ret now %s\n",ret); ++ } else { ++ if (!ret) { ++ ret=g_strdup(str); ++ retf=g_utf8_casefold(ret,-1); ++ dbg(1,"ret now %s\n",ret); ++ } else { ++ char *end=search_list_get_unique_truncate(retf,strf); ++ dbg(1,"%d characters\n",end-retf); ++ if (!max || max < end) ++ max=end; ++ } ++ } ++ } ++ g_free(strf); ++ str=linguistics_next_word(str); ++ } ++ g_free(strings[i]); ++ } ++ if (!unique) { ++ if (max) { ++ dbg(1,"max %s (%d characters)\n",max,max-retf); ++ ret[max-retf]='\0'; ++ } else { ++ dbg(1,"new max\n"); ++ } ++ } ++ dbg(1,"common %s\n",ret); ++ l=g_list_next(l); ++ } ++ g_free(search); ++ g_free(retf); ++ //dbg(0,"return %s\n",ret); ++ return ret; ++} ++ |