Update:  Rather surprisingly (to me, at least) this doesn't seem to
break binaries that are linked against libxerces-c.  I expected that
changing the underlying type of XMLCh would change the name mangling
in a way that would case link errors.

Regards,
Tom

On Wed, Sep 24, 2014 at 4:16 PM, Tom Cook <tom.k.c...@gmail.com> wrote:
> For those who come after me, rebuilding libxerces-c using char16_t is
> relatively easy.  Here's how I did it on Ubuntu 14.04:
>
>> apt-get source libxerces-c3.1
>> cd xerces-c-3.1.1
>
> edit configure.ac to apply this patch:
> 289c289
> <                       xerces_cv_type_xmlch=$xerces_cv_type_u16bit_int
> ---
>>                       xerces_cv_type_xmlch=char16_t
>
>> export DEB_CXXFLAGS_SET="-std=c++11 -fPIC"
>> dpkg-buildpackage -rfakeroot -b
>
> Whether installing such a package is a good thing for your system or
> not is another matter, since I guess it will break binary
> compatibility between libxerces-c and anything else that depends on
> it; I haven't been game to reboot my system yet.
>
> Regards,
> Tom
>
> On Fri, Sep 19, 2014 at 8:06 PM, Tom Cook <tom.k.c...@gmail.com> wrote:
>> Thanks for responding.
>>
>> Yes, use of C++11 char16_t would mean that various compilers would
>> become unsupported (ie GCC support would change from 3.4.x+ to 4.5+).
>>
>> I've just tried this patch on configure.ac:
>>
>> 289c289
>> <                       xerces_cv_type_xmlch=$xerces_cv_type_u16bit_int
>> ---
>>>                       xerces_cv_type_xmlch=char16_t
>>
>> but the results are more-or-less disastrous (haven't had a chance to
>> look into the errors in detail yet).  Is that the right way to try
>> changing the type of XMLCh?
>>
>> Thanks,
>> Tom
>>
>> On Fri, Sep 19, 2014 at 5:50 PM, Alberto Massari
>> <albertomass...@tiscali.it> wrote:
>>> There are no plans to use C++11 features in Xerces, especially if this would
>>> make any of the supported compilers to become unsupported.
>>> But you can make a test to see if char16_t literals are encoded in the same
>>> format as XMLCh expects...
>>>
>>> Alberto
>>>
>>> Il 19/09/14 08:56, Tom Cook ha scritto:
>>>
>>>> No response to this so far.  Am I better off rebuilding Xerces-C with
>>>> XMLCh typedef'd to char16_t?
>>>>
>>>> Regards,
>>>> Tom
>>>>
>>>> On Mon, Sep 15, 2014 at 4:16 PM, Tom Cook <tom.k.c...@gmail.com> wrote:
>>>>>
>>>>> Hi,
>>>>>
>>>>> I've googled around and found this question asked in quite a few
>>>>> places, but not any answer to it.
>>>>>
>>>>> What is the best way of handling strings, and particularly string
>>>>> literals, in portable code?
>>>>>
>>>>> Specifically, I'm interested in building code with VC++ 2013 on
>>>>> Windows and G++ 4.8 on Linux.  On Windows, the Xerces binary build
>>>>> uses wchar_t as the character type, and so, naturally enough, people
>>>>> on Windows write code that passes around wchar_t.  Unfortunately, G++
>>>>> has a 4-byte wchar_t and so Xerces uses unsigned short int (or
>>>>> uint16_t) as its character type.  This causes all such code written
>>>>> for Windows to break in fairly horrible ways on Linux, and in ways
>>>>> that require wide-ranging code changes to fix.
>>>>>
>>>>> So far, the best solution I've come up with looks something like this:
>>>>>
>>>>> #if defined _MSC_VER
>>>>> #define U16S(x) L##x
>>>>> typedef wchar_t my_u16_char_t;
>>>>> typedef std::wstring my_u16_str_t;
>>>>> typedef std::wstringstream my_u16_stream_t;
>>>>> inline XmlCh* XmlString(my_u16_char_t* s) { return s; }
>>>>> inline XmlCh* XmlString(my_u16_str_t* s) { return s.c_str(); }
>>>>> #elif defined __linux
>>>>> #define U16S(x) u##x
>>>>> typedef char16_t my_u16_char_t;
>>>>> typedef std::basic_string<char16_t> my_u16_str_t;
>>>>> typedef std::basic_stringstream<char16_t> my_u16_stream_t;
>>>>> inline XmlCh* XmlString(my_u16_char_t* s) { return
>>>>> reinterpret_cast<char16_t*>(s); }
>>>>> inline XmlCh* XmlString(my_u16_str_t* s) { return XmlString(s.c_str()); }
>>>>> #endif
>>>>>
>>>>> But of course this still requires major code changes for existing code
>>>>> that uses wchar_t.
>>>>>
>>>>> Is there a better way of sorting this out?  C++11 now has a distinct,
>>>>> UTF-16-encoded character type, char16_t.  Is there any plan to make
>>>>> Xerces use it?
>>>>>
>>>>> Thanks,
>>>>> Tom
>>>
>>>
>>>
>>> --
>>> -----------------------------------------
>>> Lucia Riccardi & Alberto Massari
>>> Via Prasca 19/5
>>> 16148 Genova
>>> Italia
>>> Tel.: (010) 3771653
>>> E-mail: lucia_albe...@libero.it
>>> Web: http://www.massari.org
>>>

Reply via email to