Fix:Core:More search fixes
authormartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Fri, 21 Mar 2008 20:23:48 +0000 (20:23 +0000)
committermartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Fri, 21 Mar 2008 20:23:48 +0000 (20:23 +0000)
git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@955 ffa7fe5e-494d-0410-b361-a75ebd5db220

navit/src/data/binfile/binfile.c
navit/src/osm2navit.c
navit/src/search.c

index 823aa94..a9911d6 100644 (file)
@@ -53,8 +53,7 @@ struct map_rect_priv {
        int *end;
        enum attr_type attr_last;
        int label;
-       unsigned int *street_name_attr;
-       unsigned int *street_name_systematic_attr;
+       unsigned int *label_attr[2];
         struct map_selection *sel;
         struct map_priv *m;
         struct item item;
@@ -167,7 +166,7 @@ binfile_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr)
        struct map_rect_priv *mr=priv_data;
        struct tile *t=mr->t;
        enum attr_type type;
-       int size;
+       int i,size;
 
        if (attr_type != mr->attr_last) {
                t->pos_attr=t->pos_attr_start;
@@ -178,10 +177,12 @@ binfile_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr)
                type=le32_to_cpu(t->pos_attr[0]);
                if (type == attr_label) 
                        mr->label=1;
+               if (type == attr_town_name)
+                       mr->label_attr[0]=t->pos_attr;
                if (type == attr_street_name)
-                       mr->street_name_attr=t->pos_attr;
+                       mr->label_attr[0]=t->pos_attr;
                if (type == attr_street_name_systematic)
-                       mr->street_name_systematic_attr=t->pos_attr;
+                       mr->label_attr[1]=t->pos_attr;
                if (type == attr_type || attr_type == attr_any) {
                        if (attr_type == attr_any) {
                                dbg(1,"pos %p attr %s size %d\n", t->pos_attr-1, attr_to_name(type), size);
@@ -194,11 +195,15 @@ binfile_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr)
                        t->pos_attr+=size;
                }
        }
-       if (!mr->label && (attr_type == attr_any || attr_type == attr_label) && (mr->street_name_attr || mr->street_name_systematic_attr)) {
-               mr->label=1;
-               attr->type=attr_label;
-               attr_data_set(attr, (mr->street_name_attr ? mr->street_name_attr : mr->street_name_systematic_attr) +1);
-               return 1;
+       if (!mr->label && (attr_type == attr_any || attr_type == attr_label)) {
+               for (i = 0 ; i < sizeof(mr->label_attr)/sizeof(int *) ; i++) {
+                       if (mr->label_attr[i]) {
+                               mr->label=1;
+                               attr->type=attr_label;
+                               attr_data_set(attr, mr->label_attr[i]+1);
+                               return 1;
+                       }
+               }
        }
        return 0;
 }
@@ -390,8 +395,7 @@ map_rect_get_item_binfile(struct map_rect_priv *mr)
                mr->item.id_hi=t->zipfile_num;
                mr->item.id_lo=t->pos-t->start;
                mr->label=0;
-               mr->street_name_attr=NULL;
-               mr->street_name_systematic_attr=NULL;
+               memset(mr->label_attr, 0, sizeof(mr->label_attr));
                setup_pos(mr);
                if ((mr->item.type == type_submap) && (!mr->country_id)) {
                        struct coord_rect r;
@@ -436,8 +440,7 @@ map_rect_get_item_byid_binfile(struct map_rect_priv *mr, int id_hi, int id_lo)
        mr->item.id_hi=id_hi;
        mr->item.id_lo=id_lo;
        mr->label=0;
-       mr->street_name_attr=NULL;
-       mr->street_name_systematic_attr=NULL;
+       memset(mr->label_attr, 0, sizeof(mr->label_attr));
        setup_pos(mr);
        return &mr->item;
 }
