|
From: Cyril P. <cyr...@la...> - 2005-01-10 21:27:12
|
Hi
I'm writing an XML file with the xmlpp interface.
Everything is fine with xmlpp::Document::write_to_file_formatted();
But when I'm calling xmlpp::Document::write_to_string_formatted(), I=20
receive a SIGABRT signal.
Any idea around ?
Thanks
PS: please find hereafter my source code and the gdb 'info st' output
* source code (very simple - the ConvertInput function comes from=20
libxml2 code API samples).
#include <libxml++/libxml++.h>
#include <libxml/tree.h>
#include <string>
#include <iostream>
/**
* ConvertInput:
* @in: string in a given encoding
* @encoding: the encoding used
*
* Converts @in into UTF-8 for processing with libxml2 APIs
*
* Returns the converted UTF-8 string, or NULL in case of error.
*/
xmlChar *
ConvertInput(const char *in, const char *encoding)
{
xmlChar *out;
int ret;
int size;
int out_size;
int temp;
xmlCharEncodingHandlerPtr handler;
if (in =3D=3D 0)
return 0;
handler =3D xmlFindCharEncodingHandler(encoding);
if (!handler) {
printf("ConvertInput: no encoding handler found for '%s'\n",
encoding ? encoding : "");
return 0;
}
size =3D (int) strlen(in) + 1;
out_size =3D size * 2 - 1;
out =3D (unsigned char *) xmlMalloc((size_t) out_size);
if (out !=3D 0) {
temp =3D size - 1;
ret =3D handler->input(out, &out_size, (const xmlChar *) in, &te=
mp);
if ((ret < 0) || (temp - size + 1)) {
if (ret < 0) {
printf("ConvertInput: conversion wasn't successful.\n");
} else {
printf
("ConvertInput: conversion wasn't successful.=20
converted: %i octets.\n",
temp);
}
xmlFree(out);
out =3D 0;
} else {
out =3D (unsigned char *) xmlRealloc(out, out_size + 1);
out[out_size] =3D 0; /*null terminating out */
}
} else {
printf("ConvertInput: no mem\n");
}
return out;
}
int main(int argc, char **argv)
{
xmlpp::Document doc;
xmlpp::Element * elem =3D 0;
std::string my_encoding =3D "ISO-8859-1";
doc.set_internal_subset("GEDCOM", "", "gedcom60.dtd");
doc.add_comment("Generated by libgedcomparser - part of GHOSTS project=
");
elem =3D doc.create_root_node("GEDCOM");
xmlChar * converted =3D ConvertInput("blah =E9", my_encoding.c_str());
std::cerr << converted << std::endl;
if (converted !=3D 0)
{
std::string converted_string((char *)converted);
std::cerr << converted << std::endl;
elem->set_child_text(converted_string);
}
doc.write_to_file_formatted("xmlencode.xml", my_encoding);
std::cerr << "write_to_file_formatted OK" << std::endl;
Glib::ustring result_xml;
result_xml =3D 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 :
#0 0x403aa621 in kill () from /lib/libc.so.6
#1 0x4017826b in raise (sig=3D6) at signals.c:65
#2 0x403aba53 in abort () from /lib/libc.so.6
#3 0x402f7895 in __cxxabiv1::__terminate(void (*)()) () from=20
/usr/lib/libstdc++.so.3
#4 0x402f7880 in __cxxabiv1::__terminate(void (*)()) () from=20
/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=20
/usr/lib/libstdc++.so.3
#7 0x0804aef1 in std::string::_Rep::_S_create(unsigned,=20
std::allocator<char> const&) (__capacity=3D4294967295,
__alloc=3D@0xbffff500) at /usr/include/g++-v3/bits/basic_string.tcc:=
371
#8 0x0804ab28 in char* std::string::_S_construct<char const*>(char=20
const*, char const*, std::allocator<char> const&,=20
std::forward_iterator_tag) (
__beg=3D0x80516e0 "<?xml version=3D\"1.0\"=20
encoding=3D\"ISO-8859-1\"?>\n<!DOCTYPE GEDCOM SYSTEM=20
\"gedcom60.dtd\">\n<!--Generated by libgedcomparser - part of GHOSTS=20
project-->\n<GEDCOM>blah =E9</GEDCOM>\n", __end=3D0x80516df "",
__a=3D@0xbffff500) at /usr/include/g++-v3/bits/basic_string.tcc:143
#9 0x40034674 in std::string::string(char const*, unsigned,=20
std::allocator<char> const&) (this=3D0xbffff560,
__s=3D0x80516e0 "<?xml version=3D\"1.0\"=20
encoding=3D\"ISO-8859-1\"?>\n<!DOCTYPE GEDCOM SYSTEM=20
\"gedcom60.dtd\">\n<!--Generated by libgedcomparser - part of GHOSTS=20
project-->\n<GEDCOM>blah =E9</GEDCOM>\n", __n=3D4294967295,
__a=3D@0xbffff500) at /usr/include/g++-v3/bits/basic_string.h:666
#10 0x401c40c4 in Glib::ustring::ustring(char const*, unsigned)=20
(this=3D0xbffff560,
src=3D0x80516e0 "<?xml version=3D\"1.0\"=20
encoding=3D\"ISO-8859-1\"?>\n<!DOCTYPE GEDCOM SYSTEM=20
\"gedcom60.dtd\">\n<!--Generated by libgedcomparser - part of GHOSTS=20
project-->\n<GEDCOM>blah =E9</GEDCOM>\n", n=3D169)
at /usr/include/g++-v3/bits/stl_alloc.h:571
#11 0x40025d27 in xmlpp::Document::do_write_to_string(Glib::ustring=20
const&, bool) (this=3D0xbffff6a0,
encoding=3D@0xbffff5d0, format=3Dtrue) at document.cc:309
|