Import the TinyXML dependency into the repository
This commit is contained in:
70
osx/dialogxml/xml-parser/build_instructions.txt
Normal file
70
osx/dialogxml/xml-parser/build_instructions.txt
Normal file
@@ -0,0 +1,70 @@
|
||||
TiCPP (TinyXML C++ wrapper)
|
||||
---------------------------------------------------
|
||||
Introduction:
|
||||
'TiCPP' is short for the official name TinyXML++. It is a completely new
|
||||
interface to TinyXML (http://http://www.grinninglizard.com/tinyxml/) that
|
||||
uses MANY of the C++ strengths. Templates, exceptions, and much better error
|
||||
handling. It is also fully documented in doxygen. It is really cool because
|
||||
this version let's you interface tiny the exact same way as before or you
|
||||
can choose to use the new 'TiCPP' classes. All you need to do is define
|
||||
TIXML_USE_TICPP. It has been tested in VC 6.0, VC 7.0, VC 7.1, VC 8.0,
|
||||
MinGW gcc 3.4.5, and in Linux GNU gcc 3+.
|
||||
|
||||
TinyXML++ uses Premake as the build system, so you won't find any project files
|
||||
because you generate them for your specific system. Premake is a build script
|
||||
generator. Premake supports creatation of build scripts for:
|
||||
|
||||
* MS Visual Studio 6, 2002, 2003, or 2005
|
||||
* GNU make (including Cygwin and MinGW)
|
||||
* Code::Blocks
|
||||
* And more ...
|
||||
|
||||
Build Steps:
|
||||
1) Download Premake from http://premake.sf.net/download
|
||||
2) Checkout the source for TinyXML++ using Subversion.
|
||||
- svn checkout http://ticpp.googlecode.com/svn/trunk/ ticpp
|
||||
3) Place the Premake executable in the root directory of TiCPP or somewhere in your
|
||||
path.
|
||||
4) To create the needed build files navigate to the TinyXML++ directory (ticpp)
|
||||
and type:
|
||||
|
||||
* Code::Blocks Projects and workspace:
|
||||
Windows: premake --target cb-gcc [--unicode] [--dynamic-runtime] [--ticpp-shared]
|
||||
Linux: premake --target cb-gcc [--unicode] [--dynamic-runtime] [--ticpp-shared]
|
||||
|
||||
* GNU makefiles:
|
||||
Windows: premake-win32 --target gnu [--unicode] [--dynamic-runtime] [--ticpp-shared]
|
||||
Linux: premake-linux --target gnu [--unicode] [--dynamic-runtime] [--ticpp-shared]
|
||||
|
||||
* Visual Studio 2005 (8.0) [Windows ONLY]
|
||||
Windows: premake-win32 --target vs2005 [--unicode] [--dynamic-runtime] [--ticpp-shared]
|
||||
|
||||
5) Now use the build system of your choice.
|
||||
|
||||
- For Code::Blocks, use the generated .cbp/.workspace to build TinyXML++ as a
|
||||
static library.
|
||||
|
||||
- For GNU makefiles type: (Assumes you have properly setup your system to build
|
||||
with gcc or MinGW)
|
||||
|
||||
* Release:
|
||||
make CONFIG=Release
|
||||
|
||||
* Debug:
|
||||
make
|
||||
- For Visual Studio, use the generated .vcproj/.sln to build TinyXML++ as a
|
||||
static library.
|
||||
|
||||
Notes:
|
||||
- Premake can be found here:
|
||||
http://premake.sourceforge.net
|
||||
|
||||
- Subversion is a great free cross-platform version control manager.
|
||||
It can be found here:
|
||||
http://subversion.tigris.org
|
||||
|
||||
- Code::Blocks is a free cross-platform IDE and it can be found here:
|
||||
http://codeblocks.org
|
||||
|
||||
Enjoy,
|
||||
The TiCPP Team
|
269
osx/dialogxml/xml-parser/changes.txt
Normal file
269
osx/dialogxml/xml-parser/changes.txt
Normal file
@@ -0,0 +1,269 @@
|
||||
Changes in version 1.0.1:
|
||||
- Fixed comment tags which were outputing as '<?--' instead of
|
||||
the correct '<!--'.
|
||||
- Implemented the Next and Prev methods of the TiXmlAttribute class.
|
||||
- Renamed 'LastAttribtute' to 'LastAttribute'
|
||||
- Fixed bad pointer to 'isspace' that could occur while parsing text.
|
||||
- Errors finding beginning and end of tags no longer throw it into an
|
||||
infinite loop. (Hopefully.)
|
||||
|
||||
Changes in version 1.0.2
|
||||
- Minor documentation fixes.
|
||||
|
||||
Changes in version 1.0.3
|
||||
- After nodes are added to a document, they return a pointer
|
||||
to the new node instead of a bool for success.
|
||||
- Elements can be constructed with a value, which is the
|
||||
element name. Every element must have a value or it will be
|
||||
invalid, but the code changes to enforce this are not fully
|
||||
in place.
|
||||
|
||||
Changes in version 1.1.0
|
||||
- Added the TiXmlAttributeSet class to pull the attributes into
|
||||
a seperate container.
|
||||
- Moved the doubly liked list out of XmlBase. Now XmlBase only
|
||||
requires the Print() function and defines some utility functions.
|
||||
- Moved errors into a seperate file. (With the idea of internationalization
|
||||
to the other latin-1 languages.)
|
||||
- Added the "NodeType"
|
||||
- Fixed white space parsing in text to conform with the standard.
|
||||
Basically, all white space becomes just one space.
|
||||
- Added the TiXmlDeclaration class to read xml declarations.
|
||||
|
||||
Changes in version 1.2.0
|
||||
- Removed the factory. The factory was not really in the spirit
|
||||
of small and simple, confused the code, and was of limited value.
|
||||
- Added FirstChildElement and NextSiblingElement, because they
|
||||
are such common functions.
|
||||
- Re-wrote the example to test and demonstrate more functionality.
|
||||
|
||||
Changes in version 1.2.1
|
||||
- Fixed a bug where comments couldn't be inside elements.
|
||||
- Loading now clears out existing XML rather than appending.
|
||||
- Added the "Clear" method on a node to delete all its children.
|
||||
|
||||
Changes in version 1.2.2
|
||||
- Fixed TiXmlAttribute::Previous actually returning "next." Thanks
|
||||
to Rickard Troedsson for the bug fix.
|
||||
|
||||
Changes in version 1.2.3
|
||||
- Added the TIXML prefix to the error strings to resolve conflicts
|
||||
with #defines in OS headers. Thanks to Steve Lhomme.
|
||||
- Fixed a delete buf that should be a delete [] buf.
|
||||
Thanks to Ephi Sinowitz.
|
||||
|
||||
Changes in version 1.2.4
|
||||
- ReplaceChild() was almost guarenteed to fail. Should be fixed,
|
||||
thanks to Joe Smith. Joe also pointed out that the Print() functions
|
||||
should take stream references: I agree, and would like to overload
|
||||
the Print() method to take either format, but I don't want to do
|
||||
this in a dot release.
|
||||
- Some compilers seem to need an extra <ctype.h> include. Thanks
|
||||
to Steve Lhomme for that.
|
||||
|
||||
Changes in version 2.0.0 BETA
|
||||
- Made the ToXXX() casts safe if 'this' is null.
|
||||
When "LoadFile" is called with a filename, the value will correctly get set.
|
||||
Thanks to Brian Yoder.
|
||||
- Fixed bug where isalpha() and isalnum() would get called with a negative value for
|
||||
high ascii numbers. Thanks to Alesky Aksenov.
|
||||
- Fixed some errors codes that were not getting set.
|
||||
- Made methods "const" that were not.
|
||||
- Added a switch to enable or disable the ignoring of white space. ( TiXmlDocument::SetIgnoreWhiteSpace() )
|
||||
- Greater standardization and code re-use in the parser.
|
||||
- Added a stream out operator.
|
||||
- Added a stream in operator.
|
||||
- Entity support, of predefined entites. &#x entities are untouched by input or output.
|
||||
- Improved text out formatting.
|
||||
- Fixed ReplaceChild bug, thanks to Tao Chen.
|
||||
|
||||
Changes in version 2.0.1
|
||||
- Fixed hanging on loading a 0 length file. Thanks to Jeff Scozzafava.
|
||||
- Fixed crashing on InsertBeforeChild and InsertAfterChild. Also possibility of bad links being
|
||||
created by same function. Thanks to Frank De prins.
|
||||
- Added missing licence text. Thanks to Lars Willemsens.
|
||||
- Added <ctype.h> include, at the suggestion of Steve Walters.
|
||||
|
||||
Changes in version 2.1.0
|
||||
- Yves Berquin brings us the STL switch. The forum on SourceForge, and various emails to
|
||||
me, have long debated all out STL vs. no STL at all. And now you can have it both ways.
|
||||
TinyXml will compile either way.
|
||||
|
||||
Changes in version 2.1.1
|
||||
- Compilation warnings.
|
||||
|
||||
Changes in version 2.1.2
|
||||
- Uneeded code is not compiled in the STL case.
|
||||
- Changed headers so that STL can be turned on or off in tinyxml.h
|
||||
|
||||
Changes in version 2.1.3
|
||||
- Fixed non-const reference in API; now uses a pointer.
|
||||
- Copy constructor of TiXmlString not checking for assignment to self.
|
||||
- Nimrod Cohen found a truly evil bug in the STL implementation that occurs
|
||||
when a string is converted to a c_str and then assigned to self. Search for
|
||||
STL_STRING_BUG for a full description. I'm asserting this is a Microsoft STL
|
||||
bug, since &string and string.c_str() should never be the same. Nevertheless,
|
||||
the code works around it.
|
||||
- Urivan Saaib pointed out a compiler conflict, where the C headers define
|
||||
the isblank macro, which was wiping out the TiXmlString::isblank() method.
|
||||
The method was unused and has been removed.
|
||||
|
||||
Changes in version 2.1.4
|
||||
- Reworked the entity code. Entities were not correctly surving round trip input and output.
|
||||
Will now automatically create entities for high ascii in output.
|
||||
|
||||
Changes in version 2.1.5
|
||||
- Bug fix by kylotan : infinite loop on some input (tinyxmlparser.cpp rev 1.27)
|
||||
- Contributed by Ivica Aracic (bytelord) : 1 new VC++ project to compile versions as static libraries (tinyxml_lib.dsp),
|
||||
and an example usage in xmltest.dsp
|
||||
(Patch request ID 678605)
|
||||
- A suggestion by Ronald Fenner Jr (dormlock) to add #include <istream> and <ostream> for Apple's Project Builder
|
||||
(Patch request ID 697642)
|
||||
- A patch from ohommes that allows to parse correctly dots in element names and attribute names
|
||||
(Patch request 602600 and kylotan 701728)
|
||||
- A patch from hermitgeek ( James ) and wasteland for improper error reporting
|
||||
- Reviewed by Lee, with the following changes:
|
||||
- Got sick of fighting the STL/non-STL thing in the windows build. Broke
|
||||
them out as seperate projects.
|
||||
- I have too long not included the dsw. Added.
|
||||
- TinyXmlText had a protected Print. Odd.
|
||||
- Made LinkEndChild public, with docs and appropriate warnings.
|
||||
- Updated the docs.
|
||||
|
||||
2.2.0
|
||||
- Fixed an uninitialized pointer in the TiXmlAttributes
|
||||
- Fixed STL compilation problem in MinGW (and gcc 3?) - thanks Brian Yoder for finding this one
|
||||
- Fixed a syntax error in TiXmlDeclaration - thanks Brian Yoder
|
||||
- Fletcher Dunn proposed and submitted new error handling that tracked the row and column. Lee
|
||||
modified it to not have performance impact.
|
||||
- General cleanup suggestions from Fletcher Dunn.
|
||||
- In error handling, general errors will no longer clear the error state of specific ones.
|
||||
- Fix error in documentation : comments starting with "<?--" instead of "<!--" (thanks ion_pulse)
|
||||
- Added the TiXmlHandle. An easy, safe way to browse XML DOMs with less code.
|
||||
- Added QueryAttribute calls which have better error messaging. (Proposed by Fletcher Dunn)
|
||||
- Nodes and attributes can now print themselves to strings. (Yves suggestion)
|
||||
- Fixed bug where entities with one character would confuse parser. (Thanks Roman)
|
||||
|
||||
2.2.1
|
||||
- Additional testing (no more bugs found to be fixed in this release)
|
||||
- Significant performance improvement to the cursor code.
|
||||
|
||||
2.3.0
|
||||
- User Data are now defined in TiXmlBase instead of TiXmlNode
|
||||
- Character Entities are now UCS-2
|
||||
- Character Entities can be decimal or hexadecimal
|
||||
- UTF-8 conversion.
|
||||
- Fixed many, many bugs.
|
||||
|
||||
2.3.1
|
||||
- Fixed bug in handling nulls embedded in the input.
|
||||
- Make UTF-8 parser tolerant of bad text encoding.
|
||||
- Added encoding detection.
|
||||
- Many fixes and input from John-Philip Leonard Johansson (JP) and Ellers,
|
||||
including UTF-8 feedback, bug reports, and patches. Thanks!
|
||||
- Added version # constants - a suggestion from JP and Ellers.
|
||||
- [ 979180 ] Missing ; in entity reference, fix from Rob Laveaux.
|
||||
- Copy constructors and assignment have been a long time coming. Thanks to
|
||||
Fokke and JP.
|
||||
|
||||
2.3.2
|
||||
- Made the IsAlpha and IsAlphaNum much more tolerant of non-UTF-8 encodings. Thanks
|
||||
Volker Boerchers for finding the issue.
|
||||
- Ran the program though the magnificent Valgrind - http://valgrind.kde.org - to check
|
||||
for memory errors. Fixed some minor issues.
|
||||
|
||||
2.3.3
|
||||
- Fixed crash when test program was run from incorrect directory.
|
||||
- Fixed bug 1070717 - empty document not returned correctly - thanks Katsuhisa Yuasa.
|
||||
- Bug 1079301 resolved - deprecated stdlib calls. Thanks Adrian Boeing.
|
||||
- Bug 1035218 fixed - documentation errors. Xunji Luo
|
||||
- Other bug fixes have accumulated and been fixed on the way as well; my apologies to
|
||||
authors not credited!
|
||||
- Big fix / addition is to correctly return const values. TinyXml could basically
|
||||
remove const in a method like this: TiXmlElement* Foo() const, where the returned element
|
||||
was a pointer to internal data. That is now: const TiXmlElement* Foo() const and
|
||||
TiXmlElement* Foo().
|
||||
|
||||
2.3.4
|
||||
- Fixed additional const errors, thanks Kent Gibson.
|
||||
- Correctly re-enable warnings after tinyxml header. Thanks Cory Nelson.
|
||||
- Variety of type cleanup and warning fixes. Thanks Warren Stevens.
|
||||
- Cleaned up unneeded constructor calls in TinyString - thanks to Geoff Carlton and
|
||||
the discussion group on sourceforge.
|
||||
|
||||
2.4.0
|
||||
- Improved string class, thanks Tyge Lovset (whose name gets mangled in English - sorry)
|
||||
- Type cast compiler warning, thanks Rob van den Bogaard
|
||||
- Added GetText() convenience function. Thanks Ilya Parniuk & Andrew Ellers for input.
|
||||
- Many thanks to marlonism for finding an infinite loop in bad xml.
|
||||
- A patch to cleanup warnings from Robert Gebis.
|
||||
- Added ValueStr() to get the value of a node as a string.
|
||||
- TiXmlText can now parse and output as CDATA
|
||||
- Additional string improvement from James (z2895)
|
||||
- Removed extraneous 'const', thanks David Aldrich
|
||||
- First pass at switching to the "safe" stdlib functions. Many people have suggested and
|
||||
pushed on this, but Warren Stevens put together the first proposal.
|
||||
- TinyXml now will do EOL normalization before parsing, consistent with the W3C XML spec.
|
||||
- Documents loaded with the UTF-8 BOM will now save with the UTF-8 BOM. Good suggestion
|
||||
from 'instructor_'
|
||||
- Ellers submitted his very popular tutorials, which have been added to the distribution.
|
||||
|
||||
2.4.1
|
||||
- Fixed CDATA output formatting
|
||||
- Fixed memory allocators in TinyString to work with overloaded new/delete
|
||||
|
||||
2.4.2
|
||||
- solosnake pointed out that TIXML_LOG causes problems on an XBOX. The definition in the header
|
||||
was superflous and was moved inside of DEBUG_PARSING
|
||||
|
||||
2.4.3
|
||||
- Fixed a test bug that caused a crash in 'xmltest'. TinyXML was fine, but it isn't good
|
||||
to ship with a broken test suite.
|
||||
- Started converting some functions to not cast between std::string and const char*
|
||||
quite as often.
|
||||
- Added FILE* versions of the document loads - good suggestion from Wade Brainerd
|
||||
- Empty documents might not always return the errors they should. [1398915] Thanks to igor v.
|
||||
- Added some asserts for multiply adding a node, regardng bug [1391937] suggested by Paco Arjonilla.
|
||||
|
||||
2.4.4
|
||||
- Bug find thanks to andre-gross found a memory leak that occured when a document failed to load.
|
||||
- Bug find (and good analysis) by VirtualJim who found a case where attribute parsing
|
||||
should be throwing an error and wasn't.
|
||||
- Steve Hyatt suggested the QueryValueAttribute method, which is now implemented.
|
||||
- DavidA identified a chunk of dead code.
|
||||
- Andrew Baxter sent in some compiler warnings that were good clean up points.
|
||||
|
||||
2.5
|
||||
- Added the Visit() API. Many thanks to both Andrew Ellerton and John-Philip for all their
|
||||
work, code, suggestion, and just general pushing that it should be done.
|
||||
- Removed existing streaming code and use TiXmlPrinter instead.
|
||||
- [ tinyxml-Bugs-1527079 ] Compile error in tinystr.cpp fixed, thanks to Paul Suggs
|
||||
- [ tinyxml-Bugs-1522890 ] SaveFile has no error checks fixed, thanks to Ivan Dobrokotov
|
||||
- Ivan Dobrokotov also reported redundant memory allocation in the Attribute() method, which
|
||||
upon investigation was a mess. The attribute should now be fixed for both const char* and
|
||||
std::string, and the return types match the input parameters.
|
||||
- Feature [ 1511105 ] Make TiXmlComment constructor accept a string / char*, implemented.
|
||||
Thanks to Karl Itschen for the feedback.
|
||||
- [ 1480108 ] Stream parsing fails when CDATA contains tags was found by Tobias Grimm, who also
|
||||
submitted a test case and patch. A significant bug in CDATA streaming (operator>>) has now
|
||||
been fixed.
|
||||
|
||||
2.5.2
|
||||
- Lieven, and others, pointed out a missing const-cast that upset the Open Watcom compiler.
|
||||
Should now be fixed.
|
||||
- ErrorRow and ErrorCol should have been const, and weren't. Fixed thanks to Dmitry Polutov.
|
||||
|
||||
2.5.3
|
||||
- zloe_zlo identified a missing string specialization for QueryValueAttribute() [ 1695429 ]. Worked
|
||||
on this bug, but not sure how to fix it in a safe, cross-compiler way.
|
||||
- increased warning level to 4 and turned on detect 64 bit portability issues for VC2005.
|
||||
May address [ 1677737 ] VS2005: /Wp64 warnings
|
||||
- grosheck identified several problems with the Document copy. Many thanks for [ 1660367 ]
|
||||
- Nice catch, and suggested fix, be Gilad Novik on the Printer dropping entities.
|
||||
"[ 1600650 ] Bug when printing xml text" is now fixed.
|
||||
- A subtle fix from Nicos Gollan in the tinystring initializer:
|
||||
[ 1581449 ] Fix initialiser of TiXmlString::nullrep_
|
||||
- Great catch, although there isn't a submitter for the bug. [ 1475201 ] TinyXML parses entities in comments.
|
||||
Comments should not, in fact, parse entities. Fixed the code path and added tests.
|
||||
- We were not catching all the returns from ftell. Thanks to Bernard for catching that.
|
||||
|
1229
osx/dialogxml/xml-parser/dox
Normal file
1229
osx/dialogxml/xml-parser/dox
Normal file
File diff suppressed because it is too large
Load Diff
531
osx/dialogxml/xml-parser/readme.txt
Normal file
531
osx/dialogxml/xml-parser/readme.txt
Normal file
@@ -0,0 +1,531 @@
|
||||
/** @mainpage
|
||||
|
||||
<h1> TinyXML </h1>
|
||||
|
||||
TinyXML is a simple, small, C++ XML parser that can be easily
|
||||
integrated into other programs.
|
||||
|
||||
<h2> What it does. </h2>
|
||||
|
||||
In brief, TinyXML parses an XML document, and builds from that a
|
||||
Document Object Model (DOM) that can be read, modified, and saved.
|
||||
|
||||
XML stands for "eXtensible Markup Language." It allows you to create
|
||||
your own document markups. Where HTML does a very good job of marking
|
||||
documents for browsers, XML allows you to define any kind of document
|
||||
markup, for example a document that describes a "to do" list for an
|
||||
organizer application. XML is a very structured and convenient format.
|
||||
All those random file formats created to store application data can
|
||||
all be replaced with XML. One parser for everything.
|
||||
|
||||
The best place for the complete, correct, and quite frankly hard to
|
||||
read spec is at <a href="http://www.w3.org/TR/2004/REC-xml-20040204/">
|
||||
http://www.w3.org/TR/2004/REC-xml-20040204/</a>. An intro to XML
|
||||
(that I really like) can be found at
|
||||
<a href="http://skew.org/xml/tutorial/">http://skew.org/xml/tutorial</a>.
|
||||
|
||||
There are different ways to access and interact with XML data.
|
||||
TinyXML uses a Document Object Model (DOM), meaning the XML data is parsed
|
||||
into a C++ objects that can be browsed and manipulated, and then
|
||||
written to disk or another output stream. You can also construct an XML document
|
||||
from scratch with C++ objects and write this to disk or another output
|
||||
stream.
|
||||
|
||||
TinyXML is designed to be easy and fast to learn. It is two headers
|
||||
and four cpp files. Simply add these to your project and off you go.
|
||||
There is an example file - xmltest.cpp - to get you started.
|
||||
|
||||
TinyXML is released under the ZLib license,
|
||||
so you can use it in open source or commercial code. The details
|
||||
of the license are at the top of every source file.
|
||||
|
||||
TinyXML attempts to be a flexible parser, but with truly correct and
|
||||
compliant XML output. TinyXML should compile on any reasonably C++
|
||||
compliant system. It does not rely on exceptions or RTTI. It can be
|
||||
compiled with or without STL support. TinyXML fully supports
|
||||
the UTF-8 encoding, and the first 64k character entities.
|
||||
|
||||
|
||||
<h2> What it doesn't do. </h2>
|
||||
|
||||
TinyXML doesn't parse or use DTDs (Document Type Definitions) or XSLs
|
||||
(eXtensible Stylesheet Language.) There are other parsers out there
|
||||
(check out www.sourceforge.org, search for XML) that are much more fully
|
||||
featured. But they are also much bigger, take longer to set up in
|
||||
your project, have a higher learning curve, and often have a more
|
||||
restrictive license. If you are working with browsers or have more
|
||||
complete XML needs, TinyXML is not the parser for you.
|
||||
|
||||
The following DTD syntax will not parse at this time in TinyXML:
|
||||
|
||||
@verbatim
|
||||
<!DOCTYPE Archiv [
|
||||
<!ELEMENT Comment (#PCDATA)>
|
||||
]>
|
||||
@endverbatim
|
||||
|
||||
because TinyXML sees this as a !DOCTYPE node with an illegally
|
||||
embedded !ELEMENT node. This may be addressed in the future.
|
||||
|
||||
<h2> Tutorials. </h2>
|
||||
|
||||
For the impatient, here are some tutorials to get you going. A great way to get started,
|
||||
but it is worth your time to read this (very short) manual completely.
|
||||
|
||||
- @subpage ticppTutorial
|
||||
- @subpage tutorial0
|
||||
|
||||
<h2> Code Status. </h2>
|
||||
|
||||
TinyXML is mature, tested code. It is very stable. If you find
|
||||
bugs, please file a bug report on the sourceforge web site
|
||||
(www.sourceforge.net/projects/tinyxml). We'll get them straightened
|
||||
out as soon as possible.
|
||||
|
||||
There are some areas of improvement; please check sourceforge if you are
|
||||
interested in working on TinyXML.
|
||||
|
||||
<h2> Related Projects </h2>
|
||||
|
||||
TinyXML projects you may find useful! (Descriptions provided by the projects.)
|
||||
|
||||
<ul>
|
||||
<li> <b>TinyXPath</b> (http://tinyxpath.sourceforge.net). TinyXPath is a small footprint
|
||||
XPath syntax decoder, written in C++.</li>
|
||||
<li> <b>@subpage ticpp</b> (http://code.google.com/p/ticpp/). TinyXML++ is a completely new
|
||||
interface to TinyXML that uses MANY of the C++ strengths. Templates,
|
||||
exceptions, and much better error handling.</li>
|
||||
</ul>
|
||||
|
||||
<h2> Features </h2>
|
||||
|
||||
<h3> Using STL </h3>
|
||||
|
||||
TinyXML can be compiled to use or not use STL. When using STL, TinyXML
|
||||
uses the std::string class, and fully supports std::istream, std::ostream,
|
||||
operator<<, and operator>>. Many API methods have both 'const char*' and
|
||||
'const std::string&' forms.
|
||||
|
||||
When STL support is compiled out, no STL files are included whatsoever. All
|
||||
the string classes are implemented by TinyXML itself. API methods
|
||||
all use the 'const char*' form for input.
|
||||
|
||||
Use the compile time #define:
|
||||
|
||||
TIXML_USE_STL
|
||||
|
||||
to compile one version or the other. This can be passed by the compiler,
|
||||
or set as the first line of "tinyxml.h".
|
||||
|
||||
Note: If compiling the test code in Linux, setting the environment
|
||||
variable TINYXML_USE_STL=YES/NO will control STL compilation. In the
|
||||
Windows project file, STL and non STL targets are provided. In your project,
|
||||
It's probably easiest to add the line "#define TIXML_USE_STL" as the first
|
||||
line of tinyxml.h.
|
||||
|
||||
<h3> UTF-8 </h3>
|
||||
|
||||
TinyXML supports UTF-8 allowing to manipulate XML files in any language. TinyXML
|
||||
also supports "legacy mode" - the encoding used before UTF-8 support and
|
||||
probably best described as "extended ascii".
|
||||
|
||||
Normally, TinyXML will try to detect the correct encoding and use it. However,
|
||||
by setting the value of TIXML_DEFAULT_ENCODING in the header file, TinyXML
|
||||
can be forced to always use one encoding.
|
||||
|
||||
TinyXML will assume Legacy Mode until one of the following occurs:
|
||||
<ol>
|
||||
<li> If the non-standard but common "UTF-8 lead bytes" (0xef 0xbb 0xbf)
|
||||
begin the file or data stream, TinyXML will read it as UTF-8. </li>
|
||||
<li> If the declaration tag is read, and it has an encoding="UTF-8", then
|
||||
TinyXML will read it as UTF-8. </li>
|
||||
<li> If the declaration tag is read, and it has no encoding specified, then TinyXML will
|
||||
read it as UTF-8. </li>
|
||||
<li> If the declaration tag is read, and it has an encoding="something else", then TinyXML
|
||||
will read it as Legacy Mode. In legacy mode, TinyXML will work as it did before. It's
|
||||
not clear what that mode does exactly, but old content should keep working.</li>
|
||||
<li> Until one of the above criteria is met, TinyXML runs in Legacy Mode.</li>
|
||||
</ol>
|
||||
|
||||
What happens if the encoding is incorrectly set or detected? TinyXML will try
|
||||
to read and pass through text seen as improperly encoded. You may get some strange results or
|
||||
mangled characters. You may want to force TinyXML to the correct mode.
|
||||
|
||||
You may force TinyXML to Legacy Mode by using LoadFile( TIXML_ENCODING_LEGACY ) or
|
||||
LoadFile( filename, TIXML_ENCODING_LEGACY ). You may force it to use legacy mode all
|
||||
the time by setting TIXML_DEFAULT_ENCODING = TIXML_ENCODING_LEGACY. Likewise, you may
|
||||
force it to TIXML_ENCODING_UTF8 with the same technique.
|
||||
|
||||
For English users, using English XML, UTF-8 is the same as low-ASCII. You
|
||||
don't need to be aware of UTF-8 or change your code in any way. You can think
|
||||
of UTF-8 as a "superset" of ASCII.
|
||||
|
||||
UTF-8 is not a double byte format - but it is a standard encoding of Unicode!
|
||||
TinyXML does not use or directly support wchar, TCHAR, or Microsoft's _UNICODE at this time.
|
||||
It is common to see the term "Unicode" improperly refer to UTF-16, a wide byte encoding
|
||||
of unicode. This is a source of confusion.
|
||||
|
||||
For "high-ascii" languages - everything not English, pretty much - TinyXML can
|
||||
handle all languages, at the same time, as long as the XML is encoded
|
||||
in UTF-8. That can be a little tricky, older programs and operating systems
|
||||
tend to use the "default" or "traditional" code page. Many apps (and almost all
|
||||
modern ones) can output UTF-8, but older or stubborn (or just broken) ones
|
||||
still output text in the default code page.
|
||||
|
||||
For example, Japanese systems traditionally use SHIFT-JIS encoding.
|
||||
Text encoded as SHIFT-JIS can not be read by TinyXML.
|
||||
A good text editor can import SHIFT-JIS and then save as UTF-8.
|
||||
|
||||
The <a href="http://skew.org/xml/tutorial/">Skew.org link</a> does a great
|
||||
job covering the encoding issue.
|
||||
|
||||
The test file "utf8test.xml" is an XML containing English, Spanish, Russian,
|
||||
and Simplified Chinese. (Hopefully they are translated correctly). The file
|
||||
"utf8test.gif" is a screen capture of the XML file, rendered in IE. Note that
|
||||
if you don't have the correct fonts (Simplified Chinese or Russian) on your
|
||||
system, you won't see output that matches the GIF file even if you can parse
|
||||
it correctly. Also note that (at least on my Windows machine) console output
|
||||
is in a Western code page, so that Print() or printf() cannot correctly display
|
||||
the file. This is not a bug in TinyXML - just an OS issue. No data is lost or
|
||||
destroyed by TinyXML. The console just doesn't render UTF-8.
|
||||
|
||||
|
||||
<h3> Entities </h3>
|
||||
TinyXML recognizes the pre-defined "character entities", meaning special
|
||||
characters. Namely:
|
||||
|
||||
@verbatim
|
||||
& &
|
||||
< <
|
||||
> >
|
||||
" "
|
||||
' '
|
||||
@endverbatim
|
||||
|
||||
These are recognized when the XML document is read, and translated to there
|
||||
UTF-8 equivalents. For instance, text with the XML of:
|
||||
|
||||
@verbatim
|
||||
Far & Away
|
||||
@endverbatim
|
||||
|
||||
will have the Value() of "Far & Away" when queried from the TiXmlText object,
|
||||
and will be written back to the XML stream/file as an ampersand. Older versions
|
||||
of TinyXML "preserved" character entities, but the newer versions will translate
|
||||
them into characters.
|
||||
|
||||
Additionally, any character can be specified by its Unicode code point:
|
||||
The syntax " " or " " are both to the non-breaking space characher.
|
||||
|
||||
<h3> Printing </h3>
|
||||
TinyXML can print output in several different ways that all have strengths and limitations.
|
||||
|
||||
- Print( FILE* ). Output to a std-C stream, which includes all C files as well as stdout.
|
||||
- "Pretty prints", but you don't have control over printing options.
|
||||
- The output is streamed directly to the FILE object, so there is no memory overhead
|
||||
in the TinyXML code.
|
||||
- used by Print() and SaveFile()
|
||||
|
||||
- operator<<. Output to a c++ stream.
|
||||
- Integrates with standart C++ iostreams.
|
||||
- Outputs in "network printing" mode without line breaks. Good for network transmission
|
||||
and moving XML between C++ objects, but hard for a human to read.
|
||||
|
||||
- TiXmlPrinter. Output to a std::string or memory buffer.
|
||||
- API is less concise
|
||||
- Future printing options will be put here.
|
||||
- Printing may change slightly in future versions as it is refined and expanded.
|
||||
|
||||
<h3> Streams </h3>
|
||||
With TIXML_USE_STL on TinyXML supports C++ streams (operator <<,>>) streams as well
|
||||
as C (FILE*) streams. There are some differences that you may need to be aware of.
|
||||
|
||||
C style output:
|
||||
- based on FILE*
|
||||
- the Print() and SaveFile() methods
|
||||
|
||||
Generates formatted output, with plenty of white space, intended to be as
|
||||
human-readable as possible. They are very fast, and tolerant of ill formed
|
||||
XML documents. For example, an XML document that contains 2 root elements
|
||||
and 2 declarations, will still print.
|
||||
|
||||
C style input:
|
||||
- based on FILE*
|
||||
- the Parse() and LoadFile() methods
|
||||
|
||||
A fast, tolerant read. Use whenever you don't need the C++ streams.
|
||||
|
||||
C++ style output:
|
||||
- based on std::ostream
|
||||
- operator<<
|
||||
|
||||
Generates condensed output, intended for network transmission rather than
|
||||
readability. Depending on your system's implementation of the ostream class,
|
||||
these may be somewhat slower. (Or may not.) Not tolerant of ill formed XML:
|
||||
a document should contain the correct one root element. Additional root level
|
||||
elements will not be streamed out.
|
||||
|
||||
C++ style input:
|
||||
- based on std::istream
|
||||
- operator>>
|
||||
|
||||
Reads XML from a stream, making it useful for network transmission. The tricky
|
||||
part is knowing when the XML document is complete, since there will almost
|
||||
certainly be other data in the stream. TinyXML will assume the XML data is
|
||||
complete after it reads the root element. Put another way, documents that
|
||||
are ill-constructed with more than one root element will not read correctly.
|
||||
Also note that operator>> is somewhat slower than Parse, due to both
|
||||
implementation of the STL and limitations of TinyXML.
|
||||
|
||||
<h3> White space </h3>
|
||||
The world simply does not agree on whether white space should be kept, or condensed.
|
||||
For example, pretend the '_' is a space, and look at "Hello____world". HTML, and
|
||||
at least some XML parsers, will interpret this as "Hello_world". They condense white
|
||||
space. Some XML parsers do not, and will leave it as "Hello____world". (Remember
|
||||
to keep pretending the _ is a space.) Others suggest that __Hello___world__ should become
|
||||
Hello___world.
|
||||
|
||||
It's an issue that hasn't been resolved to my satisfaction. TinyXML supports the
|
||||
first 2 approaches. Call TiXmlBase::SetCondenseWhiteSpace( bool ) to set the desired behavior.
|
||||
The default is to condense white space.
|
||||
|
||||
If you change the default, you should call TiXmlBase::SetCondenseWhiteSpace( bool )
|
||||
before making any calls to Parse XML data, and I don't recommend changing it after
|
||||
it has been set.
|
||||
|
||||
|
||||
<h3> Handles </h3>
|
||||
|
||||
Where browsing an XML document in a robust way, it is important to check
|
||||
for null returns from method calls. An error safe implementation can
|
||||
generate a lot of code like:
|
||||
|
||||
@verbatim
|
||||
TiXmlElement* root = document.FirstChildElement( "Document" );
|
||||
if ( root )
|
||||
{
|
||||
TiXmlElement* element = root->FirstChildElement( "Element" );
|
||||
if ( element )
|
||||
{
|
||||
TiXmlElement* child = element->FirstChildElement( "Child" );
|
||||
if ( child )
|
||||
{
|
||||
TiXmlElement* child2 = child->NextSiblingElement( "Child" );
|
||||
if ( child2 )
|
||||
{
|
||||
// Finally do something useful.
|
||||
@endverbatim
|
||||
|
||||
Handles have been introduced to clean this up. Using the TiXmlHandle class,
|
||||
the previous code reduces to:
|
||||
|
||||
@verbatim
|
||||
TiXmlHandle docHandle( &document );
|
||||
TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).ToElement();
|
||||
if ( child2 )
|
||||
{
|
||||
// do something useful
|
||||
@endverbatim
|
||||
|
||||
Which is much easier to deal with. See TiXmlHandle for more information.
|
||||
|
||||
|
||||
<h3> Row and Column tracking </h3>
|
||||
Being able to track nodes and attributes back to their origin location
|
||||
in source files can be very important for some applications. Additionally,
|
||||
knowing where parsing errors occured in the original source can be very
|
||||
time saving.
|
||||
|
||||
TinyXML can tracks the row and column origin of all nodes and attributes
|
||||
in a text file. The TiXmlBase::Row() and TiXmlBase::Column() methods return
|
||||
the origin of the node in the source text. The correct tabs can be
|
||||
configured in TiXmlDocument::SetTabSize().
|
||||
|
||||
|
||||
<h2> Using and Installing </h2>
|
||||
|
||||
To Compile and Run xmltest:
|
||||
|
||||
A Linux Makefile and a Windows Visual C++ .dsw file is provided.
|
||||
Simply compile and run. It will write the file demotest.xml to your
|
||||
disk and generate output on the screen. It also tests walking the
|
||||
DOM by printing out the number of nodes found using different
|
||||
techniques.
|
||||
|
||||
The Linux makefile is very generic and runs on many systems - it
|
||||
is currently tested on mingw and
|
||||
MacOSX. You do not need to run 'make depend'. The dependecies have been
|
||||
hard coded.
|
||||
|
||||
<h3>Windows project file for VC6</h3>
|
||||
<ul>
|
||||
<li>tinyxml: tinyxml library, non-STL </li>
|
||||
<li>tinyxmlSTL: tinyxml library, STL </li>
|
||||
<li>tinyXmlTest: test app, non-STL </li>
|
||||
<li>tinyXmlTestSTL: test app, STL </li>
|
||||
</ul>
|
||||
|
||||
<h3>Makefile</h3>
|
||||
At the top of the makefile you can set:
|
||||
|
||||
PROFILE, DEBUG, and TINYXML_USE_STL. Details (such that they are) are in
|
||||
the makefile.
|
||||
|
||||
In the tinyxml directory, type "make clean" then "make". The executable
|
||||
file 'xmltest' will be created.
|
||||
|
||||
|
||||
|
||||
<h3>To Use in an Application:</h3>
|
||||
|
||||
Add tinyxml.cpp, tinyxml.h, tinyxmlerror.cpp, tinyxmlparser.cpp, tinystr.cpp, and tinystr.h to your
|
||||
project or make file. That's it! It should compile on any reasonably
|
||||
compliant C++ system. You do not need to enable exceptions or
|
||||
RTTI for TinyXML.
|
||||
|
||||
|
||||
<h2> How TinyXML works. </h2>
|
||||
|
||||
An example is probably the best way to go. Take:
|
||||
@verbatim
|
||||
<?xml version="1.0" standalone=no>
|
||||
<!-- Our to do list data -->
|
||||
<ToDo>
|
||||
<Item priority="1"> Go to the <bold>Toy store!</bold></Item>
|
||||
<Item priority="2"> Do bills</Item>
|
||||
</ToDo>
|
||||
@endverbatim
|
||||
|
||||
Its not much of a To Do list, but it will do. To read this file
|
||||
(say "demo.xml") you would create a document, and parse it in:
|
||||
@verbatim
|
||||
TiXmlDocument doc( "demo.xml" );
|
||||
doc.LoadFile();
|
||||
@endverbatim
|
||||
|
||||
And its ready to go. Now lets look at some lines and how they
|
||||
relate to the DOM.
|
||||
|
||||
@verbatim
|
||||
<?xml version="1.0" standalone=no>
|
||||
@endverbatim
|
||||
|
||||
The first line is a declaration, and gets turned into the
|
||||
TiXmlDeclaration class. It will be the first child of the
|
||||
document node.
|
||||
|
||||
This is the only directive/special tag parsed by by TinyXML.
|
||||
Generally directive tags are stored in TiXmlUnknown so the
|
||||
commands wont be lost when it is saved back to disk.
|
||||
|
||||
@verbatim
|
||||
<!-- Our to do list data -->
|
||||
@endverbatim
|
||||
|
||||
A comment. Will become a TiXmlComment object.
|
||||
|
||||
@verbatim
|
||||
<ToDo>
|
||||
@endverbatim
|
||||
|
||||
The "ToDo" tag defines a TiXmlElement object. This one does not have
|
||||
any attributes, but does contain 2 other elements.
|
||||
|
||||
@verbatim
|
||||
<Item priority="1">
|
||||
@endverbatim
|
||||
|
||||
Creates another TiXmlElement which is a child of the "ToDo" element.
|
||||
This element has 1 attribute, with the name "priority" and the value
|
||||
"1".
|
||||
|
||||
@verbatim
|
||||
Go to the
|
||||
@endverbatim
|
||||
|
||||
A TiXmlText. This is a leaf node and cannot contain other nodes.
|
||||
It is a child of the "Item" TiXmlElement.
|
||||
|
||||
@verbatim
|
||||
<bold>
|
||||
@endverbatim
|
||||
|
||||
|
||||
Another TiXmlElement, this one a child of the "Item" element.
|
||||
|
||||
Etc.
|
||||
|
||||
Looking at the entire object tree, you end up with:
|
||||
@verbatim
|
||||
TiXmlDocument "demo.xml"
|
||||
TiXmlDeclaration "version='1.0'" "standalone=no"
|
||||
TiXmlComment " Our to do list data"
|
||||
TiXmlElement "ToDo"
|
||||
TiXmlElement "Item" Attribtutes: priority = 1
|
||||
TiXmlText "Go to the "
|
||||
TiXmlElement "bold"
|
||||
TiXmlText "Toy store!"
|
||||
TiXmlElement "Item" Attributes: priority=2
|
||||
TiXmlText "Do bills"
|
||||
@endverbatim
|
||||
|
||||
<h2> Documentation </h2>
|
||||
|
||||
The documentation is build with Doxygen, using the 'dox'
|
||||
configuration file.
|
||||
|
||||
<h2> License </h2>
|
||||
|
||||
TinyXML is released under the zlib license:
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any
|
||||
damages arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any
|
||||
purpose, including commercial applications, and to alter it and
|
||||
redistribute it freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must
|
||||
not claim that you wrote the original software. If you use this
|
||||
software in a product, an acknowledgment in the product documentation
|
||||
would be appreciated but is not required.
|
||||
|
||||
2. Altered source versions must be plainly marked as such, and
|
||||
must not be misrepresented as being the original software.
|
||||
|
||||
3. This notice may not be removed or altered from any source
|
||||
distribution.
|
||||
|
||||
<h2> References </h2>
|
||||
|
||||
The World Wide Web Consortium is the definitive standard body for
|
||||
XML, and there web pages contain huge amounts of information.
|
||||
|
||||
The definitive spec: <a href="http://www.w3.org/TR/2004/REC-xml-20040204/">
|
||||
http://www.w3.org/TR/2004/REC-xml-20040204/</a>
|
||||
|
||||
I also recommend "XML Pocket Reference" by Robert Eckstein and published by
|
||||
OReilly...the book that got the whole thing started.
|
||||
|
||||
<h2> Contributors, Contacts, and a Brief History </h2>
|
||||
|
||||
Thanks very much to everyone who sends suggestions, bugs, ideas, and
|
||||
encouragement. It all helps, and makes this project fun. A special thanks
|
||||
to the contributors on the web pages that keep it lively.
|
||||
|
||||
So many people have sent in bugs and ideas, that rather than list here
|
||||
we try to give credit due in the "changes.txt" file.
|
||||
|
||||
TinyXML was originally written by Lee Thomason. (Often the "I" still
|
||||
in the documentation.) Lee reviews changes and releases new versions,
|
||||
with the help of Yves Berquin, Andrew Ellerton, and the tinyXml community.
|
||||
|
||||
We appreciate your suggestions, and would love to know if you
|
||||
use TinyXML. Hopefully you will enjoy it and find it useful.
|
||||
Please post questions, comments, file bugs, or contact us at:
|
||||
|
||||
www.sourceforge.net/projects/tinyxml
|
||||
|
||||
Lee Thomason, Yves Berquin, Andrew Ellerton
|
||||
*/
|
1150
osx/dialogxml/xml-parser/ticpp.cpp
Normal file
1150
osx/dialogxml/xml-parser/ticpp.cpp
Normal file
File diff suppressed because it is too large
Load Diff
1902
osx/dialogxml/xml-parser/ticpp.h
Normal file
1902
osx/dialogxml/xml-parser/ticpp.h
Normal file
File diff suppressed because it is too large
Load Diff
118
osx/dialogxml/xml-parser/ticpp.lua
Normal file
118
osx/dialogxml/xml-parser/ticpp.lua
Normal file
@@ -0,0 +1,118 @@
|
||||
--*****************************************************************************
|
||||
--* Author: RJP Computing <rjpcomputing@gmail.com>
|
||||
--* Date: 01/21/2008
|
||||
--* Version: 1.02
|
||||
--* Copyright (C) 2008 RJP Computing
|
||||
--*
|
||||
--* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
--* this software and associated documentation files (the "Software"), to deal in
|
||||
--* the Software without restriction, including without limitation the rights to
|
||||
--* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
--* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
--* subject to the following conditions:
|
||||
--*
|
||||
--* The above copyright notice and this permission notice shall be included in all
|
||||
--* copies or substantial portions of the Software.
|
||||
--*
|
||||
--* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
--* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
--* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
--* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
--* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
--* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
--*
|
||||
--* NOTES:
|
||||
--* - use the '/' slash for all paths.
|
||||
--*****************************************************************************
|
||||
|
||||
--******* Initial Setup ************
|
||||
--* Most of the setting are set here.
|
||||
--**********************************
|
||||
|
||||
-- Set the name of your package.
|
||||
package.name = "TiCPP"
|
||||
-- Set this if you want a different name for your target than the package's name.
|
||||
local targetName = "ticpp"
|
||||
-- Set the kind of package you want to create.
|
||||
if ( options["ticpp-shared"] ) then
|
||||
package.kind = "dll"
|
||||
else
|
||||
package.kind = "lib"
|
||||
end
|
||||
-- Set the files to include/exclude.
|
||||
package.files = { matchfiles( "*.cpp", "*.h" ) }
|
||||
package.excludes = { "xmltest.cpp" }
|
||||
-- Setup the output directory options.
|
||||
-- Note: Use 'libdir' for "lib" kind only.
|
||||
package.bindir = "../lib"
|
||||
package.libdir = "../lib"
|
||||
-- Set the defines.
|
||||
package.defines = { "TIXML_USE_TICPP" }
|
||||
|
||||
--------------------------- DO NOT EDIT BELOW ----------------------------------
|
||||
|
||||
--******* GENAERAL SETUP **********
|
||||
--* Settings that are not dependant
|
||||
--* on the operating system.
|
||||
--*********************************
|
||||
-- Package options
|
||||
addoption( "ticpp-shared", "Build the library as a dll" )
|
||||
|
||||
-- Common setup
|
||||
package.language = "c++"
|
||||
|
||||
-- Set object output directory.
|
||||
if ( string.find( target or "", ".*-gcc" ) or target == "gnu" ) then
|
||||
package.objdir = ".obj"
|
||||
end
|
||||
|
||||
-- Set the default targetName if none is specified.
|
||||
if ( string.len( targetName ) == 0 ) then
|
||||
targetName = package.name
|
||||
end
|
||||
|
||||
-- Set the targets.
|
||||
package.config["Release"].target = targetName
|
||||
package.config["Debug"].target = targetName.."d"
|
||||
|
||||
-- Set the build options.
|
||||
if ( options["dynamic-runtime"] ) then
|
||||
package.buildflags = { "extra-warnings" }
|
||||
package.config["Release"].buildflags = { "no-symbols", "optimize-speed" }
|
||||
else
|
||||
package.buildflags = { "static-runtime", "extra-warnings" }
|
||||
package.config["Release"].buildflags = { "no-symbols", "optimize-speed" }
|
||||
end
|
||||
if ( options["unicode"] ) then
|
||||
table.insert( package.buildflags, "unicode" )
|
||||
end
|
||||
if ( string.find( target or "", ".*-gcc" ) or target == "gnu" ) then
|
||||
table.insert( package.config["Debug"].buildoptions, "-O0" )
|
||||
end
|
||||
|
||||
-- Set the defines.
|
||||
if ( options["unicode"] ) then
|
||||
table.insert( package.defines, { "UNICODE", "_UNICODE" } )
|
||||
end
|
||||
table.insert( package.config["Debug"].defines, { "DEBUG", "_DEBUG" } )
|
||||
table.insert( package.config["Release"].defines, "NDEBUG" )
|
||||
if ( ( target == "vs2005" ) or ( target == "vs2008" ) ) then
|
||||
-- Windows and Visual C++ 2005/2008
|
||||
table.insert( package.defines, "_CRT_SECURE_NO_DEPRECATE" )
|
||||
end
|
||||
|
||||
if ( OS == "windows" ) then
|
||||
--******* WINDOWS SETUP ***********
|
||||
--* Settings that are Windows specific.
|
||||
--*********************************
|
||||
-- Set the Windows defines.
|
||||
table.insert( package.defines, { "WIN32", "_WINDOWS" } )
|
||||
else
|
||||
--******* LINUX SETUP *************
|
||||
--* Settings that are Linux specific.
|
||||
--*********************************
|
||||
-- Ignore resource files in Linux.
|
||||
table.insert( package.excludes, matchrecursive( "*.rc" ) )
|
||||
table.insert( package.buildoptions, "-fPIC" )
|
||||
end
|
||||
|
122
osx/dialogxml/xml-parser/ticpprc.h
Normal file
122
osx/dialogxml/xml-parser/ticpprc.h
Normal file
@@ -0,0 +1,122 @@
|
||||
/*
|
||||
http://code.google.com/p/ticpp/
|
||||
Copyright (c) 2006 Ryan Pusztai, Ryan Mulder
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifdef TIXML_USE_TICPP
|
||||
|
||||
#ifndef TICPPRC_INCLUDED
|
||||
#define TICPPRC_INCLUDED
|
||||
|
||||
#include <vector>
|
||||
|
||||
// Forward declare ticpp::Node, so it can be made a friend of TiCppRC
|
||||
namespace ticpp
|
||||
{
|
||||
class Base;
|
||||
}
|
||||
|
||||
// Forward declare TiCppRCImp so TiCppRC can hold a pointer to it
|
||||
class TiCppRCImp;
|
||||
|
||||
/**
|
||||
Base class for reference counting functionality
|
||||
*/
|
||||
class TiCppRC
|
||||
{
|
||||
// Allow ticpp::Node to directly modify reference count
|
||||
friend class ticpp::Base;
|
||||
|
||||
private:
|
||||
|
||||
TiCppRCImp* m_tiRC; /**< Pointer to reference counter */
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
Constructor
|
||||
Spawns new reference counter with a pointer to this
|
||||
*/
|
||||
TiCppRC();
|
||||
|
||||
/**
|
||||
Destructor
|
||||
Nullifies the pointer to this held by the reference counter
|
||||
Decrements reference count
|
||||
*/
|
||||
virtual ~TiCppRC();
|
||||
|
||||
std::vector< ticpp::Base* > m_spawnedWrappers; /**< Remember all wrappers that we've created with 'new' - ( e.g. NodeFactory, FirstChildElement, etc. )*/
|
||||
|
||||
/**
|
||||
Delete all container objects we've spawned with 'new'.
|
||||
*/
|
||||
void DeleteSpawnedWrappers();
|
||||
};
|
||||
|
||||
class TiCppRCImp
|
||||
{
|
||||
private:
|
||||
|
||||
int m_count; /**< Holds reference count to me, and to the node I point to */
|
||||
|
||||
TiCppRC* m_tiCppRC; /**< Holds pointer to an object inheriting TiCppRC */
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
Initializes m_tiCppRC pointer, and set reference count to 1
|
||||
*/
|
||||
TiCppRCImp( TiCppRC* tiCppRC );
|
||||
|
||||
/**
|
||||
Allows the TiCppRC object to set the pointer to itself ( m_tiCppRc ) to NULL when the TiCppRC object is deleted
|
||||
*/
|
||||
void Nullify();
|
||||
|
||||
/**
|
||||
Increment Reference Count
|
||||
*/
|
||||
void IncRef();
|
||||
|
||||
/**
|
||||
Decrement Reference Count
|
||||
*/
|
||||
void DecRef();
|
||||
|
||||
/**
|
||||
Set Reference Count to 1 - dangerous! - Use only if you are sure of the consequences
|
||||
*/
|
||||
void InitRef();
|
||||
|
||||
/**
|
||||
Get internal pointer to the TiCppRC object - not reference counted, use at your own risk
|
||||
*/
|
||||
TiCppRC* Get();
|
||||
|
||||
/**
|
||||
Returns state of internal pointer - will be null if the object was deleted
|
||||
*/
|
||||
bool IsNull();
|
||||
};
|
||||
|
||||
#endif // TICPP_INCLUDED
|
||||
|
||||
#endif // TIXML_USE_TICPP
|
116
osx/dialogxml/xml-parser/tinystr.cpp
Normal file
116
osx/dialogxml/xml-parser/tinystr.cpp
Normal file
@@ -0,0 +1,116 @@
|
||||
/*
|
||||
www.sourceforge.net/projects/tinyxml
|
||||
Original file by Yves Berquin.
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any
|
||||
damages arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any
|
||||
purpose, including commercial applications, and to alter it and
|
||||
redistribute it freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must
|
||||
not claim that you wrote the original software. If you use this
|
||||
software in a product, an acknowledgment in the product documentation
|
||||
would be appreciated but is not required.
|
||||
|
||||
2. Altered source versions must be plainly marked as such, and
|
||||
must not be misrepresented as being the original software.
|
||||
|
||||
3. This notice may not be removed or altered from any source
|
||||
distribution.
|
||||
*/
|
||||
|
||||
/*
|
||||
* THIS FILE WAS ALTERED BY Tyge L<>vset, 7. April 2005.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef TIXML_USE_STL
|
||||
|
||||
#include "tinystr.h"
|
||||
|
||||
// Error value for find primitive
|
||||
const TiXmlString::size_type TiXmlString::npos = static_cast< TiXmlString::size_type >(-1);
|
||||
|
||||
|
||||
// Null rep.
|
||||
TiXmlString::Rep TiXmlString::nullrep_ = { 0, 0, { '\0' } };
|
||||
|
||||
|
||||
void TiXmlString::reserve (size_type cap)
|
||||
{
|
||||
if (cap > capacity())
|
||||
{
|
||||
TiXmlString tmp;
|
||||
tmp.init(length(), cap);
|
||||
memcpy(tmp.start(), data(), length());
|
||||
swap(tmp);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
TiXmlString& TiXmlString::assign(const char* str, size_type len)
|
||||
{
|
||||
size_type cap = capacity();
|
||||
if (len > cap || cap > 3*(len + 8))
|
||||
{
|
||||
TiXmlString tmp;
|
||||
tmp.init(len);
|
||||
memcpy(tmp.start(), str, len);
|
||||
swap(tmp);
|
||||
}
|
||||
else
|
||||
{
|
||||
memmove(start(), str, len);
|
||||
set_size(len);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
TiXmlString& TiXmlString::append(const char* str, size_type len)
|
||||
{
|
||||
size_type newsize = length() + len;
|
||||
if (newsize > capacity())
|
||||
{
|
||||
reserve (newsize + capacity());
|
||||
}
|
||||
memmove(finish(), str, len);
|
||||
set_size(newsize);
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
TiXmlString operator + (const TiXmlString & a, const TiXmlString & b)
|
||||
{
|
||||
TiXmlString tmp;
|
||||
tmp.reserve(a.length() + b.length());
|
||||
tmp += a;
|
||||
tmp += b;
|
||||
return tmp;
|
||||
}
|
||||
|
||||
TiXmlString operator + (const TiXmlString & a, const char* b)
|
||||
{
|
||||
TiXmlString tmp;
|
||||
TiXmlString::size_type b_len = static_cast<TiXmlString::size_type>( strlen(b) );
|
||||
tmp.reserve(a.length() + b_len);
|
||||
tmp += a;
|
||||
tmp.append(b, b_len);
|
||||
return tmp;
|
||||
}
|
||||
|
||||
TiXmlString operator + (const char* a, const TiXmlString & b)
|
||||
{
|
||||
TiXmlString tmp;
|
||||
TiXmlString::size_type a_len = static_cast<TiXmlString::size_type>( strlen(a) );
|
||||
tmp.reserve(a_len + b.length());
|
||||
tmp.append(a, a_len);
|
||||
tmp += b;
|
||||
return tmp;
|
||||
}
|
||||
|
||||
|
||||
#endif // TIXML_USE_STL
|
319
osx/dialogxml/xml-parser/tinystr.h
Normal file
319
osx/dialogxml/xml-parser/tinystr.h
Normal file
@@ -0,0 +1,319 @@
|
||||
/*
|
||||
www.sourceforge.net/projects/tinyxml
|
||||
Original file by Yves Berquin.
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any
|
||||
damages arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any
|
||||
purpose, including commercial applications, and to alter it and
|
||||
redistribute it freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must
|
||||
not claim that you wrote the original software. If you use this
|
||||
software in a product, an acknowledgment in the product documentation
|
||||
would be appreciated but is not required.
|
||||
|
||||
2. Altered source versions must be plainly marked as such, and
|
||||
must not be misrepresented as being the original software.
|
||||
|
||||
3. This notice may not be removed or altered from any source
|
||||
distribution.
|
||||
*/
|
||||
|
||||
/*
|
||||
* THIS FILE WAS ALTERED BY Tyge Lovset, 7. April 2005.
|
||||
*
|
||||
* - completely rewritten. compact, clean, and fast implementation.
|
||||
* - sizeof(TiXmlString) = pointer size (4 bytes on 32-bit systems)
|
||||
* - fixed reserve() to work as per specification.
|
||||
* - fixed buggy compares operator==(), operator<(), and operator>()
|
||||
* - fixed operator+=() to take a const ref argument, following spec.
|
||||
* - added "copy" constructor with length, and most compare operators.
|
||||
* - added swap(), clear(), size(), capacity(), operator+().
|
||||
*/
|
||||
|
||||
#ifndef TIXML_USE_STL
|
||||
|
||||
#ifndef TIXML_STRING_INCLUDED
|
||||
#define TIXML_STRING_INCLUDED
|
||||
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
/* The support for explicit isn't that universal, and it isn't really
|
||||
required - it is used to check that the TiXmlString class isn't incorrectly
|
||||
used. Be nice to old compilers and macro it here:
|
||||
*/
|
||||
#if defined(_MSC_VER) && (_MSC_VER >= 1200 )
|
||||
// Microsoft visual studio, version 6 and higher.
|
||||
#define TIXML_EXPLICIT explicit
|
||||
#elif defined(__GNUC__) && (__GNUC__ >= 3 )
|
||||
// GCC version 3 and higher.s
|
||||
#define TIXML_EXPLICIT explicit
|
||||
#else
|
||||
#define TIXML_EXPLICIT
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
TiXmlString is an emulation of a subset of the std::string template.
|
||||
Its purpose is to allow compiling TinyXML on compilers with no or poor STL support.
|
||||
Only the member functions relevant to the TinyXML project have been implemented.
|
||||
The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase
|
||||
a string and there's no more room, we allocate a buffer twice as big as we need.
|
||||
*/
|
||||
class TiXmlString
|
||||
{
|
||||
public :
|
||||
// The size type used
|
||||
typedef size_t size_type;
|
||||
|
||||
// Error value for find primitive
|
||||
static const size_type npos; // = -1;
|
||||
|
||||
|
||||
// TiXmlString empty constructor
|
||||
TiXmlString () : rep_(&nullrep_)
|
||||
{
|
||||
}
|
||||
|
||||
// TiXmlString copy constructor
|
||||
TiXmlString ( const TiXmlString & copy) : rep_(0)
|
||||
{
|
||||
init(copy.length());
|
||||
memcpy(start(), copy.data(), length());
|
||||
}
|
||||
|
||||
// TiXmlString constructor, based on a string
|
||||
TIXML_EXPLICIT TiXmlString ( const char * copy) : rep_(0)
|
||||
{
|
||||
init( static_cast<size_type>( strlen(copy) ));
|
||||
memcpy(start(), copy, length());
|
||||
}
|
||||
|
||||
// TiXmlString constructor, based on a string
|
||||
TIXML_EXPLICIT TiXmlString ( const char * str, size_type len) : rep_(0)
|
||||
{
|
||||
init(len);
|
||||
memcpy(start(), str, len);
|
||||
}
|
||||
|
||||
// TiXmlString destructor
|
||||
~TiXmlString ()
|
||||
{
|
||||
quit();
|
||||
}
|
||||
|
||||
// = operator
|
||||
TiXmlString& operator = (const char * copy)
|
||||
{
|
||||
return assign( copy, (size_type)strlen(copy));
|
||||
}
|
||||
|
||||
// = operator
|
||||
TiXmlString& operator = (const TiXmlString & copy)
|
||||
{
|
||||
return assign(copy.start(), copy.length());
|
||||
}
|
||||
|
||||
|
||||
// += operator. Maps to append
|
||||
TiXmlString& operator += (const char * suffix)
|
||||
{
|
||||
return append(suffix, static_cast<size_type>( strlen(suffix) ));
|
||||
}
|
||||
|
||||
// += operator. Maps to append
|
||||
TiXmlString& operator += (char single)
|
||||
{
|
||||
return append(&single, 1);
|
||||
}
|
||||
|
||||
// += operator. Maps to append
|
||||
TiXmlString& operator += (const TiXmlString & suffix)
|
||||
{
|
||||
return append(suffix.data(), suffix.length());
|
||||
}
|
||||
|
||||
|
||||
// Convert a TiXmlString into a null-terminated char *
|
||||
const char * c_str () const { return rep_->str; }
|
||||
|
||||
// Convert a TiXmlString into a char * (need not be null terminated).
|
||||
const char * data () const { return rep_->str; }
|
||||
|
||||
// Return the length of a TiXmlString
|
||||
size_type length () const { return rep_->size; }
|
||||
|
||||
// Alias for length()
|
||||
size_type size () const { return rep_->size; }
|
||||
|
||||
// Checks if a TiXmlString is empty
|
||||
bool empty () const { return rep_->size == 0; }
|
||||
|
||||
// Return capacity of string
|
||||
size_type capacity () const { return rep_->capacity; }
|
||||
|
||||
|
||||
// single char extraction
|
||||
const char& at (size_type index) const
|
||||
{
|
||||
assert( index < length() );
|
||||
return rep_->str[ index ];
|
||||
}
|
||||
|
||||
// [] operator
|
||||
char& operator [] (size_type index) const
|
||||
{
|
||||
assert( index < length() );
|
||||
return rep_->str[ index ];
|
||||
}
|
||||
|
||||
// find a char in a string. Return TiXmlString::npos if not found
|
||||
size_type find (char lookup) const
|
||||
{
|
||||
return find(lookup, 0);
|
||||
}
|
||||
|
||||
// find a char in a string from an offset. Return TiXmlString::npos if not found
|
||||
size_type find (char tofind, size_type offset) const
|
||||
{
|
||||
if (offset >= length()) return npos;
|
||||
|
||||
for (const char* p = c_str() + offset; *p != '\0'; ++p)
|
||||
{
|
||||
if (*p == tofind) return static_cast< size_type >( p - c_str() );
|
||||
}
|
||||
return npos;
|
||||
}
|
||||
|
||||
void clear ()
|
||||
{
|
||||
//Lee:
|
||||
//The original was just too strange, though correct:
|
||||
// TiXmlString().swap(*this);
|
||||
//Instead use the quit & re-init:
|
||||
quit();
|
||||
init(0,0);
|
||||
}
|
||||
|
||||
/* Function to reserve a big amount of data when we know we'll need it. Be aware that this
|
||||
function DOES NOT clear the content of the TiXmlString if any exists.
|
||||
*/
|
||||
void reserve (size_type cap);
|
||||
|
||||
TiXmlString& assign (const char* str, size_type len);
|
||||
|
||||
TiXmlString& append (const char* str, size_type len);
|
||||
|
||||
void swap (TiXmlString& other)
|
||||
{
|
||||
Rep* r = rep_;
|
||||
rep_ = other.rep_;
|
||||
other.rep_ = r;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
void init(size_type sz) { init(sz, sz); }
|
||||
void set_size(size_type sz) { rep_->str[ rep_->size = sz ] = '\0'; }
|
||||
char* start() const { return rep_->str; }
|
||||
char* finish() const { return rep_->str + rep_->size; }
|
||||
|
||||
struct Rep
|
||||
{
|
||||
size_type size, capacity;
|
||||
char str[1];
|
||||
};
|
||||
|
||||
void init(size_type sz, size_type cap)
|
||||
{
|
||||
if (cap)
|
||||
{
|
||||
// Lee: the original form:
|
||||
// rep_ = static_cast<Rep*>(operator new(sizeof(Rep) + cap));
|
||||
// doesn't work in some cases of new being overloaded. Switching
|
||||
// to the normal allocation, although use an 'int' for systems
|
||||
// that are overly picky about structure alignment.
|
||||
const size_type bytesNeeded = sizeof(Rep) + cap;
|
||||
const size_type intsNeeded = ( bytesNeeded + sizeof(int) - 1 ) / sizeof( int );
|
||||
rep_ = reinterpret_cast<Rep*>( new int[ intsNeeded ] );
|
||||
|
||||
rep_->str[ rep_->size = sz ] = '\0';
|
||||
rep_->capacity = cap;
|
||||
}
|
||||
else
|
||||
{
|
||||
rep_ = &nullrep_;
|
||||
}
|
||||
}
|
||||
|
||||
void quit()
|
||||
{
|
||||
if (rep_ != &nullrep_)
|
||||
{
|
||||
// The rep_ is really an array of ints. (see the allocator, above).
|
||||
// Cast it back before delete, so the compiler won't incorrectly call destructors.
|
||||
delete [] ( reinterpret_cast<int*>( rep_ ) );
|
||||
}
|
||||
}
|
||||
|
||||
Rep * rep_;
|
||||
static Rep nullrep_;
|
||||
|
||||
} ;
|
||||
|
||||
|
||||
inline bool operator == (const TiXmlString & a, const TiXmlString & b)
|
||||
{
|
||||
return ( a.length() == b.length() ) // optimization on some platforms
|
||||
&& ( strcmp(a.c_str(), b.c_str()) == 0 ); // actual compare
|
||||
}
|
||||
inline bool operator < (const TiXmlString & a, const TiXmlString & b)
|
||||
{
|
||||
return strcmp(a.c_str(), b.c_str()) < 0;
|
||||
}
|
||||
|
||||
inline bool operator != (const TiXmlString & a, const TiXmlString & b) { return !(a == b); }
|
||||
inline bool operator > (const TiXmlString & a, const TiXmlString & b) { return b < a; }
|
||||
inline bool operator <= (const TiXmlString & a, const TiXmlString & b) { return !(b < a); }
|
||||
inline bool operator >= (const TiXmlString & a, const TiXmlString & b) { return !(a < b); }
|
||||
|
||||
inline bool operator == (const TiXmlString & a, const char* b) { return strcmp(a.c_str(), b) == 0; }
|
||||
inline bool operator == (const char* a, const TiXmlString & b) { return b == a; }
|
||||
inline bool operator != (const TiXmlString & a, const char* b) { return !(a == b); }
|
||||
inline bool operator != (const char* a, const TiXmlString & b) { return !(b == a); }
|
||||
|
||||
TiXmlString operator + (const TiXmlString & a, const TiXmlString & b);
|
||||
TiXmlString operator + (const TiXmlString & a, const char* b);
|
||||
TiXmlString operator + (const char* a, const TiXmlString & b);
|
||||
|
||||
|
||||
/*
|
||||
TiXmlOutStream is an emulation of std::ostream. It is based on TiXmlString.
|
||||
Only the operators that we need for TinyXML have been developped.
|
||||
*/
|
||||
class TiXmlOutStream : public TiXmlString
|
||||
{
|
||||
public :
|
||||
|
||||
// TiXmlOutStream << operator.
|
||||
TiXmlOutStream & operator << (const TiXmlString & in)
|
||||
{
|
||||
*this += in;
|
||||
return *this;
|
||||
}
|
||||
|
||||
// TiXmlOutStream << operator.
|
||||
TiXmlOutStream & operator << (const char * in)
|
||||
{
|
||||
*this += in;
|
||||
return *this;
|
||||
}
|
||||
|
||||
} ;
|
||||
|
||||
#endif // TIXML_STRING_INCLUDED
|
||||
#endif // TIXML_USE_STL
|
1961
osx/dialogxml/xml-parser/tinyxml.cpp
Normal file
1961
osx/dialogxml/xml-parser/tinyxml.cpp
Normal file
File diff suppressed because it is too large
Load Diff
1883
osx/dialogxml/xml-parser/tinyxml.h
Normal file
1883
osx/dialogxml/xml-parser/tinyxml.h
Normal file
File diff suppressed because it is too large
Load Diff
53
osx/dialogxml/xml-parser/tinyxmlerror.cpp
Normal file
53
osx/dialogxml/xml-parser/tinyxmlerror.cpp
Normal file
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
www.sourceforge.net/projects/tinyxml
|
||||
Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com)
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any
|
||||
damages arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any
|
||||
purpose, including commercial applications, and to alter it and
|
||||
redistribute it freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must
|
||||
not claim that you wrote the original software. If you use this
|
||||
software in a product, an acknowledgment in the product documentation
|
||||
would be appreciated but is not required.
|
||||
|
||||
2. Altered source versions must be plainly marked as such, and
|
||||
must not be misrepresented as being the original software.
|
||||
|
||||
3. This notice may not be removed or altered from any source
|
||||
distribution.
|
||||
*/
|
||||
|
||||
#include "tinyxml.h"
|
||||
|
||||
// The goal of the seperate error file is to make the first
|
||||
// step towards localization. tinyxml (currently) only supports
|
||||
// english error messages, but the could now be translated.
|
||||
//
|
||||
// It also cleans up the code a bit.
|
||||
//
|
||||
|
||||
const char* TiXmlBase::errorString[ TIXML_ERROR_STRING_COUNT ] =
|
||||
{
|
||||
"No error",
|
||||
"Error",
|
||||
"Failed to open file",
|
||||
"Memory allocation failed.",
|
||||
"Error parsing Element.",
|
||||
"Failed to read Element name",
|
||||
"Error reading Element value.",
|
||||
"Error reading Attributes.",
|
||||
"Error: empty tag.",
|
||||
"Error reading end tag.",
|
||||
"Error parsing Unknown.",
|
||||
"Error parsing Comment.",
|
||||
"Error parsing Declaration.",
|
||||
"Error document empty.",
|
||||
"Error null (0) or unexpected EOF found in input stream.",
|
||||
"Error parsing CDATA.",
|
||||
"Error when TiXmlDocument added to document, because TiXmlDocument can only be at the root.",
|
||||
};
|
1722
osx/dialogxml/xml-parser/tinyxmlparser.cpp
Normal file
1722
osx/dialogxml/xml-parser/tinyxmlparser.cpp
Normal file
File diff suppressed because it is too large
Load Diff
835
osx/dialogxml/xml-parser/tutorial_gettingStarted.txt
Normal file
835
osx/dialogxml/xml-parser/tutorial_gettingStarted.txt
Normal file
@@ -0,0 +1,835 @@
|
||||
/** @page tutorial0 TinyXML Tutorial
|
||||
|
||||
<h1> What is this? </h1>
|
||||
|
||||
This tutorial has a few tips and suggestions on how to use TinyXML
|
||||
effectively.
|
||||
|
||||
I've also tried to include some C++ tips like how to convert strings to
|
||||
integers and vice versa. This isn't anything to do with TinyXML itself, but
|
||||
it may helpful for your project so I've put it in anyway.
|
||||
|
||||
If you don't know basic C++ concepts this tutorial won't be useful.
|
||||
Likewise if you don't know what a DOM is, look elsewhere first.
|
||||
|
||||
<h1> Before we start </h1>
|
||||
|
||||
Some example XML datasets/files will be used.
|
||||
|
||||
example1.xml:
|
||||
|
||||
@verbatim
|
||||
<?xml version="1.0" ?>
|
||||
<Hello>World</Hello>
|
||||
@endverbatim
|
||||
|
||||
example2.xml:
|
||||
|
||||
@verbatim
|
||||
<?xml version="1.0" ?>
|
||||
<poetry>
|
||||
<verse>
|
||||
Alas
|
||||
Great World
|
||||
Alas (again)
|
||||
</verse>
|
||||
</poetry>
|
||||
@endverbatim
|
||||
|
||||
example3.xml:
|
||||
|
||||
@verbatim
|
||||
<?xml version="1.0" ?>
|
||||
<shapes>
|
||||
<circle name="int-based" x="20" y="30" r="50" />
|
||||
<point name="float-based" x="3.5" y="52.1" />
|
||||
</shapes>
|
||||
@endverbatim
|
||||
|
||||
example4.xml
|
||||
|
||||
@verbatim
|
||||
<?xml version="1.0" ?>
|
||||
<MyApp>
|
||||
<!-- Settings for MyApp -->
|
||||
<Messages>
|
||||
<Welcome>Welcome to MyApp</Welcome>
|
||||
<Farewell>Thank you for using MyApp</Farewell>
|
||||
</Messages>
|
||||
<Windows>
|
||||
<Window name="MainFrame" x="5" y="15" w="400" h="250" />
|
||||
</Windows>
|
||||
<Connection ip="192.168.0.1" timeout="123.456000" />
|
||||
</MyApp>
|
||||
@endverbatim
|
||||
|
||||
<h1> Getting Started </h1>
|
||||
|
||||
<h2> Load XML from a file </h2>
|
||||
|
||||
The simplest way to load a file into a TinyXML DOM is:
|
||||
|
||||
@verbatim
|
||||
TiXmlDocument doc( "demo.xml" );
|
||||
doc.LoadFile();
|
||||
@endverbatim
|
||||
|
||||
A more real-world usage is shown below. This will load the file and display
|
||||
the contents to STDOUT:
|
||||
|
||||
@verbatim
|
||||
// load the named file and dump its structure to STDOUT
|
||||
void dump_to_stdout(const char* pFilename)
|
||||
{
|
||||
TiXmlDocument doc(pFilename);
|
||||
bool loadOkay = doc.LoadFile();
|
||||
if (loadOkay)
|
||||
{
|
||||
printf("\n%s:\n", pFilename);
|
||||
dump_to_stdout( &doc ); // defined later in the tutorial
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Failed to load file \"%s\"\n", pFilename);
|
||||
}
|
||||
}
|
||||
@endverbatim
|
||||
|
||||
A simple demonstration of this function is to use a main like this:
|
||||
|
||||
@verbatim
|
||||
int main(void)
|
||||
{
|
||||
dump_to_stdout("example1.xml");
|
||||
return 0;
|
||||
}
|
||||
@endverbatim
|
||||
|
||||
Recall that Example 1 XML is:
|
||||
|
||||
@verbatim
|
||||
<?xml version="1.0" ?>
|
||||
<Hello>World</Hello>
|
||||
@endverbatim
|
||||
|
||||
Running the program with this XML will display this in the console/DOS window:
|
||||
|
||||
@verbatim
|
||||
DOCUMENT
|
||||
+ DECLARATION
|
||||
+ ELEMENT Hello
|
||||
+ TEXT[World]
|
||||
@endverbatim
|
||||
|
||||
|
||||
The ``dump_to_stdout`` function is defined later in this tutorial and is
|
||||
useful if you want to understand recursive traversal of a DOM.
|
||||
|
||||
<h2> Building Documents Programatically </h2>
|
||||
|
||||
|
||||
This is how to build Example 1 pragmatically:
|
||||
|
||||
@verbatim
|
||||
void build_simple_doc( )
|
||||
{
|
||||
// Make xml: <?xml ..><Hello>World</Hello>
|
||||
TiXmlDocument doc;
|
||||
TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0", "", "" );
|
||||
TiXmlElement * element = new TiXmlElement( "Hello" );
|
||||
TiXmlText * text = new TiXmlText( "World" );
|
||||
element->LinkEndChild( text );
|
||||
doc.LinkEndChild( decl );
|
||||
doc.LinkEndChild( element );
|
||||
doc.SaveFile( "madeByHand.xml" );
|
||||
}
|
||||
@endverbatim
|
||||
|
||||
This can be loaded and displayed on the console with:
|
||||
|
||||
@verbatim
|
||||
dump_to_stdout("madeByHand.xml"); // this func defined later in the tutorial
|
||||
@endverbatim
|
||||
|
||||
and you'll see it is identical to Example 1:
|
||||
|
||||
@verbatim
|
||||
madeByHand.xml:
|
||||
Document
|
||||
+ Declaration
|
||||
+ Element [Hello]
|
||||
+ Text: [World]
|
||||
@endverbatim
|
||||
|
||||
This code produces exactly the same XML DOM but it shows a different ordering
|
||||
to node creation and linking:
|
||||
|
||||
@verbatim
|
||||
void write_simple_doc2( )
|
||||
{
|
||||
// same as write_simple_doc1 but add each node
|
||||
// as early as possible into the tree.
|
||||
|
||||
TiXmlDocument doc;
|
||||
TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0", "", "" );
|
||||
doc.LinkEndChild( decl );
|
||||
|
||||
TiXmlElement * element = new TiXmlElement( "Hello" );
|
||||
doc.LinkEndChild( element );
|
||||
|
||||
TiXmlText * text = new TiXmlText( "World" );
|
||||
element->LinkEndChild( text );
|
||||
|
||||
doc.SaveFile( "madeByHand2.xml" );
|
||||
}
|
||||
@endverbatim
|
||||
|
||||
Both of these produce the same XML, namely:
|
||||
|
||||
@verbatim
|
||||
<?xml version="1.0" ?>
|
||||
<Hello>World</Hello>
|
||||
@endverbatim
|
||||
|
||||
Or in structure form:
|
||||
|
||||
@verbatim
|
||||
DOCUMENT
|
||||
+ DECLARATION
|
||||
+ ELEMENT Hello
|
||||
+ TEXT[World]
|
||||
@endverbatim
|
||||
|
||||
|
||||
<h2> Attributes </h2>
|
||||
|
||||
Given an existing node, settings attributes is easy:
|
||||
|
||||
@verbatim
|
||||
window = new TiXmlElement( "Demo" );
|
||||
window->SetAttribute("name", "Circle");
|
||||
window->SetAttribute("x", 5);
|
||||
window->SetAttribute("y", 15);
|
||||
window->SetDoubleAttribute("radius", 3.14159);
|
||||
@endverbatim
|
||||
|
||||
You can it also work with the TiXmlAttribute objects if you want.
|
||||
|
||||
The following code shows one way (not the only way) to get all attributes of an
|
||||
element, print the name and string value, and if the value can be converted
|
||||
to an integer or double, print that value too:
|
||||
|
||||
@verbatim
|
||||
// print all attributes of pElement.
|
||||
// returns the number of attributes printed
|
||||
int dump_attribs_to_stdout(TiXmlElement* pElement, unsigned int indent)
|
||||
{
|
||||
if ( !pElement ) return 0;
|
||||
|
||||
TiXmlAttribute* pAttrib=pElement->FirstAttribute();
|
||||
int i=0;
|
||||
int ival;
|
||||
double dval;
|
||||
const char* pIndent=getIndent(indent);
|
||||
printf("\n");
|
||||
while (pAttrib)
|
||||
{
|
||||
printf( "%s%s: value=[%s]", pIndent, pAttrib->Name(), pAttrib->Value());
|
||||
|
||||
if (pAttrib->QueryIntValue(&ival)==TIXML_SUCCESS) printf( " int=%d", ival);
|
||||
if (pAttrib->QueryDoubleValue(&dval)==TIXML_SUCCESS) printf( " d=%1.1f", dval);
|
||||
printf( "\n" );
|
||||
i++;
|
||||
pAttrib=pAttrib->Next();
|
||||
}
|
||||
return i;
|
||||
}
|
||||
@endverbatim
|
||||
|
||||
<h2> Writing a document to a file </h2>
|
||||
|
||||
Writing a pre-built DOM to a file is trivial:
|
||||
|
||||
@verbatim
|
||||
doc.SaveFile( saveFilename );
|
||||
@endverbatim
|
||||
|
||||
Recall, for example, example 4:
|
||||
|
||||
@verbatim
|
||||
<?xml version="1.0" ?>
|
||||
<MyApp>
|
||||
<!-- Settings for MyApp -->
|
||||
<Messages>
|
||||
<Welcome>Welcome to MyApp</Welcome>
|
||||
<Farewell>Thank you for using MyApp</Farewell>
|
||||
</Messages>
|
||||
<Windows>
|
||||
<Window name="MainFrame" x="5" y="15" w="400" h="250" />
|
||||
</Windows>
|
||||
<Connection ip="192.168.0.1" timeout="123.456000" />
|
||||
</MyApp>
|
||||
@endverbatim
|
||||
|
||||
The following function builds this DOM and writes the file "appsettings.xml":
|
||||
|
||||
@verbatim
|
||||
void write_app_settings_doc( )
|
||||
{
|
||||
TiXmlDocument doc;
|
||||
TiXmlElement* msg;
|
||||
TiXmlDeclaration* decl = new TiXmlDeclaration( "1.0", "", "" );
|
||||
doc.LinkEndChild( decl );
|
||||
|
||||
TiXmlElement * root = new TiXmlElement( "MyApp" );
|
||||
doc.LinkEndChild( root );
|
||||
|
||||
TiXmlComment * comment = new TiXmlComment();
|
||||
comment->SetValue(" Settings for MyApp " );
|
||||
root->LinkEndChild( comment );
|
||||
|
||||
TiXmlElement * msgs = new TiXmlElement( "Messages" );
|
||||
root->LinkEndChild( msgs );
|
||||
|
||||
msg = new TiXmlElement( "Welcome" );
|
||||
msg->LinkEndChild( new TiXmlText( "Welcome to MyApp" ));
|
||||
msgs->LinkEndChild( msg );
|
||||
|
||||
msg = new TiXmlElement( "Farewell" );
|
||||
msg->LinkEndChild( new TiXmlText( "Thank you for using MyApp" ));
|
||||
msgs->LinkEndChild( msg );
|
||||
|
||||
TiXmlElement * windows = new TiXmlElement( "Windows" );
|
||||
root->LinkEndChild( windows );
|
||||
|
||||
TiXmlElement * window;
|
||||
window = new TiXmlElement( "Window" );
|
||||
windows->LinkEndChild( window );
|
||||
window->SetAttribute("name", "MainFrame");
|
||||
window->SetAttribute("x", 5);
|
||||
window->SetAttribute("y", 15);
|
||||
window->SetAttribute("w", 400);
|
||||
window->SetAttribute("h", 250);
|
||||
|
||||
TiXmlElement * cxn = new TiXmlElement( "Connection" );
|
||||
root->LinkEndChild( cxn );
|
||||
cxn->SetAttribute("ip", "192.168.0.1");
|
||||
cxn->SetDoubleAttribute("timeout", 123.456); // floating point attrib
|
||||
|
||||
dump_to_stdout( &doc );
|
||||
doc.SaveFile( "appsettings.xml" );
|
||||
}
|
||||
@endverbatim
|
||||
|
||||
The dump_to_stdout function will show this structure:
|
||||
|
||||
@verbatim
|
||||
Document
|
||||
+ Declaration
|
||||
+ Element [MyApp]
|
||||
(No attributes)
|
||||
+ Comment: [ Settings for MyApp ]
|
||||
+ Element [Messages]
|
||||
(No attributes)
|
||||
+ Element [Welcome]
|
||||
(No attributes)
|
||||
+ Text: [Welcome to MyApp]
|
||||
+ Element [Farewell]
|
||||
(No attributes)
|
||||
+ Text: [Thank you for using MyApp]
|
||||
+ Element [Windows]
|
||||
(No attributes)
|
||||
+ Element [Window]
|
||||
+ name: value=[MainFrame]
|
||||
+ x: value=[5] int=5 d=5.0
|
||||
+ y: value=[15] int=15 d=15.0
|
||||
+ w: value=[400] int=400 d=400.0
|
||||
+ h: value=[250] int=250 d=250.0
|
||||
5 attributes
|
||||
+ Element [Connection]
|
||||
+ ip: value=[192.168.0.1] int=192 d=192.2
|
||||
+ timeout: value=[123.456000] int=123 d=123.5
|
||||
2 attributes
|
||||
@endverbatim
|
||||
|
||||
|
||||
I was surprised that TinyXml, by default, writes the XML in what other
|
||||
APIs call a "pretty" format - it modifies the whitespace of text of elements
|
||||
that contain other nodes so that writing the tree includes an indication of
|
||||
nesting level.
|
||||
|
||||
I haven't looked yet to see if there is a way to turn off indenting when
|
||||
writing a file - its bound to be easy.
|
||||
|
||||
[Lee: It's easy in STL mode, just use cout << myDoc. Non-STL mode is
|
||||
always in "pretty" format. Adding a switch would be a nice feature and
|
||||
has been requested.]
|
||||
|
||||
|
||||
<h1> XML to/from C++ objects </h1>
|
||||
|
||||
<h2> Intro </h2>
|
||||
|
||||
This example assumes you're loading and saving your app settings in an
|
||||
XML file, e.g. something like example4.xml.
|
||||
|
||||
There are a number of ways to do this. For example, look into the TinyBind
|
||||
project at http://sourceforge.net/projects/tinybind
|
||||
|
||||
This section shows a plain-old approach to loading and saving a basic object
|
||||
structure using XML.
|
||||
|
||||
<h2> Set up your object classes </h2>
|
||||
|
||||
Start off with some basic classes like these:
|
||||
|
||||
@verbatim
|
||||
#include <string>
|
||||
#include <map>
|
||||
using namespace std;
|
||||
|
||||
typedef std::map<std::string,std::string> MessageMap;
|
||||
|
||||
// a basic window abstraction - demo purposes only
|
||||
class WindowSettings
|
||||
{
|
||||
public:
|
||||
int x,y,w,h;
|
||||
string name;
|
||||
|
||||
WindowSettings()
|
||||
: x(0), y(0), w(100), h(100), name("Untitled")
|
||||
{
|
||||
}
|
||||
|
||||
WindowSettings(int x, int y, int w, int h, const string& name)
|
||||
{
|
||||
this->x=x;
|
||||
this->y=y;
|
||||
this->w=w;
|
||||
this->h=h;
|
||||
this->name=name;
|
||||
}
|
||||
};
|
||||
|
||||
class ConnectionSettings
|
||||
{
|
||||
public:
|
||||
string ip;
|
||||
double timeout;
|
||||
};
|
||||
|
||||
class AppSettings
|
||||
{
|
||||
public:
|
||||
string m_name;
|
||||
MessageMap m_messages;
|
||||
list<WindowSettings> m_windows;
|
||||
ConnectionSettings m_connection;
|
||||
|
||||
AppSettings() {}
|
||||
|
||||
void save(const char* pFilename);
|
||||
void load(const char* pFilename);
|
||||
|
||||
// just to show how to do it
|
||||
void setDemoValues()
|
||||
{
|
||||
m_name="MyApp";
|
||||
m_messages.clear();
|
||||
m_messages["Welcome"]="Welcome to "+m_name;
|
||||
m_messages["Farewell"]="Thank you for using "+m_name;
|
||||
m_windows.clear();
|
||||
m_windows.push_back(WindowSettings(15,15,400,250,"Main"));
|
||||
m_connection.ip="Unknown";
|
||||
m_connection.timeout=123.456;
|
||||
}
|
||||
};
|
||||
@endverbatim
|
||||
|
||||
This is a basic main() that shows how to create a default settings object tree,
|
||||
save it and load it again:
|
||||
|
||||
@verbatim
|
||||
int main(void)
|
||||
{
|
||||
AppSettings settings;
|
||||
|
||||
settings.save("appsettings2.xml");
|
||||
settings.load("appsettings2.xml");
|
||||
return 0;
|
||||
}
|
||||
@endverbatim
|
||||
|
||||
The following main() shows creation, modification, saving and then loading of a
|
||||
settings structure:
|
||||
|
||||
@verbatim
|
||||
int main(void)
|
||||
{
|
||||
// block: customise and save settings
|
||||
{
|
||||
AppSettings settings;
|
||||
settings.m_name="HitchHikerApp";
|
||||
settings.m_messages["Welcome"]="Don't Panic";
|
||||
settings.m_messages["Farewell"]="Thanks for all the fish";
|
||||
settings.m_windows.push_back(WindowSettings(15,25,300,250,"BookFrame"));
|
||||
settings.m_connection.ip="192.168.0.77";
|
||||
settings.m_connection.timeout=42.0;
|
||||
|
||||
settings.save("appsettings2.xml");
|
||||
}
|
||||
|
||||
// block: load settings
|
||||
{
|
||||
AppSettings settings;
|
||||
settings.load("appsettings2.xml");
|
||||
printf("%s: %s\n", settings.m_name.c_str(),
|
||||
settings.m_messages["Welcome"].c_str());
|
||||
WindowSettings & w=settings.m_windows.front();
|
||||
printf("%s: Show window '%s' at %d,%d (%d x %d)\n",
|
||||
settings.m_name.c_str(), w.name.c_str(), w.x, w.y, w.w, w.h);
|
||||
printf("%s: %s\n", settings.m_name.c_str(), settings.m_messages["Farewell"].c_str());
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@endverbatim
|
||||
|
||||
When the save() and load() are completed (see below), running this main()
|
||||
displays on the console:
|
||||
|
||||
@verbatim
|
||||
HitchHikerApp: Don't Panic
|
||||
HitchHikerApp: Show window 'BookFrame' at 15,25 (300 x 100)
|
||||
HitchHikerApp: Thanks for all the fish
|
||||
@endverbatim
|
||||
|
||||
<h2> Encode C++ state as XML </h2>
|
||||
|
||||
There are lots of different ways to approach saving this to a file.
|
||||
Here's one:
|
||||
|
||||
@verbatim
|
||||
void AppSettings::save(const char* pFilename)
|
||||
{
|
||||
TiXmlDocument doc;
|
||||
TiXmlElement* msg;
|
||||
TiXmlComment * comment;
|
||||
string s;
|
||||
TiXmlDeclaration* decl = new TiXmlDeclaration( "1.0", "", "" );
|
||||
doc.LinkEndChild( decl );
|
||||
|
||||
TiXmlElement * root = new TiXmlElement(m_name.c_str());
|
||||
doc.LinkEndChild( root );
|
||||
|
||||
comment = new TiXmlComment();
|
||||
s=" Settings for "+m_name+" ";
|
||||
comment->SetValue(s.c_str());
|
||||
root->LinkEndChild( comment );
|
||||
|
||||
// block: messages
|
||||
{
|
||||
MessageMap::iterator iter;
|
||||
|
||||
TiXmlElement * msgs = new TiXmlElement( "Messages" );
|
||||
root->LinkEndChild( msgs );
|
||||
|
||||
for (iter=m_messages.begin(); iter != m_messages.end(); iter++)
|
||||
{
|
||||
const string & key=(*iter).first;
|
||||
const string & value=(*iter).second;
|
||||
msg = new TiXmlElement(key.c_str());
|
||||
msg->LinkEndChild( new TiXmlText(value.c_str()));
|
||||
msgs->LinkEndChild( msg );
|
||||
}
|
||||
}
|
||||
|
||||
// block: windows
|
||||
{
|
||||
TiXmlElement * windowsNode = new TiXmlElement( "Windows" );
|
||||
root->LinkEndChild( windowsNode );
|
||||
|
||||
list<WindowSettings>::iterator iter;
|
||||
|
||||
for (iter=m_windows.begin(); iter != m_windows.end(); iter++)
|
||||
{
|
||||
const WindowSettings& w=*iter;
|
||||
|
||||
TiXmlElement * window;
|
||||
window = new TiXmlElement( "Window" );
|
||||
windowsNode->LinkEndChild( window );
|
||||
window->SetAttribute("name", w.name.c_str());
|
||||
window->SetAttribute("x", w.x);
|
||||
window->SetAttribute("y", w.y);
|
||||
window->SetAttribute("w", w.w);
|
||||
window->SetAttribute("h", w.h);
|
||||
}
|
||||
}
|
||||
|
||||
// block: connection
|
||||
{
|
||||
TiXmlElement * cxn = new TiXmlElement( "Connection" );
|
||||
root->LinkEndChild( cxn );
|
||||
cxn->SetAttribute("ip", m_connection.ip.c_str());
|
||||
cxn->SetDoubleAttribute("timeout", m_connection.timeout);
|
||||
}
|
||||
|
||||
doc.SaveFile(pFilename);
|
||||
}
|
||||
@endverbatim
|
||||
|
||||
Running this with the modified main produces this file:
|
||||
|
||||
@verbatim
|
||||
<?xml version="1.0" ?>
|
||||
<HitchHikerApp>
|
||||
<!-- Settings for HitchHikerApp -->
|
||||
<Messages>
|
||||
<Farewell>Thanks for all the fish</Farewell>
|
||||
<Welcome>Don't Panic</Welcome>
|
||||
</Messages>
|
||||
<Windows>
|
||||
<Window name="BookFrame" x="15" y="25" w="300" h="250" />
|
||||
</Windows>
|
||||
<Connection ip="192.168.0.77" timeout="42.000000" />
|
||||
</HitchHikerApp>
|
||||
@endverbatim
|
||||
|
||||
|
||||
<h2> Decoding state from XML </h2>
|
||||
|
||||
As with encoding objects, there are a number of approaches to decoding XML
|
||||
into your own C++ object structure. The following approach uses TiXmlHandles.
|
||||
|
||||
@verbatim
|
||||
void AppSettings::load(const char* pFilename)
|
||||
{
|
||||
TiXmlDocument doc(pFilename);
|
||||
if (!doc.LoadFile()) return;
|
||||
|
||||
TiXmlHandle hDoc(&doc);
|
||||
TiXmlElement* pElem;
|
||||
TiXmlHandle hRoot(0);
|
||||
|
||||
// block: name
|
||||
{
|
||||
pElem=hDoc.FirstChildElement().Element();
|
||||
// should always have a valid root but handle gracefully if it does
|
||||
if (!pElem) return;
|
||||
m_name=pElem->Value();
|
||||
|
||||
// save this for later
|
||||
hRoot=TiXmlHandle(pElem);
|
||||
}
|
||||
|
||||
// block: string table
|
||||
{
|
||||
m_messages.clear(); // trash existing table
|
||||
|
||||
pElem=hRoot.FirstChild( "Messages" ).FirstChild().Element();
|
||||
for( pElem; pElem; pElem=pElem->NextSiblingElement())
|
||||
{
|
||||
const char *pKey=pElem->Value();
|
||||
const char *pText=pElem->GetText();
|
||||
if (pKey && pText)
|
||||
{
|
||||
m_messages[pKey]=pText;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// block: windows
|
||||
{
|
||||
m_windows.clear(); // trash existing list
|
||||
|
||||
TiXmlElement* pWindowNode=hRoot.FirstChild( "Windows" ).FirstChild().Element();
|
||||
for( pWindowNode; pWindowNode; pWindowNode=pWindowNode->NextSiblingElement())
|
||||
{
|
||||
WindowSettings w;
|
||||
const char *pName=pWindowNode->Attribute("name");
|
||||
if (pName) w.name=pName;
|
||||
|
||||
pWindowNode->QueryIntAttribute("x", &w.x); // If this fails, original value is left as-is
|
||||
pWindowNode->QueryIntAttribute("y", &w.y);
|
||||
pWindowNode->QueryIntAttribute("w", &w.w);
|
||||
pWindowNode->QueryIntAttribute("hh", &w.h);
|
||||
|
||||
m_windows.push_back(w);
|
||||
}
|
||||
}
|
||||
|
||||
// block: connection
|
||||
{
|
||||
pElem=hRoot.FirstChild("Connection").Element();
|
||||
if (pElem)
|
||||
{
|
||||
m_connection.ip=pElem->Attribute("ip");
|
||||
pElem->QueryDoubleAttribute("timeout",&m_connection.timeout);
|
||||
}
|
||||
}
|
||||
}
|
||||
@endverbatim
|
||||
|
||||
<h1> Full listing for dump_to_stdout </h1>
|
||||
|
||||
Below is a copy-and-paste demo program for loading arbitrary XML files and
|
||||
dumping the structure to STDOUT using the recursive traversal listed above.
|
||||
|
||||
@verbatim
|
||||
// tutorial demo program
|
||||
#include "stdafx.h"
|
||||
#include "tinyxml.h"
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
// STDOUT dump and indenting utility functions
|
||||
// ----------------------------------------------------------------------
|
||||
const unsigned int NUM_INDENTS_PER_SPACE=2;
|
||||
|
||||
const char * getIndent( unsigned int numIndents )
|
||||
{
|
||||
static const char * pINDENT=" + ";
|
||||
static const unsigned int LENGTH=strlen( pINDENT );
|
||||
unsigned int n=numIndents*NUM_INDENTS_PER_SPACE;
|
||||
if ( n > LENGTH ) n = LENGTH;
|
||||
|
||||
return &pINDENT[ LENGTH-n ];
|
||||
}
|
||||
|
||||
// same as getIndent but no "+" at the end
|
||||
const char * getIndentAlt( unsigned int numIndents )
|
||||
{
|
||||
static const char * pINDENT=" ";
|
||||
static const unsigned int LENGTH=strlen( pINDENT );
|
||||
unsigned int n=numIndents*NUM_INDENTS_PER_SPACE;
|
||||
if ( n > LENGTH ) n = LENGTH;
|
||||
|
||||
return &pINDENT[ LENGTH-n ];
|
||||
}
|
||||
|
||||
int dump_attribs_to_stdout(TiXmlElement* pElement, unsigned int indent)
|
||||
{
|
||||
if ( !pElement ) return 0;
|
||||
|
||||
TiXmlAttribute* pAttrib=pElement->FirstAttribute();
|
||||
int i=0;
|
||||
int ival;
|
||||
double dval;
|
||||
const char* pIndent=getIndent(indent);
|
||||
printf("\n");
|
||||
while (pAttrib)
|
||||
{
|
||||
printf( "%s%s: value=[%s]", pIndent, pAttrib->Name(), pAttrib->Value());
|
||||
|
||||
if (pAttrib->QueryIntValue(&ival)==TIXML_SUCCESS) printf( " int=%d", ival);
|
||||
if (pAttrib->QueryDoubleValue(&dval)==TIXML_SUCCESS) printf( " d=%1.1f", dval);
|
||||
printf( "\n" );
|
||||
i++;
|
||||
pAttrib=pAttrib->Next();
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
void dump_to_stdout( TiXmlNode* pParent, unsigned int indent = 0 )
|
||||
{
|
||||
if ( !pParent ) return;
|
||||
|
||||
TiXmlNode* pChild;
|
||||
TiXmlText* pText;
|
||||
int t = pParent->Type();
|
||||
printf( "%s", getIndent(indent));
|
||||
int num;
|
||||
|
||||
switch ( t )
|
||||
{
|
||||
case TiXmlNode::DOCUMENT:
|
||||
printf( "Document" );
|
||||
break;
|
||||
|
||||
case TiXmlNode::ELEMENT:
|
||||
printf( "Element [%s]", pParent->Value() );
|
||||
num=dump_attribs_to_stdout(pParent->ToElement(), indent+1);
|
||||
switch(num)
|
||||
{
|
||||
case 0: printf( " (No attributes)"); break;
|
||||
case 1: printf( "%s1 attribute", getIndentAlt(indent)); break;
|
||||
default: printf( "%s%d attributes", getIndentAlt(indent), num); break;
|
||||
}
|
||||
break;
|
||||
|
||||
case TiXmlNode::COMMENT:
|
||||
printf( "Comment: [%s]", pParent->Value());
|
||||
break;
|
||||
|
||||
case TiXmlNode::UNKNOWN:
|
||||
printf( "Unknown" );
|
||||
break;
|
||||
|
||||
case TiXmlNode::TEXT:
|
||||
pText = pParent->ToText();
|
||||
printf( "Text: [%s]", pText->Value() );
|
||||
break;
|
||||
|
||||
case TiXmlNode::DECLARATION:
|
||||
printf( "Declaration" );
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
printf( "\n" );
|
||||
for ( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling())
|
||||
{
|
||||
dump_to_stdout( pChild, indent+1 );
|
||||
}
|
||||
}
|
||||
|
||||
// load the named file and dump its structure to STDOUT
|
||||
void dump_to_stdout(const char* pFilename)
|
||||
{
|
||||
TiXmlDocument doc(pFilename);
|
||||
bool loadOkay = doc.LoadFile();
|
||||
if (loadOkay)
|
||||
{
|
||||
printf("\n%s:\n", pFilename);
|
||||
dump_to_stdout( &doc ); // defined later in the tutorial
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Failed to load file \"%s\"\n", pFilename);
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
// main() for printing files named on the command line
|
||||
// ----------------------------------------------------------------------
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
for (int i=1; i<argc; i++)
|
||||
{
|
||||
dump_to_stdout(argv[i]);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@endverbatim
|
||||
|
||||
Run this from the command line or a DOS window, e.g.:
|
||||
|
||||
@verbatim
|
||||
C:\dev\tinyxml> Debug\tinyxml_1.exe example1.xml
|
||||
|
||||
example1.xml:
|
||||
Document
|
||||
+ Declaration
|
||||
+ Element [Hello]
|
||||
(No attributes)
|
||||
+ Text: [World]
|
||||
@endverbatim
|
||||
|
||||
<i> Authors and Changes
|
||||
<ul>
|
||||
<li> Written by Ellers, April, May, June 2005 </li>
|
||||
<li> Minor edits and integration into doc system, Lee Thomason September 2005 </li>
|
||||
<li> Updated by Ellers, October 2005 </li>
|
||||
</ul>
|
||||
</i>
|
||||
|
||||
*/
|
220
osx/dialogxml/xml-parser/tutorial_ticpp.txt
Normal file
220
osx/dialogxml/xml-parser/tutorial_ticpp.txt
Normal file
@@ -0,0 +1,220 @@
|
||||
/**
|
||||
@page ticppTutorial TinyXML++ Tutorial
|
||||
Take a look here @subpage ticpp
|
||||
|
||||
This is a work in progress.
|
||||
|
||||
|
||||
@page ticpp TinyXML++
|
||||
<h2> General Concepts </h2>
|
||||
The TinyXML++ classes are all wrappers around the corresponding classes within TinyXML.
|
||||
|
||||
There is no reason to create TinyXML++ objects on the heap, using @p new, because the memory is managed for you. If you choose
|
||||
to use @p new to create TinyXML++ objects, you will @b always need to use @p delete to clean up.
|
||||
|
||||
Basically, TinyXML++ objects are just wrappers around TinyXML pointers.
|
||||
|
||||
<h2> Goals </h2>
|
||||
- Simplify the use and interface of TinyXml, using C++ concepts.
|
||||
- Use exceptions for error handling, so there are no return codes to check
|
||||
- Use templates for automatic type conversion
|
||||
- Use STL style iterators to move through nodes and attributes
|
||||
|
||||
<h2> Details </h2>
|
||||
<h3> Use exceptions for error handling </h3>
|
||||
When using the original TinyXML, every function returns a value indicating
|
||||
success or failure. A programmer would have to check that value to ensure
|
||||
the function succeeded.
|
||||
|
||||
Example:
|
||||
@code
|
||||
// Load a document
|
||||
TiXmlDocument doc( pFilename );
|
||||
if ( !doc.LoadFile() ) return;
|
||||
|
||||
// Get a node
|
||||
TiXmlElement* pElem = doc.FirstChildElement();
|
||||
if ( !pElem ) return;
|
||||
|
||||
// Get the node we want
|
||||
pElem = pElem->NextSibling();
|
||||
if ( !pElem ) return;
|
||||
|
||||
// do something useful here
|
||||
@endcode
|
||||
|
||||
An alternative was to use TiXmlHandle, which allows for function chaining by
|
||||
checking the intermediate function return values:
|
||||
|
||||
Example:
|
||||
@code
|
||||
// Load a document
|
||||
TiXmlDocument doc(pFilename);
|
||||
if (!doc.LoadFile()) return;
|
||||
|
||||
// Make a document handle
|
||||
TiXmlHandle hDoc(&doc);
|
||||
|
||||
// Get an element by using the handle to chain calls
|
||||
// Note the conversion of the TiXmlHandle to the TiXmlElement* - .Element()
|
||||
TiXmlElement* pElem = hDoc.FirstChildElement().NextSibling().Element();
|
||||
if ( !pElem ) return;
|
||||
|
||||
// do something useful here
|
||||
@endcode
|
||||
|
||||
With TinyXML++, if there is an error during a function call, it throws an exception.
|
||||
This means that a programmer can assume that every function is successful, as
|
||||
long as the functions are enclosed in a try-catch block.
|
||||
|
||||
Example:
|
||||
@code
|
||||
try
|
||||
{
|
||||
// Load a document
|
||||
ticpp::Document doc( pFilename );
|
||||
doc.LoadFile();
|
||||
|
||||
// Get an element by chaining calls - no return values to check, no TiXmlHandle
|
||||
ticpp::Element* pElem = doc.FirstChildElement()->NextSibling();
|
||||
|
||||
// do something useful here
|
||||
}
|
||||
catch( ticpp::Exception& ex )
|
||||
{
|
||||
// If any function has an error, execution will enter here.
|
||||
// Report the error
|
||||
std::cout << ex.what();
|
||||
}
|
||||
@endcode
|
||||
|
||||
|
||||
<h3> Use templates for automatic type conversion </h3>
|
||||
When using TinyXML, a programmer either needs to convert values to and from
|
||||
strings, or choose from one of many overloads to get the value in the desired
|
||||
type.
|
||||
|
||||
Example:
|
||||
@code
|
||||
// Load a document
|
||||
TiXmlDocument doc( pFilename );
|
||||
if ( !doc.LoadFile() ) return;
|
||||
|
||||
// Get a node
|
||||
TiXmlElement* pElem = doc.FirstChildElement();
|
||||
if ( !pElem ) return;
|
||||
|
||||
// Get the node we want
|
||||
pElem = pElem->NextSibling();
|
||||
if ( !pElem ) return;
|
||||
|
||||
// Get the attribute as a string, convert to int
|
||||
const char* pszAttr = pElem->Attribute( "myAttribute" );
|
||||
int attr = atoi( pszAttr );
|
||||
|
||||
// Get the attribute as an int
|
||||
int attr2;
|
||||
if ( TIXML_SUCCESS != pElem->QueryIntAttribute( "myAttribute", &attr2 ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Get the attribute as a double
|
||||
double attr3;
|
||||
if ( TIXML_SUCCESS != pElem->QueryDoubleAttribute( "myAttribute", &attr3 ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Get the attribute as a float
|
||||
float attr4;
|
||||
if ( TIXML_SUCCESS != pElem->QueryFloatAttribute( "myAttribute", &attr4 ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
@endcode
|
||||
|
||||
TinyXML++ uses templates for automatic type conversion.
|
||||
|
||||
Example:
|
||||
@code
|
||||
try
|
||||
{
|
||||
// Load a document
|
||||
ticpp::Document doc( pFilename );
|
||||
doc.LoadFile();
|
||||
|
||||
// Get an element by chaining calls - no return values to check, no TiXmlHandle
|
||||
ticpp::Element* pElem = doc.FirstChildElement()->NextSibling();
|
||||
|
||||
// GetAttribute can determine the type of the pointer, and convert automatically
|
||||
|
||||
// Get the attribute as a string
|
||||
std::string attr;
|
||||
pElem->GetAttribute( "myAttribute", &attr );
|
||||
|
||||
// Get the attribute as an int
|
||||
int attr2;
|
||||
pElem->GetAttribute( "myAttribute", &attr2 );
|
||||
|
||||
// Get the attribute as an float
|
||||
float attr3;
|
||||
pElem->GetAttribute( "myAttribute", &attr3 );
|
||||
|
||||
// Get the attribute as an double
|
||||
double attr4;
|
||||
pElem->GetAttribute( "myAttribute", &attr4 );
|
||||
|
||||
// Get the attribute as an bool
|
||||
bool attr5;
|
||||
pElem->GetAttribute( "myAttribute", &attr5 );
|
||||
|
||||
}
|
||||
catch( ticpp::Exception& ex )
|
||||
{
|
||||
// If any function has an error, execution will enter here.
|
||||
// Report the error
|
||||
std::cout << ex.what();
|
||||
}
|
||||
@endcode
|
||||
<h3> Use STL style iterators to move through nodes and attributes </h3>
|
||||
TinyXML has two ways to iterate:
|
||||
|
||||
First Method:
|
||||
@code
|
||||
for( child = parent->FirstChild( false ); child; child = child->NextSibling( false ) )
|
||||
@endcode
|
||||
|
||||
Second Method:
|
||||
@code
|
||||
child = 0;
|
||||
while( child = parent->IterateChildren( child ) )
|
||||
@endcode
|
||||
|
||||
Although both methods work quite well, the syntax is not familiar.
|
||||
TinyXML++ introduces iterators:
|
||||
@code
|
||||
ticpp::Iterator< ticpp::Node > child;
|
||||
for ( child = child.begin( parent ); child != child.end(); child++ )
|
||||
@endcode
|
||||
|
||||
Iterators have the added advantage of filtering by type:
|
||||
@code
|
||||
// Only iterates through Comment nodes
|
||||
ticpp::Iterator< ticpp::Comment > child;
|
||||
for ( child = child.begin( parent ); child != child.end(); child++ )
|
||||
@endcode
|
||||
|
||||
@code
|
||||
// Only iterates through Element nodes with value "ElementValue"
|
||||
ticpp::Iterator< ticpp::Element > child( "ElementValue" );
|
||||
for ( child = child.begin( parent ); child != child.end(); child++ )
|
||||
@endcode
|
||||
|
||||
Finally, Iterators also work with Attributes
|
||||
@code
|
||||
ticpp::Iterator< ticpp::Attribute > attribute;
|
||||
for ( attribute = attribute.begin( element ); attribute != attribute.end(); attribute++ )
|
||||
@endcode
|
||||
|
||||
*/
|
1
rsrc/dialogs/.gitignore
vendored
Normal file
1
rsrc/dialogs/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
img/
|
Reference in New Issue
Block a user