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

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

?? glob.c

?? UNIX下SH的實現源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* File-name wildcard pattern matching for GNU.
   Copyright (C) 1985, 1988, 1989 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 version.

   This program 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 this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA.  */

/* To whomever it may concern: I have never seen the code which most
   Unix programs use to perform this function.  I wrote this from scratch
   based on specifications for the pattern matching.  --RMS.  */

#include <config.h>

#if !defined (__GNUC__) && !defined (HAVE_ALLOCA_H) && defined (_AIX)
  #pragma alloca
#endif /* _AIX && RISC6000 && !__GNUC__ */

#if defined (SHELL)
#  include "bashtypes.h"
#else
#  include <sys/types.h>
#endif

#if defined (HAVE_UNISTD_H)
#  include <unistd.h>
#endif

#if defined (SHELL)
#  include "bashansi.h"
#else
#  if defined (HAVE_STDLIB_H)
#    include <stdlib.h>
#  endif
#  if defined (HAVE_STRING_H)
#    include <string.h>
#  else /* !HAVE_STRING_H */
#    include <strings.h>
#  endif /* !HAVE_STRING_H */
#endif

#if defined (HAVE_DIRENT_H)
#  include <dirent.h>
#  define D_NAMLEN(d) strlen ((d)->d_name)
#else /* !HAVE_DIRENT_H */
#  define D_NAMLEN(d) ((d)->d_namlen)
#  if defined (HAVE_SYS_NDIR_H)
#    include <sys/ndir.h>
#  endif
#  if defined (HAVE_SYS_DIR_H)
#    include <sys/dir.h>
#  endif /* HAVE_SYS_DIR_H */
#  if defined (HAVE_NDIR_H)
#    include <ndir.h>
#  endif
#  if !defined (dirent)
#    define dirent direct
#  endif
#endif /* !HAVE_DIRENT_H */

#if defined (_POSIX_SOURCE) || !defined (STRUCT_DIRENT_HAS_D_INO)
/* Posix does not require that the d_ino field be present, and some
   systems do not provide it. */
#  define REAL_DIR_ENTRY(dp) 1
#else
#  define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
#endif /* _POSIX_SOURCE */

#if !defined (HAVE_BCOPY) && !defined (bcopy)
#  define bcopy(s, d, n) ((void) memcpy ((d), (s), (n)))
#endif /* !HAVE_BCOPY && !bcopy */

#if defined (SHELL)
#  include "posixstat.h"
#else /* !SHELL */
#  include <sys/stat.h>
#endif /* !SHELL */

#include "filecntl.h"
#if !defined (F_OK)
#  define F_OK 0
#endif

#if defined (SHELL)
#  include "memalloc.h"
#endif

#include "fnmatch.h"

#if !defined (HAVE_STDLIB_H) && !defined (SHELL)
extern char *malloc (), *realloc ();
extern void free ();
#endif /* !HAVE_STDLIB_H */

#if !defined (NULL)
#  if defined (__STDC__)
#    define NULL ((void *) 0)
#  else
#    define NULL 0x0
#  endif /* __STDC__ */
#endif /* !NULL */

#if defined (SHELL)
extern void throw_to_top_level ();
extern int test_eaccess ();

extern int interrupt_state;
extern int extended_glob;
#endif /* SHELL */

#if defined (__MSDOS__)
#include "dosutil.h"
#endif

/* Global variable which controls whether or not * matches .*.
   Non-zero means don't match .*.  */
int noglob_dot_filenames = 1;

/* Global variable which controls whether or not filename globbing
   is done without regard to case. */
int glob_ignore_case = 0;

/* Global variable to return to signify an error in globbing. */
char *glob_error_return;

/* Return nonzero if PATTERN has any special globbing chars in it.  */
int
glob_pattern_p (pattern)
     char *pattern;
{
  register char *p;
  register char c;
  int bopen;

  p = pattern;
  bopen = 0;

  while ((c = *p++) != '\0')
    switch (c)
      {
      case '?':
      case '*':
	return (1);

      case '[':		/* Only accept an open brace if there is a close */
	bopen++;	/* brace to match it.  Bracket expressions must be */
	continue;	/* complete, according to Posix.2 */
      case ']':
	if (bopen)
	  return (1);
	continue;      

      case '+':		/* extended matching operators */
      case '@':
      case '!':
	if (*p == '(')	/*) */
	  return (1);
	continue;

      case '\\':
	if (*p++ == '\0')
	  return (0);
      }

  return (0);
}

