⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 match.c

📁 国外网站上的一些精典的C程序
💻 C
📖 第 1 页 / 共 2 页
字号:
                              if (range_end == '\0' || range_end == ']')                                    return MATCH_PATTERN;                              /* special character range end */                              if (range_end == '\\')                              {                                    range_end = *++p;                                    /* if end of text then                                       we have a bad pattern */                                    if (!range_end)                                          return MATCH_PATTERN;                              }                              /* move just beyond this range */                              p++;                        }                        /* if the text character is in range then match found.                           make sure the range letters have the proper                           relationship to one another before comparison */                        if (range_start < range_end)                        {                              if (*t >= range_start && *t <= range_end)                              {                                    member_match = TRUE;                                    loop = FALSE;                              }                        }                        else                        {                              if (*t >= range_end && *t <= range_start)                              {                                    member_match = TRUE;                                    loop = FALSE;                              }                        }                  }                  /* if there was a match in an exclusion set then no match */                  /* if there was no match in a member set then no match */                  if ((invert && member_match) || !(invert || member_match))                        return MATCH_RANGE;                  /* if this is not an exclusion then skip the rest of                     the [...] construct that already matched. */                  if (member_match)                  {                        while (*p != ']')                        {                              /* bad pattern (Missing ']') */                              if (!*p)                                    return MATCH_PATTERN;                              /* skip exact match */                              if (*p == '\\')                              {                                    p++;                                    /* if end of text then                                       we have a bad pattern */                                    if (!*p)                                          return MATCH_PATTERN;                              }                              /* move to next pattern char */                              p++;                        }                  }                  break;            }            case '\\':  /* next character is quoted and must match exactly */                  /* move pattern pointer to quoted char and fall through */                  p++;                  /* if end of text then we have a bad pattern */                  if (!*p)                        return MATCH_PATTERN;                  /* must match this character exactly */            default:                  if (*p != *t)                        return MATCH_LITERAL;            }      }      /* if end of text not reached then the pattern fails */      if (*t)            return MATCH_END;      else  return MATCH_VALID;}/*----------------------------------------------------------------------------** recursively call matche() with final segment of PATTERN and of TEXT.*----------------------------------------------------------------------------*/int matche_after_star (register char *p, register char *t){      register int match = 0;      register nextp;      /* pass over existing ? and * in pattern */      while ( *p == '?' || *p == '*' )      {            /* take one char for each ? and + */            if (*p == '?')            {                  /* if end of text then no match */                  if (!*t++)                        return MATCH_ABORT;            }            /* move to next char in pattern */            p++;      }      /* if end of pattern we have matched regardless of text left */      if (!*p)            return MATCH_VALID;      /* get the next character to match which must be a literal or '[' */      nextp = *p;      if (nextp == '\\')      {            nextp = p[1];            /* if end of text then we have a bad pattern */            if (!nextp)                  return MATCH_PATTERN;      }      /* Continue until we run out of text or definite result seen */      do      {            /* a precondition for matching is that the next character               in the pattern match the next character in the text or that               the next pattern char is the beginning of a range.  Increment               text pointer as we go here */            if (nextp == *t || nextp == '[')                  match = matche(p, t);            /* if the end of text is reached then no match */            if (!*t++)                  match = MATCH_ABORT;      } while ( match != MATCH_VALID &&                 match != MATCH_ABORT &&                match != MATCH_PATTERN);      /* return result */      return match;}/*----------------------------------------------------------------------------** match() is a shell to matche() to return only BOOLEAN values.*----------------------------------------------------------------------------*/BOOLEAN match( char *p, char *t ){      int error_type;      error_type = matche(p,t);      return (error_type == MATCH_VALID ) ? TRUE : FALSE;}#ifdef TEST/*** This test main expects as first arg the pattern and as second arg** the match string.  Output is yea or nay on match.  If nay on** match then the error code is parsed and written.*/#include <stdio.h>int main(int argc, char *argv[]){      int error;      int is_valid_error;      if (argc != 3)            printf("Usage:  MATCH Pattern Text\n");      else      {            printf("Pattern: %s\n", argv[1]);            printf("Text   : %s\n", argv[2]);            if (!is_pattern(argv[1]))                  printf("    First Argument Is Not A Pattern\n");            else            {                  error = matche(argv[1],argv[2]);                  is_valid_pattern(argv[1],&is_valid_error);                  switch (error)                  {                  case MATCH_VALID:                        printf("    Match Successful");                        if (is_valid_error != PATTERN_VALID)                              printf(" -- is_valid_pattern() "                                    "is complaining\n");                        else  printf("\n");                        break;                  case MATCH_LITERAL:                        printf("    Match Failed on Literal\n");                        break;                  case MATCH_RANGE:                        printf("    Match Failed on [..]\n");                        break;                  case MATCH_ABORT:                        printf("    Match Failed on Early "                              "Text Termination\n");                        break;                  case MATCH_END:                        printf("    Match Failed on Early "                              "Pattern Termination\n");                        break;                  case MATCH_PATTERN:                        switch (is_valid_error)                        {                        case PATTERN_VALID:                              printf("    Internal Disagreement "                                    "On Pattern\n");                              break;                        case PATTERN_ESC:                              printf("    Literal Escape at "                                    "End of Pattern\n");                              break;                        case PATTERN_RANGE:                              printf("    No End of Range in "                                    "[..] Construct\n");                              break;                        case PATTERN_CLOSE:                              printf("    [..] Construct is Open\n");                              break;                        case PATTERN_EMPTY:                              printf("    [..] Construct is Empty\n");                              break;                        default:                              printf("    Internal Error in "                                    "is_valid_pattern()\n");                        }                        break;                  default:                        printf("    Internal Error in matche()\n");                        break;                  }            }      }      return(0);}#endif /* TEST */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -