Routino SVN Repository Browser

Check out the latest version of Routino: svn co http://routino.org/svn/trunk routino

ViewVC logotype

Contents of /trunk/src/osmxmlparse.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1234 - (show annotations) (download) (as text)
Sat Dec 29 11:11:11 2012 UTC (12 years, 3 months ago) by amb
File MIME type: text/x-csrc
File size: 19881 byte(s)
Re-factor parsing code to remove duplicated parts from three parsers
(osmo5mparse.c, osmpbfparse.c and osmxmlparse.c) into a common place
(osmparser.c), also removes lots of global variables.
Change the node, way and relation count to uint64_t instead of index_t to avoid
wrap-around (although it would have been a cosmetic problem only), also removes
dependency on types.h.
Make the node, way and relation counters be 'int64_t' instead of 'long long' in
the XML parsers for consistency with the non-XML parsers.

1 /***************************************
2 OSM XML file parser (either JOSM or planet)
3
4 Part of the Routino routing software.
5 ******************/ /******************
6 This file Copyright 2008-2012 Andrew M. Bishop
7
8 This program is free software: you can redistribute it and/or modify
9 it under the terms of the GNU Affero General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU Affero General Public License for more details.
17
18 You should have received a copy of the GNU Affero General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
20 ***************************************/
21
22
23 #include <stdlib.h>
24 #include <string.h>
25 #include <inttypes.h>
26 #include <stdint.h>
27
28 #include "osmparser.h"
29 #include "xmlparse.h"
30 #include "tagging.h"
31 #include "logging.h"
32
33
34 /* Local variables */
35
36 static int current_mode=MODE_NORMAL;
37
38 static uint64_t nnodes=0,nways=0,nrelations=0;
39
40 static TagList *current_tags=NULL;
41
42
43 /* The XML tag processing function prototypes */
44
45 //static int xmlDeclaration_function(const char *_tag_,int _type_,const char *version,const char *encoding);
46 static int osmType_function(const char *_tag_,int _type_,const char *version);
47 static int osmChangeType_function(const char *_tag_,int _type_,const char *version);
48 //static int boundsType_function(const char *_tag_,int _type_);
49 //static int boundType_function(const char *_tag_,int _type_);
50 static int changesetType_function(const char *_tag_,int _type_);
51 static int modifyType_function(const char *_tag_,int _type_);
52 static int createType_function(const char *_tag_,int _type_);
53 static int deleteType_function(const char *_tag_,int _type_);
54 static int nodeType_function(const char *_tag_,int _type_,const char *id,const char *lat,const char *lon);
55 static int wayType_function(const char *_tag_,int _type_,const char *id);
56 static int relationType_function(const char *_tag_,int _type_,const char *id);
57 static int tagType_function(const char *_tag_,int _type_,const char *k,const char *v);
58 static int ndType_function(const char *_tag_,int _type_,const char *ref);
59 static int memberType_function(const char *_tag_,int _type_,const char *type,const char *ref,const char *role);
60
61
62 /* The XML tag definitions (forward declarations) */
63
64 static xmltag xmlDeclaration_tag;
65 static xmltag osmType_tag;
66 static xmltag osmChangeType_tag;
67 static xmltag boundsType_tag;
68 static xmltag boundType_tag;
69 static xmltag changesetType_tag;
70 static xmltag modifyType_tag;
71 static xmltag createType_tag;
72 static xmltag deleteType_tag;
73 static xmltag nodeType_tag;
74 static xmltag wayType_tag;
75 static xmltag relationType_tag;
76 static xmltag tagType_tag;
77 static xmltag ndType_tag;
78 static xmltag memberType_tag;
79
80
81 /* The XML tag definition values */
82
83 /*+ The complete set of tags at the top level for OSM. +*/
84 xmltag *xml_osm_toplevel_tags[]={&xmlDeclaration_tag,&osmType_tag,NULL};
85
86 /*+ The complete set of tags at the top level for OSC. +*/
87 xmltag *xml_osc_toplevel_tags[]={&xmlDeclaration_tag,&osmChangeType_tag,NULL};
88
89 /*+ The xmlDeclaration type tag. +*/
90 static xmltag xmlDeclaration_tag=
91 {"xml",
92 2, {"version","encoding"},
93 NULL,
94 {NULL}};
95
96 /*+ The osmType type tag. +*/
97 static xmltag osmType_tag=
98 {"osm",
99 1, {"version"},
100 osmType_function,
101 {&boundsType_tag,&boundType_tag,&changesetType_tag,&nodeType_tag,&wayType_tag,&relationType_tag,NULL}};
102
103 /*+ The osmChangeType type tag. +*/
104 static xmltag osmChangeType_tag=
105 {"osmChange",
106 1, {"version"},
107 osmChangeType_function,
108 {&boundsType_tag,&modifyType_tag,&createType_tag,&deleteType_tag,NULL}};
109
110 /*+ The boundsType type tag. +*/
111 static xmltag boundsType_tag=
112 {"bounds",
113 0, {NULL},
114 NULL,
115 {NULL}};
116
117 /*+ The boundType type tag. +*/
118 static xmltag boundType_tag=
119 {"bound",
120 0, {NULL},
121 NULL,
122 {NULL}};
123
124 /*+ The changesetType type tag. +*/
125 static xmltag changesetType_tag=
126 {"changeset",
127 0, {NULL},
128 changesetType_function,
129 {&tagType_tag,NULL}};
130
131 /*+ The modifyType type tag. +*/
132 static xmltag modifyType_tag=
133 {"modify",
134 0, {NULL},
135 modifyType_function,
136 {&nodeType_tag,&wayType_tag,&relationType_tag,NULL}};
137
138 /*+ The createType type tag. +*/
139 static xmltag createType_tag=
140 {"create",
141 0, {NULL},
142 createType_function,
143 {&nodeType_tag,&wayType_tag,&relationType_tag,NULL}};
144
145 /*+ The deleteType type tag. +*/
146 static xmltag deleteType_tag=
147 {"delete",
148 0, {NULL},
149 deleteType_function,
150 {&nodeType_tag,&wayType_tag,&relationType_tag,NULL}};
151
152 /*+ The nodeType type tag. +*/
153 static xmltag nodeType_tag=
154 {"node",
155 3, {"id","lat","lon"},
156 nodeType_function,
157 {&tagType_tag,NULL}};
158
159 /*+ The wayType type tag. +*/
160 static xmltag wayType_tag=
161 {"way",
162 1, {"id"},
163 wayType_function,
164 {&ndType_tag,&tagType_tag,NULL}};
165
166 /*+ The relationType type tag. +*/
167 static xmltag relationType_tag=
168 {"relation",
169 1, {"id"},
170 relationType_function,
171 {&memberType_tag,&tagType_tag,NULL}};
172
173 /*+ The tagType type tag. +*/
174 static xmltag tagType_tag=
175 {"tag",
176 2, {"k","v"},
177 tagType_function,
178 {NULL}};
179
180 /*+ The ndType type tag. +*/
181 static xmltag ndType_tag=
182 {"nd",
183 1, {"ref"},
184 ndType_function,
185 {NULL}};
186
187 /*+ The memberType type tag. +*/
188 static xmltag memberType_tag=
189 {"member",
190 3, {"type","ref","role"},
191 memberType_function,
192 {NULL}};
193
194
195 /* The XML tag processing functions */
196
197
198 /*++++++++++++++++++++++++++++++++++++++
199 The function that is called when the XML declaration is seen
200
201 int xmlDeclaration_function Returns 0 if no error occured or something else otherwise.
202
203 const char *_tag_ Set to the name of the element tag that triggered this function call.
204
205 int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag.
206
207 const char *version The contents of the 'version' attribute (or NULL if not defined).
208
209 const char *encoding The contents of the 'encoding' attribute (or NULL if not defined).
210 ++++++++++++++++++++++++++++++++++++++*/
211
212 //static int xmlDeclaration_function(const char *_tag_,int _type_,const char *version,const char *encoding)
213 //{
214 // return(0);
215 //}
216
217
218 /*++++++++++++++++++++++++++++++++++++++
219 The function that is called when the osmType XSD type is seen
220
221 int osmType_function Returns 0 if no error occured or something else otherwise.
222
223 const char *_tag_ Set to the name of the element tag that triggered this function call.
224
225 int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag.
226
227 const char *version The contents of the 'version' attribute (or NULL if not defined).
228 ++++++++++++++++++++++++++++++++++++++*/
229
230 static int osmType_function(const char *_tag_,int _type_,const char *version)
231 {
232 /* Print the initial message */
233
234 if(_type_&XMLPARSE_TAG_START)
235 printf_first("Read: Lines=%llu Nodes=%"PRIu64" Ways=%"PRIu64" Relations=%"PRIu64,ParseXML_LineNumber(),nnodes=0,nways=0,nrelations=0);
236
237 /* Check the tag values */
238
239 if(_type_&XMLPARSE_TAG_START)
240 {
241 current_mode=MODE_NORMAL;
242
243 if(!version || strcmp(version,"0.6"))
244 XMLPARSE_MESSAGE(_tag_,"Invalid value for 'version' (only '0.6' accepted)");
245 }
246
247 /* Print the final message */
248
249 if(_type_&XMLPARSE_TAG_END)
250 printf_last("Read: Lines=%llu Nodes=%"PRIu64" Ways=%"PRIu64" Relations=%"PRIu64,ParseXML_LineNumber(),nnodes,nways,nrelations);
251
252 return(0);
253 }
254
255
256 /*++++++++++++++++++++++++++++++++++++++
257 The function that is called when the osmChangeType XSD type is seen
258
259 int osmChangeType_function Returns 0 if no error occured or something else otherwise.
260
261 const char *_tag_ Set to the name of the element tag that triggered this function call.
262
263 int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag.
264
265 const char *version The contents of the 'version' attribute (or NULL if not defined).
266 ++++++++++++++++++++++++++++++++++++++*/
267
268 static int osmChangeType_function(const char *_tag_,int _type_,const char *version)
269 {
270 /* Print the initial message */
271
272 if(_type_&XMLPARSE_TAG_START)
273 printf_first("Read: Lines=%llu Nodes=%"PRIu64" Ways=%"PRIu64" Relations=%"PRIu64,ParseXML_LineNumber(),nnodes=0,nways=0,nrelations=0);
274
275 /* Check the tag values */
276
277 if(_type_&XMLPARSE_TAG_START)
278 {
279 if(!version || strcmp(version,"0.6"))
280 XMLPARSE_MESSAGE(_tag_,"Invalid value for 'version' (only '0.6' accepted)");
281 }
282
283 /* Print the final message */
284
285 if(_type_&XMLPARSE_TAG_END)
286 printf_last("Read: Lines=%llu Nodes=%"PRIu64" Ways=%"PRIu64" Relations=%"PRIu64,ParseXML_LineNumber(),nnodes,nways,nrelations);
287
288 return(0);
289 }
290
291
292 /*++++++++++++++++++++++++++++++++++++++
293 The function that is called when the boundsType XSD type is seen
294
295 int boundsType_function Returns 0 if no error occured or something else otherwise.
296
297 const char *_tag_ Set to the name of the element tag that triggered this function call.
298
299 int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag.
300 ++++++++++++++++++++++++++++++++++++++*/
301
302 //static int boundsType_function(const char *_tag_,int _type_)
303 //{
304 // return(0);
305 //}
306
307
308 /*++++++++++++++++++++++++++++++++++++++
309 The function that is called when the boundType XSD type is seen
310
311 int boundType_function Returns 0 if no error occured or something else otherwise.
312
313 const char *_tag_ Set to the name of the element tag that triggered this function call.
314
315 int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag.
316 ++++++++++++++++++++++++++++++++++++++*/
317
318 //static int boundType_function(const char *_tag_,int _type_)
319 //{
320 // return(0);
321 //}
322
323
324 /*++++++++++++++++++++++++++++++++++++++
325 The function that is called when the changesetType XSD type is seen
326
327 int changesetType_function Returns 0 if no error occured or something else otherwise.
328
329 const char *_tag_ Set to the name of the element tag that triggered this function call.
330
331 int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag.
332 ++++++++++++++++++++++++++++++++++++++*/
333
334 static int changesetType_function(const char *_tag_,int _type_)
335 {
336 current_tags=NULL;
337
338 return(0);
339 }
340
341
342 /*++++++++++++++++++++++++++++++++++++++
343 The function that is called when the modifyType XSD type is seen
344
345 int modifyType_function Returns 0 if no error occured or something else otherwise.
346
347 const char *_tag_ Set to the name of the element tag that triggered this function call.
348
349 int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag.
350 ++++++++++++++++++++++++++++++++++++++*/
351
352 static int modifyType_function(const char *_tag_,int _type_)
353 {
354 if(_type_&XMLPARSE_TAG_START)
355 current_mode=MODE_MODIFY;
356
357 return(0);
358 }
359
360
361 /*++++++++++++++++++++++++++++++++++++++
362 The function that is called when the createType XSD type is seen
363
364 int createType_function Returns 0 if no error occured or something else otherwise.
365
366 const char *_tag_ Set to the name of the element tag that triggered this function call.
367
368 int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag.
369 ++++++++++++++++++++++++++++++++++++++*/
370
371 static int createType_function(const char *_tag_,int _type_)
372 {
373 if(_type_&XMLPARSE_TAG_START)
374 current_mode=MODE_CREATE;
375
376 return(0);
377 }
378
379
380 /*++++++++++++++++++++++++++++++++++++++
381 The function that is called when the deleteType XSD type is seen
382
383 int deleteType_function Returns 0 if no error occured or something else otherwise.
384
385 const char *_tag_ Set to the name of the element tag that triggered this function call.
386
387 int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag.
388 ++++++++++++++++++++++++++++++++++++++*/
389
390 static int deleteType_function(const char *_tag_,int _type_)
391 {
392 if(_type_&XMLPARSE_TAG_START)
393 current_mode=MODE_DELETE;
394
395 return(0);
396 }
397
398
399 /*++++++++++++++++++++++++++++++++++++++
400 The function that is called when the nodeType XSD type is seen
401
402 int nodeType_function Returns 0 if no error occured or something else otherwise.
403
404 const char *_tag_ Set to the name of the element tag that triggered this function call.
405
406 int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag.
407
408 const char *id The contents of the 'id' attribute (or NULL if not defined).
409
410 const char *lat The contents of the 'lat' attribute (or NULL if not defined).
411
412 const char *lon The contents of the 'lon' attribute (or NULL if not defined).
413 ++++++++++++++++++++++++++++++++++++++*/
414
415 static int nodeType_function(const char *_tag_,int _type_,const char *id,const char *lat,const char *lon)
416 {
417 static int64_t llid;
418 static double latitude,longitude;
419
420 if(_type_&XMLPARSE_TAG_START)
421 {
422 nnodes++;
423
424 if(!(nnodes%10000))
425 printf_middle("Reading: Lines=%llu Nodes=%"PRIu64" Ways=%"PRIu64" Relations=%"PRIu64,ParseXML_LineNumber(),nnodes,nways,nrelations);
426
427 current_tags=NewTagList();
428
429 /* Handle the node information */
430
431 XMLPARSE_ASSERT_INTEGER(_tag_,id); llid=atoll(id); /* need int64_t conversion */
432
433 if(current_mode!=MODE_DELETE)
434 {
435 XMLPARSE_ASSERT_FLOATING(_tag_,lat); latitude =atof(lat);
436 XMLPARSE_ASSERT_FLOATING(_tag_,lon); longitude=atof(lon);
437 }
438 }
439
440 if(_type_&XMLPARSE_TAG_END)
441 {
442 TagList *result=ApplyNodeTaggingRules(current_tags,llid);
443
444 ProcessNodeTags(result,llid,latitude,longitude,current_mode);
445
446 DeleteTagList(current_tags); current_tags=NULL;
447 DeleteTagList(result);
448 }
449
450 return(0);
451 }
452
453
454 /*++++++++++++++++++++++++++++++++++++++
455 The function that is called when the wayType XSD type is seen
456
457 int wayType_function Returns 0 if no error occured or something else otherwise.
458
459 const char *_tag_ Set to the name of the element tag that triggered this function call.
460
461 int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag.
462
463 const char *id The contents of the 'id' attribute (or NULL if not defined).
464 ++++++++++++++++++++++++++++++++++++++*/
465
466 static int wayType_function(const char *_tag_,int _type_,const char *id)
467 {
468 static int64_t llid;
469
470 if(_type_&XMLPARSE_TAG_START)
471 {
472 nways++;
473
474 if(!(nways%1000))
475 printf_middle("Reading: Lines=%llu Nodes=%"PRIu64" Ways=%"PRIu64" Relations=%"PRIu64,ParseXML_LineNumber(),nnodes,nways,nrelations);
476
477 current_tags=NewTagList();
478
479 AddWayRefs(0);
480
481 /* Handle the way information */
482
483 XMLPARSE_ASSERT_INTEGER(_tag_,id); llid=atoll(id); /* need int64_t conversion */
484 }
485
486 if(_type_&XMLPARSE_TAG_END)
487 {
488 TagList *result=ApplyWayTaggingRules(current_tags,llid);
489
490 ProcessWayTags(result,llid,current_mode);
491
492 DeleteTagList(current_tags); current_tags=NULL;
493 DeleteTagList(result);
494 }
495
496 return(0);
497 }
498
499
500 /*++++++++++++++++++++++++++++++++++++++
501 The function that is called when the relationType XSD type is seen
502
503 int relationType_function Returns 0 if no error occured or something else otherwise.
504
505 const char *_tag_ Set to the name of the element tag that triggered this function call.
506
507 int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag.
508
509 const char *id The contents of the 'id' attribute (or NULL if not defined).
510 ++++++++++++++++++++++++++++++++++++++*/
511
512 static int relationType_function(const char *_tag_,int _type_,const char *id)
513 {
514 static int64_t llid;
515
516 if(_type_&XMLPARSE_TAG_START)
517 {
518 nrelations++;
519
520 if(!(nrelations%1000))
521 printf_middle("Reading: Lines=%llu Nodes=%"PRIu64" Ways=%"PRIu64" Relations=%"PRIu64,ParseXML_LineNumber(),nnodes,nways,nrelations);
522
523 current_tags=NewTagList();
524
525 AddRelationRefs(0,0,0,NULL);
526
527 /* Handle the relation information */
528
529 XMLPARSE_ASSERT_INTEGER(_tag_,id); llid=atoll(id); /* need int64_t conversion */
530 }
531
532 if(_type_&XMLPARSE_TAG_END)
533 {
534 TagList *result=ApplyRelationTaggingRules(current_tags,llid);
535
536 ProcessRelationTags(result,llid,current_mode);
537
538 DeleteTagList(current_tags); current_tags=NULL;
539 DeleteTagList(result);
540 }
541
542 return(0);
543 }
544
545
546 /*++++++++++++++++++++++++++++++++++++++
547 The function that is called when the tagType XSD type is seen
548
549 int tagType_function Returns 0 if no error occured or something else otherwise.
550
551 const char *_tag_ Set to the name of the element tag that triggered this function call.
552
553 int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag.
554
555 const char *k The contents of the 'k' attribute (or NULL if not defined).
556
557 const char *v The contents of the 'v' attribute (or NULL if not defined).
558 ++++++++++++++++++++++++++++++++++++++*/
559
560 static int tagType_function(const char *_tag_,int _type_,const char *k,const char *v)
561 {
562 if(_type_&XMLPARSE_TAG_START && current_tags)
563 {
564 XMLPARSE_ASSERT_STRING(_tag_,k);
565 XMLPARSE_ASSERT_STRING(_tag_,v);
566
567 AppendTag(current_tags,k,v);
568 }
569
570 return(0);
571 }
572
573
574 /*++++++++++++++++++++++++++++++++++++++
575 The function that is called when the ndType XSD type is seen
576
577 int ndType_function Returns 0 if no error occured or something else otherwise.
578
579 const char *_tag_ Set to the name of the element tag that triggered this function call.
580
581 int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag.
582
583 const char *ref The contents of the 'ref' attribute (or NULL if not defined).
584 ++++++++++++++++++++++++++++++++++++++*/
585
586 static int ndType_function(const char *_tag_,int _type_,const char *ref)
587 {
588 if(_type_&XMLPARSE_TAG_START)
589 {
590 int64_t llid;
591
592 XMLPARSE_ASSERT_INTEGER(_tag_,ref); llid=atoll(ref); /* need int64_t conversion */
593
594 AddWayRefs(llid);
595 }
596
597 return(0);
598 }
599
600
601 /*++++++++++++++++++++++++++++++++++++++
602 The function that is called when the memberType XSD type is seen
603
604 int memberType_function Returns 0 if no error occured or something else otherwise.
605
606 const char *_tag_ Set to the name of the element tag that triggered this function call.
607
608 int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag.
609
610 const char *type The contents of the 'type' attribute (or NULL if not defined).
611
612 const char *ref The contents of the 'ref' attribute (or NULL if not defined).
613
614 const char *role The contents of the 'role' attribute (or NULL if not defined).
615 ++++++++++++++++++++++++++++++++++++++*/
616
617 static int memberType_function(const char *_tag_,int _type_,const char *type,const char *ref,const char *role)
618 {
619 if(_type_&XMLPARSE_TAG_START)
620 {
621 int64_t llid;
622
623 XMLPARSE_ASSERT_STRING(_tag_,type);
624 XMLPARSE_ASSERT_INTEGER(_tag_,ref); llid=atoll(ref); /* need int64_t conversion */
625
626 if(!strcmp(type,"node"))
627 AddRelationRefs(llid,0,0,role);
628 else if(!strcmp(type,"way"))
629 AddRelationRefs(0,llid,0,role);
630 else if(!strcmp(type,"relation"))
631 AddRelationRefs(0,0,llid,role);
632 }
633
634 return(0);
635 }

Properties

Name Value
cvs:description OSM XML file parser.
svn:mergeinfo /branches/2.0.3-dev/src/osmparser.c:814-823 /branches/2.3.1-dev/src/osmparser.c:1046-1079 /branches/2.3.2-dev/src/osmparser.c:1080-1086 /branches/2.4.1-dev/src/osmparser.c:1211-1215 /tags/2.0.2/src/osmparser.c:802-813 /tags/2.0.3/src/osmparser.c:824-827 /tags/2.3/src/osmparser.c:1027-1045 /tags/2.4/src/osmparser.c:1184-1210