/* exclude.c -- exclude file names
- Copyright 1992, 1993, 1994, 1997, 1999, 2000, 2001 Free Software
- Foundation, Inc.
+ Copyright (C) 1992, 1993, 1994, 1997, 1999, 2000, 2001, 2002 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
# endif
#endif
-#include <exclude.h>
-#include <fnmatch.h>
-#include <xalloc.h>
+#include "exclude.h"
+#include "fnmatch.h"
+#include "unlocked-io.h"
+#include "xalloc.h"
#ifndef SIZE_MAX
# define SIZE_MAX ((size_t) -1)
/* Verify a requirement at compile-time (unlike assert, which is runtime). */
#define verify(name, assertion) struct name { char a[(assertion) ? 1 : -1]; }
+/* Non-GNU systems lack these options, so we don't need to check them. */
+#ifndef FNM_CASEFOLD
+# define FNM_CASEFOLD 0
+#endif
+#ifndef FNM_LEADING_DIR
+# define FNM_LEADING_DIR 0
+#endif
+
verify (EXCLUDE_macros_do_not_collide_with_FNM_macros,
(((EXCLUDE_ANCHORED | EXCLUDE_INCLUDE | EXCLUDE_WILDCARDS)
- & (FNM_FILE_NAME | FNM_NOESCAPE | FNM_PERIOD | FNM_LEADING_DIR
+ & (FNM_PATHNAME | FNM_NOESCAPE | FNM_PERIOD | FNM_LEADING_DIR
| FNM_CASEFOLD))
== 0));
static int
fnmatch_no_wildcards (char const *pattern, char const *f, int options)
{
- if (! (options & FNM_CASEFOLD))
- return (options & FNM_LEADING_DIR ? strcasecmp : strcmp) (pattern, f);
+ if (! (options & FNM_LEADING_DIR))
+ return ((options & FNM_CASEFOLD)
+ ? strcasecmp (pattern, f)
+ : strcmp (pattern, f));
else
{
size_t patlen = strlen (pattern);
- int r = ((options & FNM_LEADING_DIR ? strncasecmp : strncmp)
- (pattern, f, patlen));
+ int r = ((options & FNM_CASEFOLD)
+ ? strncasecmp (pattern, f, patlen)
+ : strncmp (pattern, f, patlen));
if (! r)
{
r = f[patlen];
- if (r == '/' && (options & FNM_LEADING_DIR))
+ if (r == '/')
r = 0;
}
return r;
/* If no options are given, the default is to include. */
if (exclude_count == 0)
- return 0;
+ return false;
else
{
struct patopts const *exclude = ex->exclude;