Re: resolution for bug 1010313

From: Marcin Ligorowski <ligo(at)interia(dot)pl>
To: Adam M <gnuman1(at)gmail(dot)com>
Cc: pgsql-odbc(at)postgresql(dot)org
Subject: Re: resolution for bug 1010313
Date: 2008-08-19 18:35:36
Message-ID: 48AB1278.2000703@interia.pl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-odbc

Bellow are changes in patch format obtained by using diff utility.

Marcin

--- win_unicode.c.org Sat Sep 1 01:40:10 2007
+++ win_unicode.c Fri Jul 25 12:52:06 2008
@@ -54,6 +54,13 @@

+int is_big_endian()
+{
+ union { long l; char c[sizeof (long)]; } u;
+ u.l = 1;
+ return (u.c[sizeof (long) - 1] == 1);
+}
+
SQLULEN ucs2strlen(const SQLWCHAR *ucs2str)
{
SQLULEN len;
@@ -66,6 +73,17 @@
char * utf8str;

+ static int is_endian_calc = 0;
+ static int big_endian = 0;
+ if(!is_endian_calc)
+ {
+ big_endian = is_big_endian();
+ is_endian_calc = 1;
+ }
+
if (!ucs2str)
{
*olen = SQL_NULL_DATA;
@@ -78,8 +96,8 @@
if (utf8str)
{
int i, len = 0;
- UInt2 byte2code;
- Int4 byte4code, surrd1, surrd2;
+ union { UInt2 i; char c[sizeof (UInt2)]; } byte2code;
+ union { Int4 i; char c[sizeof (Int4)]; } byte4code, surrd1, surrd2;
const SQLWCHAR *wstr;

for (i = 0, wstr = ucs2str; i < ilen; i++, wstr++)
@@ -95,35 +113,62 @@
}
else if ((*wstr & byte3check) == 0)
{
- byte2code = byte2_base |
+ byte2code.i = byte2_base |
((byte2_mask1 & *wstr) >> 6) |
((byte2_mask2 & *wstr) << 8);
- memcpy(utf8str + len, (char *) &byte2code, sizeof(byte2code));
- len += sizeof(byte2code);
+ if(big_endian)
+ {
+ memcpy(utf8str + len, (char *) &byte2code.c[1], 1);
+ memcpy(utf8str + len + 1, (char *) &byte2code.c[0], 1);
}
+ else
+ {
+ memcpy(utf8str + len, (char *) &byte2code.i,
sizeof(byte2code.i));
+ }
+ len += sizeof(byte2code.i);
+ }
else if (surrog1_bits == (*wstr & surrog_check))
{
- surrd1 = (*wstr & ~surrog_check) + surrogate_adjust;
+ surrd1.i = (*wstr & ~surrog_check) + surrogate_adjust;
wstr++;
i++;
- surrd2 = (*wstr & ~surrog_check);
- byte4code = byte4_base |
- ((byte4_sr1_mask1 & surrd1) >> 8) |
- ((byte4_sr1_mask2 & surrd1) << 6) |
- ((byte4_sr1_mask3 & surrd1) << 20) |
- ((byte4_sr2_mask1 & surrd2) << 10) |
- ((byte4_sr2_mask2 & surrd2) << 24);
- memcpy(utf8str + len, (char *) &byte4code, sizeof(byte4code));
- len += sizeof(byte4code);
+ surrd2.i = (*wstr & ~surrog_check);
+ byte4code.i = byte4_base |
+ ((byte4_sr1_mask1 & surrd1.i) >> 8) |
+ ((byte4_sr1_mask2 & surrd1.i) << 6) |
+ ((byte4_sr1_mask3 & surrd1.i) << 20) |
+ ((byte4_sr2_mask1 & surrd2.i) << 10) |
+ ((byte4_sr2_mask2 & surrd2.i) << 24);
+ if(big_endian)
+ {
+ memcpy(utf8str + len, (char *) &byte2code.c[3], 1);
+ memcpy(utf8str + len + 1, (char *) &byte2code.c[2], 1);
+ memcpy(utf8str + len + 2, (char *) &byte2code.c[1], 1);
+ memcpy(utf8str + len + 3, (char *) &byte2code.c[0], 1);
}
else
{
- byte4code = byte3_base |
+ memcpy(utf8str + len, (char *) &byte4code.i,
sizeof(byte4code.i));
+ }
+ len += sizeof(byte4code.i);
+ }
+ else
+ {
+ byte4code.i = byte3_base |
((byte3_mask1 & *wstr) >> 12) |
((byte3_mask2 & *wstr) << 2) |
((byte3_mask3 & *wstr) << 16);
- memcpy(utf8str + len, (char *) &byte4code, 3);
+ if(big_endian)
+ {
+ memcpy(utf8str + len, (char *) &byte2code.c[3], 1);
+ memcpy(utf8str + len + 1, (char *) &byte2code.c[2], 1);
+ memcpy(utf8str + len + 2, (char *) &byte2code.c[1], 1);
+ }
+ else
+ {
+ memcpy(utf8str + len, (char *) &byte4code.i, 3);
+ }
len += 3;
}
}

Adam M pisze:
> On Tue, Jul 29, 2008 at 2:36 AM, Marcin Ligorowski <ligo(at)interia(dot)pl> wrote:
>
>> Below is source code that I've implemented
>> (I've send all ucs2_to_utf8 function source code)
>>
>
> Is it possible to attach your changes as a patch? In-line posting of
> some code changes (and in non-patch format) really is not an ideal way
> to post changes.
>
> Thanks,
> Adam
>

----------------------------------------------------------------------
Igrzyska z nagrodami! Kliknij>>>> http://link.interia.pl/f1edb

In response to

Browse pgsql-odbc by date

  From Date Subject
Next Message Bill 2008-08-22 16:16:13 Text field truncated using ADO/ODBC
Previous Message Joost Kraaijeveld 2008-08-13 18:04:58 Re: time with time zone sql type?