some bugfixes
This commit is contained in:
		| @@ -5,7 +5,7 @@ TST_DIR=test | ||||
| DOC_DIR=doc | ||||
|  | ||||
| m4_define(x_packagename, libxml-cxx) | ||||
| m4_define(x_major, 0) | ||||
| m4_define(x_major, 1) | ||||
| m4_define(x_minor, 0) | ||||
| m4_define(x_least, 0) | ||||
| AM_INIT_AUTOMAKE(x_packagename, x_major.x_minor.x_least, [marc@waeckerlin.org]) | ||||
|   | ||||
| @@ -8,7 +8,7 @@ | ||||
| develdir = ${pkgdatadir}/doc | ||||
| 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 | ||||
|  | ||||
|   | ||||
| @@ -1,8 +1,4 @@ | ||||
| ./bootstrap.sh && \ | ||||
| ./configure && \ | ||||
| make && \ | ||||
| sudo make install && \ | ||||
| make clean && \ | ||||
| LDFLAGS="-L/usr/lib32 -m32" CXXFLAGS="-m32" ./configure \ | ||||
|   --libdir=/usr/local/lib32 \ | ||||
|   --build=x86_64 \ | ||||
| @@ -16,5 +12,8 @@ make clean && \ | ||||
|   --host=i586-mingw32msvc && \ | ||||
| make && \ | ||||
| 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, const Node& t) throw(); | ||||
|       ~exception() throw(); | ||||
|       void line(unsigned long line) throw(); | ||||
|       const char* what() const throw(); | ||||
|     private: | ||||
|       std::string _what; | ||||
| @@ -402,7 +403,7 @@ namespace xml { | ||||
|       friend class stream_error; | ||||
|       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) | ||||
|           throw(wrong_end_tag, wrong_start_tag, tag_expected, type_mismatch, | ||||
|                 second_slash_in_tag, character_after_slash, | ||||
| @@ -414,6 +415,7 @@ namespace xml { | ||||
|                 missing_end_tag, | ||||
|                 attribute_value_not_quoted, access_error, duplicate_attribute); | ||||
|       std::auto_ptr<Node> _template; | ||||
|       unsigned long _line; | ||||
|   }; | ||||
|  | ||||
| } | ||||
|   | ||||
							
								
								
									
										39
									
								
								src/xml.cxx
									
									
									
									
									
								
							
							
						
						
									
										39
									
								
								src/xml.cxx
									
									
									
									
									
								
							| @@ -49,6 +49,11 @@ namespace xml { | ||||
|   exception::~exception() throw() { | ||||
|     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() { | ||||
|     static std::string w; | ||||
|     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() { | ||||
|     return *_template; | ||||
|   } | ||||
| @@ -459,24 +464,32 @@ namespace xml { | ||||
|             second_slash_in_tag, | ||||
|             character_after_slash, missing_end_tag, attribute_value_not_quoted, | ||||
|             access_error, empty_stream, duplicate_attribute, | ||||
|             attributes_in_end_tag) { | ||||
|             attributes_in_end_tag) try { | ||||
|     _line=1; | ||||
|     std::auto_ptr<Node> node(_template->clone()); | ||||
|     node->clear(); | ||||
|     Tag res; | ||||
|     try { | ||||
|     while (true) try { | ||||
|       res = tag(is, *node); | ||||
|     } catch (missing_end_tag&) { | ||||
|       throw empty_stream(*node, is, res); | ||||
|     } | ||||
|       *node<<res.attributes; | ||||
|     while (true) switch (res.type) { | ||||
|       switch (res.type) { | ||||
|         case END: throw wrong_end_tag(*node, is, res); | ||||
|         case EMPTY: return node; // empty | ||||
|         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'; | ||||
|   } | ||||
|   std::auto_ptr<Node> Factory::read(std::istream& is, const Node& node) | ||||
| @@ -517,7 +530,9 @@ namespace xml { | ||||
|     if (c!='<') do tag.text+=c; while (is && is.get(c) && c!='<'); | ||||
|     bool nameRead(false); | ||||
|     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; | ||||
|         break; | ||||
|       case '/': | ||||
| @@ -527,14 +542,16 @@ namespace xml { | ||||
|         break; | ||||
|       case '!': case '?': | ||||
|         if (last=='<') { // <! tag or <?xml.. starts | ||||
|           tag.special+=last; | ||||
|           do tag.special+=c; while (c!='>' && is && is.get(c)); | ||||
|           tag.type=SPECIAL; | ||||
|           return tag; | ||||
|         } | ||||
|       default: | ||||
|         if (tag.type==EMPTY) throw character_after_slash(position, is, tag, c); | ||||
|         if (nameRead) { // read attribute | ||||
|           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 '=' | ||||
|           if (c=='=') { // get the value | ||||
|             while (is && is.get(c) && ws(c)); // skip ws | ||||
|   | ||||
		Reference in New Issue
	
	Block a user