2 * Navit, a modular navigation system.
3 * Copyright (C) 2005-2011 Navit Team
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * version 2 as published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the
16 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
26 osm_xml_get_attribute(char *xml, char *attribute, char *buffer, int buffer_size)
28 int len=strlen(attribute);
29 char *pos,*i,s,attr[len+2];
30 strcpy(attr, attribute);
31 strcpy(attr+len, "=");
32 pos=strstr(xml, attr);
42 if (i - pos > buffer_size) {
43 fprintf(stderr,"Buffer overflow %ld vs %d\n", (long)(i-pos), buffer_size);
46 strncpy(buffer, pos, i-pos);
51 static struct entity {
70 osm_xml_decode_entities(char *buffer)
75 while ((pos=strchr(pos, '&'))) {
77 for (i = 0 ; i < sizeof(entities)/sizeof(struct entity); i++) {
78 len=strlen(entities[i].entity);
79 if (!strncmp(pos, entities[i].entity, len)) {
81 memmove(pos+1, pos+len, strlen(pos+len)+1);
93 char k_buffer[BUFFER_SIZE];
94 char v_buffer[BUFFER_SIZE];
95 if (!osm_xml_get_attribute(p, "k", k_buffer, BUFFER_SIZE))
97 if (!osm_xml_get_attribute(p, "v", v_buffer, BUFFER_SIZE))
99 osm_xml_decode_entities(v_buffer);
100 osm_add_tag(k_buffer, v_buffer);
108 char id_buffer[BUFFER_SIZE];
109 char lat_buffer[BUFFER_SIZE];
110 char lon_buffer[BUFFER_SIZE];
111 if (!osm_xml_get_attribute(p, "id", id_buffer, BUFFER_SIZE))
113 if (!osm_xml_get_attribute(p, "lat", lat_buffer, BUFFER_SIZE))
115 if (!osm_xml_get_attribute(p, "lon", lon_buffer, BUFFER_SIZE))
117 osm_add_node(atoll(id_buffer), atof(lat_buffer), atof(lon_buffer));
125 char id_buffer[BUFFER_SIZE];
126 if (!osm_xml_get_attribute(p, "id", id_buffer, BUFFER_SIZE))
128 osm_add_way(atoll(id_buffer));
133 parse_relation(char *p)
135 char id_buffer[BUFFER_SIZE];
136 if (!osm_xml_get_attribute(p, "id", id_buffer, BUFFER_SIZE))
138 osm_add_relation(atoll(id_buffer));
143 parse_member(char *p)
145 char type_buffer[BUFFER_SIZE];
146 char ref_buffer[BUFFER_SIZE];
147 char role_buffer[BUFFER_SIZE];
149 if (!osm_xml_get_attribute(p, "type", type_buffer, BUFFER_SIZE))
151 if (!osm_xml_get_attribute(p, "ref", ref_buffer, BUFFER_SIZE))
153 if (!osm_xml_get_attribute(p, "role", role_buffer, BUFFER_SIZE))
155 if (!strcmp(type_buffer,"node"))
157 else if (!strcmp(type_buffer,"way"))
159 else if (!strcmp(type_buffer,"relation"))
162 fprintf(stderr,"Unknown type %s\n",type_buffer);
165 osm_add_member(type, atoll(ref_buffer), role_buffer);
173 char ref_buffer[BUFFER_SIZE];
174 if (!osm_xml_get_attribute(p, "ref", ref_buffer, BUFFER_SIZE))
176 osm_add_nd(atoll(ref_buffer));
181 map_collect_data_osm(FILE *in, struct maptool_osm *osm)
183 int size=BUFFER_SIZE;
187 while (fgets(buffer, size, in)) {
188 p=strchr(buffer,'<');
190 fprintf(stderr,"WARNING: wrong line %s\n", buffer);
193 if (!strncmp(p, "<?xml ",6)) {
194 } else if (!strncmp(p, "<osm ",5)) {
195 } else if (!strncmp(p, "<bound ",7)) {
196 } else if (!strncmp(p, "<node ",6)) {
198 fprintf(stderr,"WARNING: failed to parse %s\n", buffer);
200 } else if (!strncmp(p, "<tag ",5)) {
202 fprintf(stderr,"WARNING: failed to parse %s\n", buffer);
203 } else if (!strncmp(p, "<way ",5)) {
205 fprintf(stderr,"WARNING: failed to parse %s\n", buffer);
207 } else if (!strncmp(p, "<nd ",4)) {
209 fprintf(stderr,"WARNING: failed to parse %s\n", buffer);
210 } else if (!strncmp(p, "<relation ",10)) {
211 if (!parse_relation(p))
212 fprintf(stderr,"WARNING: failed to parse %s\n", buffer);
213 processed_relations++;
214 } else if (!strncmp(p, "<member ",8)) {
215 if (!parse_member(p))
216 fprintf(stderr,"WARNING: failed to parse %s\n", buffer);
217 } else if (!strncmp(p, "</node>",7)) {
219 } else if (!strncmp(p, "</way>",6)) {
221 } else if (!strncmp(p, "</relation>",11)) {
222 osm_end_relation(osm);
223 } else if (!strncmp(p, "</osm>",6)) {
225 fprintf(stderr,"WARNING: unknown tag in %s\n", buffer);