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; | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										45
									
								
								src/xml.cxx
									
									
									
									
									
								
							
							
						
						
									
										45
									
								
								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); | ||||||
|  |       *node<<res.attributes; | ||||||
|  |       switch (res.type) { | ||||||
|  |         case END: throw wrong_end_tag(*node, is, res); | ||||||
|  |         case EMPTY: return node; // empty | ||||||
|  |         case START: return read(is, *_template); | ||||||
|  |           //! @todo store instead of ignore | ||||||
|  |         case SPECIAL: break; | ||||||
|  |       } | ||||||
|     } catch (missing_end_tag&) { |     } catch (missing_end_tag&) { | ||||||
|       throw empty_stream(*node, is, res); |       throw empty_stream(*node, is, res); | ||||||
|     } |     } | ||||||
|     *node<<res.attributes; |   } catch (exception& e) { | ||||||
|     while (true) switch (res.type) { |     e.line(_line); | ||||||
|       case END: throw wrong_end_tag(*node, is, res); |     throw; | ||||||
|       case EMPTY: return node; // empty |  | ||||||
|       case START: return read(is, *_template); |  | ||||||
|       case SPECIAL: break; //! @todo ignored could be stored |  | ||||||
|     } |  | ||||||
|   } |   } | ||||||
|   bool Factory::ws(char c) const 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