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