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
signature.asc
Description: PGP signature