git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 4/8] wildmatch: support "no FNM_PATHNAME" mode

From
Junio C Hamano <gitster@pobox.com>
Date
Dec 28, 2012, 06:24 UTC
Message-ID
<7vwqw2k833.fsf@alter.siamese.dyndns.org>
In-Reply-To
<1356163028-29967-5-git-send-email-pclouds@gmail.com>
Nguyễn Thái Ngọc Duy  <pclouds@gmail.com> writes:
Show 21 quoted lines
> diff --git a/wildmatch.c b/wildmatch.c
> index a79f97e..4fe1d65 100644
> --- a/wildmatch.c
> +++ b/wildmatch.c
> @@ -77,14 +77,17 @@ static int dowild(const uchar *p, const uchar *text, unsigned int flags)
>  			continue;
>  		case '?':
>  			/* Match anything but '/'. */
> -			if (t_ch == '/')
> +			if ((flags & WM_PATHNAME) && t_ch == '/')
>  				return WM_NOMATCH;
>  			continue;
>  		case '*':
>  			if (*++p == '*') {
>  				const uchar *prev_p = p - 2;
>  				while (*++p == '*') {}
> -				if ((prev_p == text || *prev_p == '/') ||
> +				if (!(flags & WM_PATHNAME))
> +					/* without WM_PATHNAME, '*' == '**' */
> +					special = 1;
> +				else if ((prev_p == text || *prev_p == '/') ||

Not a new issue in this patch, but here, "prev_p" points into the pattern string, two bytes before p, which is the byte before the "**" that we are looking at (which might be before the beginning of the pattern). "text" is the string we are trying to match that pattern against. How can these two pointers be compared to yield a meaningful value?

>  				    (*p == '\0' || *p == '/' ||
>  				     (p[0] == '\\' && p[1] == '/'))) {
OK.  "**/", "**" (end of pattern), and "**\/" are handled here.  

Do we have to worry about "**[/]" the same way, or a class never matches the directory separator, even if it is a singleton class that consists of '/' (which is fine by me)? If so, is "\/" more or less like "[/]"?

Previous: Nguyễn Thái Ngọc DuyNext: Nguyen Thai Ngoc Duy
Message 7 of 14 in “fnmatch replacement step 1”
  1. 0/8 fnmatch replacement step 1Nguyễn Thái Ngọc Duy, Dec 22, 2012
  2. 1/8 compat/fnmatch: respect NO_FNMATCH* even on glibcNguyễn Thái Ngọc Duy, Dec 22, 2012
  3. 2/8 wildmatch: rename constants and update prototypeNguyễn Thái Ngọc Duy, Dec 22, 2012
  4. Junio C HamanoDec 26, 2012
  5. 3/8 wildmatch: make dowild() take arbitrary flagsNguyễn Thái Ngọc Duy, Dec 22, 2012
  6. 4/8 wildmatch: support "no FNM_PATHNAME" modeNguyễn Thái Ngọc Duy, Dec 22, 2012
  7. Junio C HamanoDec 28, 2012
  8. Nguyen Thai Ngoc DuyDec 28, 2012
  9. 5/8 test-wildmatch: add "perf" command to compare wildmatch and fnmatchNguyễn Thái Ngọc Duy, Dec 22, 2012
  10. 6/8 Makefile: add USE_WILDMATCH to use wildmatch as fnmatchNguyễn Thái Ngọc Duy, Dec 22, 2012
  11. 7/8 wildmatch: make a special case for "*/" with FNM_PATHNAMENguyễn Thái Ngọc Duy, Dec 22, 2012
  12. 8/8 wildmatch: advance faster in <asterisk> + <literal> patternsNguyễn Thái Ngọc Duy, Dec 22, 2012
  13. Junio C HamanoDec 28, 2012
  14. Nguyen Thai Ngoc DuyDec 28, 2012

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.