source: subversion/applications/lib/libosm/FeaturesParser.cpp @ 34562

Last change on this file since 34562 was 11684, checked in by nienhueser, 11 years ago

Less inline definitions. Start to document things (doxygen style)

File size: 2.3 KB
Line 
1#include "FeaturesParser.h"
2#include "FeatureClassification.h"
3
4#include <iostream>
5#include <cstring>
6using namespace std;
7
8namespace OSM
9{
10
11FeatureClassification* FeaturesParser::featureClassification = NULL;
12
13bool FeaturesParser::inDoc = false, FeaturesParser::inWays = false,
14                FeaturesParser::inAreas = false;
15
16std::string FeaturesParser::error = "";
17
18std::string FeaturesParser::getError()
19{
20        return error;
21}
22
23void FeaturesParser::startElement(void *d, const XML_Char* element,
24                const XML_Char** attrs)
25{
26        if (!strcmp(element, "features"))
27        {
28                inDoc = true;
29        }
30        else if (inDoc)
31        {
32                if (!strcmp(element, "ways"))
33                {
34                        inWays = true;
35                }
36                else if (!strcmp(element, "areas"))
37                {
38                        inAreas = true;
39                }
40                else if (!strcmp(element, "condition") && (inWays || inAreas))
41                {
42                        std::string key = "", value = "";
43                        int count = 0;
44                        while (attrs[count])
45                        {
46                                if (!strcmp(attrs[count], "k"))
47                                        key = attrs[count + 1];
48                                else if (!strcmp(attrs[count], "v"))
49                                        value = attrs[count + 1];
50                                count++;
51                        }
52
53                        if (key != "" && value != "")
54                        {
55                                if (inWays)
56                                        featureClassification->addWayDef(key, value);
57                                else if (inAreas)
58                                        featureClassification->addAreaDef(key, value);
59                        }
60                }
61        }
62}
63
64void FeaturesParser::endElement(void *d, const XML_Char* element)
65{
66        if (inDoc && !strcmp(element, "features"))
67        {
68                inDoc = false;
69        }
70        else if (!strcmp(element, "ways"))
71        {
72                inWays = false;
73        }
74        else if (!strcmp(element, "areas"))
75        {
76                inAreas = false;
77        }
78}
79
80FeatureClassification* FeaturesParser::parse(std::istream &in)
81{
82        int done, count = 0, n;
83        char buf[4096];
84
85        XML_Parser p = XML_ParserCreate(NULL);
86        if (!p)
87        {
88                error = "Error creating parser";
89                return NULL;
90        }
91
92        XML_SetElementHandler(p, FeaturesParser::startElement,
93                        FeaturesParser::endElement);
94        XML_SetCharacterDataHandler(p, FeaturesParser::characters);
95        featureClassification = new FeatureClassification;
96
97        // straight from example
98        do
99        {
100                //in.read(buf,4096);
101                in.getline(buf, sizeof(buf));
102                //n = in.gcount();
103                //done = (n!=4096);
104                done = in.eof();
105
106                if (XML_Parse(p, buf, strlen(buf), done) == XML_STATUS_ERROR)
107                {
108                        error = "xml parsing error";
109                        delete featureClassification;
110                        return NULL;
111                }
112                count += n;
113        } while (!done);
114        XML_ParserFree(p);
115        return featureClassification;
116}
117void FeaturesParser::characters(void*, const XML_Char* txt, int txtlen)
118{
119}
120}
121
Note: See TracBrowser for help on using the repository browser.