delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp-workers/2003/09/01/08:06:56

Subject: Non-compliant strxfrm
MIME-Version: 1.0
Date: Mon, 1 Sep 2003 10:56:07 +0100
content-class: urn:content-classes:message
X-MimeOLE: Produced By Microsoft Exchange V6.0.4417.0
Message-ID: <F1A9C8D7A58D1B45A9C16FE7E3DA83D702188D@server.HME.hme.ltd.uk>
X-MS-Has-Attach:
X-MS-TNEF-Correlator:
Thread-Topic: Non-compliant strxfrm
Thread-Index: AcNwbsY5Afc5D9xcEdeGDgBQvzMKIA==
From: "Melvin Curran" <Melvin AT HME DOT Ltd DOT uk>
To: <djgpp-workers AT delorie DOT com>
X-MIME-Autoconverted: from quoted-printable to 8bit by delorie.com id h81C6li14451
Reply-To: djgpp-workers AT delorie DOT com

I found this when I was running the boost regex library though its
regression tests - it was getting the wrong answers for some of
them. I eventually tracked the problem down to some calls to
strxfrm, and when I checked the C99 standard (sect. 7.21.4.5)
I found that the DJGPP version was almost completely wrong.

Below is a version that I believe follows the standard (although
you should feel free to pick holes in it :), and allows the boost
regex library to work properly.

size_t
strxfrm(dst, src, n)
     char *dst;
     const char *src;
     size_t n;
{
  size_t r;
  int c;

  if (n != 0)
  {
    if (dst == 0)
      return (size_t)(-1);
    r = 0;
    while ((c = *src++) != 0)
    {
      if (--n == 0)
        break;
      else
        r++;
      *dst++ = c;
    }
    *dst = 0;
    return r;
  }
  else if (dst == 0)
  {
    for (dst = (char*)src; *dst; dst++)
      ;
    return dst-src;
  }
  else
    return (size_t)(-1);
}

-- 
||  ||   |||||| | HME Ltd.          |
||  ||| |||     |                   |
|||||| | |||||  |                   |
||  ||   ||     | Melvin Curran     |
||  ||   |||||| | melvin AT hme DOT ltd DOT uk |

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019