(name_scan): Take an additional argument requesting the exact matching.
This commit is contained in:
22
src/names.c
22
src/names.c
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user