亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? fnmatch.c

?? UNIX下SH的實現源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* fnmatch.c -- ksh-like extended pattern matching for the shell and filename
		globbing. */

/* Copyright (C) 1991, 1997 Free Software Foundation, Inc.

   This file is part of GNU Bash, the Bourne Again SHell.
   
   Bash 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
   version.
              
   Bash is distributed in the hope that it will be useful, but WITHOUT ANY
   WARRANTY; without even the implied warranty of MERCHANTABILITY or
   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
   for more details.
                         
   You should have received a copy of the GNU General Public License along
   with Bash; see the file COPYING.  If not, write to the Free Software
   Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */

#include <config.h>

#include <stdio.h>	/* for debugging */
                                
#include "fnmatch.h"
#include "collsyms.h"
#include <ctype.h>

#if defined (HAVE_STRING_H)
#  include <string.h>
#else
#  include <strings.h>
#endif /* HAVE_STRING_H */

static int gmatch ();
static char *brackmatch ();
#ifdef EXTENDED_GLOB
static int extmatch ();
static char *patscan ();
#endif
  
#if !defined (isascii)
#  define isascii(c)	((unsigned int)(c) <= 0177)
#endif

/* Note that these evaluate C many times.  */

#ifndef isblank
#  define isblank(c)	((c) == ' ' || (c) == '\t')
#endif

#ifndef isgraph
#  define isgraph(c)	((c) != ' ' && isprint((c)))
#endif

#ifndef isxdigit
#  define isxdigit(c)	(((c) >= '0' && (c) <= '9') || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F'))
#endif

/* The result of FOLD is an `unsigned char' */
# define FOLD(c) ((flags & FNM_CASEFOLD) && isupper ((unsigned char)c) \
	? tolower ((unsigned char)c) \
	: ((unsigned char)c))

#ifndef STREQ
#define STREQ(a, b) ((a)[0] == (b)[0] && strcmp(a, b) == 0)
#define STREQN(a, b, n) ((a)[0] == (b)[0] && strncmp(a, b, n) == 0)
#endif

/* We don't use strcoll(3) for range comparisons in bracket expressions,
   even if we have it, since it can have unwanted side effects in locales
   other than POSIX or US.  For instance, in the de locale, [A-Z] matches
   all characters.  So, for ranges we use ASCII collation, and for
   collating symbol equivalence we use strcoll().  The casts to int are
   to handle tests that use unsigned chars. */

#define rangecmp(c1, c2)	((int)(c1) - (int)(c2))

#if defined (HAVE_STRCOLL)
/* Helper function for collating symbol equivalence. */
static int rangecmp2 (c1, c2)
     int c1, c2;
{
  static char s1[2] = { ' ', '\0' };
  static char s2[2] = { ' ', '\0' };
  int ret;

  /* Eight bits only.  Period. */
  c1 &= 0xFF;
  c2 &= 0xFF;

  if (c1 == c2)
    return (0);

  s1[0] = c1;
  s2[0] = c2;

  if ((ret = strcoll (s1, s2)) != 0)
    return ret;
  return (c1 - c2);
}
#else /* !HAVE_STRCOLL */
#  define rangecmp2(c1, c2)	((int)(c1) - (int)(c2))
#endif /* !HAVE_STRCOLL */

#if defined (HAVE_STRCOLL)
static int collequiv (c1, c2)
     int c1, c2;
{
  return (rangecmp2 (c1, c2) == 0);
}
#else
#  define collequiv(c1, c2)	((c1) == (c2))
#endif

static int
collsym (s, len)
     char *s;
     int len;
{
  register struct _collsym *csp;

  for (csp = posix_collsyms; csp->name; csp++)
    {
      if (STREQN(csp->name, s, len) && csp->name[len] == '\0')
        return (csp->code);
    }
  if (len == 1)
    return s[0];
  return -1;
}

