/* Various processing of names.
Copyright (C) 1988, 1992, 1994, 1996, 1997, 1998, 1999, 2000, 2001,
- 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+ 2003, 2004, 2005, 2006, 2007 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
- Free Software Foundation; either version 2, or (at your option) any later
+ Free Software Foundation; either version 3, or (at your option) any later
version.
This program is distributed in the hope that it will be useful, but
static storage and can't be relied upon across two calls.
If CHANGE_DIRS is true, treat any entries of type NELT_CHDIR as
- the request to change to the given directory. If filename_terminator
- is NUL, CHANGE_DIRS is effectively always false.
-
+ the request to change to the given directory.
+
Entries of type NELT_FMASK cause updates of the matching_flags
value. */
struct name_elt *
const char *source;
char *cursor;
- if (filename_terminator == '\0')
- change_dirs = 0;
-
while (name_index != names)
{
struct name_elt *ep;
if (allocated_size == 0)
{
allocated_size = offsetof (struct name, name) + NAME_FIELD_SIZE + 1;
- buffer = xmalloc (allocated_size);
- /* FIXME: This memset is overkill, and ugly... */
- memset (buffer, 0, allocated_size);
+ buffer = xzalloc (allocated_size);
}
while ((ep = name_next_elt (0)) && ep->type == NELT_CHDIR)
name->matching_flags = matching_flags;
name->change_dir = change_dir;
name->dir_contents = NULL;
- name->explicit = 1;
*nametail = name;
nametail = &name->next;
/* 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, bool exact)
+namelist_match (char const *file_name, size_t length)
{
struct name *p;
/* Return true if and only if name FILE_NAME (from an archive) matches any
name from the namelist. */
-int
+bool
name_match (const char *file_name)
{
size_t length = strlen (file_name);
struct name *cursor = namelist;
if (!cursor)
- return 1;
-
+ return true;
+
if (cursor->name[0] == 0)
{
chdir_do (cursor->change_dir);
namelist = 0;
nametail = &namelist;
- return 1;
+ return true;
}
- cursor = namelist_match (file_name, length, false);
+ cursor = namelist_match (file_name, length);
if (cursor)
{
if (!(ISSLASH (file_name[cursor->length]) && recursion_option)
{
name_gather (); /* read one more */
if (namelist->found_count)
- return 0;
+ return false;
}
else
- return 0;
+ return false;
}
}
len = strlen (p->file_name);
for (cursor = namelist; cursor; cursor = cursor->next)
{
- if (cursor->matching_flags /* FIXME: check this */
- || (!WASFOUND (cursor) && cursor->name[0])
+ if ((cursor->name[0] && !WASFOUND (cursor))
|| (len >= cursor->length && ISSLASH (p->file_name[cursor->length])))
return false;
}
add_hierarchy_to_namelist (struct name *name, dev_t device)
{
char *file_name = name->name;
- char *buffer = get_directory_contents (file_name, device);
+ const char *buffer = get_directory_contents (file_name, device);
if (! buffer)
name->dir_contents = "\0\0\0\0";
: NAME_FIELD_SIZE);
char *namebuf = xmalloc (allocated_length + 1);
/* FIXME: + 2 above? */
- char *string;
+ const char *string;
size_t string_length;
int change_dir = name->change_dir;
}
strcpy (namebuf + name_length, string + 1);
np = addname (namebuf, change_dir);
- np->explicit = 0;
add_hierarchy_to_namelist (np, device);
}
}
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. */
+ returns TRUE. */
struct name *
-name_scan (const char *file_name, bool exact)
+name_scan (const char *file_name)
{
size_t length = strlen (file_name);
while (1)
{
- struct name *cursor = namelist_match (file_name, length, exact);
+ struct name *cursor = namelist_match (file_name, length);
if (cursor)
return cursor;
if (p[0] == '.' && p[1] == '.' && (ISSLASH (p[2]) || !p[2]))
return 1;
- do
+ while (! ISSLASH (*p))
{
if (! *p++)
return 0;
}
- while (! ISSLASH (*p));
}
}