diff options
Diffstat (limited to 'navit/maptool/osm_relations.c')
-rw-r--r-- | navit/maptool/osm_relations.c | 211 |
1 files changed, 101 insertions, 110 deletions
diff --git a/navit/maptool/osm_relations.c b/navit/maptool/osm_relations.c index 591ca7d9d..fdacd3069 100644 --- a/navit/maptool/osm_relations.c +++ b/navit/maptool/osm_relations.c @@ -23,67 +23,63 @@ /** Information about all members of a relation type and how to process them. */ struct relations { - /** Hashes for nodes, ways and relations which are members. */ - GHashTable *member_hash[3]; - /** Default entries for processing items which are not a member of any relation. */ - GList *default_members; + /** Hashes for nodes, ways and relations which are members. */ + GHashTable *member_hash[3]; + /** Default entries for processing items which are not a member of any relation. */ + GList *default_members; }; struct relations_func { - void (*func)(void *func_priv, void *relation_priv, struct item_bin *member, void *member_priv); - void *func_priv; + void (*func)(void *func_priv, void *relation_priv, struct item_bin *member, void *member_priv); + void *func_priv; }; struct relations_member { - osmid memberid; - void *relation_priv,*member_priv; - struct relations_func *func; + osmid memberid; + void *relation_priv,*member_priv; + struct relations_func *func; }; static guint -relations_member_hash(gconstpointer key) -{ - const struct relations_member *memb=key; - return (memb->memberid >> 32)^(memb->memberid & 0xffffffff); +relations_member_hash(gconstpointer key) { + const struct relations_member *memb=key; + return (memb->memberid >> 32)^(memb->memberid & 0xffffffff); } static gboolean -relations_member_equal(gconstpointer a, gconstpointer b) -{ - const struct relations_member *memba=a; - const struct relations_member *membb=b; - return (memba->memberid == membb->memberid); +relations_member_equal(gconstpointer a, gconstpointer b) { + const struct relations_member *memba=a; + const struct relations_member *membb=b; + return (memba->memberid == membb->memberid); } struct relations * -relations_new(void) -{ - struct relations *ret=g_new0(struct relations, 1); - int i; - - for (i = 0 ; i < 3 ; i++) - ret->member_hash[i]=g_hash_table_new(relations_member_hash, relations_member_equal); - return ret; +relations_new(void) { + struct relations *ret=g_new0(struct relations, 1); + int i; + + for (i = 0 ; i < 3 ; i++) + ret->member_hash[i]=g_hash_table_new(relations_member_hash, relations_member_equal); + return ret; } struct relations_func * -relations_func_new(void (*func)(void *func_priv, void *relation_priv, struct item_bin *member, void *member_priv), void *func_priv) -{ - struct relations_func *relations_func=g_new(struct relations_func, 1); - relations_func->func=func; - relations_func->func_priv=func_priv; - return relations_func; +relations_func_new(void (*func)(void *func_priv, void *relation_priv, struct item_bin *member, void *member_priv), + void *func_priv) { + struct relations_func *relations_func=g_new(struct relations_func, 1); + relations_func->func=func; + relations_func->func_priv=func_priv; + return relations_func; } static struct relations_member * -relations_member_new(struct relations_func *func, void *relation_priv, void *member_priv, osmid id) -{ - struct relations_member *memb=g_new(struct relations_member, 1); - memb->memberid=id; - memb->relation_priv=relation_priv; - memb->member_priv=member_priv; - memb->func=func; - return memb; +relations_member_new(struct relations_func *func, void *relation_priv, void *member_priv, osmid id) { + struct relations_member *memb=g_new(struct relations_member, 1); + memb->memberid=id; + memb->relation_priv=relation_priv; + memb->member_priv=member_priv; + memb->func=func; + return memb; } /* * @brief Add an entry for a relation member to the relations collection. @@ -98,12 +94,11 @@ relations_member_new(struct relations_func *func, void *relation_priv, void *mem */ void relations_add_relation_member_entry(struct relations *rel, struct relations_func *func, void - *relation_priv, void *member_priv, enum relation_member_type type, osmid id) -{ - struct relations_member *memb=relations_member_new(func, relation_priv, member_priv, id); - GHashTable *member_hash=rel->member_hash[type-1]; - // The real key is the OSM ID, but we recycle "memb" as key to avoid a second allocating for the key. - g_hash_table_insert(member_hash, memb, g_list_append(g_hash_table_lookup(member_hash, memb), memb)); + *relation_priv, void *member_priv, enum relation_member_type type, osmid id) { + struct relations_member *memb=relations_member_new(func, relation_priv, member_priv, id); + GHashTable *member_hash=rel->member_hash[type-1]; + // The real key is the OSM ID, but we recycle "memb" as key to avoid a second allocating for the key. + g_hash_table_insert(member_hash, memb, g_list_append(g_hash_table_lookup(member_hash, memb), memb)); } /* @@ -115,10 +110,9 @@ relations_add_relation_member_entry(struct relations *rel, struct relations_func * @param in func structure defining function to call when this member is read */ void -relations_add_relation_default_entry(struct relations *rel, struct relations_func *func) -{ - struct relations_member *memb=relations_member_new(func, NULL, NULL, 0); - rel->default_members=g_list_append(rel->default_members, memb); +relations_add_relation_default_entry(struct relations *rel, struct relations_func *func) { + struct relations_member *memb=relations_member_new(func, NULL, NULL, 0); + rel->default_members=g_list_append(rel->default_members, memb); } @@ -131,70 +125,67 @@ relations_add_relation_default_entry(struct relations *rel, struct relations_fun * @param in ways file containing items in item_bin format. This file may contain both nodes, ways, and relations in that format. */ void -relations_process(struct relations *rel, FILE *nodes, FILE *ways) -{ - char buffer[128]; - struct item_bin *ib=(struct item_bin *)buffer; - osmid *id; - struct coord *c=(struct coord *)(ib+1),cn={0,0}; - struct node_item *ni; - GList *l; - - if (nodes) { - item_bin_init(ib, type_point_unkn); - item_bin_add_coord(ib, &cn, 1); - item_bin_add_attr_longlong(ib, attr_osm_nodeid, 0); - id=item_bin_get_attr(ib, attr_osm_nodeid, NULL); - while ((ni=read_node_item(nodes))) { - *id=ni->nd_id; - *c=ni->c; - l=g_hash_table_lookup(rel->member_hash[0], id); - while (l) { - struct relations_member *memb=l->data; - memb->func->func(memb->func->func_priv, memb->relation_priv, ib, memb->member_priv); - l=g_list_next(l); - } - } - } - if (ways) { - while ((ib=read_item(ways))) { - l=NULL; - if(NULL!=(id=item_bin_get_attr(ib, attr_osm_nodeid, NULL))) - l=g_hash_table_lookup(rel->member_hash[0], id); - else if(NULL!=(id=item_bin_get_attr(ib, attr_osm_wayid, NULL))) - l=g_hash_table_lookup(rel->member_hash[1], id); - else if(NULL!=(id=item_bin_get_attr(ib, attr_osm_relationid, NULL))) - l=g_hash_table_lookup(rel->member_hash[2], id); - if(!l) - l=rel->default_members; - while (l) { - struct relations_member *memb=l->data; - memb->func->func(memb->func->func_priv, memb->relation_priv, ib, memb->member_priv); - l=g_list_next(l); - } - } - } +relations_process(struct relations *rel, FILE *nodes, FILE *ways) { + char buffer[128]; + struct item_bin *ib=(struct item_bin *)buffer; + osmid *id; + struct coord *c=(struct coord *)(ib+1),cn= {0,0}; + struct node_item *ni; + GList *l; + + if (nodes) { + item_bin_init(ib, type_point_unkn); + item_bin_add_coord(ib, &cn, 1); + item_bin_add_attr_longlong(ib, attr_osm_nodeid, 0); + id=item_bin_get_attr(ib, attr_osm_nodeid, NULL); + while ((ni=read_node_item(nodes))) { + *id=ni->nd_id; + *c=ni->c; + l=g_hash_table_lookup(rel->member_hash[0], id); + while (l) { + struct relations_member *memb=l->data; + memb->func->func(memb->func->func_priv, memb->relation_priv, ib, memb->member_priv); + l=g_list_next(l); + } + } + } + if (ways) { + while ((ib=read_item(ways))) { + l=NULL; + if(NULL!=(id=item_bin_get_attr(ib, attr_osm_nodeid, NULL))) + l=g_hash_table_lookup(rel->member_hash[0], id); + else if(NULL!=(id=item_bin_get_attr(ib, attr_osm_wayid, NULL))) + l=g_hash_table_lookup(rel->member_hash[1], id); + else if(NULL!=(id=item_bin_get_attr(ib, attr_osm_relationid, NULL))) + l=g_hash_table_lookup(rel->member_hash[2], id); + if(!l) + l=rel->default_members; + while (l) { + struct relations_member *memb=l->data; + memb->func->func(memb->func->func_priv, memb->relation_priv, ib, memb->member_priv); + l=g_list_next(l); + } + } + } } static void -relations_destroy_func(void *key, GList *l, void *data) -{ - GList *ll=l; - while (ll) { - g_free(ll->data); - ll=g_list_next(ll); - } - g_list_free(l); +relations_destroy_func(void *key, GList *l, void *data) { + GList *ll=l; + while (ll) { + g_free(ll->data); + ll=g_list_next(ll); + } + g_list_free(l); } void -relations_destroy(struct relations *relations) -{ - int i; - - for (i = 0 ; i < 3 ; i++) { - g_hash_table_foreach(relations->member_hash[i], (GHFunc)relations_destroy_func, NULL); - g_hash_table_destroy(relations->member_hash[i]); - } - g_free(relations); +relations_destroy(struct relations *relations) { + int i; + + for (i = 0 ; i < 3 ; i++) { + g_hash_table_foreach(relations->member_hash[i], (GHFunc)relations_destroy_func, NULL); + g_hash_table_destroy(relations->member_hash[i]); + } + g_free(relations); } |