summaryrefslogtreecommitdiff
path: root/src/navigation/patches/search_list_get_unique.diff
diff options
context:
space:
mode:
Diffstat (limited to 'src/navigation/patches/search_list_get_unique.diff')
-rw-r--r--src/navigation/patches/search_list_get_unique.diff143
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;
++}
++