OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-6.8/] [libiberty/] [fnmatch.c] - Diff between revs 827 and 840

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 827 Rev 840
/* Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc.
/* Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc.
 
 
NOTE: This source is derived from an old version taken from the GNU C
NOTE: This source is derived from an old version taken from the GNU C
Library (glibc).
Library (glibc).
 
 
This program is free software; you can redistribute it and/or modify it
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
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
Free Software Foundation; either version 2, or (at your option) any
later version.
later version.
 
 
This program is distributed in the hope that it will be useful,
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
GNU General Public License for more details.
 
 
You should have received a copy of the GNU General Public License
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
along with this program; if not, write to the Free Software
Foundation, 51 Franklin Street - Fifth Floor,
Foundation, 51 Franklin Street - Fifth Floor,
Boston, MA 02110-1301, USA.  */
Boston, MA 02110-1301, USA.  */
 
 
#ifdef HAVE_CONFIG_H
#ifdef HAVE_CONFIG_H
#if defined (CONFIG_BROKETS)
#if defined (CONFIG_BROKETS)
/* We use <config.h> instead of "config.h" so that a compilation
/* We use <config.h> instead of "config.h" so that a compilation
   using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h
   using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h
   (which it would do because it found this file in $srcdir).  */
   (which it would do because it found this file in $srcdir).  */