int
fnmatch (pattern, string, flags)
     char *pattern;
     char *string;
     int flags;
{
  char *se, *pe;

  if (string == 0 || pattern == 0)
    return FNM_NOMATCH;

  se = string + strlen (string);
  pe = pattern + strlen (pattern);

  return (gmatch (string, se, pattern, pe, flags));
}

/* Match STRING against the filename pattern PATTERN, returning zero if
   it matches, FNM_NOMATCH if not.  */
static int
gmatch (string, se, pattern, pe, flags)
     char *string, *se;
     char *pattern, *pe;
     int flags;
{
  register char *p, *n;		/* pattern, string */
  register char c;		/* current pattern character */
  register char sc;		/* current string character */

  p = pattern;
  n = string;

  if (string == 0 || pattern == 0)
    return FNM_NOMATCH;

  while (p < pe)
    {
      c = *p++;
      c = FOLD (c);

      sc = n < se ? *n : '\0';

#ifdef EXTENDED_GLOB
      /* extmatch () will handle recursively calling gmatch, so we can
	 just return what extmatch() returns. */
      if ((flags & FNM_EXTMATCH) && *p == '(' &&
	  (c == '+' || c == '*' || c == '?' || c == '@' || c == '!')) /* ) */
	{
	  int lflags;
	  /* If we're not matching the start of the string, we're not
	     concerned about the special cases for matching `.' */
	  lflags = (n == string) ? flags : (flags & ~FNM_PERIOD);
	  return (extmatch (c, n, se, p, pe, lflags));
	}
#endif

      switch (c)
	{
	case '?':		/* Match single character */
	  if (sc == '\0')
	    return FNM_NOMATCH;
	  else if ((flags & FNM_PATHNAME) && sc == '/')
	    /* If we are matching a pathname, `?' can never match a `/'. */
	    return FNM_NOMATCH;
	  else if ((flags & FNM_PERIOD) && sc == '.' &&
		   (n == string || ((flags & FNM_PATHNAME) && n[-1] == '/')))
	    /* `?' cannot match a `.' if it is the first character of the
	       string or if it is the first character following a slash and
	       we are matching a pathname. */
	    return FNM_NOMATCH;
	  break;

	case '\\':		/* backslash escape removes special meaning */
	  if (p == pe)
	    return FNM_NOMATCH;

	  if ((flags & FNM_NOESCAPE) == 0)
	    {
	      c = *p++;
	      /* A trailing `\' cannot match. */
	      if (p > pe)
		return FNM_NOMATCH;
	      c = FOLD (c);
	    }
	  if (FOLD (sc) != (unsigned char)c)
	    return FNM_NOMATCH;
	  break;

	case '*':		/* Match zero or more characters */
	  if (p == pe)
	    return 0;
	  
	  if ((flags & FNM_PERIOD) && sc == '.' &&
	      (n == string || ((flags & FNM_PATHNAME) && n[-1] == '/')))
	    /* `*' cannot match a `.' if it is the first character of the
	       string or if it is the first character following a slash and
	       we are matching a pathname. */
	    return FNM_NOMATCH;

	  /* Collapse multiple consecutive, `*' and `?', but make sure that
	     one character of the string is consumed for each `?'. */
	  for (c = *p++; (c == '?' || c == '*'); c = *p++)
	    {
	      if ((flags & FNM_PATHNAME) && sc == '/')
		/* A slash does not match a wildcard under FNM_PATHNAME. */
		return FNM_NOMATCH;
	      else if (c == '?')
		{
		  if (sc == '\0')
		    return FNM_NOMATCH;
		  /* One character of the string is consumed in matching
		     this ? wildcard, so *??? won't match if there are
		     fewer than three characters. */
		  n++;
		  sc = n < se ? *n : '\0';
		}

#ifdef EXTENDED_GLOB
	      /* Handle ******(patlist) */
	      if ((flags & FNM_EXTMATCH) && c == '*' && *p == '(')  /*)*/
		{
		  char *newn;
		  /* We need to check whether or not the extended glob
		     pattern matches the remainder of the string.
		     If it does, we match the entire pattern. */
		  for (newn = n; newn < se; ++newn)
		    {
		      if (extmatch (c, newn, se, p, pe, flags) == 0)
			return (0);
		    }
		  /* We didn't match the extended glob pattern, but
		     that's OK, since we can match 0 or more occurrences.
		     We need to skip the glob pattern and see if we
		     match the rest of the string. */
		  newn = patscan (p + 1, pe, 0);
		  p = newn;
		}
#endif
	      if (p == pe)
	        break;
	    }

	  /* If we've hit the end of the pattern and the last character of
	     the pattern was handled by the loop above, we've succeeded.
	     Otherwise, we need to match that last character. */
	  if (p == pe && (c == '?' || c == '*'))
	    return (0);

	  /* General case, use recursion. */
	  {
	    unsigned char c1;

	    c1 = (unsigned char)((flags & FNM_NOESCAPE) == 0 && c == '\\') ? *p : c;
	    c1 = FOLD (c1);
	    for (--p; n < se; ++n)
	      {
		/* Only call fnmatch if the first character indicates a
		   possible match.  We can check the first character if
		   we're not doing an extended glob match. */
		if ((flags & FNM_EXTMATCH) == 0 && c != '[' && FOLD (*n) != c1)
		  continue;

		/* If we're doing an extended glob match and the pattern is not
		   one of the extended glob patterns, we can check the first
		   character. */
		if ((flags & FNM_EXTMATCH) && p[1] != '(' && /*)*/
		    strchr ("?*+@!", *p) == 0 && c != '[' && FOLD (*n) != c1)
		  continue;

		/* Otherwise, we just recurse. */
		if (gmatch (n, se, p, pe, flags & ~FNM_PERIOD) == 0)
		  return (0);
	      }
	    return FNM_NOMATCH;
	  }

	case '[':
	  {
	    if (sc == '\0' || n == se)
	      return FNM_NOMATCH;

	    /* A character class cannot match a `.' if it is the first
	       character of the string or if it is the first character
	       following a slash and we are matching a pathname. */
	    if ((flags & FNM_PERIOD) && sc == '.' &&
		(n == string || ((flags & FNM_PATHNAME) && n[-1] == '/')))
	      return (FNM_NOMATCH);

	    p = brackmatch (p, sc, flags);
	    if (p == 0)
	      return FNM_NOMATCH;
	  }
	  break;

	default:
	  if ((unsigned char)c != FOLD (sc))
	    return (FNM_NOMATCH);
	}

      ++n;
    }

  if (n == se)
    return (0);

  if ((flags & FNM_LEADING_DIR) && *n == '/')
    /* The FNM_LEADING_DIR flag says that "foo*" matches "foobar/frobozz".  */
    return 0;
          
  return (FNM_NOMATCH);
}