index 1384648..e235e14 100644 (file)
@@ -27,6 +27,8 @@
 #define debug_tile(x) (!strcmp(x,"bcdbd") || !strcmp(x,"bcdbd") || !strcmp(x,"bcdbda") || !strcmp(x,"bcdbdb") || !strcmp(x,"bcdbdba") || !strcmp(x,"bcdbdbb") || !strcmp(x,"bcdbdbba") || !strcmp(x,"bcdbdbaa") || !strcmp(x,"bcdbdbacaa") || !strcmp(x,"bcdbdbacab") || !strcmp(x,"bcdbdbacaba") || !strcmp(x,"bcdbdbacabaa") || !strcmp(x,"bcdbdbacabab") || !strcmp(x,"bcdbdbacababb") || !strcmp(x,"bcdbdbacababba") || !strcmp(x,"bcdbdbacababbb") || !strcmp(x,"bcdbdbacababbd") || !strcmp(x,"bcdbdbacababaa") || !strcmp(x,"bcdbdbacababab") || !strcmp(x,"bcdbdbacababac") || !strcmp(x,"bcdbdbacababad") || !strcmp(x,"bcdbdbacabaaa") || !strcmp(x,"bcdbdbacabaaba") || !strcmp(x,"bcdbdbacabaabb") || !strcmp(x,"bcdbdbacabaabc") || !strcmp(x,"bcdbdbacabaabd") || !strcmp(x,"bcdbdbacabaaaa") || !strcmp(x,"bcdbdbacabaaab") || !strcmp(x,"bcdbdbacabaaac") || !strcmp(x,"bcdbdbacabaaad") || 0)
 #endif
 
+#define IS_TOWN(item) ((item).type >= type_town_label && (item).type <= type_town_label_1e7)
+#define IS_STREET(item) ((item).type >= type_street_nopass && (item).type <= type_ferry)
 
 static GHashTable *dedupe_ways_hash;
 
@@ -337,10 +339,13 @@ struct attr_bin label_attr = {
 };
 char label_attr_buffer[BUFFER_SIZE];
 
+struct attr_bin town_name_attr = {
+       0, attr_town_name
+};
+
 struct attr_bin street_name_attr = {
        0, attr_street_name
 };
