Blame gnulib-tests/test-exclude.c

Packit 33f14e
/* Test suite for exclude.
Packit 33f14e
   Copyright (C) 2009-2017 Free Software Foundation, Inc.
Packit 33f14e
   This file is part of the GNUlib Library.
Packit 33f14e
Packit 33f14e
   This program is free software: you can redistribute it and/or modify
Packit 33f14e
   it under the terms of the GNU General Public License as published by
Packit 33f14e
   the Free Software Foundation; either version 3 of the License, or
Packit 33f14e
   (at your option) any later version.
Packit 33f14e
Packit 33f14e
   This program is distributed in the hope that it will be useful,
Packit 33f14e
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 33f14e
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 33f14e
   GNU General Public License for more details.
Packit 33f14e
Packit 33f14e
   You should have received a copy of the GNU General Public License
Packit 33f14e
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit 33f14e
Packit 33f14e
#include <config.h>
Packit 33f14e
#include <stdio.h>
Packit 33f14e
#include <stdlib.h>
Packit 33f14e
#include <errno.h>
Packit 33f14e
#include <string.h>
Packit 33f14e
#include <stdbool.h>
Packit 33f14e
#include <fnmatch.h>
Packit 33f14e
Packit 33f14e
#include "exclude.h"
Packit 33f14e
#include "error.h"
Packit 33f14e
#include "argmatch.h"
Packit 33f14e
Packit 33f14e
#ifndef FNM_CASEFOLD
Packit 33f14e
# define FNM_CASEFOLD 0
Packit 33f14e
#endif
Packit 33f14e
#ifndef FNM_LEADING_DIR
Packit 33f14e
# define FNM_LEADING_DIR 0
Packit 33f14e
#endif
Packit 33f14e
Packit 33f14e
char const * const exclude_keywords[] = {
Packit 33f14e
  "noescape",
Packit 33f14e
  "pathname",
Packit 33f14e
  "period",
Packit 33f14e
  "leading_dir",
Packit 33f14e
  "casefold",
Packit 33f14e
  "anchored",
Packit 33f14e
  "include",
Packit 33f14e
  "wildcards",
Packit 33f14e
  NULL
Packit 33f14e
};
Packit 33f14e
Packit 33f14e
int exclude_flags[] = {
Packit 33f14e
  FNM_NOESCAPE,
Packit 33f14e
  FNM_PATHNAME,
Packit 33f14e
  FNM_PERIOD,
Packit 33f14e
  FNM_LEADING_DIR,
Packit 33f14e
  FNM_CASEFOLD,
Packit 33f14e
  EXCLUDE_ANCHORED,
Packit 33f14e
  EXCLUDE_INCLUDE,
Packit 33f14e
  EXCLUDE_WILDCARDS
Packit 33f14e
};
Packit 33f14e
Packit 33f14e
ARGMATCH_VERIFY (exclude_keywords, exclude_flags);
Packit 33f14e
Packit 33f14e
/* Some packages define ARGMATCH_DIE and ARGMATCH_DIE_DECL in <config.h>, and
Packit 33f14e
   thus must link with a definition of that function.  Provide it here.  */
Packit 33f14e
#ifdef ARGMATCH_DIE_DECL
Packit 33f14e
Packit 33f14e
_Noreturn ARGMATCH_DIE_DECL;
Packit 33f14e
ARGMATCH_DIE_DECL { exit (1); }
Packit 33f14e
Packit 33f14e
#endif
Packit 33f14e
Packit 33f14e
int
Packit 33f14e
main (int argc, char **argv)
Packit 33f14e
{
Packit 33f14e
  int exclude_options = 0;
Packit 33f14e
  struct exclude *exclude = new_exclude ();
Packit 33f14e
Packit 33f14e
  if (argc == 1)
Packit 33f14e
    error (1, 0, "usage: %s file -- words...", argv[0]);
Packit 33f14e
Packit 33f14e
  while (--argc)
Packit 33f14e
    {
Packit 33f14e
      char *opt = *++argv;
Packit 33f14e
      if (opt[0] == '-')
Packit 33f14e
        {
Packit 33f14e
          int neg = 0;
Packit 33f14e
          int flag;
Packit 33f14e
          char *s = opt + 1;
Packit 33f14e
Packit 33f14e
          if (opt[1] == '-' && opt[2] == 0)
Packit 33f14e
            {
Packit 33f14e
              argc--;
Packit 33f14e
              break;
Packit 33f14e
            }
Packit 33f14e
          if (strlen (s) > 3 && memcmp (s, "no-", 3) == 0)
Packit 33f14e
            {
Packit 33f14e
              neg = 1;
Packit 33f14e
              s += 3;
Packit 33f14e
            }
Packit 33f14e
          flag = XARGMATCH (opt, s, exclude_keywords, exclude_flags);
Packit 33f14e
          if (neg)
Packit 33f14e
            exclude_options &= ~flag;
Packit 33f14e
          else
Packit 33f14e
            exclude_options |= flag;
Packit 33f14e
Packit 33f14e
          /* Skip this test if invoked with -leading-dir on a system that
Packit 33f14e
             lacks support for FNM_LEADING_DIR. */
Packit 33f14e
          if (strcmp (s, "leading_dir") == 0 && FNM_LEADING_DIR == 0)
Packit 33f14e
            exit (77);
Packit 33f14e
Packit 33f14e
          /* Likewise for -casefold and FNM_CASEFOLD.  */
Packit 33f14e
          if (strcmp (s, "casefold") == 0 && FNM_CASEFOLD == 0)
Packit 33f14e
            exit (77);
Packit 33f14e
        }
Packit 33f14e
      else if (add_exclude_file (add_exclude, exclude, opt,
Packit 33f14e
                                 exclude_options, '\n') != 0)
Packit 33f14e
        error (1, errno, "error loading %s", opt);
Packit 33f14e
    }
Packit 33f14e
Packit 33f14e
  for (; argc; --argc)
Packit 33f14e
    {
Packit 33f14e
      char *word = *++argv;
Packit 33f14e
Packit 33f14e
      printf ("%s: %d\n", word, excluded_file_name (exclude, word));
Packit 33f14e
    }
Packit 33f14e
Packit 33f14e
  free_exclude (exclude);
Packit 33f14e
  return 0;
Packit 33f14e
}