using nlib_ns::exi::ExiAllocatorEx;
using nlib_ns::exi::XmlStreamReader;
using nlib_ns::exi::XmlStreamReaderSettings;
using nlib_ns::exi::XmlStreamWriter;
using nlib_ns::exi::XmlStreamWriterSettings;
#define N(x) NLIB_EXI_LITERAL(x)
#define M(x) NLIB_EXI_UTF8(x)
extern const char* whatsnew;
const int kBufSize = 1024 * 128;
unsigned char g_readerbuf[kBufSize];
unsigned char g_writerbuf[kBufSize];
const int kDataBufSize = 1024;
unsigned char g_data_buf[kDataBufSize];
bool SampleExec() {
ExiAllocatorEx al_read, al_write;
if (al_read.Init(g_readerbuf, kBufSize) != 0) return false;
if (al_write.Init(g_writerbuf, kBufSize) != 0) return false;
ConsoleOutputStream out_;
TextWriter out;
out.Init();
out.Open(&out_);
MemoryInputStream istr(whatsnew,
nlib_strlen(whatsnew));
XmlStreamReaderSettings is;
UniquePtr<XmlStreamReader> r(XmlStreamReader::Create(&istr, is, al_read));
if (!r) return false;
ReallocOutputStream ostr;
XmlStreamWriterSettings os;
UniquePtr<XmlStreamWriter> w(XmlStreamWriter::Create(&ostr, os, al_write));
if (!w) return false;
w->WriteStartDocument();
w->WriteStartElement(N("titles"));
bool is_target_element = false;
while (r->HasNext()) {
XmlStreamReader::XmlStreamConstants e = r->Next();
switch (e) {
case XmlStreamReader::START_ELEMENT:
is_target_element =
StrCmp(r->GetLocalName(), N(
"title")) == 0;
break;
case XmlStreamReader::CHARACTERS:
if (is_target_element) {
w->WriteStartElement(N("title"));
w->WriteCharacters(r->GetText());
w->WriteEndElement();
out.WriteFormat("%s\n", M(r->GetText()));
}
break;
default:
break;
}
}
w->WriteEndElement();
w->WriteEndDocument();
return false;
}
return false;
}
r.reset();
w.reset();
ReallocOutputStream::CharPtrType cstr;
ostr.Flush();
out.WriteFormat("%s\n", cstr.get());
return true;
}
bool SampleMain(int, char**) {
bool rval = SampleExec();
return rval;
}
NLIB_MAINFUNC