some bugfixes
This commit is contained in:
@@ -5,7 +5,7 @@ TST_DIR=test
|
|||||||
DOC_DIR=doc
|
DOC_DIR=doc
|
||||||
|
|
||||||
m4_define(x_packagename, libxml-cxx)
|
m4_define(x_packagename, libxml-cxx)
|
||||||
m4_define(x_major, 0)
|
m4_define(x_major, 1)
|
||||||
m4_define(x_minor, 0)
|
m4_define(x_minor, 0)
|
||||||
m4_define(x_least, 0)
|
m4_define(x_least, 0)
|
||||||
AM_INIT_AUTOMAKE(x_packagename, x_major.x_minor.x_least, [marc@waeckerlin.org])
|
AM_INIT_AUTOMAKE(x_packagename, x_major.x_minor.x_least, [marc@waeckerlin.org])
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
develdir = ${pkgdatadir}/doc
|
develdir = ${pkgdatadir}/doc
|
||||||
devel_DATA = html/index.html
|
devel_DATA = html/index.html
|
||||||
|
|
||||||
ALL_SRC = ${top_srcdir}/src/*.[ch]xx ${top_srcdir}/test/*.[ch]xx
|
ALL_SRC = ${top_srcdir}/*/*.[ch]xx ${top_srcdir}/*/*/*.[ch]xx
|
||||||
|
|
||||||
DIRS = html latex
|
DIRS = html latex
|
||||||
|
|
||||||
|
@@ -1,8 +1,4 @@
|
|||||||
./bootstrap.sh && \
|
./bootstrap.sh && \
|
||||||
./configure && \
|
|
||||||
make && \
|
|
||||||
sudo make install && \
|
|
||||||
make clean && \
|
|
||||||
LDFLAGS="-L/usr/lib32 -m32" CXXFLAGS="-m32" ./configure \
|
LDFLAGS="-L/usr/lib32 -m32" CXXFLAGS="-m32" ./configure \
|
||||||
--libdir=/usr/local/lib32 \
|
--libdir=/usr/local/lib32 \
|
||||||
--build=x86_64 \
|
--build=x86_64 \
|
||||||
@@ -16,5 +12,8 @@ make clean && \
|
|||||||
--host=i586-mingw32msvc && \
|
--host=i586-mingw32msvc && \
|
||||||
make && \
|
make && \
|
||||||
sudo make install && \
|
sudo make install && \
|
||||||
make clean
|
make clean && \
|
||||||
|
./configure && \
|
||||||
|
make check && \
|
||||||
|
sudo make install
|
||||||
|
|
||||||
|
@@ -110,6 +110,7 @@ namespace xml {
|
|||||||
exception(std::string reason) throw();
|
exception(std::string reason) throw();
|
||||||
exception(std::string reason, const Node& t) throw();
|
exception(std::string reason, const Node& t) throw();
|
||||||
~exception() throw();
|
~exception() throw();
|
||||||
|
void line(unsigned long line) throw();
|
||||||
const char* what() const throw();
|
const char* what() const throw();
|
||||||
private:
|
private:
|
||||||
std::string _what;
|
std::string _what;
|
||||||
@@ -402,7 +403,7 @@ namespace xml {
|
|||||||
friend class stream_error;
|
friend class stream_error;
|
||||||
Factory(); // not implemented
|
Factory(); // not implemented
|
||||||
Factory(const Factory&); // not implemented
|
Factory(const Factory&); // not implemented
|
||||||
bool ws(char c) const throw();
|
bool ws(char c) throw();
|
||||||
std::auto_ptr<Node> read(std::istream& is, const Node& position)
|
std::auto_ptr<Node> read(std::istream& is, const Node& position)
|
||||||
throw(wrong_end_tag, wrong_start_tag, tag_expected, type_mismatch,
|
throw(wrong_end_tag, wrong_start_tag, tag_expected, type_mismatch,
|
||||||
second_slash_in_tag, character_after_slash,
|
second_slash_in_tag, character_after_slash,
|
||||||
@@ -414,6 +415,7 @@ namespace xml {
|
|||||||
missing_end_tag,
|
missing_end_tag,
|
||||||
attribute_value_not_quoted, access_error, duplicate_attribute);
|
attribute_value_not_quoted, access_error, duplicate_attribute);
|
||||||
std::auto_ptr<Node> _template;
|
std::auto_ptr<Node> _template;
|
||||||
|
unsigned long _line;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
41
src/xml.cxx
41
src/xml.cxx
@@ -49,6 +49,11 @@ namespace xml {
|
|||||||
exception::~exception() throw() {
|
exception::~exception() throw() {
|
||||||
delete _node;
|
delete _node;
|
||||||
}
|
}
|
||||||
|
void exception::line(unsigned long line) throw() {
|
||||||
|
std::stringstream ss;
|
||||||
|
ss<<line;
|
||||||
|
_what += "\nat line: "+ss.str();
|
||||||
|
}
|
||||||
const char* exception::what() const throw() {
|
const char* exception::what() const throw() {
|
||||||
static std::string w;
|
static std::string w;
|
||||||
if (!w.size()) {
|
if (!w.size()) {
|
||||||
@@ -450,7 +455,7 @@ namespace xml {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
Factory::Factory(const Node& t) throw(): _template(t.clone()) {}
|
Factory::Factory(const Node& t) throw(): _template(t.clone()), _line(0) {}
|
||||||
const Node& Factory::operator*() const throw() {
|
const Node& Factory::operator*() const throw() {
|
||||||
return *_template;
|
return *_template;
|
||||||
}
|
}
|
||||||
@@ -459,24 +464,32 @@ namespace xml {
|
|||||||
second_slash_in_tag,
|
second_slash_in_tag,
|
||||||
character_after_slash, missing_end_tag, attribute_value_not_quoted,
|
character_after_slash, missing_end_tag, attribute_value_not_quoted,
|
||||||
access_error, empty_stream, duplicate_attribute,
|
access_error, empty_stream, duplicate_attribute,
|
||||||
attributes_in_end_tag) {
|
attributes_in_end_tag) try {
|
||||||
|
_line=1;
|
||||||
std::auto_ptr<Node> node(_template->clone());
|
std::auto_ptr<Node> node(_template->clone());
|
||||||
node->clear();
|
node->clear();
|
||||||
Tag res;
|
Tag res;
|
||||||
try {
|
while (true) try {
|
||||||
res = tag(is, *node);
|
res = tag(is, *node);
|
||||||
} catch (missing_end_tag&) {
|
|
||||||
throw empty_stream(*node, is, res);
|
|
||||||
}
|
|
||||||
*node<<res.attributes;
|
*node<<res.attributes;
|
||||||
while (true) switch (res.type) {
|
switch (res.type) {
|
||||||
case END: throw wrong_end_tag(*node, is, res);
|
case END: throw wrong_end_tag(*node, is, res);
|
||||||
case EMPTY: return node; // empty
|
case EMPTY: return node; // empty
|
||||||
case START: return read(is, *_template);
|
case START: return read(is, *_template);
|
||||||
case SPECIAL: break; //! @todo ignored could be stored
|
//! @todo store instead of ignore
|
||||||
|
case SPECIAL: break;
|
||||||
}
|
}
|
||||||
|
} catch (missing_end_tag&) {
|
||||||
|
throw empty_stream(*node, is, res);
|
||||||
}
|
}
|
||||||
bool Factory::ws(char c) const throw() {
|
} catch (exception& e) {
|
||||||
|
e.line(_line);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
bool Factory::ws(char c) throw() {
|
||||||
|
static char last(0);
|
||||||
|
if ((c=='\n'||c=='\r')&&last!='\n'&&last!='\r') ++_line;
|
||||||
|
last = c;
|
||||||
return c==' '||c=='\t'||c=='\n'||c=='\r';
|
return c==' '||c=='\t'||c=='\n'||c=='\r';
|
||||||
}
|
}
|
||||||
std::auto_ptr<Node> Factory::read(std::istream& is, const Node& node)
|
std::auto_ptr<Node> Factory::read(std::istream& is, const Node& node)
|
||||||
@@ -516,8 +529,10 @@ namespace xml {
|
|||||||
if (!is) throw missing_end_tag(position, is, tag);
|
if (!is) throw missing_end_tag(position, is, tag);
|
||||||
if (c!='<') do tag.text+=c; while (is && is.get(c) && c!='<');
|
if (c!='<') do tag.text+=c; while (is && is.get(c) && c!='<');
|
||||||
bool nameRead(false);
|
bool nameRead(false);
|
||||||
for (char last(c); is && is.get(c) && c!='>'; last = c) switch (c) {
|
for (char last(c); is && is.get(c) && c!='>'; last=c) switch (c) {
|
||||||
case ' ': case '\t': case '\n': case '\r':
|
case '\n': case '\r':
|
||||||
|
if (last!='\n'&&last!='\r') ++_line;
|
||||||
|
case ' ': case '\t':
|
||||||
if (!nameRead && tag.name.size()) nameRead=true;
|
if (!nameRead && tag.name.size()) nameRead=true;
|
||||||
break;
|
break;
|
||||||
case '/':
|
case '/':
|
||||||
@@ -527,14 +542,16 @@ namespace xml {
|
|||||||
break;
|
break;
|
||||||
case '!': case '?':
|
case '!': case '?':
|
||||||
if (last=='<') { // <! tag or <?xml.. starts
|
if (last=='<') { // <! tag or <?xml.. starts
|
||||||
|
tag.special+=last;
|
||||||
do tag.special+=c; while (c!='>' && is && is.get(c));
|
do tag.special+=c; while (c!='>' && is && is.get(c));
|
||||||
|
tag.type=SPECIAL;
|
||||||
return tag;
|
return tag;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
if (tag.type==EMPTY) throw character_after_slash(position, is, tag, c);
|
if (tag.type==EMPTY) throw character_after_slash(position, is, tag, c);
|
||||||
if (nameRead) { // read attribute
|
if (nameRead) { // read attribute
|
||||||
std::string attrname(1, c), attrvalue;
|
std::string attrname(1, c), attrvalue;
|
||||||
while (is && is.get(c) && c!='=' && !ws(c)) attrname+=c;
|
while (is && is.get(c) && c!='=' && c!='>' && !ws(c)) attrname+=c;
|
||||||
while (c!='=' && is && is.get(c) && ws(c)); // skip ws, search '='
|
while (c!='=' && is && is.get(c) && ws(c)); // skip ws, search '='
|
||||||
if (c=='=') { // get the value
|
if (c=='=') { // get the value
|
||||||
while (is && is.get(c) && ws(c)); // skip ws
|
while (is && is.get(c) && ws(c)); // skip ws
|
||||||
|
Reference in New Issue
Block a user