From: Sergey Poznyakoff Date: Wed, 14 Dec 2005 12:58:22 +0000 (+0000) Subject: (name_scan): Take an additional argument requesting the exact matching. X-Git-Url: https://git.brokenzipper.com/gitweb?a=commitdiff_plain;h=85cf996677770c517b4b6c138155c79d7c86b28f;p=chaz%2Ftar (name_scan): Take an additional argument requesting the exact matching. --- diff --git a/src/names.c b/src/names.c index 2b24231..03eece6 100644 --- a/src/names.c +++ b/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;