(name_scan): Take an additional argument requesting the exact matching.

This commit is contained in:
Sergey Poznyakoff
2005-12-14 12:58:22 +00:00
parent 6cbd7e1608
commit 85cf996677

View File

@@ -446,7 +446,7 @@ addname (char const *string, int change_dir)
/* Find a match for FILE_NAME (whose string length is LENGTH) in the name
list. */
static struct name *
namelist_match (char const *file_name, size_t length)
namelist_match (char const *file_name, size_t length, bool exact)
{
struct name *p;
@@ -459,6 +459,8 @@ namelist_match (char const *file_name, size_t length)
if (p->regexp
? fnmatch (p->name, file_name, recursion_option) == 0
: exact ? (p->length == length
&& memcmp (file_name, p->name, length) == 0)
: (p->length <= length
&& (file_name[p->length] == '\0'
|| (ISSLASH (file_name[p->length]) && recursion_option))
@@ -491,7 +493,7 @@ name_match (const char *file_name)
return 1;
}
cursor = namelist_match (file_name, length);
cursor = namelist_match (file_name, length, false);
if (cursor)
{
if (!(ISSLASH (file_name[cursor->length]) && recursion_option)
@@ -787,18 +789,22 @@ collect_and_sort_names (void)
name->found_count = 0;
}
/* This is like name_match, except that it returns a pointer to the
name it matched, and doesn't set FOUND in structure. The caller
will have to do that if it wants to. Oh, and if the namelist is
empty, it returns null, unlike name_match, which returns TRUE. */
/* This is like name_match, except that
1. It returns a pointer to the name it matched, and doesn't set FOUND
in structure. The caller will have to do that if it wants to.
2. If the namelist is empty, it returns null, unlike name_match, which
returns TRUE.
3. The second argument (EXACT) controls matching algorithm. If it
is TRUE, the exact matching is used. However, regular expressions are
always matched as such, no matter what the value of EXACT is. */
struct name *
name_scan (const char *file_name)
name_scan (const char *file_name, bool exact)
{
size_t length = strlen (file_name);
while (1)
{
struct name *cursor = namelist_match (file_name, length);
struct name *cursor = namelist_match (file_name, length, exact);
if (cursor)
return cursor;