]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/input_output/FGXMLParse.cpp
PAtch by Andreas Gaeb to eliminate NaN's in the location code
[flightgear.git] / src / FDM / JSBSim / input_output / FGXMLParse.cpp
1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2
3  Header:       FGXMLParse.cpp
4  Author:       Jon Berndt
5  Date started: 08/20/2004
6  Purpose:      Config file read-in class and XML parser
7  Called by:    Various
8
9  ------------- Copyright (C) 2001  Jon S. Berndt (jon@jsbsim.org) -------------
10
11  This program is free software; you can redistribute it and/or modify it under
12  the terms of the GNU Lesser General Public License as published by the Free Software
13  Foundation; either version 2 of the License, or (at your option) any later
14  version.
15
16  This program is distributed in the hope that it will be useful, but WITHOUT
17  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
18  FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
19  details.
20
21  You should have received a copy of the GNU Lesser General Public License along with
22  this program; if not, write to the Free Software Foundation, Inc., 59 Temple
23  Place - Suite 330, Boston, MA  02111-1307, USA.
24
25  Further information about the GNU Lesser General Public License can also be found on
26  the world wide web at http://www.gnu.org.
27
28 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
29 INCLUDES
30 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
31
32 #include "FGXMLParse.h"
33 #include "FGXMLElement.h"
34 #include <string>
35 #include <iostream>
36 #include <cstdlib>
37 #include "input_output/string_utilities.h"
38
39 using namespace std;
40
41 namespace JSBSim {
42
43 static const char *IdSrc = "$Id: FGXMLParse.cpp,v 1.11 2010/09/28 02:54:03 jberndt Exp $";
44 static const char *IdHdr = ID_XMLPARSE;
45
46 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
47 CLASS IMPLEMENTATION
48 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
49
50 #include "FGXMLParse.h"
51
52 using namespace std;
53
54 FGXMLParse::FGXMLParse(void)
55 {
56   first_element_read = false;
57   current_element = document = 0L;
58 }
59
60 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
61
62 FGXMLParse::~FGXMLParse(void)
63 {
64   delete document;
65 }
66
67 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
68
69 void FGXMLParse::startXML(void)
70 {
71 }
72
73 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
74
75 void FGXMLParse::reset(void)
76 {
77   delete document;
78   first_element_read = false;
79   current_element = document = 0L;
80 }
81
82 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
83
84 void FGXMLParse::endXML(void)
85 {
86   // At this point, document should equal current_element ?
87 }
88
89 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
90
91 void FGXMLParse::startElement (const char * name, const XMLAttributes &atts)
92 {
93   string Name(name);
94   Element *temp_element;
95
96   working_string.erase();
97
98   if (!first_element_read) {
99     document = new Element(Name);
100     current_element = document;
101     first_element_read = true;
102   } else {
103     temp_element = new Element(Name);
104     temp_element->SetParent(current_element);
105     current_element->AddChildElement(temp_element);
106     current_element = temp_element;
107   }
108
109   if (current_element == 0L) {
110     cerr << "No current element read (no top-level element in XML file?)" << endl;
111     exit (-1);
112   }
113
114   for (int i=0; i<atts.size();i++) {
115     current_element->AddAttribute(atts.getName(i), atts.getValue(i));
116   }
117 }
118
119 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
120
121 void FGXMLParse::endElement (const char * name)
122 {
123   if (!working_string.empty()) {
124     vector <string> work_strings = split(working_string, '\n');
125     for (unsigned int i=0; i<work_strings.size(); i++) current_element->AddData(work_strings[i]);
126   }
127
128   current_element = current_element->GetParent();
129 }
130
131 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
132
133 void FGXMLParse::data (const char * s, int length)
134 {
135   working_string += string(s, length);
136 }
137
138 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
139
140 void FGXMLParse::pi (const char * target, const char * data)
141 {
142 }
143
144 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
145
146 void FGXMLParse::warning (const char * message, int line, int column)
147 {
148   cerr << "Warning: " << message << " line: " << line << " column: " << column << endl;
149 }
150
151 } // end namespace JSBSim