@return true on success
*/
virtual bool write(const void* buffer, size_t size) = 0;
- virtual void newline();
virtual void flush();
virtual size_t bytesWritten() const = 0;
SkASSERT(text);
return this->write(text, strlen(text));
}
+
+ bool newline() { return this->write("\n", strlen("\n")); }
+
bool writeDecAsText(int32_t);
bool writeBigDecAsText(int64_t, int minDigits = 0);
bool writeHexAsText(uint32_t, int minDigits = 0);
typedef SkWStream INHERITED;
};
-
-class SK_API SkDebugWStream : public SkWStream {
-public:
- SkDebugWStream() : fBytesWritten(0) {}
-
- // overrides
- bool write(const void* buffer, size_t size) override;
- void newline() override;
- size_t bytesWritten() const override { return fBytesWritten; }
-
-private:
- size_t fBytesWritten;
- typedef SkWStream INHERITED;
-};
-
-// for now
-typedef SkFILEStream SkURLStream;
-
#endif
-
/*
* Copyright 2006 The Android Open Source Project
*
* found in the LICENSE file.
*/
-
#ifndef SkDOM_DEFINED
#define SkDOM_DEFINED
kElement_Type,
kText_Type
};
- Type getType(const Node*) const;
+ Type getType(const Node*) const;
const char* getName(const Node*) const;
const Node* getFirstChild(const Node*, const char elem[] = NULL) const;
bool findBool(const Node*, const char name[], bool*) const;
int findList(const Node*, const char name[], const char list[]) const;
- bool findScalar(const Node* node, const char name[], SkScalar value[]) const
- {
+ bool findScalar(const Node* node, const char name[], SkScalar value[]) const {
return this->findScalars(node, name, value, 1);
}
const Attr* fStop;
};
- SkDEBUGCODE(void dump(const Node* node = NULL, int tabLevel = 0) const;)
-
private:
SkChunkAlloc fAlloc;
Node* fRoot;
SkXMLStreamWriter(SkWStream*);
virtual ~SkXMLStreamWriter();
void writeHeader() override;
- SkDEBUGCODE(static void UnitTest();)
protected:
void onStartElementLen(const char elem[], size_t length) override;
{
}
-void SkWStream::newline()
-{
- this->write("\n", 1);
-}
-
void SkWStream::flush()
{
}
return stream.release();
}
-///////////////////////////////////////////////////////////////////////////////
-
-void SkDebugWStream::newline()
-{
-#if defined(SK_DEBUG)
- SkDebugf("\n");
- fBytesWritten++;
-#endif
-}
-
-bool SkDebugWStream::write(const void* buffer, size_t size)
-{
-#if defined(SK_DEBUG)
- char* s = new char[size+1];
- memcpy(s, buffer, size);
- s[size] = 0;
- SkDebugf("%s", s);
- delete[] s;
- fBytesWritten += size;
-#endif
- return true;
-}
-
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
-
static sk_sp<SkData> mmap_filename(const char path[]) {
FILE* file = sk_fopen(path, kRead_SkFILE_Flag);
if (nullptr == file) {
#include "SkDOM.h"
#include "SkStream.h"
+#include "SkXMLParser.h"
#include "SkXMLWriter.h"
-/////////////////////////////////////////////////////////////////////////
-
-#include "SkXMLParser.h"
-bool SkXMLParser::parse(const SkDOM& dom, const SkDOMNode* node)
-{
+bool SkXMLParser::parse(const SkDOM& dom, const SkDOMNode* node) {
const char* elemName = dom.getName(node);
- if (this->startElement(elemName))
+ if (this->startElement(elemName)) {
return false;
+ }
SkDOM::AttrIter iter(dom, node);
const char* name, *value;
- while ((name = iter.next(&value)) != nullptr)
- if (this->addAttribute(name, value))
+ while ((name = iter.next(&value)) != nullptr) {
+ if (this->addAttribute(name, value)) {
return false;
+ }
+ }
- if ((node = dom.getFirstChild(node)) != nullptr)
+ if ((node = dom.getFirstChild(node)) != nullptr) {
do {
- if (!this->parse(dom, node))
+ if (!this->parse(dom, node)) {
return false;
+ }
} while ((node = dom.getNextSibling(node)) != nullptr);
-
+ }
return !this->endElement(elemName);
}
uint8_t fType;
uint8_t fPad;
- const SkDOMAttr* attrs() const
- {
+ const SkDOMAttr* attrs() const {
return (const SkDOMAttr*)(this + 1);
}
- SkDOMAttr* attrs()
- {
+
+ SkDOMAttr* attrs() {
return (SkDOMAttr*)(this + 1);
}
};
#define kMinChunkSize 512
-SkDOM::SkDOM() : fAlloc(kMinChunkSize), fRoot(nullptr)
-{
-}
+SkDOM::SkDOM() : fAlloc(kMinChunkSize), fRoot(nullptr) {}
-SkDOM::~SkDOM()
-{
-}
+SkDOM::~SkDOM() {}
-const SkDOM::Node* SkDOM::getRootNode() const
-{
+const SkDOM::Node* SkDOM::getRootNode() const {
return fRoot;
}
-const SkDOM::Node* SkDOM::getFirstChild(const Node* node, const char name[]) const
-{
+const SkDOM::Node* SkDOM::getFirstChild(const Node* node, const char name[]) const {
SkASSERT(node);
const Node* child = node->fFirstChild;
- if (name)
- {
- for (; child != nullptr; child = child->fNextSibling)
- if (!strcmp(name, child->fName))
+ if (name) {
+ for (; child != nullptr; child = child->fNextSibling) {
+ if (!strcmp(name, child->fName)) {
break;
+ }
+ }
}
return child;
}
-const SkDOM::Node* SkDOM::getNextSibling(const Node* node, const char name[]) const
-{
+const SkDOM::Node* SkDOM::getNextSibling(const Node* node, const char name[]) const {
SkASSERT(node);
const Node* sibling = node->fNextSibling;
- if (name)
- {
- for (; sibling != nullptr; sibling = sibling->fNextSibling)
- if (!strcmp(name, sibling->fName))
+ if (name) {
+ for (; sibling != nullptr; sibling = sibling->fNextSibling) {
+ if (!strcmp(name, sibling->fName)) {
break;
+ }
+ }
}
return sibling;
}
-SkDOM::Type SkDOM::getType(const Node* node) const
-{
+SkDOM::Type SkDOM::getType(const Node* node) const {
SkASSERT(node);
return (Type)node->fType;
}
-const char* SkDOM::getName(const Node* node) const
-{
+const char* SkDOM::getName(const Node* node) const {
SkASSERT(node);
return node->fName;
}
-const char* SkDOM::findAttr(const Node* node, const char name[]) const
-{
+const char* SkDOM::findAttr(const Node* node, const char name[]) const {
SkASSERT(node);
const Attr* attr = node->attrs();
const Attr* stop = attr + node->fAttrCount;
- while (attr < stop)
- {
- if (!strcmp(attr->fName, name))
+ while (attr < stop) {
+ if (!strcmp(attr->fName, name)) {
return attr->fValue;
+ }
attr += 1;
}
return nullptr;
/////////////////////////////////////////////////////////////////////////////////////
-const SkDOM::Attr* SkDOM::getFirstAttr(const Node* node) const
-{
+const SkDOM::Attr* SkDOM::getFirstAttr(const Node* node) const {
return node->fAttrCount ? node->attrs() : nullptr;
}
-const SkDOM::Attr* SkDOM::getNextAttr(const Node* node, const Attr* attr) const
-{
+const SkDOM::Attr* SkDOM::getNextAttr(const Node* node, const Attr* attr) const {
SkASSERT(node);
- if (attr == nullptr)
+ if (attr == nullptr) {
return nullptr;
+ }
return (attr - node->attrs() + 1) < node->fAttrCount ? attr + 1 : nullptr;
}
-const char* SkDOM::getAttrName(const Node* node, const Attr* attr) const
-{
+const char* SkDOM::getAttrName(const Node* node, const Attr* attr) const {
SkASSERT(node);
SkASSERT(attr);
return attr->fName;
}
-const char* SkDOM::getAttrValue(const Node* node, const Attr* attr) const
-{
+const char* SkDOM::getAttrValue(const Node* node, const Attr* attr) const {
SkASSERT(node);
SkASSERT(attr);
return attr->fValue;
/////////////////////////////////////////////////////////////////////////////////////
-SkDOM::AttrIter::AttrIter(const SkDOM&, const SkDOM::Node* node)
-{
+SkDOM::AttrIter::AttrIter(const SkDOM&, const SkDOM::Node* node) {
SkASSERT(node);
fAttr = node->attrs();
fStop = fAttr + node->fAttrCount;
}
-const char* SkDOM::AttrIter::next(const char** value)
-{
+const char* SkDOM::AttrIter::next(const char** value) {
const char* name = nullptr;
- if (fAttr < fStop)
- {
+ if (fAttr < fStop) {
name = fAttr->fName;
if (value)
*value = fAttr->fValue;
#include "SkXMLParser.h"
#include "SkTDArray.h"
-static char* dupstr(SkChunkAlloc* chunk, const char src[])
-{
+static char* dupstr(SkChunkAlloc* chunk, const char src[]) {
SkASSERT(chunk && src);
size_t len = strlen(src);
char* dst = (char*)chunk->alloc(len + 1, SkChunkAlloc::kThrow_AllocFailType);
class SkDOMParser : public SkXMLParser {
public:
- SkDOMParser(SkChunkAlloc* chunk) : SkXMLParser(&fParserError), fAlloc(chunk)
- {
+ SkDOMParser(SkChunkAlloc* chunk) : SkXMLParser(&fParserError), fAlloc(chunk) {
fAlloc->reset();
fRoot = nullptr;
fLevel = 0;
SkXMLParserError fParserError;
protected:
- void flushAttributes()
- {
+ void flushAttributes() {
SkASSERT(fLevel > 0);
int attrCount = fAttrs.count();
node->fAttrCount = SkToU16(attrCount);
node->fType = fElemType;
- if (fRoot == nullptr)
- {
+ if (fRoot == nullptr) {
node->fNextSibling = nullptr;
fRoot = node;
- }
- else // this adds siblings in reverse order. gets corrected in onEndElement()
- {
+ } else { // this adds siblings in reverse order. gets corrected in onEndElement()
SkDOM::Node* parent = fParentStack.top();
SkASSERT(fRoot && parent);
node->fNextSibling = parent->fFirstChild;
SkDOM::Node* child = parent->fFirstChild;
SkDOM::Node* prev = nullptr;
- while (child)
- {
+ while (child) {
SkDOM::Node* next = child->fNextSibling;
child->fNextSibling = prev;
prev = child;
private:
void startCommon(const char elem[], SkDOM::Type type) {
- if (fLevel > 0 && fNeedToFlush)
+ if (fLevel > 0 && fNeedToFlush) {
this->flushAttributes();
-
+ }
fNeedToFlush = true;
fElemName = dupstr(fAlloc, elem);
fElemType = type;
///////////////////////////////////////////////////////////////////////////
-static void walk_dom(const SkDOM& dom, const SkDOM::Node* node, SkXMLParser* parser)
-{
+static void walk_dom(const SkDOM& dom, const SkDOM::Node* node, SkXMLParser* parser) {
const char* elem = dom.getName(node);
if (dom.getType(node) == SkDOM::kText_Type) {
SkASSERT(dom.countChildren(node) == 0);
parser->endElement(elem);
}
-const SkDOM::Node* SkDOM::copy(const SkDOM& dom, const SkDOM::Node* node)
-{
+const SkDOM::Node* SkDOM::copy(const SkDOM& dom, const SkDOM::Node* node) {
SkDOMParser parser(&fAlloc);
walk_dom(dom, node, &parser);
//////////////////////////////////////////////////////////////////////////
-int SkDOM::countChildren(const Node* node, const char elem[]) const
-{
+int SkDOM::countChildren(const Node* node, const char elem[]) const {
int count = 0;
node = this->getFirstChild(node, elem);
- while (node)
- {
+ while (node) {
count += 1;
node = this->getNextSibling(node, elem);
}
#include "SkParse.h"
-bool SkDOM::findS32(const Node* node, const char name[], int32_t* value) const
-{
+bool SkDOM::findS32(const Node* node, const char name[], int32_t* value) const {
const char* vstr = this->findAttr(node, name);
return vstr && SkParse::FindS32(vstr, value);
}
-bool SkDOM::findScalars(const Node* node, const char name[], SkScalar value[], int count) const
-{
+bool SkDOM::findScalars(const Node* node, const char name[], SkScalar value[], int count) const {
const char* vstr = this->findAttr(node, name);
return vstr && SkParse::FindScalars(vstr, value, count);
}
-bool SkDOM::findHex(const Node* node, const char name[], uint32_t* value) const
-{
+bool SkDOM::findHex(const Node* node, const char name[], uint32_t* value) const {
const char* vstr = this->findAttr(node, name);
return vstr && SkParse::FindHex(vstr, value);
}
-bool SkDOM::findBool(const Node* node, const char name[], bool* value) const
-{
+bool SkDOM::findBool(const Node* node, const char name[], bool* value) const {
const char* vstr = this->findAttr(node, name);
return vstr && SkParse::FindBool(vstr, value);
}
-int SkDOM::findList(const Node* node, const char name[], const char list[]) const
-{
+int SkDOM::findList(const Node* node, const char name[], const char list[]) const {
const char* vstr = this->findAttr(node, name);
return vstr ? SkParse::FindList(vstr, list) : -1;
}
-bool SkDOM::hasAttr(const Node* node, const char name[], const char value[]) const
-{
+bool SkDOM::hasAttr(const Node* node, const char name[], const char value[]) const {
const char* vstr = this->findAttr(node, name);
return vstr && !strcmp(vstr, value);
}
-bool SkDOM::hasS32(const Node* node, const char name[], int32_t target) const
-{
+bool SkDOM::hasS32(const Node* node, const char name[], int32_t target) const {
const char* vstr = this->findAttr(node, name);
int32_t value;
return vstr && SkParse::FindS32(vstr, &value) && value == target;
}
-bool SkDOM::hasScalar(const Node* node, const char name[], SkScalar target) const
-{
+bool SkDOM::hasScalar(const Node* node, const char name[], SkScalar target) const {
const char* vstr = this->findAttr(node, name);
SkScalar value;
return vstr && SkParse::FindScalar(vstr, &value) && value == target;
}
-bool SkDOM::hasHex(const Node* node, const char name[], uint32_t target) const
-{
+bool SkDOM::hasHex(const Node* node, const char name[], uint32_t target) const {
const char* vstr = this->findAttr(node, name);
uint32_t value;
return vstr && SkParse::FindHex(vstr, &value) && value == target;
}
-bool SkDOM::hasBool(const Node* node, const char name[], bool target) const
-{
+bool SkDOM::hasBool(const Node* node, const char name[], bool target) const {
const char* vstr = this->findAttr(node, name);
bool value;
return vstr && SkParse::FindBool(vstr, &value) && value == target;
}
-
-//////////////////////////////////////////////////////////////////////////
-
-#ifdef SK_DEBUG
-
-void SkDOM::dump(const Node* node, int level) const
-{
- if (node == nullptr)
- node = this->getRootNode();
-
- SkDebugWStream debugStream;
- SkXMLStreamWriter xmlWriter(&debugStream);
- xmlWriter.writeDOM(*this, node, false);
-}
-
-#endif
#include "SkStream.h"
SkXMLWriter::SkXMLWriter(bool doEscapeMarkup) : fDoEscapeMarkup(doEscapeMarkup)
-{
-}
+{}
-SkXMLWriter::~SkXMLWriter()
-{
+SkXMLWriter::~SkXMLWriter() {
SkASSERT(fElems.count() == 0);
}
-void SkXMLWriter::flush()
-{
- while (fElems.count())
+void SkXMLWriter::flush() {
+ while (fElems.count()) {
this->endElement();
+ }
}
-void SkXMLWriter::addAttribute(const char name[], const char value[])
-{
+void SkXMLWriter::addAttribute(const char name[], const char value[]) {
this->addAttributeLen(name, value, strlen(value));
}
-void SkXMLWriter::addS32Attribute(const char name[], int32_t value)
-{
+void SkXMLWriter::addS32Attribute(const char name[], int32_t value) {
SkString tmp;
tmp.appendS32(value);
this->addAttribute(name, tmp.c_str());
}
-void SkXMLWriter::addHexAttribute(const char name[], uint32_t value, int minDigits)
-{
+void SkXMLWriter::addHexAttribute(const char name[], uint32_t value, int minDigits) {
SkString tmp("0x");
tmp.appendHex(value, minDigits);
this->addAttribute(name, tmp.c_str());
}
-void SkXMLWriter::addScalarAttribute(const char name[], SkScalar value)
-{
+void SkXMLWriter::addScalarAttribute(const char name[], SkScalar value) {
SkString tmp;
tmp.appendScalar(value);
this->addAttribute(name, tmp.c_str());
fElems.top()->fHasText = true;
}
-void SkXMLWriter::doEnd(Elem* elem)
-{
+void SkXMLWriter::doEnd(Elem* elem) {
delete elem;
}
-bool SkXMLWriter::doStart(const char name[], size_t length)
-{
+bool SkXMLWriter::doStart(const char name[], size_t length) {
int level = fElems.count();
bool firstChild = level > 0 && !fElems[level-1]->fHasChildren;
- if (firstChild)
+ if (firstChild) {
fElems[level-1]->fHasChildren = true;
+ }
Elem** elem = fElems.push();
*elem = new Elem(name, length);
return firstChild;
}
-SkXMLWriter::Elem* SkXMLWriter::getEnd()
-{
+SkXMLWriter::Elem* SkXMLWriter::getEnd() {
Elem* elem;
fElems.pop(&elem);
return elem;
}
-const char* SkXMLWriter::getHeader()
-{
+const char* SkXMLWriter::getHeader() {
static const char gHeader[] = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>";
return gHeader;
}
-void SkXMLWriter::startElement(const char name[])
-{
+void SkXMLWriter::startElement(const char name[]) {
this->startElementLen(name, strlen(name));
}
-static const char* escape_char(char c, char storage[2])
-{
+static const char* escape_char(char c, char storage[2]) {
static const char* gEscapeChars[] = {
"<<",
">>",
};
const char** array = gEscapeChars;
- for (unsigned i = 0; i < SK_ARRAY_COUNT(gEscapeChars); i++)
- {
- if (array[i][0] == c)
+ for (unsigned i = 0; i < SK_ARRAY_COUNT(gEscapeChars); i++) {
+ if (array[i][0] == c) {
return &array[i][1];
+ }
}
storage[0] = c;
storage[1] = 0;
return storage;
}
-static size_t escape_markup(char dst[], const char src[], size_t length)
-{
+static size_t escape_markup(char dst[], const char src[], size_t length) {
size_t extra = 0;
const char* stop = src + length;
- while (src < stop)
- {
+ while (src < stop) {
char orig[2];
const char* seq = escape_char(*src, orig);
size_t seqSize = strlen(seq);
- if (dst)
- {
+ if (dst) {
memcpy(dst, seq, seqSize);
dst += seqSize;
}
return extra;
}
-void SkXMLWriter::addAttributeLen(const char name[], const char value[], size_t length)
-{
+void SkXMLWriter::addAttributeLen(const char name[], const char value[], size_t length) {
SkString valueStr;
- if (fDoEscapeMarkup)
- {
+ if (fDoEscapeMarkup) {
size_t extra = escape_markup(nullptr, value, length);
- if (extra)
- {
+ if (extra) {
valueStr.resize(length + extra);
(void)escape_markup(valueStr.writable_str(), value, length);
value = valueStr.c_str();
this->onAddAttributeLen(name, value, length);
}
-void SkXMLWriter::startElementLen(const char elem[], size_t length)
-{
+void SkXMLWriter::startElementLen(const char elem[], size_t length) {
this->onStartElementLen(elem, length);
}
////////////////////////////////////////////////////////////////////////////////////////
-static void write_dom(const SkDOM& dom, const SkDOM::Node* node, SkXMLWriter* w, bool skipRoot)
-{
- if (!skipRoot)
- {
+static void write_dom(const SkDOM& dom, const SkDOM::Node* node, SkXMLWriter* w, bool skipRoot) {
+ if (!skipRoot) {
const char* elem = dom.getName(node);
if (dom.getType(node) == SkDOM::kText_Type) {
SkASSERT(dom.countChildren(node) == 0);
SkDOM::AttrIter iter(dom, node);
const char* name;
const char* value;
- while ((name = iter.next(&value)) != nullptr)
+ while ((name = iter.next(&value)) != nullptr) {
w->addAttribute(name, value);
+ }
}
node = dom.getFirstChild(node, nullptr);
- while (node)
- {
+ while (node) {
write_dom(dom, node, w, false);
node = dom.getNextSibling(node, nullptr);
}
- if (!skipRoot)
+ if (!skipRoot) {
w->endElement();
+ }
}
-void SkXMLWriter::writeDOM(const SkDOM& dom, const SkDOM::Node* node, bool skipRoot)
-{
- if (node)
+void SkXMLWriter::writeDOM(const SkDOM& dom, const SkDOM::Node* node, bool skipRoot) {
+ if (node) {
write_dom(dom, node, this, skipRoot);
+ }
}
void SkXMLWriter::writeHeader()
-{
-}
+{}
// SkXMLStreamWriter
-static void tab(SkWStream& stream, int level)
-{
- for (int i = 0; i < level; i++)
+static void tab(SkWStream& stream, int level) {
+ for (int i = 0; i < level; i++) {
stream.writeText("\t");
+ }
}
SkXMLStreamWriter::SkXMLStreamWriter(SkWStream* stream) : fStream(*stream)
-{
-}
+{}
-SkXMLStreamWriter::~SkXMLStreamWriter()
-{
+SkXMLStreamWriter::~SkXMLStreamWriter() {
this->flush();
}
-void SkXMLStreamWriter::onAddAttributeLen(const char name[], const char value[], size_t length)
-{
+void SkXMLStreamWriter::onAddAttributeLen(const char name[], const char value[], size_t length) {
SkASSERT(!fElems.top()->fHasChildren && !fElems.top()->fHasText);
fStream.writeText(" ");
fStream.writeText(name);
fStream.newline();
}
-void SkXMLStreamWriter::onEndElement()
-{
+void SkXMLStreamWriter::onEndElement() {
Elem* elem = getEnd();
- if (elem->fHasChildren || elem->fHasText)
- {
+ if (elem->fHasChildren || elem->fHasText) {
tab(fStream, fElems.count());
fStream.writeText("</");
fStream.writeText(elem->fName.c_str());
doEnd(elem);
}
-void SkXMLStreamWriter::onStartElementLen(const char name[], size_t length)
-{
+void SkXMLStreamWriter::onStartElementLen(const char name[], size_t length) {
int level = fElems.count();
- if (this->doStart(name, length))
- {
+ if (this->doStart(name, length)) {
// the first child, need to close with >
fStream.writeText(">");
fStream.newline();
fStream.write(name, length);
}
-void SkXMLStreamWriter::writeHeader()
-{
+void SkXMLStreamWriter::writeHeader() {
const char* header = getHeader();
fStream.write(header, strlen(header));
fStream.newline();
{
}
-SkXMLParserWriter::~SkXMLParserWriter()
-{
+SkXMLParserWriter::~SkXMLParserWriter() {
this->flush();
}
-void SkXMLParserWriter::onAddAttributeLen(const char name[], const char value[], size_t length)
-{
+void SkXMLParserWriter::onAddAttributeLen(const char name[], const char value[], size_t length) {
SkASSERT(fElems.count() == 0 || (!fElems.top()->fHasChildren && !fElems.top()->fHasText));
SkString str(value, length);
fParser.addAttribute(name, str.c_str());
fParser.text(text, SkToInt(length));
}
-void SkXMLParserWriter::onEndElement()
-{
+void SkXMLParserWriter::onEndElement() {
Elem* elem = this->getEnd();
fParser.endElement(elem->fName.c_str());
this->doEnd(elem);
}
-void SkXMLParserWriter::onStartElementLen(const char name[], size_t length)
-{
+void SkXMLParserWriter::onStartElementLen(const char name[], size_t length) {
(void)this->doStart(name, length);
SkString str(name, length);
fParser.startElement(str.c_str());
}
-
-
-////////////////////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////////////////
-
-#ifdef SK_DEBUG
-
-void SkXMLStreamWriter::UnitTest()
-{
-#ifdef SK_SUPPORT_UNITTEST
- SkDebugWStream s;
- SkXMLStreamWriter w(&s);
-
- w.startElement("elem0");
- w.addAttribute("hello", "world");
- w.addS32Attribute("dec", 42);
- w.addHexAttribute("hex", 0x42, 3);
- w.addScalarAttribute("scalar", -4.2f);
- w.startElement("elem1");
- w.endElement();
- w.startElement("elem1");
- w.addAttribute("name", "value");
- w.endElement();
- w.startElement("elem1");
- w.startElement("elem2");
- w.startElement("elem3");
- w.addAttribute("name", "value");
- w.endElement();
- w.endElement();
- w.startElement("elem2");
- w.endElement();
- w.endElement();
- w.endElement();
-#endif
-}
-
-#endif