]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/input_output/FGXMLParse.cpp
Synchronized with JSBSim/CVS
[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.12 2013/11/16 14:51:20 bcoconni 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 << "In file " << getPath() << ": line " << getLine() << endl
111          << "No current element read (running out of memory?)" << endl;
112     exit (-1);
113   }
114
115   current_element->SetLineNumber(getLine());
116   current_element->SetFileName(getPath());
117
118   for (int i=0; i<atts.size();i++) {
119     current_element->AddAttribute(atts.getName(i), atts.getValue(i));
120   }
121 }
122
123 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
124
125 void FGXMLParse::endElement (const char * name)
126 {
127   if (!working_string.empty()) {
128     vector <string> work_strings = split(working_string, '\n');
129     for (unsigned int i=0; i<work_strings.size(); i++) current_element->AddData(work_strings[i]);
130   }
131
132   current_element = current_element->GetParent();
133 }
134
135 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
136
137 void FGXMLParse::data (const char * s, int length)
138 {
139   working_string += string(s, length);
140 }
141
142 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
143
144 void FGXMLParse::pi (const char * target, const char * data)
145 {
146 }
147
148 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
149
150 void FGXMLParse::warning (const char * message, int line, int column)
151 {
152   cerr << "Warning: " << message << " line: " << line << " column: " << column << endl;
153 }
154
155 } // end namespace JSBSim