/* Remove backslashes quoting characters in PATHNAME by modifying PATHNAME. */
static void
dequote_pathname (pathname)
     char *pathname;
{
  register int i, j;

  for (i = j = 0; pathname && pathname[i]; )
    {
      if (pathname[i] == '\\')
	i++;

      pathname[j++] = pathname[i++];

      if (!pathname[i - 1])
	break;
    }
  pathname[j] = '\0';
}



/* Test whether NAME exists. */

#if defined (HAVE_LSTAT)
#  define GLOB_TESTNAME(name)  (lstat (name, &finfo))
#else /* !HAVE_LSTAT */
#  if defined (SHELL) && !defined (AFS)
#    define GLOB_TESTNAME(name)  (test_eaccess (nextname, F_OK))
#  else /* !SHELL || AFS */
#    define GLOB_TESTNAME(name)  (access (nextname, F_OK))
#  endif /* !SHELL || AFS */
#endif /* !HAVE_LSTAT */

/* Return 0 if DIR is a directory, -1 otherwise. */
static int
glob_testdir (dir)
     char *dir;
{
  struct stat finfo;

  if (stat (dir, &finfo) < 0)
    return (-1);

  if (S_ISDIR (finfo.st_mode) == 0)
    return (-1);

  return (0);
}

/* Return a vector of names of files in directory DIR
   whose names match glob pattern PAT.
   The names are not in any particular order.
   Wildcards at the beginning of PAT do not match an initial period.

   The vector is terminated by an element that is a null pointer.

   To free the space allocated, first free the vector's elements,
   then free the vector.

   Return 0 if cannot get enough memory to hold the pointer
   and the names.

   Return -1 if cannot access directory DIR.
   Look in errno for more information.  */