/* Parse a bracket expression collating symbol ([.sym.]) starting at P, find
   the value of the symbol, and move P past the collating symbol expression.
   The value is returned in *VP, if VP is not null. */
static char *
parse_collsym (p, vp)
     char *p;
     int *vp;
{
  register int pc;
  int val;

  p++;				/* move past the `.' */
          
  for (pc = 0; p[pc]; pc++)
    if (p[pc] == '.' && p[pc+1] == ']')
      break;
   val = collsym (p, pc);
   if (vp)
     *vp = val;
   return (p + pc + 2);
}

static char *
brackmatch (p, test, flags)
     char *p;
     unsigned char test;
     int flags;
{
  register char cstart, cend, c;
  register int not;    /* Nonzero if the sense of the character class is inverted.  */
  int pc, brcnt;
  char *savep;

  test = FOLD (test);

  savep = p;

  /* POSIX.2 3.13.1 says that an exclamation mark (`!') shall replace the
     circumflex (`^') in its role in a `nonmatching list'.  A bracket
     expression starging with an unquoted circumflex character produces
     unspecified results.  This implementation treats the two identically. */
  if (not = (*p == '!' || *p == '^'))
    ++p;

  c = *p++;
  for (;;)
    {
      /* Initialize cstart and cend in case `-' is the last
	 character of the pattern. */
      cstart = cend = c;

      /* POSIX.2 equivalence class:  [=c=].  See POSIX.2 2.8.3.2.  Find
	 the end of the equivalence class, move the pattern pointer past
	 it, and check for equivalence.  XXX - this handles only
	 single-character equivalence classes, which is wrong, or at
	 least incomplete. */
      if (c == '[' && *p == '=' && p[2] == '=' && p[3] == ']')
	{
	  pc = FOLD (p[1]);
	  p += 4;
	  if (collequiv (test, pc))
	    {
/*[*/	      /* Move past the closing `]', since the first thing we do at
	         the `matched:' label is back p up one. */
	      p++;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产**成人网毛片九色 | 国产成人一级电影| 91精品国产综合久久精品app | 91丨九色丨国产丨porny| 久久午夜羞羞影院免费观看| 国模娜娜一区二区三区| 欧美成人高清电影在线| 国内精品免费在线观看| 国产日韩v精品一区二区| 成人激情免费视频| 亚洲欧美一区二区三区极速播放| av激情综合网| 一区二区三区四区亚洲| 精品视频在线看| 久久精品国产秦先生| 日本一区二区三区高清不卡 | 亚洲高清三级视频| 精品三级av在线| 国产高清不卡二三区| 亚洲女同女同女同女同女同69| 色婷婷av一区| 日韩专区一卡二卡| 久久久精品国产免费观看同学| 成人av资源在线| 亚洲国产一二三| 欧美一级黄色录像| 成人av先锋影音| 亚洲一区二区在线播放相泽 | 亚洲成a人片在线观看中文| 欧美一级二级三级乱码| 国产成人在线免费观看| 一区二区三区精品| 亚洲精品一线二线三线| 97se亚洲国产综合自在线不卡| 亚洲国产精品欧美一二99| 欧美mv日韩mv国产网站app| 成人成人成人在线视频| 日韩成人精品在线观看| 成人免费小视频| 日韩欧美国产电影| 91在线视频播放地址| 免费高清在线一区| 亚洲日本在线视频观看| ww亚洲ww在线观看国产| 欧美日韩高清在线播放| 国产福利91精品一区二区三区| 麻豆传媒一区二区三区| 国产亚洲欧美日韩在线一区| 欧美三级电影精品| 成人精品视频一区二区三区尤物| 午夜私人影院久久久久| 国产精品国产三级国产有无不卡| 日韩欧美一区中文| 在线欧美日韩精品| 懂色av一区二区三区免费观看| 视频一区国产视频| 亚洲综合成人在线视频| 国产精品视频第一区| 日韩欧美一级片| 欧美视频三区在线播放| 99国产欧美另类久久久精品| 国产一区二区精品久久| 免费精品99久久国产综合精品| 伊人开心综合网| 中文字幕乱码亚洲精品一区| 久久日韩粉嫩一区二区三区| 91麻豆精品国产91久久久更新时间| av亚洲精华国产精华| 成人性视频网站| 国产老肥熟一区二区三区| 日本免费在线视频不卡一不卡二 | 成av人片一区二区| 成人免费视频一区| 国内精品久久久久影院一蜜桃| 蜜臀av在线播放一区二区三区| 亚洲国产精品久久一线不卡| 亚洲影院在线观看| 亚洲一区在线看| 一区二区三区小说| 亚洲精品乱码久久久久| 亚洲精品第一国产综合野| 中文字幕中文在线不卡住| 国产精品天美传媒| 国产精品女主播在线观看| 欧美激情在线观看视频免费| 久久精品亚洲精品国产欧美 | 一区二区三区中文字幕精品精品 | 国产精品亚洲成人| 成人精品视频一区二区三区尤物| 国产黑丝在线一区二区三区| 国产成人在线免费| 成人黄页在线观看| 91视视频在线观看入口直接观看www | 国产精品亚洲成人| 国产精品自拍毛片| zzijzzij亚洲日本少妇熟睡| 99re8在线精品视频免费播放| 91在线观看免费视频| 91视频观看免费| 91激情五月电影| 欧美亚洲一区二区在线观看| 欧美福利一区二区| 欧美大尺度电影在线| 久久嫩草精品久久久久| 国产精品国产成人国产三级| 亚洲裸体在线观看| 视频精品一区二区| 国产麻豆视频一区| 色婷婷国产精品| 91精品国产综合久久婷婷香蕉 | av一区二区三区在线| 欧美影院午夜播放| 26uuu色噜噜精品一区| 中文字幕免费一区| 一区二区理论电影在线观看| 日韩国产欧美一区二区三区| 国产美女一区二区三区| 色综合久久六月婷婷中文字幕| 欧美美女视频在线观看| 久久久影视传媒| 亚洲天堂a在线| 日韩精品一级二级 | 久久久夜色精品亚洲| 亚洲欧美自拍偷拍| 日日欢夜夜爽一区| av亚洲产国偷v产偷v自拍| 欧美精选一区二区| 中文字幕av一区二区三区免费看 | 亚洲国产美国国产综合一区二区| 狠狠久久亚洲欧美| 在线观看网站黄不卡| 久久久高清一区二区三区| 伊人开心综合网| 国产精品18久久久久久久网站| 欧美午夜精品久久久久久超碰| 精品久久久久久久久久久院品网| 亚洲日本欧美天堂| 国产精品中文欧美| 91精品国产欧美一区二区18| 国产精品久久影院| 琪琪一区二区三区| 欧美在线观看一区二区| 国产精品久久久久久福利一牛影视| 视频一区视频二区在线观看| 色综合天天狠狠| 久久精品在这里| 久久精品72免费观看| 91丨九色丨蝌蚪丨老版| 欧美激情中文字幕| 黄色成人免费在线| 在线成人免费视频| 一区二区三区中文免费| 成人97人人超碰人人99| 久久综合一区二区| 久久精品72免费观看| 欧美一区二区三区视频免费| 夜夜操天天操亚洲| 色综合久久久久网| 中文字幕亚洲区| 成人一区二区在线观看| 欧美精品一区视频| 看片网站欧美日韩| 日韩一区二区三区免费看 | 91免费小视频| 中文字幕一区二区三区色视频| 国产精品一区二区久久不卡| 日韩欧美国产系列| 青青草国产成人99久久| 制服丝袜亚洲网站| 秋霞成人午夜伦在线观看| 欧美日韩国产在线观看| 亚洲午夜久久久久| 欧美日韩性生活| 午夜精品视频在线观看| 欧美日韩卡一卡二| 午夜激情综合网| 7777精品久久久大香线蕉| 天天综合网 天天综合色| 6080亚洲精品一区二区| 午夜视黄欧洲亚洲| 欧美一区二区三区公司| 免费高清成人在线| 欧美一区二区三区免费| 久久精品久久99精品久久| 精品国产乱码久久久久久久| 狠狠色丁香婷婷综合久久片| 亚洲色图欧美在线| 欧美性一二三区| 午夜精品一区二区三区三上悠亚| 欧美嫩在线观看| 精东粉嫩av免费一区二区三区| 欧美成人a∨高清免费观看| 国产精品亚洲人在线观看| 国产精品另类一区| 色婷婷av一区二区三区大白胸| 亚洲v中文字幕| 日韩三级伦理片妻子的秘密按摩| 国内精品久久久久影院一蜜桃| 国产精品乱人伦一区二区| 色婷婷av一区二区三区之一色屋|