summaryrefslogtreecommitdiff
path: root/navit/map/mg/map.c
diff options
context:
space:
mode:
Diffstat (limited to 'navit/map/mg/map.c')
-rw-r--r--navit/map/mg/map.c1011
1 files changed, 494 insertions, 517 deletions
diff --git a/navit/map/mg/map.c b/navit/map/mg/map.c
index 13561e154..50860e193 100644
--- a/navit/map/mg/map.c
+++ b/navit/map/mg/map.c
@@ -29,585 +29,562 @@
GList *maps;
static struct country_isonum {
- int country;
- int isonum;
- int postal_len;
- char *postal_prefix;
-} country_isonums[]={
- { 1,203},
- { 2,703},
- { 7,674},
- { 11,233},
- { 12,268},
- { 13,428},
- { 14,440},
- { 15,498},
- { 16,643},
- { 17,804},
- { 18,112},
- { 20,818},
- { 30,300},
- { 31,528},
- { 32, 56},
- { 33,250},
- { 34,724},
- { 36,348},
- { 39,380},
- { 40,642},
- { 41,756},
- { 43, 40},
- { 44,826},
- { 45,208},
- { 46,752},
- { 47,578},
- { 48,616},
- { 49,276,5,"D@@"},
- { 50,292},
- { 51,620},
- { 52,442},
- { 53,372},
- { 54,352},
- { 55, 8},
- { 56,470},
- { 57,196},
- { 58,246},
- { 59,100},
- { 61,422},
- { 62, 20},
- { 63,760},
- { 66,682},
- { 71,434},
- { 72,376},
- { 73,275},
- { 75,438},
- { 76,504},
- { 77, 12},
- { 78,788},
- { 81,688},
- { 83,400},
- { 85,191},
- { 86,705},
- { 87, 70},
- { 89,807},
- { 90,792},
- { 93,492},
- { 94, 31},
- { 95, 51},
- { 98,234},
- { 99,732},
- {336,774},
+ int country;
+ int isonum;
+ int postal_len;
+ char *postal_prefix;
+} country_isonums[]= {
+ { 1,203},
+ { 2,703},
+ { 7,674},
+ { 11,233},
+ { 12,268},
+ { 13,428},
+ { 14,440},
+ { 15,498},
+ { 16,643},
+ { 17,804},
+ { 18,112},
+ { 20,818},
+ { 30,300},
+ { 31,528},
+ { 32, 56},
+ { 33,250},
+ { 34,724},
+ { 36,348},
+ { 39,380},
+ { 40,642},
+ { 41,756},
+ { 43, 40},
+ { 44,826},
+ { 45,208},
+ { 46,752},
+ { 47,578},
+ { 48,616},
+ { 49,276,5,"D@@"},
+ { 50,292},
+ { 51,620},
+ { 52,442},
+ { 53,372},
+ { 54,352},
+ { 55, 8},
+ { 56,470},
+ { 57,196},
+ { 58,246},
+ { 59,100},
+ { 61,422},
+ { 62, 20},
+ { 63,760},
+ { 66,682},
+ { 71,434},
+ { 72,376},
+ { 73,275},
+ { 75,438},
+ { 76,504},
+ { 77, 12},
+ { 78,788},
+ { 81,688},
+ { 83,400},
+ { 85,191},
+ { 86,705},
+ { 87, 70},
+ { 89,807},
+ { 90,792},
+ { 93,492},
+ { 94, 31},
+ { 95, 51},
+ { 98,234},
+ { 99,732},
+ {336,774},
};
struct map_priv * map_new_mg(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl);
static int map_id;
-static char *file[]={
- [file_border_ply]="border.ply",
- [file_bridge_ply]="bridge.ply",
- [file_build_ply]="build.ply",
- [file_golf_ply]="golf.ply",
- [file_height_ply]="height.ply",
- [file_natpark_ply]="natpark.ply",
- [file_nature_ply]="nature.ply",
- [file_other_ply]="other.ply",
- [file_rail_ply]="rail.ply",
- [file_sea_ply]="sea.ply",
- [file_street_bti]="street.bti",
- [file_street_str]="street.str",
- [file_strname_stn]="strname.stn",
- [file_town_twn]="town.twn",
- [file_tunnel_ply]="tunnel.ply",
- [file_water_ply]="water.ply",
- [file_woodland_ply]="woodland.ply",
+static char *file[]= {
+ [file_border_ply]="border.ply",
+ [file_bridge_ply]="bridge.ply",
+ [file_build_ply]="build.ply",
+ [file_golf_ply]="golf.ply",
+ [file_height_ply]="height.ply",
+ [file_natpark_ply]="natpark.ply",
+ [file_nature_ply]="nature.ply",
+ [file_other_ply]="other.ply",
+ [file_rail_ply]="rail.ply",
+ [file_sea_ply]="sea.ply",
+ [file_street_bti]="street.bti",
+ [file_street_str]="street.str",
+ [file_strname_stn]="strname.stn",
+ [file_town_twn]="town.twn",
+ [file_tunnel_ply]="tunnel.ply",
+ [file_water_ply]="water.ply",
+ [file_woodland_ply]="woodland.ply",
};
-int mg_country_from_isonum(int isonum)
-{
- int i;
- for (i = 0 ; i < sizeof(country_isonums)/sizeof(struct country_isonum) ; i++)
- if (country_isonums[i].isonum == isonum)
- return country_isonums[i].country;
- return 0;
+int mg_country_from_isonum(int isonum) {
+ int i;
+ for (i = 0 ; i < sizeof(country_isonums)/sizeof(struct country_isonum) ; i++)
+ if (country_isonums[i].isonum == isonum)
+ return country_isonums[i].country;
+ return 0;
}
-int mg_country_to_isonum(int country)
-{
- int i;
- for (i = 0 ; i < sizeof(country_isonums)/sizeof(struct country_isonum) ; i++)
- if (country_isonums[i].country == country)
- return country_isonums[i].isonum;
- return 0;
+int mg_country_to_isonum(int country) {
+ int i;
+ for (i = 0 ; i < sizeof(country_isonums)/sizeof(struct country_isonum) ; i++)
+ if (country_isonums[i].country == country)
+ return country_isonums[i].isonum;
+ return 0;
}
-int mg_country_postal_len(int country)
-{
- int i;
- for (i = 0 ; i < sizeof(country_isonums)/sizeof(struct country_isonum) ; i++)
- if (country_isonums[i].country == country)
- return country_isonums[i].postal_len;
- return 0;
+int mg_country_postal_len(int country) {
+ int i;
+ for (i = 0 ; i < sizeof(country_isonums)/sizeof(struct country_isonum) ; i++)
+ if (country_isonums[i].country == country)
+ return country_isonums[i].postal_len;
+ return 0;
}
-static char *mg_country_postal_prefix(int isonum)
-{
- int i;
- for (i = 0 ; i < sizeof(country_isonums)/sizeof(struct country_isonum) ; i++)
- if (country_isonums[i].isonum == isonum)
- return country_isonums[i].postal_prefix;
- return NULL;
+static char *mg_country_postal_prefix(int isonum) {
+ int i;
+ for (i = 0 ; i < sizeof(country_isonums)/sizeof(struct country_isonum) ; i++)
+ if (country_isonums[i].isonum == isonum)
+ return country_isonums[i].postal_prefix;
+ return NULL;
}
-struct item_range town_ranges[]={
- {type_town_label,type_port_label},
+struct item_range town_ranges[]= {
+ {type_town_label,type_port_label},
};
-struct item_range street_ranges[]={
- {type_street_nopass,type_street_unkn},
+struct item_range street_ranges[]= {
+ {type_street_nopass,type_street_unkn},
};
-struct item_range poly_ranges[]={
- {type_border_country,type_water_line},
- {type_street_unkn,type_street_unkn},
- {type_area,type_last},
+struct item_range poly_ranges[]= {
+ {type_border_country,type_water_line},
+ {type_street_unkn,type_street_unkn},
+ {type_area,type_last},
};
-static int
-file_next(struct map_rect_priv *mr)
-{
- int debug=0;
-
- for (;;) {
- mr->current_file++;
- if (mr->current_file >= file_end)
- return 0;
- mr->file=mr->m->file[mr->current_file];
- if (! mr->file)
- continue;
- switch (mr->current_file) {
- case file_strname_stn:
- continue;
- case file_town_twn:
- if (mr->cur_sel && !map_selection_contains_item_range(mr->cur_sel, 0, town_ranges, sizeof(town_ranges)/sizeof(struct item_range)))
- continue;
- break;
- case file_street_str:
- if (mr->cur_sel && !map_selection_contains_item_range(mr->cur_sel, 0, street_ranges, sizeof(street_ranges)/sizeof(struct item_range)))
- continue;
- break;
- default:
- if (mr->cur_sel && !map_selection_contains_item_range(mr->cur_sel, 0, poly_ranges, sizeof(poly_ranges)/sizeof(struct item_range)))
- continue;
- break;
- }
- if (debug)
- printf("current file: '%s'\n", file[mr->current_file]);
- mr->cur_sel=mr->xsel;
- if (block_init(mr))
- return 1;
- }
+static int file_next(struct map_rect_priv *mr) {
+ int debug=0;
+
+ for (;;) {
+ mr->current_file++;
+ if (mr->current_file >= file_end)
+ return 0;
+ mr->file=mr->m->file[mr->current_file];
+ if (! mr->file)
+ continue;
+ switch (mr->current_file) {
+ case file_strname_stn:
+ continue;
+ case file_town_twn:
+ if (mr->cur_sel
+ && !map_selection_contains_item_range(mr->cur_sel, 0, town_ranges, sizeof(town_ranges)/sizeof(struct item_range)))
+ continue;
+ break;
+ case file_street_str:
+ if (mr->cur_sel
+ && !map_selection_contains_item_range(mr->cur_sel, 0, street_ranges, sizeof(street_ranges)/sizeof(struct item_range)))
+ continue;
+ break;
+ default:
+ if (mr->cur_sel
+ && !map_selection_contains_item_range(mr->cur_sel, 0, poly_ranges, sizeof(poly_ranges)/sizeof(struct item_range)))
+ continue;
+ break;
+ }
+ if (debug)
+ printf("current file: '%s'\n", file[mr->current_file]);
+ mr->cur_sel=mr->xsel;
+ if (block_init(mr))
+ return 1;
+ }
}
-static void
-map_destroy_mg(struct map_priv *m)
-{
- int i;
+static void map_destroy_mg(struct map_priv *m) {
+ int i;
- printf("mg_map_destroy\n");
- for (i = 0 ; i < file_end ; i++) {
- if (m->file[i])
- file_destroy(m->file[i]);
- }
+ printf("mg_map_destroy\n");
+ for (i = 0 ; i < file_end ; i++) {
+ if (m->file[i])
+ file_destroy(m->file[i]);
+ }
}
extern int block_lin_count,block_idx_count,block_active_count,block_mem,block_active_mem;
struct map_rect_priv *
-map_rect_new_mg(struct map_priv *map, struct map_selection *sel)
-{
- struct map_rect_priv *mr;
- int i;
-
- block_lin_count=0;
- block_idx_count=0;
- block_active_count=0;
- block_mem=0;
- block_active_mem=0;
- mr=g_new0(struct map_rect_priv, 1);
- mr->m=map;
- mr->xsel=sel;
- mr->current_file=-1;
- if (sel && sel->next)
- for (i=0 ; i < file_end ; i++)
- mr->block_hash[i]=g_hash_table_new(g_int_hash,g_int_equal);
- file_next(mr);
- return mr;
+map_rect_new_mg(struct map_priv *map, struct map_selection *sel) {
+ struct map_rect_priv *mr;
+ int i;
+
+ block_lin_count=0;
+ block_idx_count=0;
+ block_active_count=0;
+ block_mem=0;
+ block_active_mem=0;
+ mr=g_new0(struct map_rect_priv, 1);
+ mr->m=map;
+ mr->xsel=sel;
+ mr->current_file=-1;
+ if (sel && sel->next)
+ for (i=0 ; i < file_end ; i++)
+ mr->block_hash[i]=g_hash_table_new(g_int_hash,g_int_equal);
+ file_next(mr);
+ return mr;
}
-static struct item *
-map_rect_get_item_mg(struct map_rect_priv *mr)
-{
- for (;;) {
- switch (mr->current_file) {
- case file_town_twn:
- if (town_get(mr, &mr->town, &mr->item))
- return &mr->item;
- break;
- case file_border_ply:
- case file_bridge_ply:
- case file_build_ply:
- case file_golf_ply:
- /* case file_height_ply: */
- case file_natpark_ply:
- case file_nature_ply:
- case file_other_ply:
- case file_rail_ply:
- case file_sea_ply:
- /* case file_tunnel_ply: */
- case file_water_ply:
- case file_woodland_ply:
- if (poly_get(mr, &mr->poly, &mr->item))
- return &mr->item;
- break;
- case file_street_str:
- if (street_get(mr, &mr->street, &mr->item))
- return &mr->item;
- break;
- case file_end:
- return NULL;
- default:
- break;
- }
- if (block_next(mr))
- continue;
- if (mr->cur_sel->next) {
- mr->cur_sel=mr->cur_sel->next;
- if (block_init(mr))
- continue;
- }
- if (file_next(mr))
- continue;
- dbg(lvl_debug,"lin_count %d idx_count %d active_count %d %d kB (%d kB)\n", block_lin_count, block_idx_count, block_active_count, (block_mem+block_active_mem)/1024, block_active_mem/1024);
- return NULL;
- }
+static struct item *map_rect_get_item_mg(struct map_rect_priv *mr) {
+ for (;;) {
+ switch (mr->current_file) {
+ case file_town_twn:
+ if (town_get(mr, &mr->town, &mr->item))
+ return &mr->item;
+ break;
+ case file_border_ply:
+ case file_bridge_ply:
+ case file_build_ply:
+ case file_golf_ply:
+ /* case file_height_ply: */
+ case file_natpark_ply:
+ case file_nature_ply:
+ case file_other_ply:
+ case file_rail_ply:
+ case file_sea_ply:
+ /* case file_tunnel_ply: */
+ case file_water_ply:
+ case file_woodland_ply:
+ if (poly_get(mr, &mr->poly, &mr->item))
+ return &mr->item;
+ break;
+ case file_street_str:
+ if (street_get(mr, &mr->street, &mr->item))
+ return &mr->item;
+ break;
+ case file_end:
+ return NULL;
+ default:
+ break;
+ }
+ if (block_next(mr))
+ continue;
+ if (mr->cur_sel->next) {
+ mr->cur_sel=mr->cur_sel->next;
+ if (block_init(mr))
+ continue;
+ }
+ if (file_next(mr))
+ continue;
+ dbg(lvl_debug,"lin_count %d idx_count %d active_count %d %d kB (%d kB)", block_lin_count, block_idx_count,
+ block_active_count, (block_mem+block_active_mem)/1024, block_active_mem/1024);
+ return NULL;
+ }
}
struct item *
-map_rect_get_item_byid_mg(struct map_rect_priv *mr, int id_hi, int id_lo)
-{
- mr->current_file = (id_hi >> 16) & 0xff;
- switch (mr->current_file) {
- case file_town_twn:
- if (town_get_byid(mr, &mr->town, id_hi, id_lo, &mr->item))
- return &mr->item;
- break;
- case file_street_str:
- if (street_get_byid(mr, &mr->street, id_hi, id_lo, &mr->item))
- return &mr->item;
- break;
- case file_strname_stn:
- if (street_name_get_byid(mr, &mr->street, id_hi, id_lo, &mr->item))
- return &mr->item;
- break;
- default:
- if (poly_get_byid(mr, &mr->poly, id_hi, id_lo, &mr->item))
- return &mr->item;
- break;
- }
- return NULL;
+map_rect_get_item_byid_mg(struct map_rect_priv *mr, int id_hi, int id_lo) {
+ mr->current_file = (id_hi >> 16) & 0xff;
+ switch (mr->current_file) {
+ case file_town_twn:
+ if (town_get_byid(mr, &mr->town, id_hi, id_lo, &mr->item))
+ return &mr->item;
+ break;
+ case file_street_str:
+ if (street_get_byid(mr, &mr->street, id_hi, id_lo, &mr->item))
+ return &mr->item;
+ break;
+ case file_strname_stn:
+ if (street_name_get_byid(mr, &mr->street, id_hi, id_lo, &mr->item))
+ return &mr->item;
+ break;
+ default:
+ if (poly_get_byid(mr, &mr->poly, id_hi, id_lo, &mr->item))
+ return &mr->item;
+ break;
+ }
+ return NULL;
}
-void
-map_rect_destroy_mg(struct map_rect_priv *mr)
-{
- int i;
- for (i=0 ; i < file_end ; i++)
- if (mr->block_hash[i])
- g_hash_table_destroy(mr->block_hash[i]);
- g_free(mr);
+void map_rect_destroy_mg(struct map_rect_priv *mr) {
+ int i;
+ for (i=0 ; i < file_end ; i++)
+ if (mr->block_hash[i])
+ g_hash_table_destroy(mr->block_hash[i]);
+ g_free(mr);
}
-static char *
-map_search_mg_convert_special(char *str)
-{
- char *ret,*c=g_malloc(strlen(str)*2+1);
-
- ret=c;
- for (;;) {
- switch ((unsigned char)(*str)) {
- case 0xc4:
- *c++='A';
- break;
- case 0xd6:
- *c++='O';
- break;
- case 0xdc:
- *c++='U';
- break;
- case 0xdf:
- *c++='s';
- *c++='s';
- break;
- case 0xe4:
- *c++='a';
- break;
- case 0xf6:
- *c++='o';
- break;
- case 0xfc:
- *c++='u';
- break;
- default:
- dbg(lvl_debug,"0x%x\n", *str);
- *c++=*str;
- break;
- }
- if (! *str)
- return ret;
- str++;
- }
+static char *map_search_mg_convert_special(char *str) {
+ char *ret,*c=g_malloc(strlen(str)*2+1);
+
+ ret=c;
+ for (;;) {
+ switch ((unsigned char)(*str)) {
+ case 0xc4:
+ *c++='A';
+ break;
+ case 0xd6:
+ *c++='O';
+ break;
+ case 0xdc:
+ *c++='U';
+ break;
+ case 0xdf:
+ *c++='s';
+ *c++='s';
+ break;
+ case 0xe4:
+ *c++='a';
+ break;
+ case 0xf6:
+ *c++='o';
+ break;
+ case 0xfc:
+ *c++='u';
+ break;
+ default:
+ dbg(lvl_debug,"0x%x", *str);
+ *c++=*str;
+ break;
+ }
+ if (! *str)
+ return ret;
+ str++;
+ }
}
-static int
-map_search_setup(struct map_rect_priv *mr)
-{
- char *prefix;
- dbg(lvl_debug,"%s\n", attr_to_name(mr->search_type));
- switch (mr->search_type) {
- case attr_town_postal:
- if (mr->search_item.type != type_country_label) {
- dbg(lvl_error,"wrong parent type %s\n", item_to_name(mr->search_item.type));
- return 0;
- }
- prefix=mg_country_postal_prefix(mr->search_item.id_lo);
- if (! prefix)
- return 0;
- tree_search_init(mr->m->dirname, "town.b1", &mr->ts, 0);
- mr->current_file=file_town_twn;
- mr->search_str=g_strdup_printf("%s%s",prefix,mr->search_attr->u.str);
- dbg(lvl_debug,"search_str='%s'\n",mr->search_str);
- mr->search_country=mg_country_from_isonum(mr->search_item.id_lo);
- break;
- case attr_town_name:
- if (mr->search_item.type != type_country_label) {
- dbg(lvl_error,"wrong parent type %s\n", item_to_name(mr->search_item.type));
- return 0;
- }
- tree_search_init(mr->m->dirname, "town.b2", &mr->ts, 0x1000);
- mr->current_file=file_town_twn;
- mr->search_str=map_search_mg_convert_special(mr->search_attr->u.str);
- mr->search_country=mg_country_from_isonum(mr->search_item.id_lo);
- break;
- case attr_district_name:
- if (mr->search_item.type != type_country_label) {
- dbg(lvl_error,"wrong parent type %s\n", item_to_name(mr->search_item.type));
- return 0;
- }
- tree_search_init(mr->m->dirname, "town.b3", &mr->ts, 0x1000);
- mr->current_file=file_town_twn;
- mr->search_str=map_search_mg_convert_special(mr->search_attr->u.str);
- mr->search_country=mg_country_from_isonum(mr->search_item.id_lo);
- break;
- case attr_street_name:
- if (mr->search_item.type != type_town_streets) {
- GList *tmp=maps;
- struct item *item=NULL;
- struct attr attr;
- struct map_rect_priv *mr2;
- while (tmp) {
- mr2=map_rect_new_mg(tmp->data, NULL);
- item=map_rect_get_item_byid_mg(mr2, mr->search_item.id_hi, mr->search_item.id_lo);
- if (item)
- break;
- map_rect_destroy_mg(mr2);
- tmp=g_list_next(tmp);
- }
- if (item) {
- if (item_attr_get(item, attr_town_streets_item, &attr)) {
- mr->search_item=*attr.u.item;
- map_rect_destroy_mg(mr2);
- } else {
- map_rect_destroy_mg(mr2);
- return 0;
- }
- } else {
- dbg(lvl_error,"wrong parent type %s %p 0x%x 0x%x\n", item_to_name(mr->search_item.type), item, mr->search_item.id_hi, mr->search_item.id_lo);
- return 0;
- }
- }
- dbg(lvl_debug,"street_assoc=0x%x\n", mr->search_item.id_lo);
- tree_search_init(mr->m->dirname, "strname.b1", &mr->ts, 0);
- mr->current_file=file_strname_stn;
- mr->search_str=g_strdup(mr->search_attr->u.str);
- break;
- case attr_house_number:
- if (!map_priv_is(mr->search_item.map, mr->m))
- return 0;
- if (!housenumber_search_setup(mr)) {
- dbg(lvl_error,"failed to search for attr_house_number\n");
- return 0;
- }
- break;
- default:
- dbg(lvl_error,"unknown search %s\n",attr_to_name(mr->search_type));
- return 0;
- }
- mr->file=mr->m->file[mr->current_file];
- block_init(mr);
- return 1;
+static int map_search_setup(struct map_rect_priv *mr) {
+ char *prefix;
+ dbg(lvl_debug,"%s", attr_to_name(mr->search_type));
+ switch (mr->search_type) {
+ case attr_town_postal:
+ if (mr->search_item.type != type_country_label) {
+ dbg(lvl_error,"wrong parent type %s", item_to_name(mr->search_item.type));
+ return 0;
+ }
+ prefix=mg_country_postal_prefix(mr->search_item.id_lo);
+ if (! prefix)
+ return 0;
+ tree_search_init(mr->m->dirname, "town.b1", &mr->ts, 0);
+ mr->current_file=file_town_twn;
+ mr->search_str=g_strdup_printf("%s%s",prefix,mr->search_attr->u.str);
+ dbg(lvl_debug,"search_str='%s'",mr->search_str);
+ mr->search_country=mg_country_from_isonum(mr->search_item.id_lo);
+ break;
+ case attr_town_name:
+ if (mr->search_item.type != type_country_label) {
+ dbg(lvl_error,"wrong parent type %s", item_to_name(mr->search_item.type));
+ return 0;
+ }
+ tree_search_init(mr->m->dirname, "town.b2", &mr->ts, 0x1000);
+ mr->current_file=file_town_twn;
+ mr->search_str=map_search_mg_convert_special(mr->search_attr->u.str);
+ mr->search_country=mg_country_from_isonum(mr->search_item.id_lo);
+ break;
+ case attr_district_name:
+ if (mr->search_item.type != type_country_label) {
+ dbg(lvl_error,"wrong parent type %s", item_to_name(mr->search_item.type));
+ return 0;
+ }
+ tree_search_init(mr->m->dirname, "town.b3", &mr->ts, 0x1000);
+ mr->current_file=file_town_twn;
+ mr->search_str=map_search_mg_convert_special(mr->search_attr->u.str);
+ mr->search_country=mg_country_from_isonum(mr->search_item.id_lo);
+ break;
+ case attr_street_name:
+ if (mr->search_item.type != type_town_streets) {
+ GList *tmp=maps;
+ struct item *item=NULL;
+ struct attr attr;
+ struct map_rect_priv *mr2;
+ while (tmp) {
+ mr2=map_rect_new_mg(tmp->data, NULL);
+ item=map_rect_get_item_byid_mg(mr2, mr->search_item.id_hi, mr->search_item.id_lo);
+ if (item)
+ break;
+ map_rect_destroy_mg(mr2);
+ tmp=g_list_next(tmp);
+ }
+ if (item) {
+ if (item_attr_get(item, attr_town_streets_item, &attr)) {
+ mr->search_item=*attr.u.item;
+ map_rect_destroy_mg(mr2);
+ } else {
+ map_rect_destroy_mg(mr2);
+ return 0;
+ }
+ } else {
+ dbg(lvl_error,"wrong parent type %s %p 0x%x 0x%x", item_to_name(mr->search_item.type), item, mr->search_item.id_hi,
+ mr->search_item.id_lo);
+ return 0;
+ }
+ }
+ dbg(lvl_debug,"street_assoc=0x%x", mr->search_item.id_lo);
+ tree_search_init(mr->m->dirname, "strname.b1", &mr->ts, 0);
+ mr->current_file=file_strname_stn;
+ mr->search_str=g_strdup(mr->search_attr->u.str);
+ break;
+ case attr_house_number:
+ if (!map_priv_is(mr->search_item.map, mr->m))
+ return 0;
+ if (!housenumber_search_setup(mr)) {
+ dbg(lvl_error,"failed to search for attr_house_number");
+ return 0;
+ }
+ break;
+ default:
+ dbg(lvl_error,"unknown search %s",attr_to_name(mr->search_type));
+ return 0;
+ }
+ mr->file=mr->m->file[mr->current_file];
+ block_init(mr);
+ return 1;
}
static void map_search_cleanup(struct map_rect_priv *mr);
static struct item * map_search_get_item_mg(struct map_search_priv *ms);
-static struct map_search_priv *
-map_search_new_mg(struct map_priv *map, struct item *item, struct attr *search, int partial)
-{
- struct map_rect_priv *mr=g_new0(struct map_rect_priv, 1);
- dbg(lvl_debug,"searching for %s '%s'\n", attr_to_name(search->type), search->u.str);
- dbg(lvl_debug,"id_lo=0x%x\n", item->id_lo);
- dbg(lvl_debug,"search=%s\n", search->u.str);
- mr->m=map;
- mr->search_attr=attr_dup(search);
- mr->search_type=search->type;
- mr->search_item=*item;
- mr->search_partial=partial;
- if (search->type == attr_town_or_district_name) {
- mr->search_type=attr_town_name;
- mr->search_type_next=attr_district_name;
- }
- if (!map_search_setup(mr)) {
- dbg(lvl_warning,"map_search_new_mg failed\n");
- g_free(mr);
- return NULL;
- }
- mr->search_mr_tmp=map_rect_new_mg(map, NULL);
-
- return (struct map_search_priv *)mr;
+static struct map_search_priv *map_search_new_mg(struct map_priv *map, struct item *item, struct attr *search,
+ int partial) {
+ struct map_rect_priv *mr=g_new0(struct map_rect_priv, 1);
+ dbg(lvl_debug,"searching for %s '%s'", attr_to_name(search->type), search->u.str);
+ dbg(lvl_debug,"id_lo=0x%x", item->id_lo);
+ dbg(lvl_debug,"search=%s", search->u.str);
+ mr->m=map;
+ mr->search_attr=attr_dup(search);
+ mr->search_type=search->type;
+ mr->search_item=*item;
+ mr->search_partial=partial;
+ if (search->type == attr_town_or_district_name) {
+ mr->search_type=attr_town_name;
+ mr->search_type_next=attr_district_name;
+ }
+ if (!map_search_setup(mr)) {
+ dbg(lvl_warning,"map_search_new_mg failed");
+ g_free(mr);
+ return NULL;
+ }
+ mr->search_mr_tmp=map_rect_new_mg(map, NULL);
+
+ return (struct map_search_priv *)mr;
}
-static void
-map_search_cleanup(struct map_rect_priv *mr)
-{
- g_free(mr->search_str);
- mr->search_str=NULL;
- tree_search_free(&mr->ts);
- mr->search_linear=0;
- mr->search_p=NULL;
- mr->search_blk_count=0;
- mr->search_blk_off=NULL;
- mr->search_block=0;
+static void map_search_cleanup(struct map_rect_priv *mr) {
+ g_free(mr->search_str);
+ mr->search_str=NULL;
+ tree_search_free(&mr->ts);
+ mr->search_linear=0;
+ mr->search_p=NULL;
+ mr->search_blk_count=0;
+ mr->search_blk_off=NULL;
+ mr->search_block=0;
}
-static void
-map_search_destroy_mg(struct map_search_priv *ms)
-{
- struct map_rect_priv *mr=(struct map_rect_priv *)ms;
-
- dbg(lvl_debug,"mr=%p\n", mr);
- if (! mr)
- return;
- map_search_cleanup(mr);
- if (mr->search_mr_tmp)
- map_rect_destroy_mg(mr->search_mr_tmp);
- attr_free(mr->search_attr);
- g_free(mr);
+static void map_search_destroy_mg(struct map_search_priv *ms) {
+ struct map_rect_priv *mr=(struct map_rect_priv *)ms;
+
+ dbg(lvl_debug,"mr=%p", mr);
+ if (! mr)
+ return;
+ map_search_cleanup(mr);
+ if (mr->search_mr_tmp)
+ map_rect_destroy_mg(mr->search_mr_tmp);
+ attr_free(mr->search_attr);
+ g_free(mr);
}
-static struct item *
-map_search_get_item_mg(struct map_search_priv *ms)
-{
- struct map_rect_priv *mr=(struct map_rect_priv *)ms;
- struct item *ret=NULL;
-
- if (! mr)
- return NULL;
- switch (mr->search_type) {
- case attr_town_postal:
- case attr_town_name:
- case attr_district_name:
- ret=town_search_get_item(mr);
- break;
- case attr_street_name:
- ret=street_search_get_item(mr);
- break;
- case attr_house_number:
- ret=housenumber_search_get_item(mr);
- break;
- default:
- dbg(lvl_error,"unknown search %s\n",attr_to_name(mr->search_type));
- break;
- }
- if (!ret && mr->search_type_next != attr_none) {
- mr->search_type=mr->search_type_next;
- mr->search_type_next=attr_none;
- map_search_cleanup(mr);
- map_search_setup(mr);
- return map_search_get_item_mg(ms);
- }
- return ret;
+static struct item *map_search_get_item_mg(struct map_search_priv *ms) {
+ struct map_rect_priv *mr=(struct map_rect_priv *)ms;
+ struct item *ret=NULL;
+
+ if (! mr)
+ return NULL;
+ switch (mr->search_type) {
+ case attr_town_postal:
+ case attr_town_name:
+ case attr_district_name:
+ ret=town_search_get_item(mr);
+ break;
+ case attr_street_name:
+ ret=street_search_get_item(mr);
+ break;
+ case attr_house_number:
+ ret=housenumber_search_get_item(mr);
+ break;
+ default:
+ dbg(lvl_error,"unknown search %s",attr_to_name(mr->search_type));
+ break;
+ }
+ if (!ret && mr->search_type_next != attr_none) {
+ mr->search_type=mr->search_type_next;
+ mr->search_type_next=attr_none;
+ map_search_cleanup(mr);
+ map_search_setup(mr);
+ return map_search_get_item_mg(ms);
+ }
+ return ret;
}
static struct map_methods map_methods_mg = {
- projection_mg,
- "iso8859-1",
- map_destroy_mg,
- map_rect_new_mg,
- map_rect_destroy_mg,
- map_rect_get_item_mg,
- map_rect_get_item_byid_mg,
- map_search_new_mg,
- map_search_destroy_mg,
- map_search_get_item_mg,
+ projection_mg,
+ "iso8859-1",
+ map_destroy_mg,
+ map_rect_new_mg,
+ map_rect_destroy_mg,
+ map_rect_get_item_mg,
+ map_rect_get_item_byid_mg,
+ map_search_new_mg,
+ map_search_destroy_mg,
+ map_search_get_item_mg,
};
struct map_priv *
-map_new_mg(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl)
-{
- struct map_priv *m;
- int i,maybe_missing;
- struct attr *data=attr_search(attrs, NULL, attr_data);
- char *filename;
- struct file_wordexp *wexp;
- char **wexp_data;
-
- if (! data)
- return NULL;
-
- wexp=file_wordexp_new(data->u.str);
- wexp_data=file_wordexp_get_array(wexp);
-
- *meth=map_methods_mg;
- data=attr_search(attrs, NULL, attr_data);
-
- m=g_new(struct map_priv, 1);
- m->id=++map_id;
- m->dirname=g_strdup(wexp_data[0]);
- file_wordexp_destroy(wexp);
- for (i = 0 ; i < file_end ; i++) {
- if (file[i]) {
- filename=g_strdup_printf("%s/%s", m->dirname, file[i]);
- m->file[i]=file_create_caseinsensitive(filename, 0);
- if (! m->file[i]) {
- maybe_missing=(i == file_border_ply || i == file_height_ply || i == file_sea_ply);
- if (! maybe_missing)
- dbg(lvl_error,"Failed to load %s\n", filename);
- } else
- file_mmap(m->file[i]);
- g_free(filename);
- }
- }
- maps=g_list_append(maps, m);
-
- return m;
+map_new_mg(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) {
+ struct map_priv *m;
+ int i,maybe_missing;
+ struct attr *data=attr_search(attrs, NULL, attr_data);
+ char *filename;
+ struct file_wordexp *wexp;
+ char **wexp_data;
+
+ if (! data)
+ return NULL;
+
+ wexp=file_wordexp_new(data->u.str);
+ wexp_data=file_wordexp_get_array(wexp);
+
+ *meth=map_methods_mg;
+ data=attr_search(attrs, NULL, attr_data);
+
+ m=g_new(struct map_priv, 1);
+ m->id=++map_id;
+ m->dirname=g_strdup(wexp_data[0]);
+ file_wordexp_destroy(wexp);
+ for (i = 0 ; i < file_end ; i++) {
+ if (file[i]) {
+ filename=g_strdup_printf("%s/%s", m->dirname, file[i]);
+ m->file[i]=file_create_caseinsensitive(filename, 0);
+ if (! m->file[i]) {
+ maybe_missing=(i == file_border_ply || i == file_height_ply || i == file_sea_ply);
+ if (! maybe_missing)
+ dbg(lvl_error,"Failed to load %s", filename);
+ } else
+ file_mmap(m->file[i]);
+ g_free(filename);
+ }
+ }
+ maps=g_list_append(maps, m);
+
+ return m;
}
-void
-plugin_init(void)
-{
- plugin_register_category_map("mg", map_new_mg);
+void plugin_init(void) {
+ plugin_register_category_map("mg", map_new_mg);
}