From dad3b9c52c4f791680b4829b6ae1338efd593e1a Mon Sep 17 00:00:00 2001 From: martin-s Date: Fri, 21 Mar 2008 20:23:48 +0000 Subject: [PATCH] Fix:Core:More search fixes git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@955 ffa7fe5e-494d-0410-b361-a75ebd5db220 --- navit/src/data/binfile/binfile.c | 31 ++++++++++++---------- navit/src/osm2navit.c | 56 ++++++++++++++++++++++++---------------- navit/src/search.c | 4 --- 3 files changed, 51 insertions(+), 40 deletions(-) diff --git a/navit/src/data/binfile/binfile.c b/navit/src/data/binfile/binfile.c index 823aa94..a9911d6 100644 --- a/navit/src/data/binfile/binfile.c +++ b/navit/src/data/binfile/binfile.c @@ -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; } diff --git a/navit/src/osm2navit.c b/navit/src/osm2navit.c index 1384648..e235e14 100644 --- a/navit/src/osm2navit.c +++ b/navit/src/osm2navit.c @@ -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; } diff --git a/navit/src/search.c b/navit/src/search.c index d088c5f..f4db773 100644 --- a/navit/src/search.c +++ b/navit/src/search.c @@ -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 * -- 2.7.4