/* 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;
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))
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)
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;