Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #ifndef __SP_TOOL_XMLPARSER_H__
00009 #define __SP_TOOL_XMLPARSER_H__
00010
00011
00012 #include "Base/spStandard.hpp"
00013
00014 #ifdef SP_COMPILE_WITH_XMLPARSER
00015
00016
00017 #include "Base/spInputOutputString.hpp"
00018 #include "Base/spInputOutputFileSystem.hpp"
00019
00020 #include <list>
00021 #include <vector>
00022
00023
00024 namespace sp
00025 {
00026 namespace tool
00027 {
00028
00029
00030 struct SP_EXPORT SXMLAttribute
00031 {
00032 SXMLAttribute();
00033 SXMLAttribute(const io::stringc &AttribName, const io::stringc &AttribValue);
00034 ~SXMLAttribute();
00035
00036
00037
00038 template <typename T> static void setStringArray(io::stringc &Str, const std::vector<T> &Array)
00039 {
00040 Str = "";
00041 for (typename std::vector< T, std::allocator<T> >::const_iterator it = Array.begin(); it != Array.end(); ++it)
00042 Str += io::stringc(*it) + ";";
00043 }
00044
00045 template <typename T> static std::vector<T> getStringArray(const io::stringc &Str)
00046 {
00047 s32 Pos1, Pos2 = 0;
00048 std::vector<T> Array;
00049
00050 while ( ( Pos1 = Str.find(";", Pos2) ) != -1 && static_cast<u32>(Pos2) < Str.size() )
00051 {
00052 Array.push_back(
00053 static_cast<T>(Str.section(Pos2, Pos1).val<T>())
00054 );
00055 Pos2 = Pos1 + 1;
00056 }
00057
00058 return Array;
00059 }
00060
00061 template <typename T> void setArray(const std::vector<T> &Array)
00062 {
00063 SXMLAttribute::setStringArray<T>(Value, Array);
00064 }
00065 template <typename T> std::vector<T> getArray() const
00066 {
00067 return SXMLAttribute::getStringArray<T>(Value);
00068 }
00069
00070 void setColor(const video::color &Color);
00071 video::color getColor() const;
00072
00073 void setVector(const dim::vector3df &Vec);
00074 dim::vector3df getVector() const;
00075
00076 template <typename T> inline T getValue() const
00077 {
00078 return Value.val<T>();
00079 }
00080
00081 inline bool getBool() const
00082 {
00083 return Value.lower() == "true";
00084 }
00085
00086
00087
00088 io::stringc Name, Value;
00089 };
00090
00091 struct SP_EXPORT SXMLTag
00092 {
00093 SXMLTag();
00094 SXMLTag(const io::stringc &TagName);
00095 ~SXMLTag();
00096
00097
00098 void clear();
00099
00100
00101 io::stringc Name, Text;
00102 std::list<SXMLAttribute> Attributes;
00103 std::list<SXMLTag> Tags;
00104 };
00105
00106
00111 class SP_EXPORT XMLParser
00112 {
00113
00114 public:
00115
00116 XMLParser();
00117 virtual ~XMLParser();
00118
00119
00120
00126 bool loadFile(const io::stringc &Filename);
00127
00129 bool saveFile(const io::stringc &Filename, const SXMLTag &RootTag);
00130
00132 inline const SXMLTag& getRootTag() const
00133 {
00134 return RootTag_;
00135 }
00136
00137 protected:
00138
00139
00140
00141 enum ETokenState
00142 {
00143 TOKENSTATE_NONE,
00144 TOKENSTATE_CHECK_COMMENT,
00145 TOKENSTATE_SEARCH_COMMENT_END,
00146 TOKENSTATE_STRING,
00147 };
00148
00149 enum ETokenTypes
00150 {
00151 TOKEN_UNKNOWN,
00152 TOKEN_SINGLE,
00153 TOKEN_STRING,
00154 TOKEN_NAME,
00155 TOKEN_TAG_START,
00156 TOKEN_TAG_END,
00157 TOKEN_TAG_CLOSE,
00158 TOKEN_BLANK,
00159 };
00160
00161
00162
00163 struct SFileState
00164 {
00165 u32 FilePos;
00166 io::stringc Line;
00167 u32 Row;
00168 u32 Column;
00169 };
00170
00171 struct SToken
00172 {
00173 SToken() : Type(TOKEN_UNKNOWN)
00174 {
00175 }
00176 ~SToken()
00177 {
00178 }
00179
00180
00181 inline void reset()
00182 {
00183 Type = TOKEN_UNKNOWN;
00184 Value = "";
00185 }
00186
00187
00188 ETokenTypes Type;
00189 io::stringc Value;
00190 };
00191
00192
00193
00194 c8 readChar();
00195 void storePrevChar();
00196 void jumpPrevChar();
00197
00198 SToken readToken();
00199
00200 bool readXML();
00201 bool readTag(bool &hasTagClosed);
00202 bool readTagName(SToken &Token, io::stringc &Name);
00203
00204 bool writeTag(const SXMLTag &Tag, io::stringc &Tab);
00205
00206 bool isCharName(const c8 Character) const;
00207
00208 void pushTag();
00209 void popTag();
00210
00211 void pushTagName();
00212 void popTagName();
00213
00214 void addAttribute(const io::stringc &Name);
00215
00216 io::stringc getLinesIndicate() const;
00217 bool printErrorLI(const io::stringc &Message) const;
00218 void printWarningLI(const io::stringc &Message) const;
00219
00220
00221
00222 io::FileSystem FileSys_;
00223 io::File* File_;
00224
00225 io::stringc Line_;
00226 u32 LineColumn_;
00227 u32 LineRow_;
00228
00229 SFileState PrevState_;
00230 io::stringc ParentTagName_;
00231
00232 std::list<SXMLTag*> TagStack_;
00233 std::list<io::stringc> TagNameStack_;
00234
00235 SXMLTag* CurTag_;
00236 SXMLTag RootTag_;
00237
00238 };
00239
00240
00241 }
00242
00243 }
00244
00245
00246 #endif
00247
00248 #endif
00249
00250
00251
00252