summaryrefslogtreecommitdiff
path: root/map/mg/mg.h
diff options
context:
space:
mode:
Diffstat (limited to 'map/mg/mg.h')
-rw-r--r--map/mg/mg.h372
1 files changed, 372 insertions, 0 deletions
diff --git a/map/mg/mg.h b/map/mg/mg.h
new file mode 100644
index 00000000..e6febc21
--- /dev/null
+++ b/map/mg/mg.h
@@ -0,0 +1,372 @@
+/**
+ * Navit, a modular navigation system.
+ * Copyright (C) 2005-2008 Navit Team
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <glib.h>
+#include "item.h"
+#include "attr.h"
+#include "coord.h"
+#include "data.h"
+#include "projection.h"
+#include "map.h"
+#include "file.h"
+
+struct block_data {
+ struct file *file;
+};
+
+struct block {
+/* int blocks;
+ int size;
+ int next;
+ struct coord_rect r;
+ int count;*/
+ unsigned char p[32];
+};
+static inline int block_get_blocks(struct block * blk) { unsigned char *p = blk->p; return get_u32(&p); }
+static inline int block_get_size(struct block * blk) { unsigned char *p = blk->p+4; return get_u32(&p); }
+static inline int block_get_next(struct block * blk) { unsigned char *p = blk->p+8; return get_u32(&p); }
+static inline int block_get_count(struct block * blk) { unsigned char *p = blk->p+28; return get_u32(&p); }
+static inline void block_get_r(struct block * blk, struct coord_rect * r) { unsigned char *p = blk->p+12; r ->lu.x = get_u32(&p); r ->lu.y = get_u32(&p); r ->rl.x = get_u32(&p); r ->rl.y = get_u32(&p); }
+
+struct item_priv {
+ int cidx;
+ int aidx;
+ unsigned char *cstart,*cp,*cend;
+ unsigned char *astart,*ap,*aend;
+ enum attr_type attr_last;
+ enum attr_type attr_next;
+ struct item item;
+};
+
+struct town_priv {
+ unsigned int id; /*!< Identifier */
+ struct coord c; /*!< Coordinates */
+ char *name; /*!< Name */
+ char *district; /*!< District */
+ char *postal_code1; /*!< Postal code */
+ unsigned char order; /*!< Order (Importance) */
+ unsigned char type; /*!< Type */
+ unsigned short country; /*!< Country */
+ unsigned int unknown2; /*!< Unknown */
+ unsigned char size; /*!< Size of town */
+ unsigned int street_assoc; /*!< Association to streets */
+ unsigned char unknown3; /*!< Unknown */
+ char *postal_code2; /*!< 2nd postal code */
+ unsigned int unknown4; /*!< Unknown */
+
+ int cidx;
+ int aidx;
+ enum attr_type attr_next;
+ char debug[256];
+ char postal[32];
+ struct item town_attr_item;
+};
+
+struct poly_priv {
+ int poly_num;
+ unsigned char *poly_next;
+ int subpoly_num;
+ int subpoly_num_all;
+ unsigned char *subpoly_next;
+ unsigned char *subpoly_start;
+ unsigned char *p;
+ struct coord c[2];
+ char *name;
+ unsigned char order;
+ unsigned char type;
+ unsigned int polys;
+ unsigned int *count;
+ unsigned int count_sum;
+
+ int aidx;
+ enum attr_type attr_next;
+};
+
+struct street_header {
+ /*unsigned char order;
+ int count;*/
+ unsigned char p[5];
+} __attribute__((packed));
+static inline unsigned char street_header_get_order(struct street_header * str) { return *str->p; }
+static inline int street_header_get_count(struct street_header * str) { unsigned char *p = str->p+1; return get_u32_unal(&p); }
+
+struct street_type {
+ /*unsigned char order;
+ unsigned short country;*/
+ unsigned char p[3];
+} __attribute__((packed));
+static inline unsigned char street_type_get_order(struct street_type * str) { return *str->p; }
+static inline unsigned short street_type_get_country(struct street_type * str) { unsigned char *p = str->p+1; return get_u16_unal(&p); }
+
+struct street_header_type {
+ struct street_header *header;
+ int type_count;
+ struct street_type *type;
+};
+
+struct street_str {
+ /*int segid;
+ unsigned char limit;*/ /* 0x03,0x30=One Way,0x33=No Passing */
+ /*unsigned char unknown2;
+ unsigned char unknown3;
+ unsigned char type;
+ unsigned int nameid;*/
+ unsigned char p[12];
+};
+static inline int street_str_get_segid(struct street_str * str) { unsigned char *p = str->p; return get_u32_unal(&p); }
+static inline unsigned char street_str_get_limit(struct street_str * str) { return str->p[4]; }
+static inline unsigned char street_str_get_unknown2(struct street_str * str) { return str->p[5]; }
+static inline unsigned char street_str_get_unknown3(struct street_str * str) { return str->p[6]; }
+static inline unsigned char street_str_get_type(struct street_str * str) { return str->p[7]; }
+static inline unsigned int street_str_get_nameid(struct street_str * str) { unsigned char *p = str->p+8; return get_u32_unal(&p); }
+
+struct street_name_segment {
+ int segid;
+ int country;
+};
+
+struct street_name {
+ int len;
+ int country;
+ int townassoc;
+ char *name1;
+ char *name2;
+ int segment_count;
+ struct street_name_segment *segments;
+ int aux_len;
+ unsigned char *aux_data;
+ int tmp_len;
+ unsigned char *tmp_data;
+};
+
+struct housenumber {
+ int number;
+ char *suffix;
+};
+
+struct street_name_numbers {
+ int len;
+ int tag;
+ int dist;
+ int country;
+ struct coord *c;
+ struct housenumber first;
+ struct housenumber last;
+ int segment_count;
+ struct street_name_segment *segments;
+ int aux_len;
+ unsigned char *aux_data;
+ int tmp_len;
+ unsigned char *tmp_data;
+};
+static inline void street_name_numbers_get_coord(struct street_name_numbers * str, struct coord * c) {
+ unsigned char *p=(unsigned char *)str->c;
+ c->x=get_u32_unal(&p);
+ c->y=get_u32_unal(&p);
+}
+
+struct street_name_number {
+ int len;
+ int tag;
+ struct coord *c;
+ struct housenumber first;
+ struct housenumber last;
+ struct street_name_segment *segment;
+};
+
+
+
+struct street_priv {
+ struct file *name_file;
+ struct street_header *header;
+ int type_count;
+ struct street_type *type;
+ struct street_str *str;
+ struct street_str *str_start;
+ unsigned char *coord_begin;
+ unsigned char *p;
+ unsigned char *p_rewind;
+ unsigned char *end;
+ unsigned char *next;
+ int status;
+ int status_rewind;
+ struct coord_rect ref;
+ int bytes;
+ int more;
+ int flags;
+ int housenumber;
+ int cidx;
+ struct coord hnc[100];
+ struct housenumber hn[100];
+ int hn_count;
+ struct street_name name;
+ struct street_name_numbers name_numbers;
+ struct street_name_number name_number;
+ enum attr_type attr_next;
+ char debug[256];
+ char first_number[32];
+ char last_number[32];
+ char current_number[32];
+ GHashTable *streetname_hash;
+};
+
+enum file_index {
+ file_border_ply=0,
+ file_bridge_ply,
+ file_build_ply,
+ file_golf_ply,
+ file_height_ply,
+ file_natpark_ply,
+ file_nature_ply,
+ file_other_ply,
+ file_rail_ply,
+ file_sea_ply,
+ file_street_bti,
+ file_street_str,
+ file_strname_stn,
+ file_town_twn,
+ file_tunnel_ply,
+ file_water_ply,
+ file_woodland_ply,
+ file_end,
+ file_town_twn_alt1,
+ file_town_twn_alt2,
+ file_street_str_alt1,
+ file_street_str_alt2,
+ file_street_str_alt3,
+ file_street_str_alt4,
+};
+
+struct map_priv {
+ int id;
+ struct file *file[file_end];
+ char *dirname;
+};
+
+#define BT_STACK_SIZE 32
+
+struct block_bt_priv {
+ struct block *b;
+ struct coord_rect r, r_curr;
+ int next;
+ int block_count;
+ struct coord_rect stack[BT_STACK_SIZE];
+ int stackp;
+ int order;
+ unsigned char *p;
+ unsigned char *end;
+};
+
+struct block_priv {
+ int block_num;
+ struct coord_rect b_rect;
+ unsigned char *block_start;
+ struct block *b;
+ unsigned char *p;
+ unsigned char *end;
+ unsigned char *p_start;
+ int binarytree;
+ struct block_bt_priv bt;
+};
+
+struct block_offset {
+/* unsigned short offset;
+ unsigned short block;*/
+ unsigned char p[4];
+};
+static inline unsigned short block_offset_get_offset(struct block_offset * blk) { unsigned char *p = blk->p; return get_u16_unal(&p); }
+static inline unsigned short block_offset_get_block(struct block_offset * blk) { unsigned char *p = blk->p+2; return get_u16_unal(&p); }
+
+struct tree_search_node {
+ struct tree_hdr *hdr;
+ unsigned char *p;
+ unsigned char *last;
+ unsigned char *end;
+ int low;
+ int high;
+ int last_low;
+ int last_high;
+ };
+
+struct tree_search {
+ struct file *f;
+ int last_node;
+ int curr_node;
+ struct tree_search_node nodes[5];
+};
+
+
+struct map_rect_priv {
+ struct map_selection *xsel;
+ struct map_selection *cur_sel;
+
+ struct map_priv *m;
+ enum file_index current_file;
+ struct file *file;
+ struct block_priv b;
+ struct item item;
+ struct town_priv town;
+ struct poly_priv poly;
+ struct street_priv street;
+ struct tree_search ts;
+ int search_country;
+ struct item search_item;
+ struct attr *search_attr;
+ char *search_str;
+ int search_partial;
+ int search_linear;
+ unsigned char *search_p;
+ int search_blk_count;
+ enum attr_type search_type,search_type_next;
+ struct map_rect_priv *search_mr_tmp;
+ struct item *search_item_tmp;
+ struct block_offset *search_blk_off;
+ int search_block;
+ GHashTable *block_hash[file_end];
+ struct item_priv item3;
+};
+
+int mg_country_from_isonum(int isonum);
+int mg_country_to_isonum(int country);
+int mg_country_postal_len(int country);
+
+int block_init(struct map_rect_priv *mr);
+int block_next(struct map_rect_priv *mr);
+int block_get_byindex(struct file *file, int idx, struct block_priv *blk);
+int block_next_lin(struct map_rect_priv *mr);
+
+int tree_search_hv(char *dirname, char *filename, unsigned int search1, unsigned int search2, int *result);
+int town_get(struct map_rect_priv *mr, struct town_priv *poly, struct item *item);
+int town_get_byid(struct map_rect_priv *mr, struct town_priv *twn, int id_hi, int id_lo, struct item *item);
+struct item * town_search_get_item(struct map_rect_priv *mr);
+int poly_get(struct map_rect_priv *mr, struct poly_priv *poly, struct item *item);
+int poly_get_byid(struct map_rect_priv *mr, struct poly_priv *poly, int id_hi, int id_lo, struct item *item);
+int street_get(struct map_rect_priv *mr, struct street_priv *street, struct item *item);
+int street_get_byid(struct map_rect_priv *mr, struct street_priv *street, int id_hi, int id_lo, struct item *item);
+int street_name_get_byid(struct map_rect_priv *mr, struct street_priv *street, int id_hi, int id_lo, struct item *item);
+struct item * street_search_get_item(struct map_rect_priv *mr);
+void tree_search_init(char *dirname, char *filename, struct tree_search *ts, int offset);
+void tree_search_free(struct tree_search *ts);
+int tree_search_next(struct tree_search *ts, unsigned char **p, int dir);
+int tree_search_next_lin(struct tree_search *ts, unsigned char **p);
+struct item * housenumber_search_get_item(struct map_rect_priv *mr);
+struct map_rect_priv * map_rect_new_mg(struct map_priv *map, struct map_selection *sel);
+void map_rect_destroy_mg(struct map_rect_priv *mr);
+struct item *map_rect_get_item_byid_mg(struct map_rect_priv *mr, int id_hi, int id_lo);
+int housenumber_search_setup(struct map_rect_priv *mr);