char **
glob_vector (pat, dir)
     char *pat;
     char *dir;
{
  struct globval
    {
      struct globval *next;
      char *name;
    };

#if defined (__MSDOS__)
  char *fixp;
  int use_lfn = (pathconf (NULL, _PC_NAME_MAX) > 12);
#endif
  DIR *d;
  register struct dirent *dp;
  struct globval *lastlink;
  register struct globval *nextlink;
  register char *nextname, *npat;
  unsigned int count;
  int lose, skip;
  register char **name_vector;
  register unsigned int i;
  int flags;		/* Flags passed to fnmatch (). */

  lastlink = 0;
  count = lose = skip = 0;

  /* If PAT is empty, skip the loop, but return one (empty) filename. */
  if (pat == 0 || *pat == '\0')
    {
      if (glob_testdir (dir) < 0)
	return ((char **) &glob_error_return);

      nextlink = (struct globval *)alloca (sizeof (struct globval));
      nextlink->next = (struct globval *)0;
      nextname = (char *) malloc (1);
      if (nextname == 0)
	lose = 1;
      else
	{
	  lastlink = nextlink;
	  nextlink->name = nextname;
	  nextname[0] = '\0';
	  count = 1;
	}

      skip = 1;
    }

  /* If the filename pattern (PAT) does not contain any globbing characters,
     we can dispense with reading the directory, and just see if there is
     a filename `DIR/PAT'.  If there is, and we can access it, just make the
     vector to return and bail immediately. */
  if (skip == 0 && glob_pattern_p (pat) == 0)
    {
      int dirlen;
      struct stat finfo;

      if (glob_testdir (dir) < 0)
	return ((char **) &glob_error_return);

      dirlen = strlen (dir);
      nextname = (char *)malloc (dirlen + strlen (pat) + 2);
      npat = (char *)malloc (strlen (pat) + 1);
      if (nextname == 0 || npat == 0)
	lose = 1;
      else
	{
	  strcpy (npat, pat);
	  dequote_pathname (npat);

	  strcpy (nextname, dir);
	  nextname[dirlen++] = '/';
	  strcpy (nextname + dirlen, npat);

	  if (GLOB_TESTNAME (nextname) >= 0)
	    {
	      free (nextname);
	      nextlink = (struct globval *)alloca (sizeof (struct globval));
	      nextlink->next = (struct globval *)0;
	      lastlink = nextlink;
	      nextlink->name = npat;
	      count = 1;
	    }
	  else
	    {
	      free (nextname);
	      free (npat);
	    }
	}

      skip = 1;
    }

  if (skip == 0)
    {
      /* Open the directory, punting immediately if we cannot.  If opendir
	 is not robust (i.e., it opens non-directories successfully), test
	 that DIR is a directory and punt if it's not. */
#if defined (OPENDIR_NOT_ROBUST)
      if (glob_testdir (dir) < 0)
	return ((char **) &glob_error_return);
#endif

      d = opendir (dir);
      if (d == NULL)
	return ((char **) &glob_error_return);

      /* Compute the flags that will be passed to fnmatch().  We don't
         need to do this every time through the loop. */
      flags = (noglob_dot_filenames ? FNM_PERIOD : 0) | FNM_PATHNAME;

#ifdef FNM_CASEFOLD
#if defined (__DJGPP__)
      /* DJGPP's globbing does not ignore case
         when in an LFN environment and either FNCASE=Y
         or an uppercase letter is in the pattern. */

      glob_ignore_case = !(use_lfn && (_preserve_fncase() != 0));
      if (glob_ignore_case && use_lfn)
        {
          char *cur_pat = pat;
          char ch;
          while ((ch = *cur_pat++))
            {
              if ((ch >= 'A') && (ch <= 'Z'))
                {
                  glob_ignore_case = 0;
                  break;
                }
            }
        }
#endif
      if (glob_ignore_case)
	flags |= FNM_CASEFOLD;
#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区四区在线播放| 久久99国产精品尤物| 日本久久一区二区| 日韩久久一区二区| 欧美乱妇15p| 国产中文字幕一区| 国产精品视频观看| 欧美日韩精品三区| 久久国内精品视频| 中文字幕在线一区| 欧美色倩网站大全免费| 国内精品免费**视频| 中文字幕视频一区| 日韩美女天天操| 色综合中文字幕| 久国产精品韩国三级视频| 中文字幕一区二区三区四区| 在线不卡中文字幕| 色网站国产精品| 一二三四社区欧美黄| 国产亚洲短视频| 欧美日本免费一区二区三区| 成人av在线电影| 精品一区二区三区在线播放视频| 亚洲天堂成人在线观看| 国产网红主播福利一区二区| 91精品蜜臀在线一区尤物| 色域天天综合网| 成人sese在线| 99在线精品一区二区三区| 国产一区二区影院| 国产一区二区三区观看| 日韩不卡在线观看日韩不卡视频| 亚洲精品一二三| 亚洲蜜臀av乱码久久精品 | 91香蕉视频mp4| av福利精品导航| 精久久久久久久久久久| 日日夜夜免费精品视频| 亚洲一区二区三区三| 亚洲福利视频一区二区| 亚洲一区二区三区小说| 日韩制服丝袜先锋影音| 丝袜诱惑亚洲看片| 蜜桃av一区二区| 高清成人在线观看| 欧美日韩中文精品| 精品奇米国产一区二区三区| 国产色产综合色产在线视频| 国产精品久久久久久久久免费桃花 | 不卡视频免费播放| 91成人网在线| xnxx国产精品| 亚洲综合视频在线| 久久国产综合精品| 国产剧情在线观看一区二区| 极品瑜伽女神91| 99国产精品久久久久久久久久| 欧美日本免费一区二区三区| 精品国产免费人成电影在线观看四季| 精品三级在线观看| 亚洲成人激情综合网| 从欧美一区二区三区| 日韩一级黄色片| 亚洲成人手机在线| 不卡视频一二三四| 久久精品水蜜桃av综合天堂| 亚洲成人动漫精品| 成人免费黄色在线| 精品国产乱码久久久久久浪潮| 亚洲三级视频在线观看| 国产+成+人+亚洲欧洲自线| 精品久久久久一区| 日欧美一区二区| 欧美乱熟臀69xxxxxx| 五月天欧美精品| 精品一区二区三区在线观看| eeuss鲁片一区二区三区| 国产亚洲成av人在线观看导航 | 欧美丝袜自拍制服另类| 亚洲人成伊人成综合网小说| 成人精品视频一区二区三区| 国产午夜久久久久| www.久久精品| 无码av免费一区二区三区试看 | 国产欧美日韩不卡免费| 国产一区二区三区免费观看| 国产精品久久久久久久久动漫| 高清不卡一二三区| 亚洲成a人在线观看| 日韩一区二区在线观看视频| 国产精品自拍av| 中文字幕一区三区| 色综合久久六月婷婷中文字幕| 一区二区视频在线| 欧美成人一级视频| av在线播放一区二区三区| 亚洲午夜成aⅴ人片| 久久精品男人的天堂| 欧美亚洲国产一区二区三区va| 美女视频黄 久久| 亚洲欧美韩国综合色| 欧美一区二区三区视频免费播放 | 国产在线精品一区二区| 亚洲男人的天堂网| 欧美激情一区二区| 日韩免费观看高清完整版| 91免费看片在线观看| 国产激情一区二区三区桃花岛亚洲| 亚洲综合视频在线观看| 中文久久乱码一区二区| 久久综合色之久久综合| 日韩一区二区三区精品视频| 欧美三级一区二区| 国产激情精品久久久第一区二区 | 亚洲国产日韩av| 亚洲精品日日夜夜| 一级中文字幕一区二区| 综合激情成人伊人| 椎名由奈av一区二区三区| 综合在线观看色| 亚洲欧美日韩综合aⅴ视频| 亚洲青青青在线视频| 亚洲国产美女搞黄色| 亚洲成人动漫一区| 极品少妇xxxx偷拍精品少妇| 久久99精品国产91久久来源| 国内精品久久久久影院一蜜桃| 福利电影一区二区三区| 91免费版在线| 日韩一级欧美一级| 中文字幕av在线一区二区三区| 日韩一区在线看| 亚洲欧美日韩久久精品| 亚洲成人免费看| 成人精品一区二区三区中文字幕| 粉嫩av亚洲一区二区图片| 精品一区二区影视| 成人国产免费视频| 欧美高清一级片在线| 国产精品人成在线观看免费| 亚洲欧美综合色| 精品亚洲porn| 欧美日韩免费不卡视频一区二区三区| 91精品在线观看入口| 1024成人网| 成人精品视频.| 日韩午夜精品视频| 午夜精彩视频在线观看不卡| 国产激情视频一区二区三区欧美 | 国产成人av电影在线观看| 欧美视频日韩视频| 国产精品乱人伦中文| 国产精品88av| 国产亚洲精品免费| 久久精品国产一区二区三| 欧美天堂亚洲电影院在线播放| 国产精品久久久久久久久免费相片| 伦理电影国产精品| 91精品国产综合久久精品麻豆| 欧美激情一区二区三区不卡 | 欧美老肥妇做.爰bbww| 亚洲日本丝袜连裤袜办公室| 成人aa视频在线观看| 国产精品免费aⅴ片在线观看| 久久精品国产一区二区| 久久久久久久久久看片| 国产一区二区三区观看| 26uuu久久天堂性欧美| 国内精品不卡在线| 久久亚洲精品国产精品紫薇| 国产二区国产一区在线观看| 久久久久综合网| 91精品福利视频| 麻豆国产精品一区二区三区 | 日韩一区二区视频| 国产1区2区3区精品美女| 亚洲成人av在线电影| 国产日韩欧美高清在线| 欧美日韩小视频| 国产精品18久久久久久久久 | 久久亚洲精品小早川怜子| 国产成人免费视频精品含羞草妖精 | 亚洲精品视频一区| 精品国产伦一区二区三区观看体验| 成人在线一区二区三区| 麻豆一区二区99久久久久| 亚洲欧洲www| 国产欧美一区二区三区鸳鸯浴| 在线精品视频一区二区| 成人中文字幕合集| 久草精品在线观看| 日本美女视频一区二区| 亚洲乱码日产精品bd| 欧美国产亚洲另类动漫| 日韩亚洲欧美一区| 欧美精品色综合| 日本大香伊一区二区三区| 成人中文字幕在线| 成年人午夜久久久|