/* Various processing of names.
Copyright (C) 1988, 1992, 1994, 1996, 1997, 1998, 1999, 2000, 2001,
- 2003, 2004, 2005 Free Software Foundation, Inc.
+ 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
}
name_array[names++] = name;
}
+
\f
/* Names from external name file. */
name->firstch = 1; /* assume first char is literal */
name->change_dir = change_dir;
name->dir_contents = 0;
+ name->explicit = 1;
if (string && is_pattern (string))
{
/* 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)
string_length = strlen (string);
if (*string == 'D')
{
+ struct name *np;
+
if (allocated_length <= name_length + string_length)
{
do
namebuf = xrealloc (namebuf, allocated_length + 1);
}
strcpy (namebuf + name_length, string + 1);
- add_hierarchy_to_namelist (addname (namebuf, change_dir),
- device);
+ np = addname (namebuf, change_dir);
+ np->explicit = 0;
+ add_hierarchy_to_namelist (np, device);
}
}
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;