| delorie.com/archives/browse.cgi | search |
| X-Authentication-Warning: | delorie.com: mail set sender to djgpp-bounces using -f |
| NNTP-Posting-Date: | Thu, 30 Nov 2006 00:32:27 -0600 |
| From: | "Alexei A. Frounze" <alexfru AT chat DOT ru> |
| Newsgroups: | comp.os.msdos.djgpp |
| References: | <iKydndAovO98z_DYnZ2dnUVZ_sadnZ2d AT comcast DOT com> <LO6dnbePOLnKzvDYnZ2dnUVZ_sGdnZ2d AT comcast DOT com> <456dad03$0$486$cc7c7865 AT news DOT luth DOT se> <200611291634 DOT kATGYcbw010800 AT envy DOT delorie DOT com> <n6qsm2l2pk3svjtu7aqu68mmhdmvldprk5 AT 4ax DOT com> |
| Subject: | Re: fnmatch("\\\\", "\\", 0) == 1 ??? |
| Date: | Wed, 29 Nov 2006 22:31:24 -0800 |
| MIME-Version: | 1.0 |
| X-Priority: | 3 |
| X-MSMail-Priority: | Normal |
| X-Newsreader: | Microsoft Outlook Express 6.00.2900.2869 |
| X-MimeOLE: | Produced By Microsoft MimeOLE V6.00.2900.2962 |
| Message-ID: | <Sb6dnSX2_Plh5_PYnZ2dnUVZ_rSdnZ2d@comcast.com> |
| Lines: | 51 |
| NNTP-Posting-Host: | 24.18.54.10 |
| X-Trace: | sv3-8e6yh+5z6CotmU9Dwr/BRrwtelRqNhqT8vXf95/UIwxLfft8omKgtE6uNufBS+944eJO7YimMeXJFpZ!WNQHsAxU7zTP9aETRuiuHDUm+adhJPIUueEVuOnTBYb8VEZaxrhnNz2p6J878njUui6hFcpZDro4!+BSh6JyToA== |
| X-Complaints-To: | abuse AT comcast DOT net |
| X-DMCA-Complaints-To: | dmca AT comcast DOT net |
| X-Abuse-and-DMCA-Info: | Please be sure to forward a copy of ALL headers |
| X-Abuse-and-DMCA-Info: | Otherwise we will be unable to process your complaint properly |
| X-Postfilter: | 1.3.32 |
| To: | djgpp AT delorie DOT com |
| DJ-Gateway: | from newsgroup comp.os.msdos.djgpp |
| Reply-To: | djgpp AT delorie DOT com |
Brian Inglis wrote:
> fOn Wed, 29 Nov 2006 11:34:38 -0500 in comp.os.msdos.djgpp, DJ Delorie
> <dj AT delorie DOT com> wrote:
>
>>
>>> This function indicates if STRING matches the PATTERN. ..."
>>>
>>> So DJGPP says that "\" doesn't match "\\" while Linux says it does.
>>>
>>> Well, I say DJGPP is right as the pattern says there should be two
>>> backslashes and you only provide one.
>>
>> Except that PATTERN is a regex influenced by FNM_NOESCAPE and
>> FNM_PATHNAME, and STRING isn't. So a pattern of "\\" is a single
>> escaped backslash, whereas a string of "\" is a single backslash.
>> They should match.
>
> switch ((c = *pattern++))
> {
> ...
> ...
> ...
> case '\\':
> /*+++ pattern already post-incremented to point to next char */
> if (!(flags & FNM_NOESCAPE) && pattern[1] && strchr("*?[\\",
> pattern[1]))
> /*+++ should be:
> if (!(flags & FNM_NOESCAPE) && strchr("*?[\\", *pattern))
> *+++ as end of input pattern will match end char in escapes string */
> {
> /*+++ end of input pattern might be clearer with ! or == '\0' */
> if ((c = *pattern++) == 0)
> {
> c = '\\';
> --pattern;
> }
> if (c != *string++)
> return FNM_NOMATCH;
> break;
> }
I don't think the above is enough. There's another problem. With the above
code you'd never see (c = *pattern++) == 0. My bet is that the intent was to
treat the slash in the last character of pattern as an ordinary character.
That would explain the {c = '\\'; --pattern;} thing along with the
fallthrough behavior. But the code is broken in this place. Dunno if it was
tested against the single unix spec or just a little bit to see that it
seems to work (in some basic cases).
Alex
| webmaster | delorie software privacy |
| Copyright © 2019 by DJ Delorie | Updated Jul 2019 |