#include <config.h>
#include <config.h>
#else
#else
#include "config.h"
#include "config.h"
#endif
#endif
#endif
#endif
 
 
 
 
#ifndef _GNU_SOURCE
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#define _GNU_SOURCE
#endif
#endif
 
 
/* This code to undef const added in libiberty.  */
/* This code to undef const added in libiberty.  */
#ifndef __STDC__
#ifndef __STDC__
/* This is a separate conditional since some stdc systems
/* This is a separate conditional since some stdc systems
   reject `defined (const)'.  */
   reject `defined (const)'.  */
#ifndef const
#ifndef const
#define const
#define const
#endif
#endif
#endif
#endif
 
 
#include <errno.h>
#include <errno.h>
#include <fnmatch.h>
#include <fnmatch.h>
#include <safe-ctype.h>
#include <safe-ctype.h>
 
 
/* Comment out all this code if we are using the GNU C Library, and are not
/* Comment out all this code if we are using the GNU C Library, and are not
   actually compiling the library itself.  This code is part of the GNU C
   actually compiling the library itself.  This code is part of the GNU C
   Library, but also included in many other GNU distributions.  Compiling
   Library, but also included in many other GNU distributions.  Compiling
   and linking in this code is a waste when using the GNU C library
   and linking in this code is a waste when using the GNU C library
   (especially if it is a shared library).  Rather than having every GNU
   (especially if it is a shared library).  Rather than having every GNU
   program understand `configure --with-gnu-libc' and omit the object files,
   program understand `configure --with-gnu-libc' and omit the object files,
   it is simpler to just do this in the source for each such file.  */
   it is simpler to just do this in the source for each such file.  */
 
 
#if defined (_LIBC) || !defined (__GNU_LIBRARY__)
#if defined (_LIBC) || !defined (__GNU_LIBRARY__)
 
 
 
 
#if !defined(__GNU_LIBRARY__) && !defined(STDC_HEADERS)
#if !defined(__GNU_LIBRARY__) && !defined(STDC_HEADERS)
extern int errno;
extern int errno;
#endif
#endif
 
 
/* Match STRING against the filename pattern PATTERN, returning zero if
/* Match STRING against the filename pattern PATTERN, returning zero if
   it matches, nonzero if not.  */
   it matches, nonzero if not.  */
int
int
fnmatch (const char *pattern, const char *string, int flags)
fnmatch (const char *pattern, const char *string, int flags)
{
{
  register const char *p = pattern, *n = string;
  register const char *p = pattern, *n = string;
  register unsigned char c;
  register unsigned char c;
 
 
#define FOLD(c) ((flags & FNM_CASEFOLD) ? TOLOWER (c) : (c))
#define FOLD(c) ((flags & FNM_CASEFOLD) ? TOLOWER (c) : (c))
 
 
  while ((c = *p++) != '\0')
  while ((c = *p++) != '\0')
    {
    {
      c = FOLD (c);
      c = FOLD (c);
 
 
      switch (c)
      switch (c)
        {
        {
        case '?':
        case '?':
          if (*n == '\0')
          if (*n == '\0')
            return FNM_NOMATCH;
            return FNM_NOMATCH;
          else if ((flags & FNM_FILE_NAME) && *n == '/')
          else if ((flags & FNM_FILE_NAME) && *n == '/')
            return FNM_NOMATCH;
            return FNM_NOMATCH;
          else if ((flags & FNM_PERIOD) && *n == '.' &&
          else if ((flags & FNM_PERIOD) && *n == '.' &&
                   (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/')))
                   (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/')))
            return FNM_NOMATCH;
            return FNM_NOMATCH;
          break;
          break;
 
 
        case '\\':
        case '\\':
          if (!(flags & FNM_NOESCAPE))
          if (!(flags & FNM_NOESCAPE))
            {
            {
              c = *p++;
              c = *p++;
              c = FOLD (c);
              c = FOLD (c);
            }
            }
          if (FOLD ((unsigned char)*n) != c)
          if (FOLD ((unsigned char)*n) != c)
            return FNM_NOMATCH;
            return FNM_NOMATCH;
          break;
          break;
 
 
        case '*':
        case '*':
          if ((flags & FNM_PERIOD) && *n == '.' &&
          if ((flags & FNM_PERIOD) && *n == '.' &&
              (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/')))
              (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/')))
            return FNM_NOMATCH;
            return FNM_NOMATCH;
 
 
          for (c = *p++; c == '?' || c == '*'; c = *p++, ++n)
          for (c = *p++; c == '?' || c == '*'; c = *p++, ++n)
            if (((flags & FNM_FILE_NAME) && *n == '/') ||
            if (((flags & FNM_FILE_NAME) && *n == '/') ||
                (c == '?' && *n == '\0'))
                (c == '?' && *n == '\0'))
              return FNM_NOMATCH;
              return FNM_NOMATCH;
 
 
          if (c == '\0')
          if (c == '\0')
            return 0;
            return 0;
 
 
          {
          {
            unsigned char c1 = (!(flags & FNM_NOESCAPE) && c == '\\') ? *p : c;
            unsigned char c1 = (!(flags & FNM_NOESCAPE) && c == '\\') ? *p : c;
            c1 = FOLD (c1);
            c1 = FOLD (c1);
            for (--p; *n != '\0'; ++n)
            for (--p; *n != '\0'; ++n)
              if ((c == '[' || FOLD ((unsigned char)*n) == c1) &&
              if ((c == '[' || FOLD ((unsigned char)*n) == c1) &&
                  fnmatch (p, n, flags & ~FNM_PERIOD) == 0)
                  fnmatch (p, n, flags & ~FNM_PERIOD) == 0)
                return 0;
                return 0;
            return FNM_NOMATCH;
            return FNM_NOMATCH;
          }
          }
 
 
        case '[':
        case '[':
          {
          {
            /* Nonzero if the sense of the character class is inverted.  */
            /* Nonzero if the sense of the character class is inverted.  */
            register int negate;
            register int negate;
 
 
            if (*n == '\0')
            if (*n == '\0')
              return FNM_NOMATCH;
              return FNM_NOMATCH;
 
 
            if ((flags & FNM_PERIOD) && *n == '.' &&
            if ((flags & FNM_PERIOD) && *n == '.' &&
                (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/')))
                (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/')))
              return FNM_NOMATCH;
              return FNM_NOMATCH;
 
 
            negate = (*p == '!' || *p == '^');
            negate = (*p == '!' || *p == '^');
            if (negate)
            if (negate)
              ++p;
              ++p;
 
 
            c = *p++;
            c = *p++;
            for (;;)
            for (;;)
              {
              {
                register unsigned char cstart = c, cend = c;
                register unsigned char cstart = c, cend = c;
 
 
                if (!(flags & FNM_NOESCAPE) && c == '\\')
                if (!(flags & FNM_NOESCAPE) && c == '\\')
                  cstart = cend = *p++;
                  cstart = cend = *p++;
 
 
                cstart = cend = FOLD (cstart);
                cstart = cend = FOLD (cstart);
 
 
                if (c == '\0')
                if (c == '\0')
                  /* [ (unterminated) loses.  */
                  /* [ (unterminated) loses.  */
                  return FNM_NOMATCH;
                  return FNM_NOMATCH;
 
 
                c = *p++;
                c = *p++;
                c = FOLD (c);
                c = FOLD (c);
 
 
                if ((flags & FNM_FILE_NAME) && c == '/')
                if ((flags & FNM_FILE_NAME) && c == '/')
                  /* [/] can never match.  */
                  /* [/] can never match.  */
                  return FNM_NOMATCH;
                  return FNM_NOMATCH;
 
 
                if (c == '-' && *p != ']')
                if (c == '-' && *p != ']')
                  {
                  {
                    cend = *p++;
                    cend = *p++;
                    if (!(flags & FNM_NOESCAPE) && cend == '\\')
                    if (!(flags & FNM_NOESCAPE) && cend == '\\')
                      cend = *p++;
                      cend = *p++;
                    if (cend == '\0')
                    if (cend == '\0')
                      return FNM_NOMATCH;
                      return FNM_NOMATCH;
                    cend = FOLD (cend);
                    cend = FOLD (cend);
 
 
                    c = *p++;
                    c = *p++;
                  }
                  }
 
 
                if (FOLD ((unsigned char)*n) >= cstart
                if (FOLD ((unsigned char)*n) >= cstart
                    && FOLD ((unsigned char)*n) <= cend)
                    && FOLD ((unsigned char)*n) <= cend)
                  goto matched;
                  goto matched;
 
 
                if (c == ']')
                if (c == ']')
                  break;
                  break;
              }
              }
            if (!negate)
            if (!negate)
              return FNM_NOMATCH;
              return FNM_NOMATCH;
            break;
            break;
 
 
          matched:;
          matched:;
            /* Skip the rest of the [...] that already matched.  */
            /* Skip the rest of the [...] that already matched.  */
            while (c != ']')
            while (c != ']')
              {
              {
                if (c == '\0')
                if (c == '\0')
                  /* [... (unterminated) loses.  */
                  /* [... (unterminated) loses.  */
                  return FNM_NOMATCH;
                  return FNM_NOMATCH;
 
 
                c = *p++;
                c = *p++;
                if (!(flags & FNM_NOESCAPE) && c == '\\')
                if (!(flags & FNM_NOESCAPE) && c == '\\')
                  /* XXX 1003.2d11 is unclear if this is right.  */
                  /* XXX 1003.2d11 is unclear if this is right.  */
                  ++p;
                  ++p;
              }
              }
            if (negate)
            if (negate)
              return FNM_NOMATCH;
              return FNM_NOMATCH;
          }
          }
          break;
          break;
 
 
        default:
        default:
          if (c != FOLD ((unsigned char)*n))
          if (c != FOLD ((unsigned char)*n))
            return FNM_NOMATCH;
            return FNM_NOMATCH;
        }
        }
 
 
      ++n;
      ++n;
    }
    }
 
 
  if (*n == '\0')
  if (*n == '\0')
    return 0;
    return 0;
 
 
  if ((flags & FNM_LEADING_DIR) && *n == '/')
  if ((flags & FNM_LEADING_DIR) && *n == '/')
    /* The FNM_LEADING_DIR flag says that "foo*" matches "foobar/frobozz".  */
    /* The FNM_LEADING_DIR flag says that "foo*" matches "foobar/frobozz".  */
    return 0;
    return 0;
 
 
  return FNM_NOMATCH;
  return FNM_NOMATCH;
}
}
 
 
#endif  /* _LIBC or not __GNU_LIBRARY__.  */
#endif  /* _LIBC or not __GNU_LIBRARY__.  */
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.