Thread: Re: about contrib/dbase/dbf.c (fwd): conversion of non-ascii dbf

Re: about contrib/dbase/dbf.c (fwd): conversion of non-ascii dbf

From
Andriy Tkachuk
Date:
Hi folks.

I suppose, that Bruse was busy to answer on my last mail on this topic.
But I love, when something work rather then it do not :)

What do you think about this little patch?

Sorry if i put this msg into wrong list, but i didn't find
more appropriate for this contrib. I will be appreciate if
you put me into right one.

Thanks,
 Andriy.

http://www.imt.com.ua

---------- Forwarded message ----------

The code above skips anything but chars between 0x21 and 0x7E.
My dbf have cyrillic charset, so any filds, that doesn't end on "." (dot)
are truncated. Moreover "chars between 0x21 and 0x7E" means, that
dbf2pg is not working for not ascii charset unless string ends on
some ascii symbol, usually punctuation.

What else than isspace one must skip (trim) in 'C' (char) field in dbf?

On Thu, 24 Jul 2003, Bruce Momjian wrote:

>
> Can we assume anything in that range is a space?  There must be a better
> way.
>
>
> ---------------------------------------------------------------------------
>
> Andriy Tkachuk wrote:
> > Bruse, what about this:
> >
> > Index: contrib/dbase/dbf.c
> > ===================================================================
> > RCS file: /projects/cvsroot/pgsql-server/contrib/dbase/dbf.c,v
> > retrieving revision 1.5
> > diff -r1.5 dbf.c
> > 337c337
> > <                       while ((i > 0) && ((*end < 0x21) || (*end > 0x7E)))
> > ---
> > >                       while ((i > 0) && isspace(*end))
> >
> > it fixes an bug for me with cyrillic conversion.
> >
> > Thanks,
> >     Andriy.
> >
> >
>
> --
>   Bruce Momjian                        |  http://candle.pha.pa.us
>   pgman@candle.pha.pa.us               |  (610) 359-1001
>   +  If your life is a hard drive,     |  13 Roberts Road
>   +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
>

--
  Because strait is the gate, and narrow is the way, which leadeth unto
   life, and few there be that find it. (MAT 7:14)
  Ask, and it shall be given you; seek, and ye shall find;
   knock, and it shall be opened unto you... (MAT 7:7)

ANT17-RIPE



Re: about contrib/dbase/dbf.c (fwd): conversion of non-ascii

From
Bruce Momjian
Date:
I already applied your DBF patch, but I just found a cleaner way ---
patch attached and applied.

---------------------------------------------------------------------------

Andriy Tkachuk wrote:
> Hi folks.
>
> I suppose, that Bruse was busy to answer on my last mail on this topic.
> But I love, when something work rather then it do not :)
>
> What do you think about this little patch?
>
> Sorry if i put this msg into wrong list, but i didn't find
> more appropriate for this contrib. I will be appreciate if
> you put me into right one.
>
> Thanks,
>  Andriy.
>
> http://www.imt.com.ua
>
> ---------- Forwarded message ----------
>
> The code above skips anything but chars between 0x21 and 0x7E.
> My dbf have cyrillic charset, so any filds, that doesn't end on "." (dot)
> are truncated. Moreover "chars between 0x21 and 0x7E" means, that
> dbf2pg is not working for not ascii charset unless string ends on
> some ascii symbol, usually punctuation.
>
> What else than isspace one must skip (trim) in 'C' (char) field in dbf?
>
> On Thu, 24 Jul 2003, Bruce Momjian wrote:
>
> >
> > Can we assume anything in that range is a space?  There must be a better
> > way.
> >
> >
> > ---------------------------------------------------------------------------
> >
> > Andriy Tkachuk wrote:
> > > Bruse, what about this:
> > >
> > > Index: contrib/dbase/dbf.c
> > > ===================================================================
> > > RCS file: /projects/cvsroot/pgsql-server/contrib/dbase/dbf.c,v
> > > retrieving revision 1.5
> > > diff -r1.5 dbf.c
> > > 337c337
> > > <                       while ((i > 0) && ((*end < 0x21) || (*end > 0x7E)))
> > > ---
> > > >                       while ((i > 0) && isspace(*end))
> > >
> > > it fixes an bug for me with cyrillic conversion.
> > >
> > > Thanks,
> > >     Andriy.
> > >
> > >
> >
> > --
> >   Bruce Momjian                        |  http://candle.pha.pa.us
> >   pgman@candle.pha.pa.us               |  (610) 359-1001
> >   +  If your life is a hard drive,     |  13 Roberts Road
> >   +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
> >
>
> --
>   Because strait is the gate, and narrow is the way, which leadeth unto
>    life, and few there be that find it. (MAT 7:14)
>   Ask, and it shall be given you; seek, and ye shall find;
>    knock, and it shall be opened unto you... (MAT 7:7)
>
> ANT17-RIPE
>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 2: you can get off all lists at once with the unregister command
>     (send "unregister YourEmailAddressHere" to majordomo@postgresql.org)
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: contrib/dbase/dbf.c
===================================================================
RCS file: /cvsroot/pgsql-server/contrib/dbase/dbf.c,v
retrieving revision 1.5
diff -c -c -r1.5 dbf.c
*** contrib/dbase/dbf.c    5 Sep 2002 20:57:00 -0000    1.5
--- contrib/dbase/dbf.c    10 Sep 2003 00:31:41 -0000
***************
*** 334,340 ****
          {
              end = &dbffield[fields[t].db_flen - 1];
              i = fields[t].db_flen;
!             while ((i > 0) && ((*end < 0x21) || (*end > 0x7E)))
              {
                  end--;
                  i--;
--- 334,340 ----
          {
              end = &dbffield[fields[t].db_flen - 1];
              i = fields[t].db_flen;
!             while (i > 0 && !isprint(*end))
              {
                  end--;
                  i--;
***************
*** 346,352 ****
          {
              end = dbffield;
              i = fields[t].db_flen;
!             while ((i > 0) && ((*end < 0x21) || (*end > 0x7E)))
              {
                  end++;
                  i--;
--- 346,352 ----
          {
              end = dbffield;
              i = fields[t].db_flen;
!             while (i > 0 && !isprint(*end))
              {
                  end++;
                  i--;