On Aug 24 11:32, Corinna Vinschen wrote:
> On Aug 23 13:25, Brian Inglis wrote:
> > Cygwin strptime(3) (also strptime(1)) fails with default width, without an
> > explicit width, because of the test in the following code:
> > 
> > case 'F':   /* The date as "%Y-%m-%d". */
> >     {
> >       LEGAL_ALT(0);
> >       ymd |= SET_YMD;
> >       char *tmp = __strptime ((const char *) bp, "%Y-%m-%d",
> >                               tm, era_info, alt_digits,
> >                               locale);
> >       if (tmp && (uint) (tmp - (char *) bp) > width)
> >         return NULL;
> >       bp = (const unsigned char *) tmp;
> >       continue;
> >     }
> > 
> > as default width is zero so test fails and returns NULL.
> > 
> > Simple patch for this as with the other cases supporting width is to change 
> > the
> > test to:
> > 
> >       if (tmp && width && (uint) (tmp - (char *) bp) > width)
> > 
> > but this does not properly support [+0] flags or width in the format as
> > specified by glibc (latest POSIX punts on %F) for compatibility with 
> > strftime(),
> > affecting only the %Y format, supplying %[+0]<w-6>F, to support signed and 
> > zero
> > filled fixed and variable length year fields in %F format.
> 
> Ok, I admit I didn't understand this fully.  What is '<w-6>'?
> Can you give a real world example?
> 
> > So do you want compatible support or just the quick fix?
> 
> Quick and then right?  Fixing this in two steps is just as well.

Btw., FreeBSD's _strptime only calls _strptime recursively, without any
checks for field width:

      case 'F':
              buf = _strptime(buf, "%Y-%m-%d", tm, GMTp, locale);
              if (buf == NULL)
                      return (NULL);
              flags |= FLAG_MONTH | FLAG_MDAY | FLAG_YEAR;
              break;


Corinna

-- 
Corinna Vinschen                  Please, send mails regarding Cygwin to
Cygwin Maintainer                 cygwin AT cygwin DOT com
Red Hat

Attachment: signature.asc
Description: PGP signature

Reply via email to