-char street_name_attr_buffer[BUFFER_SIZE];
 
 struct attr_bin street_name_systematic_attr = {
        0, attr_street_name_systematic
@@ -366,10 +371,13 @@ static void
 pad_text_attr(struct attr_bin *a, char *buffer)
 {
        int l;
-       l=strlen(buffer)+1;
-       while (l % 4)
-               buffer[l++]='\0';
-       a->len=l/4+1;
+       if (buffer && buffer[0]) {
+               l=strlen(buffer)+1;
+               while (l % 4)
+                       buffer[l++]='\0';
+               a->len=l/4+1;
+       } else
+               a->len=0;
 }
 
 static int
@@ -454,13 +462,8 @@ add_tag(char *k, char *v)
        if (! strcmp(k,"note"))
                level=5;
        if (! strcmp(k,"name")) {
-               if (in_way) {
-                       strcpy(street_name_attr_buffer, v);
-                       pad_text_attr(&street_name_attr, street_name_attr_buffer);
-               } else {
                strcpy(label_attr_buffer, v);
                pad_text_attr(&label_attr, label_attr_buffer);
-               }
                level=5;
        }
        if (! strcmp(k,"ref")) {
@@ -510,10 +513,9 @@ add_tag(char *k, char *v)
        }
        if ( (type != type_street_unkn ) && ( type != type_point_unkn )  )
        {
-               if (coverage && type >= type_street_nopass && type <= type_ramp)
+               item.type=type;
+               if (coverage && IS_STREET(item))
                        item.type=type_coverage;
-               else
-                       item.type=type;
        }
        else
        {
@@ -616,6 +618,7 @@ add_node(int id, double lat, double lon)
        nodeid=id;
        item.type=type_point_unkn;
        label_attr.len=0;
+       town_name_attr.len=0;
        debug_attr.len=0;
        is_in_buffer[0]='\0';
        sprintf(debug_attr_buffer,"nodeid=%d", nodeid);
@@ -727,6 +730,7 @@ add_way(int id)
        wayid=id;
        coord_count=0;
        item.type=type_street_unkn;
+       label_attr.len=0;
        street_name_attr.len=0;
        street_name_systematic_attr.len=0;
        debug_attr.len=0;
@@ -773,8 +777,8 @@ end_way(FILE *out)
                g_hash_table_insert(dedupe_ways_hash, (gpointer)wayid, (gpointer)1);
        }
        pad_text_attr(&debug_attr, debug_attr_buffer);
-       if (street_name_attr.len)
-               alen+=street_name_attr.len+1;
+       if (label_attr.len)
+               alen+=label_attr.len+1;
        if (street_name_systematic_attr.len)
                alen+=street_name_systematic_attr.len+1;
        if (debug_attr.len)
@@ -785,7 +789,11 @@ end_way(FILE *out)
        item.len=item.clen+2+alen;
        fwrite(&item, sizeof(item), 1, out);
        fwrite(coord_buffer, coord_count*sizeof(struct coord), 1, out);
-       write_attr(out, &street_name_attr, street_name_attr_buffer);
+       if (IS_STREET(item)) {
+               street_name_attr.len=label_attr.len;
+               write_attr(out, &street_name_attr, label_attr_buffer);
+       } else
+               write_attr(out, &label_attr, label_attr_buffer);
        write_attr(out, &street_name_systematic_attr, street_name_systematic_attr_buffer);
        write_attr(out, &debug_attr, debug_attr_buffer);
        write_attr(out, &flags_attr, &flags_attr_value);
@@ -808,10 +816,14 @@ end_node(FILE *out)
        item.len=item.clen+2+alen;
        fwrite(&item, sizeof(item), 1, out);
        fwrite(&ni->c, 1*sizeof(struct coord), 1, out);
-       write_attr(out, &label_attr, label_attr_buffer);
+       if (IS_TOWN(item)) {
+               town_name_attr.len=label_attr.len;
+               write_attr(out, &town_name_attr, label_attr_buffer);
+       } else
+               write_attr(out, &label_attr, label_attr_buffer);
        write_attr(out, &debug_attr, debug_attr_buffer);
 #ifdef GENERATE_INDEX
-       if (item.type >= type_town_label && item.type <= type_town_label_1e7 && label_attr.len) {
+       if (IS_TOWN(item) && town_name_attr.len) {
                char *tok,*buf=is_in_buffer;
                while ((tok=strtok(buf, ","))) {
                        while (*tok==' ')
@@ -837,7 +849,7 @@ end_node(FILE *out)
                                item.len=item.clen+2+label_attr.len+1;
                                fwrite(&item, sizeof(item), 1, result->file);
                                fwrite(&ni->c, 1*sizeof(struct coord), 1, result->file);
-                               write_attr(result->file, &label_attr, label_attr_buffer);
+                               write_attr(result->file, &town_name_attr, label_attr_buffer);
                                result->count++;
                                result->size+=(item.clen+3+label_attr.len+1)*4;
                        }
@@ -858,8 +870,8 @@ sort_countries_compare(const void *p1, const void *p2)
        assert(ib2->clen==2);
        attr1=(struct attr_bin *)((int *)(ib1+1)+ib1->clen);
        attr2=(struct attr_bin *)((int *)(ib2+1)+ib1->clen);
-       assert(attr1->type == attr_label);
-       assert(attr2->type == attr_label);
+       assert(attr1->type == attr_town_name);
+       assert(attr2->type == attr_town_name);
        s1=(char *)(attr1+1);
        s2=(char *)(attr2+1);
        return strcmp(s1, s2);
@@ -1371,7 +1383,7 @@ phase2(FILE *in, FILE *out)
                                fprintf(stderr,"ni=%p\n", ni);
 #endif
                                c[i]=ni->c;
-                               if (ni->ref_way > 1 && i != 0 && i != ccount-1 && ib->type >= type_street_nopass && ib->type <= type_ferry) {
+                               if (ni->ref_way > 1 && i != 0 && i != ccount-1 && IS_STREET(*ib)) {
                                        write_item_part(out, ib, last, i);
                                        last=i;
                                }
index d088c5f..f4db773 100644 (file)
@@ -241,16 +241,12 @@ search_list_search_free(struct search_list *sl, int level)
 static int
 search_add_result(struct search_list_level *le, void *p)
 {
-#if 0
        if (! g_hash_table_lookup(le->hash, p)) {
-#endif
                g_hash_table_insert(le->hash, p, (void *)1);    
                le->list=g_list_append(le->list, p);
                return 1;
-#if 0
        }
        return 0;
-#endif
 }
 
 struct search_list_result *