Re: [libxml++] SIGABRT received during xmlpp::Document::write_to_string_formatted
- From: Murray Cumming <murrayc murrayc com>
- To: libxml++ <libxmlplusplus-general lists sourceforge net>
- Cc: Cyril PICARD <cyril picard-mail laposte net>
- Subject: Re: [libxml++] SIGABRT received during xmlpp::Document::write_to_string_formatted
- Date: Tue, 18 Jan 2005 12:11:11 +0100
This seems to be a problem with Glib::convert() (and the conversion
function that you were using before).
You see this earlier when you store the result of Glib::convert in a
ustring instead of a std::string (which makes sense, because it's a utf8
string.).
Glib::ustring's operator<< then throws an exception when trying to
convert the utf8 back into something that std::cerr can take. Using
g_warning() shows some ??s, suggesting that Glib::convert() was not
successful. I don't know whether the conversion should be successful.
You can see this in the attached version of the test case.
But I would expect Glib::convert to throw a Glib::ConvertError
exception, as documented here:
http://www.gtkmm.org/docs/glibmm-2.4/docs/reference/html/group__CharsetConv.html#ga2
So please file a glibmm bug report about that at bugzilla.gnome.org.
It's probably an issue in glib, but we'll hopefully track that down.
You might play with Glib::convert_with_fallback() for now.
On Tue, 2005-01-11 at 23:47 +0100, Cyril PICARD wrote:
> For for the link, it's quite simpler now... but still SIGABRT... Still
> no idea on my side...
>
> Here is my code and the 'gdb info st' output:
>
> *** code
> #include <libxml++/libxml++.h>
>
> #include <glibmm/convert.h>
> #include <string>
> #include <iostream>
>
> int main(int argc, char **argv)
> {
> xmlpp::Document doc;
> xmlpp::Element * elem = 0;
> std::string my_encoding = "ISO-8859-1";
> doc.set_internal_subset("GEDCOM", "", "gedcom60.dtd");
> doc.add_comment("Generated by libgedcomparser - part of GHOSTS project");
> elem = doc.create_root_node("GEDCOM");
> std::string converted = Glib::convert("blah éo", "UTF-8", my_encoding);
> elem->set_child_text(converted);
> std::cerr << converted << std::endl;
>
> doc.write_to_file_formatted("xmlencode.xml", my_encoding);
> std::cerr << "write_to_file_formatted OK" << std::endl;
> Glib::ustring result_xml;
> result_xml = doc.write_to_string_formatted(my_encoding);
> std::cerr << "write_to_string_formatted OK" << std::endl;
> std::cerr << result_xml << std::endl;
> return 0;
> }
>
> *** gdb info st:
> Program received signal SIGABRT, Aborted.
> [Switching to Thread 1024 (LWP 15825)]
> 0x403aa621 in kill () from /lib/libc.so.6
> Current language: auto; currently c
> (gdb) info st
> #0 0x403aa621 in kill () from /lib/libc.so.6
> #1 0x4017826b in raise (sig=6) at signals.c:65
> #2 0x403aba53 in abort () from /lib/libc.so.6
> #3 0x402f7895 in __cxxabiv1::__terminate(void (*)()) ()
> from /usr/lib/libstdc++.so.3
> #4 0x402f7880 in __cxxabiv1::__terminate(void (*)()) ()
> from /usr/lib/libstdc++.so.3
> #5 0x402f79e0 in __cxa_rethrow () from /usr/lib/libstdc++.so.3
> #6 0x402ede29 in std::__throw_length_error(char const*) ()
> from /usr/lib/libstdc++.so.3
> #7 0x0804af61 in std::string::_Rep::_S_create(unsigned,
> std::allocator<char> co
> nst&) (__capacity=4294967295, __alloc= 0xbffff4c0)
> at /usr/include/g++-v3/bits/basic_string.tcc:371
> #8 0x0804ab98 in char* std::string::_S_construct<char const*>(char
> const*, char
> const*, std::allocator<char> const&, std::forward_iterator_tag) (
> __beg=0x806e168 "<?xml version=\"1.0\"
> encoding=\"ISO-8859-1\"?>\n<!DOCTYPE
> GEDCOM SYSTEM \"gedcom60.dtd\">\n<!--Generated by libgedcomparser - part
> of GHOS
> TS project-->\n<GEDCOM>blah éo</GEDCOM>\n", __end=0x806e167 "",
> __a= 0xbffff4c0) at /usr/include/g++-v3/bits/basic_string.tcc:143
> #9 0x40034674 in std::string::string(char const*, unsigned,
> std::allocator<char
> > const&) (this=0xbffff520,
> __s=0x806e168 "<?xml version=\"1.0\"
> encoding=\"ISO-8859-1\"?>\n<!DOCTYPE GE
> DCOM SYSTEM \"gedcom60.dtd\">\n<!--Generated by libgedcomparser - part
> of GHOSTS
> ---Type <return> to continue, or q <return> to quit---
> project-->\n<GEDCOM>blah éo</GEDCOM>\n", __n=4294967295, __a= 0xbffff4c0)
> at /usr/include/g++-v3/bits/basic_string.h:666
> #10 0x401c40c4 in Glib::ustring::ustring(char const*, unsigned) (
> this=0xbffff520,
> src=0x806e168 "<?xml version=\"1.0\"
> encoding=\"ISO-8859-1\"?>\n<!DOCTYPE GE
> DCOM SYSTEM \"gedcom60.dtd\">\n<!--Generated by libgedcomparser - part
> of GHOSTS
> project-->\n<GEDCOM>blah éo</GEDCOM>\n", n=170)
> at /usr/include/g++-v3/bits/stl_alloc.h:571
> #11 0x40025d27 in xmlpp::Document::do_write_to_string(Glib::ustring
> const&, bool
> ) (this=0xbffff6a0, encoding= 0xbffff5a0, format=true) at document.cc:309
> #12 0x400259b8 in
> xmlpp::Document::write_to_string_formatted(Glib::ustring const
> &) (this=0xbffff6a0, encoding= 0xbffff5a0) at document.cc:266
> #13 0x0804a318 in main (argc=1, argv=0xbffff734) at xmlencode.cpp:25
> #14 0x40398280 in __libc_start_main () from /lib/libc.so.6
>
> Murray Cumming wrote:
> > On Tue, 2005-01-11 at 20:59 +0100, Cyril PICARD wrote:
> >
> >>I understand your comments, but I don't understand how to correctly
> >>UTF-8-encode my string. I thought my conversion was ok since
> >>- I use the ConvertInput function provided in the libxml2 code samples
> >
> >
> > You might have more success with the Glib::convert() methods:
> > http://www.gtkmm.org/docs/glibmm-2.4/docs/reference/html/group__CharsetConv.html
> >
>
>
>
> -------------------------------------------------------
> The SF.Net email is sponsored by: Beat the post-holiday blues
> Get a FREE limited edition SourceForge.net t-shirt from ThinkGeek.
> It's fun and FREE -- well, almost....http://www.thinkgeek.com/sfshirt
> _______________________________________________
> Libxmlplusplus-general mailing list
> Libxmlplusplus-general lists sourceforge net
> https://lists.sourceforge.net/lists/listinfo/libxmlplusplus-general
--
Murray Cumming
murrayc murrayc com
www.murrayc.com
www.openismus.com
#include <libxml++/libxml++.h>
#include <glibmm/convert.h>
#include <string>
#include <iostream>
#include <glibmm.h> //For g_warning()
int main(int argc, char **argv)
{
try
{
xmlpp::Document doc;
xmlpp::Element * elem = 0;
std::string my_encoding = "ISO-8859-1";
doc.set_internal_subset("GEDCOM", "", "gedcom60.dtd");
doc.add_comment("Generated by libgedcomparser - part of GHOSTS project");
elem = doc.create_root_node("GEDCOM");
Glib::ustring converted = Glib::convert("blah éo", "UTF-8", my_encoding);
//std::cerr doesn't understand utf8, but g_warning() probably does:
g_warning("converted=%s", converted.c_str());
elem->set_child_text(converted);
//This throws a "Invalid byte sequence in conversion input" Glib::Error exception
std::cerr << converted << std::endl;
doc.write_to_file_formatted("xmlencode.xml", my_encoding);
std::cerr << "write_to_file_formatted OK" << std::endl;
Glib::ustring result_xml;
//This throws an exception:
result_xml = doc.write_to_string_formatted(my_encoding);
std::cerr << "write_to_string_formatted OK" << std::endl;
std::cerr << result_xml << std::endl;
}
catch(const xmlpp::exception& ex)
{
std::cerr << "xmlpp::exception: " << ex.what() << std::endl;
return 0;
}
catch(const Glib::Error& ex)
{
std::cerr << "Glib::Error exception: " << ex.what() << std::endl;
return 0;
}
catch(const std::exception& ex)
{
std::cerr << "std::exception: " << ex.what() << std::endl;
return 0;
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]